From 640c7c6b67a8f3c78a893b5239e228d84faa4a92 Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Tue, 3 Feb 2026 22:05:56 -0700 Subject: [PATCH 01/84] chore: vnext updates --- .github/ISSUE_TEMPLATE/bug_report.md | 23 + .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/feature_request.md | 13 + .github/PULL_REQUEST_TEMPLATE.md | 10 + .github/workflows/ci.yml | 34 ++ .github/workflows/release-please.yml | 19 + .gitignore | 1 + .prettierrc.json | 5 + CHANGELOG.md | 12 + CODEOWNERS | 1 + CONTRIBUTING.md | 34 ++ LICENSE | 21 + PLAN.md | 76 ++- README.md | 128 ++++- SECURITY.md | 7 + eslint.config.js | 45 ++ examples/README.md | 14 + examples/primer.eval.json | 15 + package.json | 24 +- primer.eval.json | 2 +- release-please-config.json | 9 + release-please-manifest.json | 3 + src/cli.ts | 15 +- src/commands/batch.tsx | 29 +- src/commands/eval.ts | 5 +- src/commands/init.ts | 85 ++- src/commands/pr.ts | 97 +++- src/commands/readiness.ts | 120 ++++ src/services/__tests__/analyzer.test.ts | 31 ++ src/services/analyzer.ts | 142 ++++- src/services/azureDevops.ts | 235 ++++++++ src/services/evaluator.ts | 461 ++++++++++++++- src/services/git.ts | 22 +- src/services/readiness.ts | 648 ++++++++++++++++++++++ src/ui/BatchTuiAzure.tsx | 526 ++++++++++++++++++ src/ui/README.md | 2 + src/ui/tui.tsx | 166 +++++- vitest.config.ts | 12 + 38 files changed, 2996 insertions(+), 101 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release-please.yml create mode 100644 .prettierrc.json create mode 100644 CHANGELOG.md create mode 100644 CODEOWNERS create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 SECURITY.md create mode 100644 eslint.config.js create mode 100644 examples/README.md create mode 100644 examples/primer.eval.json create mode 100644 release-please-config.json create mode 100644 release-please-manifest.json create mode 100644 src/commands/readiness.ts create mode 100644 src/services/__tests__/analyzer.test.ts create mode 100644 src/services/azureDevops.ts create mode 100644 src/services/readiness.ts create mode 100644 src/ui/BatchTuiAzure.tsx create mode 100644 vitest.config.ts diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..c7f8e50 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,23 @@ +--- +name: Bug report +description: Report a problem with Primer +labels: [bug] +--- + +## Description + +## Steps to reproduce + +1. +2. +3. + +## Expected behavior + +## Actual behavior + +## Environment + +- OS: +- Node version: +- Primer version: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..3624ac5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Questions + url: https://github.com/pierceboggan/primer/discussions + about: Ask questions and discuss ideas here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..dabc116 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,13 @@ +--- +name: Feature request +description: Suggest an enhancement for Primer +labels: [enhancement] +--- + +## Summary + +## Problem statement + +## Proposed solution + +## Additional context diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..84350e7 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,10 @@ +## Summary + +- [ ] What changed +- [ ] Why it changed + +## Checklist + +- [ ] Tests added or updated +- [ ] Lint/typecheck pass +- [ ] Docs updated if needed diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..cb9b04c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,34 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + - name: Install + run: npm ci + - name: Lint + run: npm run lint + - name: Typecheck + run: npm run typecheck + - name: Test + run: npm run test:coverage + - name: Build + run: npm run build + - name: Upload coverage + uses: actions/upload-artifact@v4 + with: + name: coverage + path: coverage + if-no-files-found: ignore diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..3547bac --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,19 @@ +name: Release Please + +on: + push: + branches: [main] + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - name: Release + uses: google-github-actions/release-please-action@v4 + with: + config-file: release-please-config.json + manifest-file: release-please-manifest.json diff --git a/.gitignore b/.gitignore index 6b4a136..89da78c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ node_modules/ # Build output dist/ +coverage/ # IDE .vscode/ diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..1ad2e3d --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "singleQuote": false, + "trailingComma": "none", + "printWidth": 100 +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e91d5ff --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +- Readiness report with monorepo support and fix-first checklist. +- CI workflow with lint, typecheck, tests, and build steps. +- Release automation via release-please. +- ESLint, Prettier, and Vitest tooling plus starter tests. +- Added contributing, security, and issue/PR templates. +- Added examples folder with sample configs. diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..77511c7 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @pierceboggan diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e66fc98 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,34 @@ +# Contributing + +Thanks for contributing to Primer. + +## Quick start + +1. Fork and clone the repo. +2. Install dependencies: npm install +3. Build locally: npm run build +4. Run lint/typecheck/tests before opening a PR: + - npm run lint + - npm run typecheck + - npm run test + +## Development workflow + +- Create a feature branch from main. +- Use clear, conventional commit messages (e.g. feat: add readiness report). +- Keep PRs focused and include context in the description. +- Add or update tests when behavior changes. + +## Code style + +- ESLint + Prettier are enforced in CI. +- Prefer small, composable functions with clear types. + +## Reporting issues + +- Use GitHub Issues for bugs and feature requests. +- Provide steps to reproduce and expected behavior. + +## Releasing + +Releases are automated with release-please when changes are merged to main. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cb6db3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Primer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PLAN.md b/PLAN.md index 3dcc268..46f5b83 100644 --- a/PLAN.md +++ b/PLAN.md @@ -16,9 +16,14 @@ Make any repository "AI-ready" with a single command — generating optimal conf - Detect language(s), frameworks, and project structure - Identify existing AI configurations - Analyze package managers, build tools, and testing frameworks -- Detect monorepo vs single-project structure +- Detect monorepo vs single-project structure (workspace-aware) -### 2. **Configuration Generation** +### 2. **Readiness Report** +- Score AI readiness across key pillars +- Provide fix-first checklists and maturity levels +- Support monorepos with app-scoped checks + +### 3. **Configuration Generation** | Config Type | Description | |-------------|-------------| @@ -26,19 +31,19 @@ Make any repository "AI-ready" with a single command — generating optimal conf | **MCP Server Config** | `.vscode/mcp.json` for Model Context Protocol servers | | **VS Code Settings** | `.vscode/settings.json` with AI-optimized workspace settings | -### 3. **GitHub Integration** +### 4. **GitHub Integration** - Authenticate via GitHub CLI (`gh auth`) or OAuth device flow - List and select from accessible repositories - Clone repos temporarily for analysis - **Auto-create PRs** with generated configurations - Support for GitHub Enterprise -### 4. **Local Repository Support** +### 5. **Local Repository Support** - Detect local Git repositories - Work offline with local-only mode - Push changes to remote when ready -### 5. **Interactive & Non-Interactive Modes** +### 6. **Interactive & Non-Interactive Modes** - Beautiful TUI with prompts and previews - CI/CD-friendly `--yes` flag for automation - JSON output for scripting @@ -99,6 +104,9 @@ primer pr owner/repo # Analyze repo without making changes primer analyze +# Readiness report +primer readiness + # Update existing configurations primer update @@ -107,6 +115,18 @@ primer templates # Configure CLI settings primer config + +# Generate instructions +primer instructions + +# Run evaluations +primer eval primer.eval.json + +# Run TUI +primer tui + +# Batch processing +primer batch ``` --- @@ -370,23 +390,33 @@ primer/ │ ├── index.ts # Entry point │ ├── cli.ts # Commander setup │ ├── commands/ -│ │ ├── init.ts -│ │ ├── generate.ts │ │ ├── analyze.ts +│ │ ├── batch.tsx +│ │ ├── config.ts +│ │ ├── eval.ts +│ │ ├── generate.ts +│ │ ├── init.ts +│ │ ├── instructions.tsx │ │ ├── pr.ts -│ │ └── config.ts +│ │ ├── readiness.ts +│ │ ├── templates.ts +│ │ ├── tui.tsx +│ │ └── update.ts │ ├── services/ -│ │ ├── github.ts # GitHub API interactions │ │ ├── analyzer.ts # Repo analysis logic +│ │ ├── azureDevops.ts # Azure DevOps integration +│ │ ├── evaluator.ts # Eval runner │ │ ├── generator.ts # Config generation -│ │ └── git.ts # Local git operations +│ │ ├── git.ts # Local git operations +│ │ ├── github.ts # GitHub API interactions +│ │ └── instructions.ts # Copilot SDK integration │ ├── ui/ -│ │ ├── prompts.ts # Inquirer prompts -│ │ ├── spinner.ts # Loading indicators -│ │ └── preview.ts # File previews +│ │ ├── AnimatedBanner.tsx +│ │ ├── BatchTui.tsx +│ │ ├── BatchTuiAzure.tsx +│ │ └── tui.tsx │ └── utils/ │ ├── fs.ts # File system helpers -│ ├── detection.ts # Language/framework detection │ └── logger.ts # Styled console output ├── package.json ├── tsconfig.json @@ -476,24 +506,24 @@ Create example repos for each major stack: # Install dependencies npm install -# Development with watch mode -npm run dev - # Build for production npm run build -# Run tests -npm test - # Lint and format npm run lint npm run format +# Type check +npm run typecheck + +# Run tests +npm run test + +# Coverage +npm run test:coverage + # Link globally for testing npm link - -# Create standalone binaries -npm run package ``` --- diff --git a/README.md b/README.md index 7c5dd6c..ab2da0a 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ > Prime your repositories for AI-assisted development. +[![CI](https://github.com/pierceboggan/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/pierceboggan/primer/actions/workflows/ci.yml) +[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) + Primer is a CLI tool that analyzes your codebase and generates `.github/copilot-instructions.md` files to help AI coding assistants understand your project better. It supports single repos, batch processing across organizations, and includes an evaluation framework to measure instruction effectiveness. ![Primer](primer.png) @@ -12,6 +15,7 @@ Primer is a CLI tool that analyzes your codebase and generates `.github/copilot- - **AI-Powered Generation** - Uses the Copilot SDK to analyze your codebase and generate context-aware instructions - **Batch Processing** - Process multiple repos across organizations with a single command - **Evaluation Framework** - Test and measure how well your instructions improve AI responses +- **Readiness Report** - Score AI readiness across key pillars with a fix-first checklist - **GitHub Integration** - Clone repos, create branches, and open PRs automatically - **Interactive TUI** - Beautiful terminal interface built with Ink - **Config Generation** - Generate MCP and VS Code configurations @@ -22,14 +26,31 @@ Primer is a CLI tool that analyzes your codebase and generates `.github/copilot- 2. **GitHub Copilot CLI** - Installed via VS Code's Copilot Chat extension 3. **Copilot CLI Authentication** - Run `copilot` then `/login` to authenticate 4. **GitHub CLI (optional)** - For batch processing and PR creation: `brew install gh && gh auth login` +5. **Azure DevOps PAT (optional)** - For Azure DevOps batch/PR workflows: set `AZURE_DEVOPS_PAT` ## Installation ```bash -# Clone and install +# Install from npm +npm install -g primer +``` + +### Quick Install + +```bash +primer --help +``` + +### Local Development Install + +```bash +# Clone and install dependencies git clone https://github.com/pierceboggan/primer.git cd primer npm install + +# Build and link the local CLI +npm run build ``` ## Usage @@ -40,26 +61,29 @@ The easiest way to get started is with the `init` command: ```bash # Interactive setup for current directory -npx tsx src/index.ts init +primer init # Accept defaults and generate instructions automatically -npx tsx src/index.ts init --yes +primer init --yes # Work with a GitHub repository -npx tsx src/index.ts init --github +primer init --github + +# Work with an Azure DevOps repository +primer init --provider azure ``` ### Interactive Mode (TUI) ```bash # Run TUI in current directory -npx tsx src/index.ts tui +primer tui # Run on a specific repo -npx tsx src/index.ts tui --repo /path/to/repo +primer tui --repo /path/to/repo # Skip the animated intro -npx tsx src/index.ts tui --no-animation +primer tui --no-animation ``` **Keys:** @@ -73,13 +97,13 @@ npx tsx src/index.ts tui --no-animation ```bash # Generate instructions for current directory -npx tsx src/index.ts instructions +primer instructions # Generate for specific repo with custom output -npx tsx src/index.ts instructions --repo /path/to/repo --output ./instructions.md +primer instructions --repo /path/to/repo --output ./instructions.md # Use a specific model -npx tsx src/index.ts instructions --model gpt-5 +primer instructions --model gpt-5 ``` ### Batch Processing @@ -88,10 +112,13 @@ Process multiple repositories across organizations: ```bash # Launch batch TUI -npx tsx src/index.ts batch +primer batch + +# Launch batch TUI for Azure DevOps +primer batch --provider azure # Save results to file -npx tsx src/index.ts batch --output results.json +primer batch --output results.json ``` **Batch TUI Keys:** @@ -105,31 +132,53 @@ npx tsx src/index.ts batch --output results.json ```bash # Analyze current directory -npx tsx src/index.ts analyze +primer analyze # Analyze specific path with JSON output -npx tsx src/index.ts analyze /path/to/repo --json +primer analyze /path/to/repo --json ``` +### Readiness Report + +Assess how ready a repository is for AI agents and get a prioritized checklist of fixes: + +```bash +# Run readiness report in current directory +primer readiness + +# Run readiness report on a specific repo +primer readiness /path/to/repo + +# Output JSON only +primer readiness --json + +# Write JSON report to a file +primer readiness --output readiness.json +``` + +### Examples + +See [examples/README.md](examples/README.md) for quick usage snippets and a sample eval config. + ### Generate Configs Generate configuration files for your repo: ```bash # Generate MCP config -npx tsx src/index.ts generate mcp +primer generate mcp # Generate VS Code settings -npx tsx src/index.ts generate vscode --force +primer generate vscode --force # Generate custom prompts -npx tsx src/index.ts generate prompts +primer generate prompts # Generate agent configs -npx tsx src/index.ts generate agents +primer generate agents # Generate .aiignore file -npx tsx src/index.ts generate aiignore +primer generate aiignore ``` ### Manage Templates @@ -137,7 +186,7 @@ npx tsx src/index.ts generate aiignore View available instruction templates: ```bash -npx tsx src/index.ts templates +primer templates ``` ### Configuration @@ -145,7 +194,7 @@ npx tsx src/index.ts templates View and manage Primer configuration: ```bash -npx tsx src/index.ts config +primer config ``` ### Update @@ -153,7 +202,7 @@ npx tsx src/index.ts config Check for and apply updates: ```bash -npx tsx src/index.ts update +primer update ``` ### Create Pull Requests @@ -162,10 +211,13 @@ Automatically create a PR to add Primer configs to a repository: ```bash # Create PR for a GitHub repo -npx tsx src/index.ts pr owner/repo-name +primer pr owner/repo-name # Use custom branch name -npx tsx src/index.ts pr owner/repo-name --branch primer/custom-branch +primer pr owner/repo-name --branch primer/custom-branch + +# Create PR for an Azure DevOps repo (org/project/repo) +primer pr my-org/my-project/my-repo --provider azure ``` ### Evaluation Framework @@ -174,19 +226,22 @@ Test how well your instructions improve AI responses: ```bash # Create a starter eval config -npx tsx src/index.ts eval --init +primer eval --init # Run evaluation -npx tsx src/index.ts eval primer.eval.json --repo /path/to/repo +primer eval primer.eval.json --repo /path/to/repo # Save results and use specific models -npx tsx src/index.ts eval --output results.json --model gpt-5 --judge-model gpt-5 +primer eval --output results.json --model gpt-5 --judge-model gpt-5 ``` +When `--output` is provided (or `outputPath` is set in the eval config), Primer writes a JSON report that includes per-case metrics and trajectory events, and also generates a companion HTML trajectory viewer next to the JSON file. + Example `primer.eval.json`: ```json { "instructionFile": ".github/copilot-instructions.md", + "outputPath": "eval-results.json", "cases": [ { "id": "project-overview", @@ -264,8 +319,23 @@ primer/ # Type check npx tsc -p tsconfig.json --noEmit -# Run in dev mode -npx tsx src/index.ts +# Lint +npm run lint + +# Format +npm run format + +# Test +npm run test + +# Coverage +npm run test:coverage + +# Build and link the local CLI +npm run build + +# Run locally +primer ``` ## Troubleshooting diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..0f09971 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,7 @@ +# Security Policy + +## Reporting a Vulnerability + +Please report security issues privately by emailing the maintainer or opening a GitHub security advisory. Avoid filing public issues for vulnerabilities. + +We aim to respond within 72 hours and will work with you on remediation and disclosure. diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..309d504 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,45 @@ +import js from "@eslint/js"; +import tseslint from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; +import eslintConfigPrettier from "eslint-config-prettier"; +import importPlugin from "eslint-plugin-import"; +import nPlugin from "eslint-plugin-n"; +import promisePlugin from "eslint-plugin-promise"; + +const sourceGlobs = ["**/*.{ts,tsx,js,jsx}"]; + +export default [ + { + ignores: ["dist/**", "node_modules/**", "coverage/**"] + }, + js.configs.recommended, + { + files: sourceGlobs, + languageOptions: { + parser: tsParser, + parserOptions: { + project: "./tsconfig.json", + sourceType: "module", + ecmaVersion: "latest" + } + }, + plugins: { + "@typescript-eslint": tseslint, + import: importPlugin, + n: nPlugin, + promise: promisePlugin + }, + rules: { + "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], + "@typescript-eslint/consistent-type-imports": ["warn", { "prefer": "type-imports" }], + "import/order": [ + "warn", + { + "newlines-between": "always", + "alphabetize": { "order": "asc", "caseInsensitive": true } + } + ] + } + }, + eslintConfigPrettier +]; diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..1be29f8 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,14 @@ +# Primer Examples + +This folder includes quick examples to help you get started. + +## CLI usage + +- Analyze a repo: primer analyze /path/to/repo +- Generate instructions: primer instructions --repo /path/to/repo +- Run readiness: primer readiness /path/to/repo +- Run evals: primer eval primer.eval.json --repo /path/to/repo + +## Sample eval config + +See primer.eval.json for a starter eval config you can customize. diff --git a/examples/primer.eval.json b/examples/primer.eval.json new file mode 100644 index 0000000..1294fb1 --- /dev/null +++ b/examples/primer.eval.json @@ -0,0 +1,15 @@ +{ + "instructionFile": ".github/copilot-instructions.md", + "cases": [ + { + "id": "project-overview", + "prompt": "Summarize what this project does and list the main entry points.", + "expectation": "Should mention the primary purpose and key files/directories." + }, + { + "id": "build-commands", + "prompt": "How do I build and test this project?", + "expectation": "Should provide the correct build and test commands from package.json or equivalent." + } + ] +} diff --git a/package.json b/package.json index 2a15771..bf64dc8 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,17 @@ "name": "primer", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "dist/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "tsc && npm link", + "prepare": "tsc", + "lint": "eslint .", + "format": "prettier --write .", + "format:check": "prettier --check .", + "typecheck": "tsc -p tsconfig.json --noEmit", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage" }, "keywords": [], "author": "", @@ -23,9 +31,19 @@ "devDependencies": { "@types/node": "^25.1.0", "@types/react": "^19.2.10", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "@typescript-eslint/parser": "^8.5.0", + "@vitest/coverage-v8": "^2.1.4", + "eslint": "^9.7.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-n": "^17.10.2", + "eslint-plugin-promise": "^7.1.0", + "prettier": "^3.3.3", "tsup": "^8.5.1", "tsx": "^4.21.0", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "vitest": "^2.1.4" }, "type": "module", "bin": { diff --git a/primer.eval.json b/primer.eval.json index 3b77578..bc1fa99 100644 --- a/primer.eval.json +++ b/primer.eval.json @@ -7,4 +7,4 @@ "expectation": "Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI." } ] -} +} \ No newline at end of file diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..0ef4665 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,9 @@ +{ + "release-type": "node", + "packages": { + ".": { + "package-name": "primer", + "changelog-path": "CHANGELOG.md" + } + } +} diff --git a/release-please-manifest.json b/release-please-manifest.json new file mode 100644 index 0000000..37fcefa --- /dev/null +++ b/release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "1.0.0" +} diff --git a/src/cli.ts b/src/cli.ts index 86bcf74..3a667c1 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -10,6 +10,7 @@ import { evalCommand } from "./commands/eval"; import { tuiCommand } from "./commands/tui"; import { instructionsCommand } from "./commands/instructions"; import { batchCommand } from "./commands/batch"; +import { readinessCommand } from "./commands/readiness"; export function runCli(argv: string[]): void { const program = new Command(); @@ -23,6 +24,7 @@ export function runCli(argv: string[]): void { .command("init") .argument("[path]", "Path to a local repository") .option("--github", "Use a GitHub repository") + .option("--provider ", "Repo provider (github|azure)") .option("--yes", "Accept defaults and skip prompts") .option("--force", "Overwrite existing files") .action(initCommand); @@ -42,8 +44,9 @@ export function runCli(argv: string[]): void { program .command("pr") - .argument("[repo]", "GitHub repo in owner/name form") - .option("--branch ", "Branch name", "primer/add-configs") + .argument("[repo]", "Repo identifier (github: owner/name, azure: org/project/repo)") + .option("--branch ", "Branch name") + .option("--provider ", "Repo provider (github|azure)") .action(prCommand); program @@ -69,10 +72,18 @@ export function runCli(argv: string[]): void { .option("--model ", "Model for instructions generation", "gpt-4.1") .action(instructionsCommand); + program + .command("readiness") + .argument("[path]", "Path to a local repository") + .option("--json", "Output JSON") + .option("--output ", "Write JSON report to file") + .action(readinessCommand); + program .command("batch") .description("Batch process multiple repos across orgs") .option("--output ", "Write results JSON to file") + .option("--provider ", "Repo provider (github|azure)", "github") .action(batchCommand); program.command("templates").action(templatesCommand); diff --git a/src/commands/batch.tsx b/src/commands/batch.tsx index eb69267..bce2c3f 100644 --- a/src/commands/batch.tsx +++ b/src/commands/batch.tsx @@ -2,14 +2,41 @@ import React from "react"; import { render } from "ink"; import { BatchTui } from "../ui/BatchTui"; import { getGitHubToken } from "../services/github"; +import { BatchTuiAzure } from "../ui/BatchTuiAzure"; +import { getAzureDevOpsToken } from "../services/azureDevops"; type BatchOptions = { output?: string; + provider?: string; }; export async function batchCommand(options: BatchOptions): Promise { + const provider = options.provider ?? "github"; + if (provider !== "github" && provider !== "azure") { + console.error("Invalid provider. Use github or azure."); + process.exitCode = 1; + return; + } + + if (provider === "azure") { + const token = getAzureDevOpsToken(); + if (!token) { + console.error("Error: Azure DevOps authentication required."); + console.error(""); + console.error("Set a PAT environment variable:"); + console.error(" export AZURE_DEVOPS_PAT="); + process.exitCode = 1; + return; + } + + const { waitUntilExit } = render( + + ); + await waitUntilExit(); + return; + } + const token = await getGitHubToken(); - if (!token) { console.error("Error: GitHub authentication required."); console.error(""); diff --git a/src/commands/eval.ts b/src/commands/eval.ts index b875f97..bee399d 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -53,7 +53,7 @@ export async function evalCommand(configPathArg: string | undefined, options: Ev const configPath = path.resolve(configPathArg ?? path.join(repoPath, "primer.eval.json")); - const { summary } = await runEval({ + const { summary, viewerPath } = await runEval({ configPath, repoPath, model: options.model ?? "gpt-5", @@ -62,4 +62,7 @@ export async function evalCommand(configPathArg: string | undefined, options: Ev }); console.log(summary); + if (viewerPath) { + console.log(`Trajectory viewer: ${viewerPath}`); + } } diff --git a/src/commands/init.ts b/src/commands/init.ts index 4f22389..2c6ed94 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -4,21 +4,38 @@ import { checkbox, select } from "@inquirer/prompts"; import { analyzeRepo } from "../services/analyzer"; import { generateConfigs } from "../services/generator"; import { GitHubRepo, listAccessibleRepos } from "../services/github"; -import { cloneRepo, isGitRepo } from "../services/git"; +import { + AzureDevOpsOrg, + AzureDevOpsProject, + AzureDevOpsRepo, + getAzureDevOpsToken, + listOrganizations, + listProjects, + listRepos +} from "../services/azureDevops"; +import { buildAuthedUrl, cloneRepo, isGitRepo } from "../services/git"; import { generateCopilotInstructions } from "../services/instructions"; import { ensureDir } from "../utils/fs"; import { prettyPrintSummary } from "../utils/logger"; type InitOptions = { github?: boolean; + provider?: string; yes?: boolean; force?: boolean; }; export async function initCommand(repoPathArg: string | undefined, options: InitOptions): Promise { let repoPath = path.resolve(repoPathArg ?? process.cwd()); + const provider = options.provider ?? (options.github ? "github" : undefined); - if (options.github) { + if (provider && provider !== "github" && provider !== "azure") { + console.error("Invalid provider. Use github or azure."); + process.exitCode = 1; + return; + } + + if (provider === "github") { const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN; if (!token) { console.error("Set GITHUB_TOKEN or GH_TOKEN to use GitHub mode."); @@ -50,6 +67,70 @@ export async function initCommand(repoPathArg: string | undefined, options: Init await cloneRepo(selection.cloneUrl, repoPath); } } + + if (provider === "azure") { + const token = getAzureDevOpsToken(); + if (!token) { + console.error("Set AZURE_DEVOPS_PAT (or AZDO_PAT) to use Azure DevOps mode."); + process.exitCode = 1; + return; + } + + const orgs = await listOrganizations(token); + if (orgs.length === 0) { + console.error("No Azure DevOps organizations found."); + process.exitCode = 1; + return; + } + + const orgSelection = await select({ + message: "Choose an Azure DevOps organization", + choices: orgs.map((org) => ({ + name: org.name, + value: org + })) + }); + + const projects = await listProjects(token, orgSelection.name); + if (projects.length === 0) { + console.error("No Azure DevOps projects found."); + process.exitCode = 1; + return; + } + + const projectSelection = await select({ + message: "Choose an Azure DevOps project", + choices: projects.map((project) => ({ + name: project.name, + value: project + })) + }); + + const repos = await listRepos(token, orgSelection.name, projectSelection.name); + if (repos.length === 0) { + console.error("No Azure DevOps repositories found."); + process.exitCode = 1; + return; + } + + const repoSelection = await select({ + message: "Choose a repository", + choices: repos.map((repo) => ({ + name: `${repo.name}${repo.isPrivate ? " (private)" : ""}`, + value: repo + })) + }); + + const cacheRoot = path.join(process.cwd(), ".primer-cache"); + repoPath = path.join(cacheRoot, orgSelection.name, projectSelection.name, repoSelection.name); + await ensureDir(repoPath); + + const hasGit = await isGitRepo(repoPath); + if (!hasGit) { + const authedUrl = buildAuthedUrl(repoSelection.cloneUrl, token, "azure"); + await cloneRepo(authedUrl, repoPath); + } + } const analysis = await analyzeRepo(repoPath); prettyPrintSummary(analysis); diff --git a/src/commands/pr.ts b/src/commands/pr.ts index d8ce79b..7050840 100644 --- a/src/commands/pr.ts +++ b/src/commands/pr.ts @@ -1,21 +1,88 @@ import path from "path"; +import fs from "fs/promises"; import { analyzeRepo } from "../services/analyzer"; import { generateConfigs } from "../services/generator"; import { createPullRequest, getRepo } from "../services/github"; -import { checkoutBranch, cloneRepo, commitAll, isGitRepo, pushBranch } from "../services/git"; +import { generateCopilotInstructions } from "../services/instructions"; +import { + createPullRequest as createAzurePullRequest, + getAzureDevOpsToken, + getRepo as getAzureRepo +} from "../services/azureDevops"; +import { buildAuthedUrl, checkoutBranch, cloneRepo, commitAll, isGitRepo, pushBranch } from "../services/git"; import { ensureDir } from "../utils/fs"; type PrOptions = { branch?: string; + provider?: string; }; export async function prCommand(repo: string | undefined, options: PrOptions): Promise { + const provider = options.provider ?? "github"; + if (provider !== "github" && provider !== "azure") { + console.error("Invalid provider. Use github or azure."); + process.exitCode = 1; + return; + } + if (!repo) { - console.error("Provide a repo in owner/name form."); + console.error("Provide a repo identifier (github: owner/name, azure: org/project/repo)."); process.exitCode = 1; return; } + if (provider === "azure") { + const token = getAzureDevOpsToken(); + if (!token) { + console.error("Set AZURE_DEVOPS_PAT (or AZDO_PAT) to use Azure DevOps PR automation."); + process.exitCode = 1; + return; + } + + const [organization, project, name] = repo.split("/"); + if (!organization || !project || !name) { + console.error("Invalid Azure DevOps repo format. Use org/project/repo."); + process.exitCode = 1; + return; + } + + const repoInfo = await getAzureRepo(token, organization, project, name); + const cacheRoot = path.join(process.cwd(), ".primer-cache"); + const repoPath = path.join(cacheRoot, organization, project, name); + await ensureDir(repoPath); + + if (!(await isGitRepo(repoPath))) { + const authedUrl = buildAuthedUrl(repoInfo.cloneUrl, token, "azure"); + await cloneRepo(authedUrl, repoPath); + } + + const branch = options.branch ?? "primer/add-instructions"; + await checkoutBranch(repoPath, branch); + + const instructions = await generateCopilotInstructions({ repoPath, model: "gpt-4.1" }); + const instructionsPath = path.join(repoPath, ".github", "copilot-instructions.md"); + await ensureDir(path.dirname(instructionsPath)); + await fs.writeFile(instructionsPath, instructions, "utf8"); + + await commitAll(repoPath, "chore: add copilot instructions via Primer"); + await pushBranch(repoPath, branch, token, "azure"); + + const prUrl = await createAzurePullRequest({ + token, + organization, + project, + repoId: repoInfo.id, + repoName: repoInfo.name, + title: "🤖 Add Copilot instructions via Primer", + body: buildInstructionsPrBody(), + sourceBranch: branch, + targetBranch: repoInfo.defaultBranch + }); + + console.log(`Created PR: ${prUrl}`); + return; + } + const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN; if (!token) { console.error("Set GITHUB_TOKEN or GH_TOKEN to use PR automation."); @@ -89,3 +156,29 @@ function buildPrBody(): string { "*Generated by Primer*" ].join("\n"); } + +function buildInstructionsPrBody(): string { + return [ + "## 🤖 Copilot Instructions Added", + "", + "This PR adds a `.github/copilot-instructions.md` file to help GitHub Copilot understand this codebase better.", + "", + "### What's Included", + "", + "The instructions file contains:", + "- Project overview and architecture", + "- Tech stack and conventions", + "- Build/test commands", + "- Key directories and files", + "", + "### Benefits", + "", + "With these instructions, Copilot will:", + "- Generate more contextually-aware code suggestions", + "- Follow project-specific patterns and conventions", + "- Understand the codebase structure", + "", + "---", + "*Generated by [Primer](https://github.com/pierceboggan/primer) - Prime your repos for AI*" + ].join("\n"); +} diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts new file mode 100644 index 0000000..c2b65fa --- /dev/null +++ b/src/commands/readiness.ts @@ -0,0 +1,120 @@ +import path from "path"; +import fs from "fs/promises"; +import chalk from "chalk"; +import { + ReadinessReport, + ReadinessCriterionResult, + runReadinessReport +} from "../services/readiness"; + +type ReadinessOptions = { + json?: boolean; + output?: string; +}; + +export async function readinessCommand(repoPathArg: string | undefined, options: ReadinessOptions): Promise { + const repoPath = path.resolve(repoPathArg ?? process.cwd()); + const report = await runReadinessReport({ repoPath }); + + if (options.output) { + const outputPath = path.resolve(options.output); + await fs.writeFile(outputPath, JSON.stringify(report, null, 2), "utf8"); + } + + if (options.json) { + console.log(JSON.stringify(report, null, 2)); + return; + } + + printReadinessChecklist(report); +} + +function printReadinessChecklist(report: ReadinessReport): void { + console.log(chalk.bold("Readiness report")); + console.log(`- Repo: ${report.repoPath}`); + console.log(`- Monorepo: ${report.isMonorepo ? "yes" : "no"}${report.apps.length ? ` (${report.apps.length} apps)` : ""}`); + console.log(`- Level: ${report.achievedLevel || 1} (${levelName(report.achievedLevel || 1)})`); + + console.log(chalk.bold("\nPillars")); + for (const pillar of report.pillars) { + const rate = formatPercent(pillar.passRate); + const icon = pillar.passRate >= 0.8 ? chalk.green("●") : chalk.yellow("●"); + console.log(`${icon} ${pillar.name}: ${pillar.passed}/${pillar.total} (${rate})`); + } + + console.log(chalk.bold("\nFix first")); + const fixes = rankFixes(report.criteria); + if (!fixes.length) { + console.log(chalk.green("✔ No failing criteria detected.")); + } else { + for (const fix of fixes) { + const impact = colorImpact(fix.impact); + const effort = colorEffort(fix.effort); + const scope = fix.scope === "app" ? "app" : "repo"; + const detail = fix.appSummary + ? ` (${fix.appSummary.passed}/${fix.appSummary.total} apps)` + : ""; + console.log(`- ${impact} impact / ${effort} effort • ${fix.title}${detail} [${scope}]`); + if (fix.reason) { + console.log(` ${chalk.dim(fix.reason)}`); + } + if (fix.appFailures?.length) { + console.log(` ${chalk.dim(`Apps: ${fix.appFailures.join(", ")}`)}`); + } + } + } + + if (report.extras.length) { + console.log(chalk.bold("\nAI readiness extras")); + for (const extra of report.extras) { + const icon = extra.status === "pass" ? chalk.green("✔") : chalk.red("✖"); + console.log(`${icon} ${extra.title}`); + } + } +} + +function rankFixes(criteria: ReadinessCriterionResult[]): ReadinessCriterionResult[] { + return criteria + .filter((criterion) => criterion.status === "fail") + .sort((a, b) => { + const impactDelta = impactWeight(b.impact) - impactWeight(a.impact); + if (impactDelta !== 0) return impactDelta; + return effortWeight(a.effort) - effortWeight(b.effort); + }); +} + +function impactWeight(value: "high" | "medium" | "low"): number { + if (value === "high") return 3; + if (value === "medium") return 2; + return 1; +} + +function effortWeight(value: "low" | "medium" | "high"): number { + if (value === "low") return 1; + if (value === "medium") return 2; + return 3; +} + +function colorImpact(value: "high" | "medium" | "low"): string { + if (value === "high") return chalk.red("High"); + if (value === "medium") return chalk.yellow("Medium"); + return chalk.green("Low"); +} + +function colorEffort(value: "low" | "medium" | "high"): string { + if (value === "high") return chalk.red("High"); + if (value === "medium") return chalk.yellow("Medium"); + return chalk.green("Low"); +} + +function formatPercent(value: number): string { + return `${Math.round(value * 100)}%`; +} + +function levelName(level: number): string { + if (level === 2) return "Documented"; + if (level === 3) return "Standardized"; + if (level === 4) return "Optimized"; + if (level === 5) return "Autonomous"; + return "Functional"; +} \ No newline at end of file diff --git a/src/services/__tests__/analyzer.test.ts b/src/services/__tests__/analyzer.test.ts new file mode 100644 index 0000000..724678f --- /dev/null +++ b/src/services/__tests__/analyzer.test.ts @@ -0,0 +1,31 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; +import { describe, expect, it } from "vitest"; + +import { analyzeRepo } from "../analyzer"; + +describe("analyzeRepo", () => { + it("detects TypeScript and npm workspace", async () => { + const repoPath = await fs.mkdtemp(path.join(os.tmpdir(), "primer-test-")); + const packageJson = { + name: "demo", + workspaces: ["packages/*"], + dependencies: { react: "^19.0.0" } + }; + + await fs.writeFile(path.join(repoPath, "package.json"), JSON.stringify(packageJson, null, 2)); + await fs.writeFile(path.join(repoPath, "tsconfig.json"), "{}", "utf8"); + await fs.mkdir(path.join(repoPath, "packages", "app"), { recursive: true }); + await fs.writeFile( + path.join(repoPath, "packages", "app", "package.json"), + JSON.stringify({ name: "app", scripts: { build: "tsc" } }, null, 2) + ); + + const result = await analyzeRepo(repoPath); + + expect(result.languages).toContain("TypeScript"); + expect(result.workspaceType).toBe("npm"); + expect(result.apps?.length).toBe(1); + }); +}); diff --git a/src/services/analyzer.ts b/src/services/analyzer.ts index bd1b28a..a9e0566 100644 --- a/src/services/analyzer.ts +++ b/src/services/analyzer.ts @@ -1,13 +1,26 @@ import fs from "fs/promises"; import path from "path"; +import fg from "fast-glob"; import { isGitRepo } from "./git"; +export type RepoApp = { + name: string; + path: string; + packageJsonPath: string; + scripts: Record; + hasTsConfig: boolean; +}; + export type RepoAnalysis = { path: string; isGitRepo: boolean; languages: string[]; frameworks: string[]; packageManager?: string; + isMonorepo?: boolean; + workspaceType?: "npm" | "pnpm" | "yarn"; + workspacePatterns?: string[]; + apps?: RepoApp[]; }; const PACKAGE_MANAGERS: Array<{ file: string; name: string }> = [ @@ -41,15 +54,27 @@ export async function analyzeRepo(repoPath: string): Promise { analysis.packageManager = await detectPackageManager(repoPath, files); + let rootPackageJson: Record | undefined; + if (hasPackageJson) { - const packageJson = await readJson(path.join(repoPath, "package.json")); + rootPackageJson = await readJson(path.join(repoPath, "package.json")); const deps = Object.keys({ - ...(packageJson?.dependencies ?? {}), - ...(packageJson?.devDependencies ?? {}) + ...(rootPackageJson?.dependencies ?? {}), + ...(rootPackageJson?.devDependencies ?? {}) }); analysis.frameworks.push(...detectFrameworks(deps, files)); } + const workspace = await detectWorkspace(repoPath, files, rootPackageJson); + if (workspace) { + analysis.workspaceType = workspace.type; + analysis.workspacePatterns = workspace.patterns; + } + + const apps = await resolveWorkspaceApps(repoPath, workspace?.patterns ?? [], rootPackageJson); + analysis.apps = apps; + analysis.isMonorepo = apps.length > 1; + analysis.languages = unique(analysis.languages); analysis.frameworks = unique(analysis.frameworks); @@ -99,6 +124,117 @@ async function readJson(filePath: string): Promise | und } } +type WorkspaceConfig = { + type: "npm" | "pnpm" | "yarn"; + patterns: string[]; +}; + +async function detectWorkspace( + repoPath: string, + files: string[], + packageJson?: Record +): Promise { + if (files.includes("pnpm-workspace.yaml")) { + const patterns = await readPnpmWorkspace(path.join(repoPath, "pnpm-workspace.yaml")); + if (patterns.length) return { type: "pnpm", patterns }; + } + + const workspaces = packageJson?.workspaces; + if (Array.isArray(workspaces)) { + return { type: files.includes("yarn.lock") ? "yarn" : "npm", patterns: workspaces.map(String) }; + } + + if (workspaces && typeof workspaces === "object") { + const packages = (workspaces as { packages?: unknown }).packages; + if (Array.isArray(packages)) { + return { type: files.includes("yarn.lock") ? "yarn" : "npm", patterns: packages.map(String) }; + } + } + + return undefined; +} + +async function readPnpmWorkspace(filePath: string): Promise { + try { + const raw = await fs.readFile(filePath, "utf8"); + const lines = raw.split(/\r?\n/u); + const patterns: string[] = []; + let inPackages = false; + for (const line of lines) { + if (!inPackages && /^\s*packages\s*:/u.test(line)) { + inPackages = true; + continue; + } + if (inPackages) { + const match = line.match(/^\s*-\s*(.+)$/u); + if (match?.[1]) { + patterns.push(match[1].trim().replace(/^['"]|['"]$/gu, "")); + continue; + } + if (/^\S/u.test(line)) break; + } + } + return patterns; + } catch { + return []; + } +} + +async function resolveWorkspaceApps( + repoPath: string, + patterns: string[], + rootPackageJson?: Record +): Promise { + const workspacePatterns = patterns + .map((pattern) => pattern.replace(/\\/gu, "/")) + .map((pattern) => (pattern.endsWith("package.json") ? pattern : path.posix.join(pattern, "package.json"))); + + const packageJsonPaths = workspacePatterns.length + ? await fg(workspacePatterns, { cwd: repoPath, absolute: true, onlyFiles: true, dot: false }) + : []; + + if (!packageJsonPaths.length && rootPackageJson) { + const rootPath = path.join(repoPath, "package.json"); + return [await buildRepoApp(repoPath, rootPath, rootPackageJson)]; + } + + const apps = await Promise.all( + packageJsonPaths.map(async (pkgPath) => { + const pkg = await readJson(pkgPath); + return buildRepoApp(path.dirname(pkgPath), pkgPath, pkg); + }) + ); + + return apps.filter(Boolean) as RepoApp[]; +} + +async function buildRepoApp( + appPath: string, + packageJsonPath: string, + packageJson?: Record +): Promise { + const scripts = (packageJson?.scripts ?? {}) as Record; + const name = typeof packageJson?.name === "string" ? packageJson.name : path.basename(appPath); + const hasTsConfig = await fileExists(path.join(appPath, "tsconfig.json")); + + return { + name, + path: appPath, + packageJsonPath, + scripts, + hasTsConfig + }; +} + +async function fileExists(filePath: string): Promise { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } +} + function unique(items: T[]): T[] { return Array.from(new Set(items)); } diff --git a/src/services/azureDevops.ts b/src/services/azureDevops.ts new file mode 100644 index 0000000..bebe975 --- /dev/null +++ b/src/services/azureDevops.ts @@ -0,0 +1,235 @@ +type AzureDevOpsProfileResponse = { + id: string; + displayName: string; +}; + +type AzureDevOpsAccountResponse = { + accountId: string; + accountName: string; + accountUri: string; +}; + +type AzureDevOpsListResponse = { + value: T[]; +}; + +type AzureDevOpsProjectResponse = { + id: string; + name: string; + url: string; +}; + +type AzureDevOpsRepoResponse = { + id: string; + name: string; + webUrl: string; + remoteUrl: string; + isPrivate: boolean; + defaultBranch?: string; + project?: { + id: string; + name: string; + }; +}; + +export type AzureDevOpsOrg = { + id: string; + name: string; + url: string; +}; + +export type AzureDevOpsProject = { + id: string; + name: string; + organization: string; + url: string; +}; + +export type AzureDevOpsRepo = { + id: string; + name: string; + organization: string; + project: string; + projectId: string; + webUrl: string; + cloneUrl: string; + isPrivate: boolean; + defaultBranch: string; + hasInstructions?: boolean; +}; + +const PROFILE_URL = "https://app.vssps.visualstudio.com/_apis/profile/profiles/me?api-version=7.1-preview.1"; + +function getAuthHeader(token: string): string { + const encoded = Buffer.from(`:${token}`).toString("base64"); + return `Basic ${encoded}`; +} + +async function adoRequest(url: string, token: string, init?: RequestInit): Promise { + const response = await fetch(url, { + ...init, + headers: { + "Content-Type": "application/json", + Authorization: getAuthHeader(token), + ...(init?.headers ?? {}) + } + }); + + if (!response.ok) { + const text = await response.text(); + throw new Error(`Azure DevOps request failed (${response.status}): ${text}`); + } + + return (await response.json()) as T; +} + +export function getAzureDevOpsToken(): string | null { + return process.env.AZURE_DEVOPS_PAT ?? process.env.AZDO_PAT ?? null; +} + +export async function listOrganizations(token: string): Promise { + const profile = await adoRequest(PROFILE_URL, token); + const accountsUrl = `https://app.vssps.visualstudio.com/_apis/accounts?memberId=${profile.id}&api-version=7.1-preview.1`; + const accounts = await adoRequest>(accountsUrl, token); + + return accounts.value.map((account) => ({ + id: account.accountId, + name: account.accountName, + url: account.accountUri + })); +} + +export async function listProjects(token: string, organization: string): Promise { + const url = `https://dev.azure.com/${organization}/_apis/projects?stateFilter=wellFormed&api-version=7.1-preview.1`; + const response = await adoRequest>(url, token); + + return response.value.map((project) => ({ + id: project.id, + name: project.name, + organization, + url: project.url + })); +} + +export async function listRepos(token: string, organization: string, project: string): Promise { + const url = `https://dev.azure.com/${organization}/${project}/_apis/git/repositories?api-version=7.1-preview.1`; + const response = await adoRequest>(url, token); + + return response.value.map((repo) => ({ + id: repo.id, + name: repo.name, + organization, + project, + projectId: repo.project?.id ?? "", + webUrl: repo.webUrl, + cloneUrl: repo.remoteUrl, + isPrivate: repo.isPrivate, + defaultBranch: repo.defaultBranch ?? "refs/heads/main" + })); +} + +export async function getRepo( + token: string, + organization: string, + project: string, + repo: string +): Promise { + const url = `https://dev.azure.com/${organization}/${project}/_apis/git/repositories/${repo}?api-version=7.1-preview.1`; + const response = await adoRequest(url, token); + + return { + id: response.id, + name: response.name, + organization, + project, + projectId: response.project?.id ?? "", + webUrl: response.webUrl, + cloneUrl: response.remoteUrl, + isPrivate: response.isPrivate, + defaultBranch: response.defaultBranch ?? "refs/heads/main" + }; +} + +function toRefName(branch: string): string { + if (branch.startsWith("refs/")) return branch; + return `refs/heads/${branch}`; +} + +export async function createPullRequest(params: { + token: string; + organization: string; + project: string; + repoId: string; + repoName: string; + title: string; + body: string; + sourceBranch: string; + targetBranch: string; +}): Promise { + const url = `https://dev.azure.com/${params.organization}/${params.project}/_apis/git/repositories/${params.repoId}/pullrequests?api-version=7.1-preview.1`; + const payload = { + title: params.title, + description: params.body, + sourceRefName: toRefName(params.sourceBranch), + targetRefName: toRefName(params.targetBranch) + }; + + const response = await adoRequest<{ pullRequestId: number }>(url, params.token, { + method: "POST", + body: JSON.stringify(payload) + }); + + return `https://dev.azure.com/${params.organization}/${params.project}/_git/${encodeURIComponent( + params.repoName + )}/pullrequest/${response.pullRequestId}`; +} + +export async function checkRepoHasInstructions( + token: string, + organization: string, + project: string, + repoId: string +): Promise { + const url = `https://dev.azure.com/${organization}/${project}/_apis/git/repositories/${repoId}/items?path=/.github/copilot-instructions.md&includeContentMetadata=true&api-version=7.1-preview.1`; + const response = await fetch(url, { + headers: { + Authorization: getAuthHeader(token) + } + }); + + if (response.status === 404) { + return false; + } + + return response.ok; +} + +export async function checkReposForInstructions( + token: string, + repos: AzureDevOpsRepo[], + onProgress?: (checked: number, total: number) => void +): Promise { + const concurrency = 10; + const results: AzureDevOpsRepo[] = []; + let checked = 0; + + for (let i = 0; i < repos.length; i += concurrency) { + const batch = repos.slice(i, i + concurrency); + const checks = await Promise.all( + batch.map(async (repo) => { + const hasInstructions = await checkRepoHasInstructions( + token, + repo.organization, + repo.project, + repo.id + ); + return { ...repo, hasInstructions }; + }) + ); + results.push(...checks); + checked += batch.length; + onProgress?.(checked, repos.length); + } + + return results; +} \ No newline at end of file diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index 6a30001..adddce6 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -15,6 +15,7 @@ type EvalConfig = { instructionFile?: string; cases: EvalCase[]; systemMessage?: string; + outputPath?: string; }; type EvalRunOptions = { @@ -26,6 +27,40 @@ type EvalRunOptions = { onProgress?: (message: string) => void; }; +type TokenUsage = { + promptTokens?: number; + completionTokens?: number; + totalTokens?: number; +}; + +type ToolCallSummary = { + count: number; + byName: Record; + totalDurationMs: number; +}; + +type AskMetrics = { + durationMs: number; + tokenUsage?: TokenUsage; + toolCalls: ToolCallSummary; +}; + +type EvalMetrics = { + withoutInstructions: AskMetrics; + withInstructions: AskMetrics; + judge: AskMetrics; + totalDurationMs: number; +}; + +type EvalPhase = "withoutInstructions" | "withInstructions" | "judge"; + +type TrajectoryEvent = { + timestampMs: number; + phase: EvalPhase; + type: string; + data?: Record; +}; + export type EvalResult = { id: string; prompt: string; @@ -35,14 +70,18 @@ export type EvalResult = { verdict?: "pass" | "fail" | "unknown"; score?: number; rationale?: string; + metrics?: EvalMetrics; + trajectory?: TrajectoryEvent[]; }; -export async function runEval(options: EvalRunOptions): Promise<{ summary: string; results: EvalResult[] }> { +export async function runEval(options: EvalRunOptions): Promise<{ summary: string; results: EvalResult[]; viewerPath?: string }> { const config = await loadConfig(options.configPath); const instructionFile = config.instructionFile ?? ".github/copilot-instructions.md"; const instructionPath = path.resolve(options.repoPath, instructionFile); const instructionText = await readOptionalFile(instructionPath); const progress = options.onProgress ?? (() => {}); + const outputPath = resolveOutputPath(options.repoPath, options.outputPath, config.outputPath); + const runStartedAt = Date.now(); progress("Starting Copilot SDK..."); const cliPath = await findCopilotCliPath(); @@ -56,19 +95,22 @@ export async function runEval(options: EvalRunOptions): Promise<{ summary: strin for (const [index, testCase] of config.cases.entries()) { const id = testCase.id ?? `case-${index + 1}`; const prompt = buildPrompt(options.repoPath, testCase.prompt); + const caseStartedAt = Date.now(); progress(`Running eval ${index + 1}/${total}: ${id} (without instructions)...`); - const withoutInstructions = await askOnce(client, { + const withoutResult = await askOnce(client, { prompt, model: options.model, - systemMessage: config.systemMessage + systemMessage: config.systemMessage, + phase: "withoutInstructions" }); progress(`Running eval ${index + 1}/${total}: ${id} (with instructions)...`); - const withInstructions = await askOnce(client, { + const withResult = await askOnce(client, { prompt, model: options.model, - systemMessage: [config.systemMessage, instructionText].filter(Boolean).join("\n\n") + systemMessage: [config.systemMessage, instructionText].filter(Boolean).join("\n\n"), + phase: "withInstructions" }); progress(`Running eval ${index + 1}/${total}: ${id} (judging)...`); @@ -76,36 +118,60 @@ export async function runEval(options: EvalRunOptions): Promise<{ summary: strin model: options.judgeModel, prompt: testCase.prompt, expectation: testCase.expectation, - withoutInstructions, - withInstructions + withoutInstructions: withoutResult.content, + withInstructions: withResult.content }); + const metrics: EvalMetrics = { + withoutInstructions: withoutResult.metrics, + withInstructions: withResult.metrics, + judge: judgment.metrics, + totalDurationMs: Date.now() - caseStartedAt + }; + + const trajectory = [ + ...withoutResult.trajectory, + ...withResult.trajectory, + ...judgment.trajectory + ]; + results.push({ id, prompt: testCase.prompt, expectation: testCase.expectation, - withInstructions, - withoutInstructions, - verdict: judgment.verdict, - score: judgment.score, - rationale: judgment.rationale + withInstructions: withResult.content, + withoutInstructions: withoutResult.content, + verdict: judgment.result.verdict, + score: judgment.result.score, + rationale: judgment.result.rationale, + metrics, + trajectory }); - progress(`Eval ${index + 1}/${total}: ${id} → ${judgment.verdict} (score: ${judgment.score})`); + progress(`Eval ${index + 1}/${total}: ${id} → ${judgment.result.verdict} (score: ${judgment.result.score})`); } - if (options.outputPath) { - const output = { - repoPath: options.repoPath, - model: options.model, - judgeModel: options.judgeModel, - results - }; - await fs.writeFile(options.outputPath, JSON.stringify(output, null, 2), "utf8"); + const runFinishedAt = Date.now(); + const output = { + repoPath: options.repoPath, + model: options.model, + judgeModel: options.judgeModel, + runMetrics: { + startedAt: new Date(runStartedAt).toISOString(), + finishedAt: new Date(runFinishedAt).toISOString(), + durationMs: runFinishedAt - runStartedAt + }, + results + }; + let viewerPath: string | undefined; + if (outputPath) { + await fs.writeFile(outputPath, JSON.stringify(output, null, 2), "utf8"); + viewerPath = buildViewerPath(outputPath); + await fs.writeFile(viewerPath, buildTrajectoryViewerHtml(output), "utf8"); } - const summary = formatSummary(results); - return { summary, results }; + const summary = formatSummary(results, runFinishedAt - runStartedAt); + return { summary, results, viewerPath }; } finally { await client.stop(); } @@ -115,12 +181,19 @@ type AskOptions = { prompt: string; model: string; systemMessage?: string; + phase: EvalPhase; +}; + +type AskResult = { + content: string; + metrics: AskMetrics; + trajectory: TrajectoryEvent[]; }; async function askOnce( client: { createSession: (config?: Record) => Promise }, options: AskOptions -): Promise { +): Promise { const session = await client.createSession({ model: options.model, streaming: true, @@ -131,7 +204,10 @@ async function askOnce( }); let content = ""; + const telemetry = createTelemetry(options.phase); + const startedAt = Date.now(); session.on((event: { type: string; data?: Record }) => { + captureTelemetryEvent(event, telemetry); if (event.type === "assistant.message_delta") { const delta = event.data?.deltaContent as string | undefined; if (delta) content += delta; @@ -140,7 +216,16 @@ async function askOnce( await session.sendAndWait({ prompt: options.prompt }, 120000); await session.destroy(); - return content.trim(); + const finishedAt = Date.now(); + return { + content: content.trim(), + metrics: { + durationMs: finishedAt - startedAt, + tokenUsage: normalizeTokenUsage(telemetry.tokenUsage), + toolCalls: telemetry.toolCalls + }, + trajectory: telemetry.trajectory + }; } type JudgeOptions = { @@ -160,7 +245,7 @@ type JudgeResult = { async function judge( client: { createSession: (config?: Record) => Promise }, options: JudgeOptions -): Promise { +): Promise<{ result: JudgeResult; metrics: AskMetrics; trajectory: TrajectoryEvent[] }> { const session = await client.createSession({ model: options.model, streaming: true, @@ -171,7 +256,10 @@ async function judge( }); let content = ""; + const telemetry = createTelemetry("judge"); + const startedAt = Date.now(); session.on((event: { type: string; data?: Record }) => { + captureTelemetryEvent(event, telemetry); if (event.type === "assistant.message_delta") { const delta = event.data?.deltaContent as string | undefined; if (delta) content += delta; @@ -195,7 +283,16 @@ async function judge( await session.sendAndWait({ prompt }, 120000); await session.destroy(); - return parseJudge(content); + const finishedAt = Date.now(); + return { + result: parseJudge(content), + metrics: { + durationMs: finishedAt - startedAt, + tokenUsage: normalizeTokenUsage(telemetry.tokenUsage), + toolCalls: telemetry.toolCalls + }, + trajectory: telemetry.trajectory + }; } function parseJudge(content: string): JudgeResult { @@ -271,14 +368,18 @@ function buildPrompt(repoPath: string, userPrompt: string): string { ].join("\n"); } -function formatSummary(results: EvalResult[]): string { +function formatSummary(results: EvalResult[], runDurationMs: number): string { const total = results.length; const passed = results.filter((r) => r.verdict === "pass").length; const failed = results.filter((r) => r.verdict === "fail").length; const unknown = results.filter((r) => r.verdict === "unknown").length; + const totalUsage = aggregateTokenUsage(results); + const hasUsage = Boolean(totalUsage.promptTokens || totalUsage.completionTokens || totalUsage.totalTokens); const lines = [ - `Eval results: ${passed}/${total} pass, ${failed} fail, ${unknown} unknown.` + `Eval results: ${passed}/${total} pass, ${failed} fail, ${unknown} unknown.`, + `Runtime: ${formatDuration(runDurationMs)}.`, + hasUsage ? `Token usage: ${formatTokenUsage(totalUsage)}.` : "Token usage: unavailable." ]; for (const result of results) { @@ -289,3 +390,305 @@ function formatSummary(results: EvalResult[]): string { return `\n${lines.join("\n")}`; } + +type TelemetryCollector = { + trajectory: TrajectoryEvent[]; + tokenUsage: TokenUsage; + toolCalls: ToolCallSummary; + toolCallMap: Map; + phase: EvalPhase; +}; + +function createTelemetry(phase: EvalPhase): TelemetryCollector { + return { + trajectory: [], + tokenUsage: {}, + toolCalls: { count: 0, byName: {}, totalDurationMs: 0 }, + toolCallMap: new Map(), + phase + }; +} + +function captureTelemetryEvent( + event: { type: string; data?: Record }, + telemetry: TelemetryCollector +): void { + const timestampMs = Date.now(); + telemetry.trajectory.push({ + timestampMs, + phase: telemetry.phase, + type: event.type, + data: sanitizeEventData(event.data) + }); + + if (event.type === "tool.execution_start") { + const toolName = (event.data?.toolName as string | undefined) ?? "unknown"; + const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size); + telemetry.toolCallMap.set(toolId, { name: toolName, startMs: timestampMs }); + telemetry.toolCalls.count += 1; + telemetry.toolCalls.byName[toolName] = (telemetry.toolCalls.byName[toolName] ?? 0) + 1; + } else if (event.type === "tool.execution_finish" || event.type === "tool.execution_error") { + const toolName = (event.data?.toolName as string | undefined) ?? "unknown"; + const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size); + const entry = telemetry.toolCallMap.get(toolId) ?? findLatestToolByName(telemetry.toolCallMap, toolName); + if (entry) { + const durationMs = timestampMs - entry.startMs; + telemetry.toolCalls.totalDurationMs += durationMs; + telemetry.toolCallMap.delete(toolId); + } + } + + const usage = extractTokenUsage(event.data); + if (usage) { + telemetry.tokenUsage = mergeTokenUsage(telemetry.tokenUsage, usage); + } +} + +function resolveToolId( + data: Record | undefined, + toolName: string, + index: number +): string { + const rawId = data?.executionId ?? data?.toolCallId ?? data?.callId ?? data?.id; + if (typeof rawId === "string" || typeof rawId === "number") { + return String(rawId); + } + return `${toolName}-${index + 1}`; +} + +function findLatestToolByName( + map: Map, + toolName: string +): { name?: string; startMs: number } | undefined { + const entries = Array.from(map.values()).filter((entry) => entry.name === toolName); + return entries.at(-1); +} + +function extractTokenUsage(data: Record | undefined): TokenUsage | null { + if (!data) return null; + const usage = (data.usage ?? data.tokenUsage ?? data.tokens) as Record | undefined; + const promptTokens = getNumber(usage?.prompt_tokens ?? usage?.promptTokens ?? data.promptTokens ?? data.inputTokens); + const completionTokens = getNumber(usage?.completion_tokens ?? usage?.completionTokens ?? data.completionTokens ?? data.outputTokens); + const totalTokens = getNumber(usage?.total_tokens ?? usage?.totalTokens ?? data.totalTokens); + + if (promptTokens == null && completionTokens == null && totalTokens == null) { + return null; + } + + return { + promptTokens: promptTokens ?? undefined, + completionTokens: completionTokens ?? undefined, + totalTokens: totalTokens ?? undefined + }; +} + +function getNumber(value: unknown): number | null { + if (typeof value === "number" && Number.isFinite(value)) return value; + if (typeof value === "string" && value.trim()) { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : null; + } + return null; +} + +function mergeTokenUsage(existing: TokenUsage, next: TokenUsage): TokenUsage { + return { + promptTokens: Math.max(existing.promptTokens ?? 0, next.promptTokens ?? 0) || undefined, + completionTokens: Math.max(existing.completionTokens ?? 0, next.completionTokens ?? 0) || undefined, + totalTokens: Math.max(existing.totalTokens ?? 0, next.totalTokens ?? 0) || undefined + }; +} + +function normalizeTokenUsage(usage: TokenUsage): TokenUsage | undefined { + if (!usage.promptTokens && !usage.completionTokens && !usage.totalTokens) return undefined; + return usage; +} + +function aggregateTokenUsage(results: EvalResult[]): TokenUsage { + const total: TokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 }; + for (const result of results) { + const metrics = result.metrics; + if (!metrics) continue; + const usages = [metrics.withoutInstructions.tokenUsage, metrics.withInstructions.tokenUsage, metrics.judge.tokenUsage]; + for (const usage of usages) { + if (!usage) continue; + total.promptTokens = (total.promptTokens ?? 0) + (usage.promptTokens ?? 0); + total.completionTokens = (total.completionTokens ?? 0) + (usage.completionTokens ?? 0); + total.totalTokens = (total.totalTokens ?? 0) + (usage.totalTokens ?? 0); + } + } + return total; +} + +function formatDuration(durationMs: number): string { + const seconds = Math.round(durationMs / 100) / 10; + if (seconds < 60) return `${seconds}s`; + const minutes = Math.floor(seconds / 60); + const remaining = Math.round((seconds % 60) * 10) / 10; + return `${minutes}m ${remaining}s`; +} + +function formatTokenUsage(usage: TokenUsage): string { + const prompt = usage.promptTokens ?? 0; + const completion = usage.completionTokens ?? 0; + const total = usage.totalTokens ?? prompt + completion; + return `prompt ${prompt}, completion ${completion}, total ${total}`; +} + +function resolveOutputPath(repoPath: string, override?: string, configValue?: string): string | undefined { + const chosen = override ?? configValue; + if (!chosen) return undefined; + return path.isAbsolute(chosen) ? chosen : path.resolve(repoPath, chosen); +} + +function buildViewerPath(outputPath: string): string { + if (outputPath.endsWith(".json")) { + return outputPath.replace(/\.json$/u, ".html"); + } + return `${outputPath}.html`; +} + +function buildTrajectoryViewerHtml(data: Record): string { + const serialized = JSON.stringify(data).replace(/ + + + + + Primer Eval Trajectory + + + +

Primer Eval Trajectory

+
+
+
+
+
+ + +`; +} + +function sanitizeEventData(data: Record | undefined): Record | undefined { + if (!data) return undefined; + const sanitized: Record = {}; + for (const [key, value] of Object.entries(data)) { + if (key === "deltaContent" && typeof value === "string") { + sanitized.deltaChars = value.length; + sanitized.deltaPreview = value.slice(0, 120); + continue; + } + sanitized[key] = sanitizeValue(value, 0); + } + return sanitized; +} + +function sanitizeValue(value: unknown, depth: number): unknown { + if (depth > 4) return "[depth-limit]"; + if (typeof value === "string") { + return value.length > 2000 ? `${value.slice(0, 2000)}…` : value; + } + if (Array.isArray(value)) { + return value.slice(0, 50).map((entry) => sanitizeValue(entry, depth + 1)); + } + if (value && typeof value === "object") { + const obj: Record = {}; + for (const [key, entry] of Object.entries(value as Record)) { + obj[key] = sanitizeValue(entry, depth + 1); + } + return obj; + } + return value; +} diff --git a/src/services/git.ts b/src/services/git.ts index a8b1e79..5eceb3a 100644 --- a/src/services/git.ts +++ b/src/services/git.ts @@ -65,6 +65,8 @@ export async function commitAll(repoPath: string, message: string): Promise { +export function buildAuthedUrl(url: string, token: string, provider: AuthProvider): string { + const normalizedUrl = normalizeGitUrl(url); + if (!normalizedUrl.startsWith("https://")) return normalizedUrl; + if (provider === "azure") { + return normalizedUrl.replace("https://", `https://pat:${token}@`); + } + return normalizedUrl.replace("https://", `https://x-access-token:${token}@`); +} + +export async function pushBranch( + repoPath: string, + branch: string, + token?: string, + provider: AuthProvider = "github" +): Promise { const git = simpleGit(repoPath); if (token) { @@ -85,7 +103,7 @@ export async function pushBranch(repoPath: string, branch: string, token?: strin const remoteUrl = (await git.remote(["get-url", "origin"])) ?? ""; const normalizedUrl = normalizeGitUrl(remoteUrl); if (normalizedUrl.startsWith("https://")) { - const authedUrl = normalizedUrl.replace("https://", `https://x-access-token:${token}@`); + const authedUrl = buildAuthedUrl(normalizedUrl, token, provider); await git.remote(["set-url", "origin", authedUrl]); try { await git.push(["-u", "origin", branch]); diff --git a/src/services/readiness.ts b/src/services/readiness.ts new file mode 100644 index 0000000..ea55e77 --- /dev/null +++ b/src/services/readiness.ts @@ -0,0 +1,648 @@ +import fs from "fs/promises"; +import path from "path"; +import { analyzeRepo, RepoApp, RepoAnalysis } from "./analyzer"; + +export type ReadinessPillar = + | "style-validation" + | "build-system" + | "testing" + | "documentation" + | "dev-environment" + | "code-quality" + | "observability" + | "security-governance"; + +export type ReadinessScope = "repo" | "app"; + +export type ReadinessStatus = "pass" | "fail" | "skip"; + +export type ReadinessCriterionResult = { + id: string; + title: string; + pillar: ReadinessPillar; + level: number; + scope: ReadinessScope; + impact: "high" | "medium" | "low"; + effort: "low" | "medium" | "high"; + status: ReadinessStatus; + reason?: string; + evidence?: string[]; + passRate?: number; + appSummary?: { passed: number; total: number }; + appFailures?: string[]; +}; + +export type ReadinessExtraResult = { + id: string; + title: string; + status: ReadinessStatus; + reason?: string; +}; + +export type ReadinessPillarSummary = { + id: ReadinessPillar; + name: string; + passed: number; + total: number; + passRate: number; +}; + +export type ReadinessLevelSummary = { + level: number; + name: string; + passed: number; + total: number; + passRate: number; + achieved: boolean; +}; + +export type ReadinessReport = { + repoPath: string; + generatedAt: string; + isMonorepo: boolean; + apps: Array<{ name: string; path: string }>; + pillars: ReadinessPillarSummary[]; + levels: ReadinessLevelSummary[]; + achievedLevel: number; + criteria: ReadinessCriterionResult[]; + extras: ReadinessExtraResult[]; +}; + +type ReadinessOptions = { + repoPath: string; + includeExtras?: boolean; +}; + +type ReadinessContext = { + repoPath: string; + analysis: RepoAnalysis; + apps: RepoApp[]; + rootFiles: string[]; + rootPackageJson?: Record; +}; + +type ReadinessCriterion = { + id: string; + title: string; + pillar: ReadinessPillar; + level: number; + scope: ReadinessScope; + impact: "high" | "medium" | "low"; + effort: "low" | "medium" | "high"; + check: (context: ReadinessContext, app?: RepoApp) => Promise; +}; + +type CheckResult = { + status: ReadinessStatus; + reason?: string; + evidence?: string[]; +}; + +export async function runReadinessReport(options: ReadinessOptions): Promise { + const repoPath = options.repoPath; + const analysis = await analyzeRepo(repoPath); + const rootFiles = await safeReadDir(repoPath); + const rootPackageJson = await readJson(path.join(repoPath, "package.json")); + const apps = analysis.apps?.length ? analysis.apps : []; + + const context: ReadinessContext = { + repoPath, + analysis, + apps, + rootFiles, + rootPackageJson + }; + + const criteria = buildCriteria(); + const criteriaResults: ReadinessCriterionResult[] = []; + + for (const criterion of criteria) { + if (criterion.scope === "repo") { + const result = await criterion.check(context); + criteriaResults.push({ + id: criterion.id, + title: criterion.title, + pillar: criterion.pillar, + level: criterion.level, + scope: criterion.scope, + impact: criterion.impact, + effort: criterion.effort, + status: result.status, + reason: result.reason, + evidence: result.evidence + }); + continue; + } + + const appResults = await Promise.all( + apps.map(async (app) => ({ + app, + result: await criterion.check(context, app) + })) + ); + + if (!appResults.length) { + criteriaResults.push({ + id: criterion.id, + title: criterion.title, + pillar: criterion.pillar, + level: criterion.level, + scope: criterion.scope, + impact: criterion.impact, + effort: criterion.effort, + status: "skip", + reason: "No application packages detected." + }); + continue; + } + + const passed = appResults.filter((entry) => entry.result.status === "pass").length; + const total = appResults.length; + const passRate = total ? passed / total : 0; + const status: ReadinessStatus = passRate >= 0.8 ? "pass" : "fail"; + const failures = appResults + .filter((entry) => entry.result.status !== "pass") + .map((entry) => entry.app.name); + + criteriaResults.push({ + id: criterion.id, + title: criterion.title, + pillar: criterion.pillar, + level: criterion.level, + scope: criterion.scope, + impact: criterion.impact, + effort: criterion.effort, + status, + reason: status === "pass" ? undefined : `Only ${passed}/${total} apps pass this check.`, + passRate, + appSummary: { passed, total }, + appFailures: failures + }); + } + + const pillars = summarizePillars(criteriaResults); + const levels = summarizeLevels(criteriaResults); + const achievedLevel = levels.filter((level) => level.achieved).reduce((acc, level) => Math.max(acc, level.level), 0); + + const extras = options.includeExtras === false ? [] : await runExtras(context); + + return { + repoPath, + generatedAt: new Date().toISOString(), + isMonorepo: analysis.isMonorepo ?? false, + apps: apps.map((app) => ({ name: app.name, path: app.path })), + pillars, + levels, + achievedLevel, + criteria: criteriaResults, + extras + }; +} + +function buildCriteria(): ReadinessCriterion[] { + return [ + { + id: "lint-config", + title: "Linting configured", + pillar: "style-validation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => ({ + status: (await hasLintConfig(context.repoPath)) ? "pass" : "fail", + reason: "Missing ESLint/Biome/Prettier configuration.", + evidence: ["eslint.config.js", ".eslintrc", "biome.json", ".prettierrc"] + }) + }, + { + id: "typecheck-config", + title: "Type checking configured", + pillar: "style-validation", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => ({ + status: (await hasTypecheckConfig(context.repoPath)) ? "pass" : "fail", + reason: "Missing type checking config (tsconfig or equivalent).", + evidence: ["tsconfig.json", "pyproject.toml", "mypy.ini"] + }) + }, + { + id: "build-script", + title: "Build script present", + pillar: "build-system", + level: 1, + scope: "app", + impact: "high", + effort: "low", + check: async (_context, app) => ({ + status: app?.scripts?.build ? "pass" : "fail", + reason: "Missing build script in package.json." + }) + }, + { + id: "ci-config", + title: "CI workflow configured", + pillar: "build-system", + level: 2, + scope: "repo", + impact: "high", + effort: "medium", + check: async (context) => ({ + status: (await hasGithubWorkflows(context.repoPath)) ? "pass" : "fail", + reason: "Missing .github/workflows CI configuration.", + evidence: [".github/workflows"] + }) + }, + { + id: "test-script", + title: "Test script present", + pillar: "testing", + level: 1, + scope: "app", + impact: "high", + effort: "low", + check: async (_context, app) => ({ + status: app?.scripts?.test ? "pass" : "fail", + reason: "Missing test script in package.json." + }) + }, + { + id: "readme", + title: "README present", + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => ({ + status: (await hasReadme(context.repoPath)) ? "pass" : "fail", + reason: "Missing README documentation.", + evidence: ["README.md"] + }) + }, + { + id: "contributing", + title: "CONTRIBUTING guide present", + pillar: "documentation", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => ({ + status: (await fileExists(path.join(context.repoPath, "CONTRIBUTING.md"))) ? "pass" : "fail", + reason: "Missing CONTRIBUTING.md for contributor workflows." + }) + }, + { + id: "lockfile", + title: "Lockfile present", + pillar: "dev-environment", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => ({ + status: hasAnyFile(context.rootFiles, ["pnpm-lock.yaml", "yarn.lock", "package-lock.json", "bun.lockb"]) ? "pass" : "fail", + reason: "Missing package manager lockfile." + }) + }, + { + id: "env-example", + title: "Environment example present", + pillar: "dev-environment", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => ({ + status: hasAnyFile(context.rootFiles, [".env.example", ".env.sample"]) ? "pass" : "fail", + reason: "Missing .env.example or .env.sample for setup guidance." + }) + }, + { + id: "format-config", + title: "Formatter configured", + pillar: "code-quality", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => ({ + status: (await hasFormatterConfig(context.repoPath)) ? "pass" : "fail", + reason: "Missing Prettier/Biome formatting config." + }) + }, + { + id: "codeowners", + title: "CODEOWNERS present", + pillar: "security-governance", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => ({ + status: (await hasCodeowners(context.repoPath)) ? "pass" : "fail", + reason: "Missing CODEOWNERS file." + }) + }, + { + id: "license", + title: "LICENSE present", + pillar: "security-governance", + level: 1, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => ({ + status: (await hasLicense(context.repoPath)) ? "pass" : "fail", + reason: "Missing LICENSE file." + }) + }, + { + id: "security-policy", + title: "Security policy present", + pillar: "security-governance", + level: 3, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => ({ + status: (await fileExists(path.join(context.repoPath, "SECURITY.md"))) ? "pass" : "fail", + reason: "Missing SECURITY.md policy." + }) + }, + { + id: "dependabot", + title: "Dependabot configured", + pillar: "security-governance", + level: 3, + scope: "repo", + impact: "medium", + effort: "medium", + check: async (context) => ({ + status: (await fileExists(path.join(context.repoPath, ".github", "dependabot.yml"))) ? "pass" : "fail", + reason: "Missing .github/dependabot.yml configuration." + }) + }, + { + id: "observability", + title: "Observability tooling present", + pillar: "observability", + level: 3, + scope: "repo", + impact: "medium", + effort: "medium", + check: async (context) => { + const deps = await readAllDependencies(context); + const has = deps.some((dep) => ["@opentelemetry/api", "@opentelemetry/sdk", "pino", "winston", "bunyan"].includes(dep)); + return { + status: has ? "pass" : "fail", + reason: "No observability dependencies detected (OpenTelemetry/logging)." + }; + } + } + ]; +} + +async function runExtras(context: ReadinessContext): Promise { + const results: ReadinessExtraResult[] = []; + + results.push({ + id: "agents-doc", + title: "AGENTS.md present", + status: (await fileExists(path.join(context.repoPath, "AGENTS.md"))) ? "pass" : "fail", + reason: "Missing AGENTS.md to guide coding agents." + }); + + results.push({ + id: "pr-template", + title: "Pull request template present", + status: (await hasPullRequestTemplate(context.repoPath)) ? "pass" : "fail", + reason: "Missing PR template for consistent reviews." + }); + + results.push({ + id: "pre-commit", + title: "Pre-commit hooks configured", + status: (await hasPrecommitConfig(context.repoPath)) ? "pass" : "fail", + reason: "Missing pre-commit or Husky configuration for fast feedback." + }); + + results.push({ + id: "architecture-doc", + title: "Architecture guide present", + status: (await hasArchitectureDoc(context.repoPath)) ? "pass" : "fail", + reason: "Missing architecture documentation." + }); + + return results; +} + +function summarizePillars(criteria: ReadinessCriterionResult[]): ReadinessPillarSummary[] { + const pillarNames: Record = { + "style-validation": "Style & Validation", + "build-system": "Build System", + testing: "Testing", + documentation: "Documentation", + "dev-environment": "Dev Environment", + "code-quality": "Code Quality", + observability: "Observability", + "security-governance": "Security & Governance" + }; + + return (Object.keys(pillarNames) as ReadinessPillar[]).map((pillar) => { + const items = criteria.filter((criterion) => criterion.pillar === pillar); + const { passed, total } = countStatus(items); + return { + id: pillar, + name: pillarNames[pillar], + passed, + total, + passRate: total ? passed / total : 0 + }; + }); +} + +function summarizeLevels(criteria: ReadinessCriterionResult[]): ReadinessLevelSummary[] { + const levelNames: Record = { + 1: "Functional", + 2: "Documented", + 3: "Standardized", + 4: "Optimized", + 5: "Autonomous" + }; + + const summaries: ReadinessLevelSummary[] = []; + for (let level = 1; level <= 5; level += 1) { + const items = criteria.filter((criterion) => criterion.level === level); + const { passed, total } = countStatus(items); + const passRate = total ? passed / total : 0; + summaries.push({ + level, + name: levelNames[level], + passed, + total, + passRate, + achieved: false + }); + } + + for (const summary of summaries) { + const allPrior = summaries.filter((candidate) => candidate.level <= summary.level); + const achieved = allPrior.every((candidate) => candidate.total === 0 || candidate.passRate >= 0.8); + summary.achieved = achieved; + } + + return summaries; +} + +function countStatus(items: ReadinessCriterionResult[]): { passed: number; total: number } { + const relevant = items.filter((item) => item.status !== "skip"); + const passed = relevant.filter((item) => item.status === "pass").length; + return { passed, total: relevant.length }; +} + +async function safeReadDir(dirPath: string): Promise { + try { + return await fs.readdir(dirPath); + } catch { + return []; + } +} + +async function readJson(filePath: string): Promise | undefined> { + try { + const raw = await fs.readFile(filePath, "utf8"); + return JSON.parse(raw) as Record; + } catch { + return undefined; + } +} + +async function fileExists(filePath: string): Promise { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } +} + +function hasAnyFile(files: string[], candidates: string[]): boolean { + return candidates.some((candidate) => files.includes(candidate)); +} + +async function hasReadme(repoPath: string): Promise { + const files = await safeReadDir(repoPath); + return files.some((file) => file.toLowerCase() === "readme.md" || file.toLowerCase() === "readme"); +} + +async function hasLintConfig(repoPath: string): Promise { + return hasAnyFile(await safeReadDir(repoPath), [ + "eslint.config.js", + "eslint.config.mjs", + ".eslintrc", + ".eslintrc.js", + ".eslintrc.cjs", + ".eslintrc.json", + ".eslintrc.yml", + ".eslintrc.yaml", + "biome.json", + "biome.jsonc", + ".prettierrc", + ".prettierrc.json", + ".prettierrc.js", + ".prettierrc.cjs", + "prettier.config.js", + "prettier.config.cjs" + ]); +} + +async function hasFormatterConfig(repoPath: string): Promise { + return hasAnyFile(await safeReadDir(repoPath), [ + "biome.json", + "biome.jsonc", + ".prettierrc", + ".prettierrc.json", + ".prettierrc.js", + ".prettierrc.cjs", + "prettier.config.js", + "prettier.config.cjs" + ]); +} + +async function hasTypecheckConfig(repoPath: string): Promise { + return hasAnyFile(await safeReadDir(repoPath), [ + "tsconfig.json", + "tsconfig.base.json", + "pyproject.toml", + "mypy.ini" + ]); +} + +async function hasGithubWorkflows(repoPath: string): Promise { + return fileExists(path.join(repoPath, ".github", "workflows")); +} + +async function hasCodeowners(repoPath: string): Promise { + const root = await fileExists(path.join(repoPath, "CODEOWNERS")); + const github = await fileExists(path.join(repoPath, ".github", "CODEOWNERS")); + return root || github; +} + +async function hasLicense(repoPath: string): Promise { + const files = await safeReadDir(repoPath); + return files.some((file) => file.toLowerCase().startsWith("license")); +} + +async function hasPullRequestTemplate(repoPath: string): Promise { + const direct = await fileExists(path.join(repoPath, ".github", "PULL_REQUEST_TEMPLATE.md")); + if (direct) return true; + const dir = path.join(repoPath, ".github", "PULL_REQUEST_TEMPLATE"); + try { + const entries = await fs.readdir(dir); + return entries.some((entry) => entry.toLowerCase().endsWith(".md")); + } catch { + return false; + } +} + +async function hasPrecommitConfig(repoPath: string): Promise { + const precommit = await fileExists(path.join(repoPath, ".pre-commit-config.yaml")); + if (precommit) return true; + return fileExists(path.join(repoPath, ".husky")); +} + +async function hasArchitectureDoc(repoPath: string): Promise { + const files = await safeReadDir(repoPath); + if (files.some((file) => file.toLowerCase() === "architecture.md")) return true; + return fileExists(path.join(repoPath, "docs", "architecture.md")); +} + +async function readAllDependencies(context: ReadinessContext): Promise { + const dependencies: string[] = []; + const apps = context.apps.length ? context.apps : []; + for (const app of apps) { + const pkg = await readJson(app.packageJsonPath); + const deps = (pkg?.dependencies ?? {}) as Record; + const devDeps = (pkg?.devDependencies ?? {}) as Record; + dependencies.push(...Object.keys({ + ...deps, + ...devDeps + })); + } + + if (!apps.length && context.rootPackageJson) { + const rootDeps = (context.rootPackageJson.dependencies ?? {}) as Record; + const rootDevDeps = (context.rootPackageJson.devDependencies ?? {}) as Record; + dependencies.push(...Object.keys({ + ...rootDeps, + ...rootDevDeps + })); + } + + return Array.from(new Set(dependencies)); +} \ No newline at end of file diff --git a/src/ui/BatchTuiAzure.tsx b/src/ui/BatchTuiAzure.tsx new file mode 100644 index 0000000..8eb5fea --- /dev/null +++ b/src/ui/BatchTuiAzure.tsx @@ -0,0 +1,526 @@ +import React, { useEffect, useState } from "react"; +import { Box, Text, useApp, useInput } from "ink"; +import path from "path"; +import fs from "fs/promises"; +import { + AzureDevOpsOrg, + AzureDevOpsProject, + AzureDevOpsRepo, + listOrganizations, + listProjects, + listRepos, + checkReposForInstructions, + createPullRequest +} from "../services/azureDevops"; +import { + buildAuthedUrl, + checkoutBranch, + cloneRepo, + commitAll, + isGitRepo, + pushBranch +} from "../services/git"; +import { generateCopilotInstructions } from "../services/instructions"; +import { ensureDir } from "../utils/fs"; +import { StaticBanner } from "./AnimatedBanner"; + +type Props = { + token: string; + outputPath?: string; +}; + +type Status = + | "loading-orgs" + | "select-orgs" + | "loading-projects" + | "select-projects" + | "loading-repos" + | "select-repos" + | "confirm" + | "processing" + | "complete" + | "error"; + +type ProcessResult = { + repo: string; + success: boolean; + prUrl?: string; + error?: string; +}; + +export function BatchTuiAzure({ token, outputPath }: Props): React.JSX.Element { + const app = useApp(); + const [status, setStatus] = useState("loading-orgs"); + const [message, setMessage] = useState("Fetching organizations..."); + const [errorMessage, setErrorMessage] = useState(""); + + const [orgs, setOrgs] = useState([]); + const [projects, setProjects] = useState([]); + const [repos, setRepos] = useState([]); + const [selectedOrgIndices, setSelectedOrgIndices] = useState>(new Set()); + const [selectedProjectIndices, setSelectedProjectIndices] = useState>(new Set()); + const [selectedRepoIndices, setSelectedRepoIndices] = useState>(new Set()); + const [cursorIndex, setCursorIndex] = useState(0); + + const [results, setResults] = useState([]); + const [currentRepoIndex, setCurrentRepoIndex] = useState(0); + const [processingMessage, setProcessingMessage] = useState(""); + + useEffect(() => { + loadOrgs(); + }, []); + + async function loadOrgs() { + try { + const userOrgs = await listOrganizations(token); + setOrgs(userOrgs); + setStatus("select-orgs"); + setMessage("Select organizations (space to toggle, enter to confirm)"); + } catch (error) { + setStatus("error"); + setErrorMessage(error instanceof Error ? error.message : "Failed to fetch organizations"); + } + } + + async function loadProjects() { + setStatus("loading-projects"); + setMessage("Fetching projects..."); + + try { + const selectedOrgs = Array.from(selectedOrgIndices).map(i => orgs[i]); + let allProjects: AzureDevOpsProject[] = []; + + for (let idx = 0; idx < selectedOrgs.length; idx++) { + const org = selectedOrgs[idx]; + setMessage(`Fetching projects from ${org.name} (${idx + 1}/${selectedOrgs.length})...`); + const orgProjects = await listProjects(token, org.name); + allProjects = [...allProjects, ...orgProjects]; + } + + setProjects(allProjects); + setCursorIndex(0); + setSelectedProjectIndices(new Set()); + setStatus("select-projects"); + setMessage("Select projects (space to toggle, enter to confirm)"); + } catch (error) { + setStatus("error"); + setErrorMessage(error instanceof Error ? error.message : "Failed to fetch projects"); + } + } + + async function loadRepos() { + setStatus("loading-repos"); + setMessage("Fetching repositories..."); + + try { + const selectedProjects = Array.from(selectedProjectIndices).map(i => projects[i]); + let allRepos: AzureDevOpsRepo[] = []; + + for (let idx = 0; idx < selectedProjects.length; idx++) { + const project = selectedProjects[idx]; + setMessage( + `Fetching repos from ${project.organization}/${project.name} (${idx + 1}/${selectedProjects.length})...` + ); + const projectRepos = await listRepos(token, project.organization, project.name); + allRepos = [...allRepos, ...projectRepos]; + } + + const seen = new Set(); + const uniqueRepos = allRepos.filter((repo) => { + const key = `${repo.organization}/${repo.project}/${repo.name}`; + if (seen.has(key)) return false; + seen.add(key); + return true; + }); + + setMessage(`Checking ${uniqueRepos.length} repos for existing instructions...`); + const reposWithStatus = await checkReposForInstructions( + token, + uniqueRepos, + (checked, total) => setMessage(`Checking for existing instructions (${checked}/${total})...`) + ); + + reposWithStatus.sort((a, b) => { + if (a.hasInstructions === b.hasInstructions) return 0; + return a.hasInstructions ? 1 : -1; + }); + + const withInstructions = reposWithStatus.filter(r => r.hasInstructions).length; + const withoutInstructions = reposWithStatus.length - withInstructions; + + setRepos(reposWithStatus); + setCursorIndex(0); + setSelectedRepoIndices(new Set()); + setStatus("select-repos"); + setMessage(`Found ${reposWithStatus.length} repos (${withoutInstructions} need instructions, ${withInstructions} already have them)`); + } catch (error) { + setStatus("error"); + setErrorMessage(error instanceof Error ? error.message : "Failed to fetch repositories"); + } + } + + async function processRepos() { + const selectedRepos = Array.from(selectedRepoIndices).map(i => repos[i]); + setStatus("processing"); + setCurrentRepoIndex(0); + setResults([]); + + const nextResults: ProcessResult[] = []; + + for (let i = 0; i < selectedRepos.length; i++) { + const repo = selectedRepos[i]; + setCurrentRepoIndex(i); + setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${repo.organization}/${repo.project}/${repo.name}: Cloning...`); + + try { + const cacheRoot = path.join(process.cwd(), ".primer-cache"); + const repoPath = path.join(cacheRoot, repo.organization, repo.project, repo.name); + await ensureDir(repoPath); + + if (!(await isGitRepo(repoPath))) { + const authedUrl = buildAuthedUrl(repo.cloneUrl, token, "azure"); + await cloneRepo(authedUrl, repoPath, { + shallow: true, + timeoutMs: 120000, + onProgress: (stage, progress) => { + setProcessingMessage( + `[${i + 1}/${selectedRepos.length}] ${repo.organization}/${repo.project}/${repo.name}: Cloning (${stage} ${progress}%)...` + ); + } + }); + } + + setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${repo.organization}/${repo.project}/${repo.name}: Creating branch...`); + const branch = "primer/add-instructions"; + await checkoutBranch(repoPath, branch); + + setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${repo.organization}/${repo.project}/${repo.name}: Generating instructions...`); + const timeoutMs = 120000; + const instructionsPromise = generateCopilotInstructions({ + repoPath, + model: "gpt-4.1", + onProgress: (msg) => { + setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${repo.organization}/${repo.project}/${repo.name}: ${msg}`); + } + }); + + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => reject(new Error("Generation timed out after 2 minutes")), timeoutMs); + }); + + const instructions = await Promise.race([instructionsPromise, timeoutPromise]); + + if (!instructions.trim()) { + throw new Error("Generated instructions were empty"); + } + + const instructionsPath = path.join(repoPath, ".github", "copilot-instructions.md"); + await fs.mkdir(path.dirname(instructionsPath), { recursive: true }); + await fs.writeFile(instructionsPath, instructions, "utf8"); + + setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${repo.organization}/${repo.project}/${repo.name}: Committing...`); + await commitAll(repoPath, "chore: add copilot instructions via Primer"); + + setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${repo.organization}/${repo.project}/${repo.name}: Pushing...`); + await pushBranch(repoPath, branch, token, "azure"); + + setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${repo.organization}/${repo.project}/${repo.name}: Creating PR...`); + const prUrl = await createPullRequest({ + token, + organization: repo.organization, + project: repo.project, + repoId: repo.id, + repoName: repo.name, + title: "🤖 Add Copilot instructions via Primer", + body: buildPrBody(), + sourceBranch: branch, + targetBranch: repo.defaultBranch + }); + + nextResults.push({ repo: `${repo.organization}/${repo.project}/${repo.name}`, success: true, prUrl }); + setResults([...nextResults]); + } catch (error) { + const errorMsg = error instanceof Error ? error.message : "Unknown error"; + nextResults.push({ repo: `${repo.organization}/${repo.project}/${repo.name}`, success: false, error: errorMsg }); + setResults([...nextResults]); + } + } + + if (outputPath) { + await fs.writeFile(outputPath, JSON.stringify(nextResults, null, 2), "utf8"); + } + + setStatus("complete"); + setMessage("Batch processing complete!"); + } + + useInput((input, key) => { + if (key.escape || input.toLowerCase() === "q") { + app.exit(); + return; + } + + if (status === "select-orgs") { + if (key.upArrow) { + setCursorIndex(prev => Math.max(0, prev - 1)); + } else if (key.downArrow) { + setCursorIndex(prev => Math.min(orgs.length - 1, prev + 1)); + } else if (input === " ") { + setSelectedOrgIndices(prev => { + const next = new Set(prev); + if (next.has(cursorIndex)) { + next.delete(cursorIndex); + } else { + next.add(cursorIndex); + } + return next; + }); + } else if (key.return && selectedOrgIndices.size > 0) { + loadProjects(); + } + } + + if (status === "select-projects") { + if (key.upArrow) { + setCursorIndex(prev => Math.max(0, prev - 1)); + } else if (key.downArrow) { + setCursorIndex(prev => Math.min(projects.length - 1, prev + 1)); + } else if (input === " ") { + setSelectedProjectIndices(prev => { + const next = new Set(prev); + if (next.has(cursorIndex)) { + next.delete(cursorIndex); + } else { + next.add(cursorIndex); + } + return next; + }); + } else if (key.return && selectedProjectIndices.size > 0) { + loadRepos(); + } + } + + if (status === "select-repos") { + if (key.upArrow) { + setCursorIndex(prev => Math.max(0, prev - 1)); + } else if (key.downArrow) { + setCursorIndex(prev => Math.min(repos.length - 1, prev + 1)); + } else if (input === " ") { + setSelectedRepoIndices(prev => { + const next = new Set(prev); + if (next.has(cursorIndex)) { + next.delete(cursorIndex); + } else { + next.add(cursorIndex); + } + return next; + }); + } else if (input.toLowerCase() === "a") { + const indicesWithoutInstructions = repos + .map((r, i) => ({ r, i })) + .filter(({ r }) => !r.hasInstructions) + .map(({ i }) => i); + setSelectedRepoIndices(new Set(indicesWithoutInstructions)); + } else if (key.return && selectedRepoIndices.size > 0) { + setStatus("confirm"); + setMessage(`Ready to process ${selectedRepoIndices.size} repositories. Press Y to confirm, N to go back.`); + } + } + + if (status === "confirm") { + if (input.toLowerCase() === "y") { + processRepos(); + } else if (input.toLowerCase() === "n") { + setStatus("select-repos"); + setMessage("Select repos (space to toggle, enter to confirm)"); + } + } + }); + + const windowSize = 15; + const getVisibleItems = (items: T[], cursor: number): { items: T[]; startIndex: number } => { + const start = Math.max(0, cursor - Math.floor(windowSize / 2)); + const end = Math.min(items.length, start + windowSize); + const adjustedStart = Math.max(0, end - windowSize); + return { items: items.slice(adjustedStart, end), startIndex: adjustedStart }; + }; + + return ( + + + Batch Processing - Azure DevOps + + {message} + + + {status === "error" && ( + + Error: {errorMessage} + + )} + + {status === "select-orgs" && ( + + {(() => { + const { items: visibleOrgs, startIndex } = getVisibleItems(orgs, cursorIndex); + return visibleOrgs.map((org, i) => { + const realIndex = startIndex + i; + const isSelected = selectedOrgIndices.has(realIndex); + const isCursor = realIndex === cursorIndex; + return ( + + {isCursor ? "❯ " : " "} + {isSelected ? "◉" : "○"} + {org.name} + + ); + }); + })()} + {orgs.length > windowSize && ( + + Showing {Math.min(windowSize, orgs.length)} of {orgs.length} • Use ↑↓ to scroll + + )} + + )} + + {status === "select-projects" && ( + + {(() => { + const { items: visibleProjects, startIndex } = getVisibleItems(projects, cursorIndex); + return visibleProjects.map((project, i) => { + const realIndex = startIndex + i; + const isSelected = selectedProjectIndices.has(realIndex); + const isCursor = realIndex === cursorIndex; + return ( + + {isCursor ? "❯ " : " "} + {isSelected ? "◉" : "○"} + {project.organization}/{project.name} + + ); + }); + })()} + {projects.length > windowSize && ( + + Showing {Math.min(windowSize, projects.length)} of {projects.length} • Use ↑↓ to scroll + + )} + + )} + + {status === "select-repos" && ( + + {(() => { + const { items: visibleRepos, startIndex } = getVisibleItems(repos, cursorIndex); + return visibleRepos.map((repo, i) => { + const realIndex = startIndex + i; + const isSelected = selectedRepoIndices.has(realIndex); + const isCursor = realIndex === cursorIndex; + return ( + + {isCursor ? "❯ " : " "} + {isSelected ? "◉" : "○"} + {repo.hasInstructions ? "✓" : "✗"} + + {repo.organization}/{repo.project}/{repo.name} + + {repo.isPrivate && (private)} + + ); + }); + })()} + {repos.length > windowSize && ( + + Showing {Math.min(windowSize, repos.length)} of {repos.length} • Use ↑↓ to scroll + + )} + + + Selected: {selectedRepoIndices.size} repos + + + + )} + + {status === "processing" && ( + + {processingMessage} + {results.length > 0 && ( + + Completed: + {results.slice(-5).map((r) => ( + + {r.success ? "✓" : "✗"} {r.repo} + {r.success && r.prUrl && → {r.prUrl}} + {!r.success && r.error && ({r.error})} + + ))} + + )} + + )} + + {status === "complete" && ( + + + ✓ Batch complete: {results.filter(r => r.success).length} succeeded, {results.filter(r => !r.success).length} failed + + + {results.map((r) => ( + + {r.success ? "✓" : "✗"} {r.repo} + {r.success && r.prUrl && → {r.prUrl}} + {!r.success && r.error && ({r.error})} + + ))} + + + )} + + + {status === "select-orgs" && ( + Keys: [Space] Toggle [Enter] Confirm [Q] Quit + )} + {status === "select-projects" && ( + Keys: [Space] Toggle [Enter] Confirm [Q] Quit + )} + {status === "select-repos" && ( + Keys: [Space] Toggle [A] Select Missing [Enter] Confirm [Q] Quit + )} + {status === "confirm" && ( + Keys: [Y] Yes, proceed [N] Go back [Q] Quit + )} + {(status === "complete" || status === "error") && ( + Keys: [Q] Quit + )} + + + ); +} + +function buildPrBody(): string { + return [ + "## 🤖 Copilot Instructions Added", + "", + "This PR adds a `.github/copilot-instructions.md` file to help GitHub Copilot understand this codebase better.", + "", + "### What's Included", + "", + "The instructions file contains:", + "- Project overview and architecture", + "- Tech stack and conventions", + "- Build/test commands", + "- Key directories and files", + "", + "### Benefits", + "", + "With these instructions, Copilot will:", + "- Generate more contextually-aware code suggestions", + "- Follow project-specific patterns and conventions", + "- Understand the codebase structure", + "", + "---", + "*Generated by [Primer](https://github.com/pierceboggan/primer) - Prime your repos for AI*" + ].join("\n"); +} \ No newline at end of file diff --git a/src/ui/README.md b/src/ui/README.md index a34f7c0..551d04e 100644 --- a/src/ui/README.md +++ b/src/ui/README.md @@ -1 +1,3 @@ Primer TUI components live here. + +Run the TUI with `primer tui`. diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index cfa8dbb..7991865 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -8,13 +8,79 @@ import { runEval, type EvalResult } from "../services/evaluator"; import { AnimatedBanner, StaticBanner } from "./AnimatedBanner"; import { BatchTui } from "./BatchTui"; import { getGitHubToken } from "../services/github"; +import { safeWriteFile } from "../utils/fs"; type Props = { repoPath: string; skipAnimation?: boolean; }; -type Status = "intro" | "idle" | "analyzing" | "generating" | "evaluating" | "preview" | "done" | "error" | "batch"; +type Status = + | "intro" + | "idle" + | "analyzing" + | "generating" + | "evaluating" + | "preview" + | "done" + | "error" + | "batch" + | "bootstrapEvalCount" + | "bootstrapEvalConfirm"; + +type EvalCase = { + id: string; + prompt: string; + expectation: string; +}; + +type EvalConfig = { + instructionFile?: string; + cases: EvalCase[]; + systemMessage?: string; + outputPath?: string; +}; + +function buildBootstrapEvalConfig(count: number): EvalConfig { + const templates = [ + { + prompt: "Summarize this repository's purpose and main entry points. Use the README and package.json if available.", + expectation: "A concise summary of repo purpose plus key entry points (CLI or main files) and how to run it." + }, + { + prompt: "Identify the primary languages, frameworks, and package manager used in this repo.", + expectation: "A brief list of languages/frameworks and the detected package manager, with short justification." + }, + { + prompt: "Draft a minimal .github/copilot-instructions.md tailored to this repo's conventions.", + expectation: "A short instruction file referencing observed conventions, avoiding assumptions or secrets." + }, + { + prompt: "Describe how to run the CLI and list its core commands and flags.", + expectation: "Clear usage instructions with command names and key flags derived from docs or source." + }, + { + prompt: "Propose an eval case that checks consistency between CLI and TUI behaviors.", + expectation: "One eval case that validates parity between CLI and TUI outputs or workflows." + } + ]; + + const cases = Array.from({ length: count }, (_, index) => { + const template = templates[index % templates.length]; + const variant = Math.floor(index / templates.length); + const suffix = variant > 0 ? ` (variant ${variant + 1})` : ""; + return { + id: `case-${index + 1}`, + prompt: `${template.prompt}${suffix}`, + expectation: `${template.expectation}${suffix}` + } satisfies EvalCase; + }); + + return { + instructionFile: ".github/copilot-instructions.md", + cases + }; +} export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX.Element { const app = useApp(); @@ -23,7 +89,10 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const [message, setMessage] = useState(""); const [generatedContent, setGeneratedContent] = useState(""); const [evalResults, setEvalResults] = useState(null); + const [evalViewerPath, setEvalViewerPath] = useState(null); const [batchToken, setBatchToken] = useState(null); + const [evalCaseCountInput, setEvalCaseCountInput] = useState(""); + const [evalBootstrapCount, setEvalBootstrapCount] = useState(null); const repoLabel = useMemo(() => repoPath, [repoPath]); const handleAnimationComplete = () => { @@ -67,6 +136,78 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return; } + if (status === "bootstrapEvalCount") { + if (key.return) { + const trimmed = evalCaseCountInput.trim(); + const count = Number.parseInt(trimmed, 10); + if (!trimmed || !Number.isFinite(count) || count <= 0) { + setMessage("Enter a positive number of eval cases, then press Enter."); + return; + } + + const configPath = path.join(repoPath, "primer.eval.json"); + setEvalBootstrapCount(count); + try { + await fs.access(configPath); + setStatus("bootstrapEvalConfirm"); + setMessage("primer.eval.json exists. Overwrite? (Y/N)"); + } catch { + const config = buildBootstrapEvalConfig(count); + const resultMessage = await safeWriteFile(configPath, JSON.stringify(config, null, 2), false); + setStatus("done"); + setMessage(`Bootstrapped eval: ${resultMessage}`); + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + } + return; + } + + if (key.backspace || key.delete) { + setEvalCaseCountInput((prev) => prev.slice(0, -1)); + return; + } + + if (/^\d$/.test(input)) { + setEvalCaseCountInput((prev) => prev + input); + return; + } + + return; + } + + if (status === "bootstrapEvalConfirm") { + if (input.toLowerCase() === "y") { + const count = evalBootstrapCount ?? 0; + if (count <= 0) { + setStatus("error"); + setMessage("Missing eval case count. Restart bootstrap."); + return; + } + try { + const configPath = path.join(repoPath, "primer.eval.json"); + const config = buildBootstrapEvalConfig(count); + const resultMessage = await safeWriteFile(configPath, JSON.stringify(config, null, 2), true); + setStatus("done"); + setMessage(`Bootstrapped eval: ${resultMessage}`); + } catch (error) { + setStatus("error"); + setMessage(error instanceof Error ? error.message : "Failed to write eval config."); + } finally { + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + } + return; + } + + if (input.toLowerCase() === "n") { + setStatus("idle"); + setMessage("Bootstrap cancelled."); + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + } + return; + } + if (input.toLowerCase() === "a") { setStatus("analyzing"); try { @@ -133,8 +274,9 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setStatus("evaluating"); setMessage("Running evals... (this may take a few minutes)"); setEvalResults(null); + setEvalViewerPath(null); try { - const { results } = await runEval({ + const { results, viewerPath } = await runEval({ configPath, repoPath, model: "gpt-4.1", @@ -142,6 +284,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX // Note: onProgress removed - causes issues with SDK in React/Ink context }); setEvalResults(results); + setEvalViewerPath(viewerPath ?? null); const passed = results.filter(r => r.verdict === "pass").length; const failed = results.filter(r => r.verdict === "fail").length; setStatus("done"); @@ -151,6 +294,13 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setMessage(error instanceof Error ? error.message : "Eval failed."); } } + + if (input.toLowerCase() === "i") { + setStatus("bootstrapEvalCount"); + setMessage("Enter number of eval cases, then press Enter."); + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + } }); const statusLabel = status === "intro" ? "..." : status === "idle" ? "ready (awaiting input)" : status; @@ -186,6 +336,11 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {message} + {status === "bootstrapEvalCount" && ( + + Eval case count: {evalCaseCountInput || ""} + + )} {status === "preview" && generatedContent && ( Preview (.github/copilot-instructions.md): @@ -200,6 +355,9 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {r.verdict === "pass" ? "✓" : r.verdict === "fail" ? "✗" : "?"} {r.id}: {r.verdict} (score: {r.score}) ))} + {evalViewerPath && ( + Trajectory viewer: {evalViewerPath} + )} )} @@ -207,8 +365,10 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX Press any key to skip animation... ) : status === "preview" ? ( Keys: [S] Save [D] Discard [Q] Quit + ) : status === "bootstrapEvalConfirm" ? ( + Keys: [Y] Overwrite [N] Cancel [Q] Quit ) : ( - Keys: [A] Analyze [G] Generate [E] Eval [B] Batch [Q] Quit + Keys: [A] Analyze [G] Generate [E] Eval [I] Init Eval [B] Batch [Q] Quit )} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..2481bee --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + coverage: { + provider: "v8", + reporter: ["text", "html", "json-summary"], + reportsDirectory: "./coverage" + } + } +}); From 05a98bf29ac50b210e36e30d14b0dc04c94f82e0 Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Tue, 3 Feb 2026 22:23:02 -0700 Subject: [PATCH 02/84] Refactor code structure for improved readability and maintainability --- eval-results.html | 160 + eval-results.json | 5273 +++++++++++++++++++++++++++- package-lock.json | 6917 ++++++++++++++++++++++++++++++++----- src/services/evaluator.ts | 193 +- src/ui/tui.tsx | 46 +- 5 files changed, 11586 insertions(+), 1003 deletions(-) create mode 100644 eval-results.html diff --git a/eval-results.html b/eval-results.html new file mode 100644 index 0000000..cdc38d9 --- /dev/null +++ b/eval-results.html @@ -0,0 +1,160 @@ + + + + + + Primer Eval Trajectory + + + +

Primer Eval Trajectory

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/eval-results.json b/eval-results.json index 765bd07..da3cda4 100644 --- a/eval-results.json +++ b/eval-results.json @@ -2,16 +2,5283 @@ "repoPath": "/Users/pierceboggan/Documents/get-ready", "model": "gpt-4.1", "judgeModel": "gpt-4.1", + "runMetrics": { + "startedAt": "2026-02-04T05:21:19.668Z", + "finishedAt": "2026-02-04T05:21:58.146Z", + "durationMs": 38478 + }, "results": [ { "id": "overview", "prompt": "Summarize what this application does and list the main entrypoints.", "expectation": "Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.", - "withInstructions": "This application, Primer, is a CLI tool that analyzes your codebase and generates `.github/copilot-instructions.md` files to help AI coding assistants (like Copilot) better understand your project. It detects languages, frameworks, and package managers, and can generate, preview, and save project-specific instructions using the Copilot SDK. \n\n**Main entrypoints:**\n- `src/index.ts` (primary entry)\n- `src/cli.ts` (CLI setup)\n- CLI commands in `src/commands/` (e.g., `analyze.ts`, `generate.ts`, `instructions.tsx`, `tui.tsx`, `pr.ts`, `eval.ts`, etc.)", - "withoutInstructions": "This application, Primer, is a CLI tool that analyzes your codebase and generates `.github/copilot-instructions.md` files to help AI coding assistants (like Copilot) better understand your project. It detects languages, frameworks, and package managers, and uses the Copilot SDK to generate project-specific instructions. \n\n**Main entrypoints:**\n- `src/index.ts`: Primary entrypoint for the CLI.\n- `src/cli.ts`: Sets up the command-line interface using Commander.\n- `src/commands/`: Contains subcommands for analyze, generate, and instructions.\n- `src/ui/tui.tsx`: Entry for the interactive terminal UI (TUI).", + "withInstructions": "This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, evaluation, readiness reporting, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\nMain entrypoints:\n- CLI: `primer` (main binary, installed globally)\n- Programmatic: `src/index.ts` (calls `runCli()` in `src/cli.ts`)\n\nPrimary commands include: `init`, `analyze`, `generate`, `instructions`, `tui`, `eval`, `readiness`, `pr`, `batch`, `templates`, `config`, and `update`.", + "withoutInstructions": "This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, evaluation, readiness reports, and GitHub integration.\n\nMain entrypoints:\n- src/index.ts — CLI entry point\n- src/cli.ts — Commander CLI setup\n\nKey commands include: `primer init`, `primer tui`, `primer instructions`, `primer analyze`, `primer batch`, `primer readiness`, and `primer eval`.", "verdict": "pass", "score": 100, - "rationale": "Both responses mention the foCLI entrypoint in src/index.ts and that this is the Primer CLI. Response B is slightly more complete, but both meet the expectation." + "rationale": "Response B best matches the expectation by explicitly mentioning the CLI entrypoint in src/index.ts, clarifying that it calls runCli in src/cli.ts, and identifying this as the Primer CLI. It also provides a more complete and accurate list of commands and features, aligning closely with the expectation.", + "metrics": { + "withoutInstructions": { + "durationMs": 11934, + "tokenUsage": { + "promptTokens": 10005, + "completionTokens": 289, + "totalTokens": 10294 + }, + "toolCalls": { + "count": 5, + "byName": { + "report_intent": 1, + "task": 1, + "view": 3 + }, + "totalDurationMs": 0 + } + }, + "withInstructions": { + "durationMs": 22221, + "tokenUsage": { + "promptTokens": 11011, + "completionTokens": 335, + "totalTokens": 11346 + }, + "toolCalls": { + "count": 7, + "byName": { + "report_intent": 1, + "task": 1, + "view": 3, + "glob": 1, + "grep": 1 + }, + "totalDurationMs": 0 + } + }, + "judge": { + "durationMs": 2774, + "tokenUsage": { + "promptTokens": 10011, + "completionTokens": 84, + "totalTokens": 10095 + }, + "toolCalls": { + "count": 0, + "byName": {}, + "totalDurationMs": 0 + } + }, + "totalDurationMs": 38461 + }, + "trajectory": [ + { + "timestampMs": 1770182481178, + "phase": "withoutInstructions", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770182481178, + "phase": "withoutInstructions", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770182483604, + "phase": "withoutInstructions", + "type": "user.message", + "data": { + "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nSummarize what this application does and list the main entrypoints.", + "transformedContent": "2026-02-04T05:21:23.352Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nSummarize what this application does and list the main entrypoints.", + "attachments": [] + } + }, + { + "timestampMs": 1770182483604, + "phase": "withoutInstructions", + "type": "assistant.turn_start", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770182483604, + "phase": "withoutInstructions", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 10343, + "messagesLength": 2 + } + }, + { + "timestampMs": 1770182485828, + "phase": "withoutInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 9710, + "outputTokens": 85, + "cacheReadTokens": 3840, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 2197, + "initiator": "user", + "apiCallId": "chatcmpl-D5PcKj8TBk6a1XH5WkxrNpJSXawfs", + "providerCallId": "E903:35A03D:33E28A:3D9614:6982D753", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770182485829, + "phase": "withoutInstructions", + "type": "assistant.message", + "data": { + "messageId": "93ddd8e5-b53b-4e65-ae4d-3c9ab4f51f3b", + "content": "", + "toolRequests": [ + { + "toolCallId": "call_tpnJMuSM0sryKLy4z7k2W06H", + "name": "report_intent", + "arguments": { + "intent": "Exploring codebase" + }, + "type": "function" + }, + { + "toolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "name": "task", + "arguments": { + "agent_type": "explore", + "description": "Summarizing application purpose", + "prompt": "Summarize what this application does and list the main entrypoints. Be concise and list file paths for entrypoints." + }, + "type": "function" + } + ] + } + }, + { + "timestampMs": 1770182485834, + "phase": "withoutInstructions", + "type": "tool.execution_start", + "data": { + "toolCallId": "call_tpnJMuSM0sryKLy4z7k2W06H", + "toolName": "report_intent", + "arguments": { + "intent": "Exploring codebase" + } + } + }, + { + "timestampMs": 1770182485837, + "phase": "withoutInstructions", + "type": "tool.execution_start", + "data": { + "toolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "toolName": "task", + "arguments": { + "agent_type": "explore", + "description": "Summarizing application purpose", + "prompt": "Summarize what this application does and list the main entrypoints. Be concise and list file paths for entrypoints." + } + } + }, + { + "timestampMs": 1770182485837, + "phase": "withoutInstructions", + "type": "tool.execution_complete", + "data": { + "toolCallId": "call_tpnJMuSM0sryKLy4z7k2W06H", + "success": true, + "result": { + "content": "Intent logged", + "detailedContent": "Exploring codebase" + }, + "toolTelemetry": {} + } + }, + { + "timestampMs": 1770182488411, + "phase": "withoutInstructions", + "type": "assistant.usage", + "data": { + "model": "claude-haiku-4.5", + "inputTokens": 2707, + "outputTokens": 289, + "cacheReadTokens": 0, + "cacheWriteTokens": 0, + "cost": 0.33, + "duration": 2250, + "initiator": "sub-agent", + "apiCallId": "msg_016BDLf3uZartGeaCcNnSoWD", + "providerCallId": "E903:35A03D:33EB57:3DA002:6982D756", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + }, + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg" + } + }, + { + "timestampMs": 1770182488411, + "phase": "withoutInstructions", + "type": "assistant.message", + "data": { + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "messageId": "7b744914-d9fc-49f0-80de-7c84c32a6b2c", + "content": "", + "toolRequests": [ + { + "toolCallId": "toolu_01CzbYettZVEcZ8aE2dMxFGW", + "name": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready" + }, + "type": "function" + }, + { + "toolCallId": "toolu_01FQ6TzCWfm56V3EwxeF2MRA", + "name": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready/package.json" + }, + "type": "function" + }, + { + "toolCallId": "toolu_01NGYzuJkusQqT4meJPJuhD9", + "name": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready/README.md" + }, + "type": "function" + } + ], + "reasoningOpaque": "3IOUA34d654sP/xOhtYd0oHMHIP6BSEfihGf5GWOyWK7q6GXOek2hymkrZygkkIadRZ4TN0p6q0c68r5514Y9GJBJYvm+dmAwPNxF1EP2lFKZowIJ2CxDiEydSmtN4FsoqK9SENjWhrk8SL/Vy3OGKEAFQP9UTJzSYLVc1EHT8RnBzA0vgAi7YMCma7ch40DCjCvwQUdQJMhoxVjUYXfVkIW041JasRO3g5SBz6EJjZEynwbAyf41sgLSyXJGYEP2IsTHRqHv6jmVHwZVd6ZS5Z13rUFDJewL+k1Krl10f4M1dVhTu9QXLkiuIYSBTQ65q8GengLmnoiSCaLwLIaOpyAe5l5Dqj1x2gWiS5jK9UDvnwlTyLCtoOxH6iGBY8SoqkPOhjuy2nuuODytX96I9Am+lPG11rgKfnhrsM7IJM/AmXEQCLb8kxRKlvqoRU3rmC3nozTQEXRLfyCY9ODN2OoRTc+Uhc4Ew1ZAi6WGFY01AiPJaSKCtgZ2O4+p8kp1p7dk2AKv2bGVe5k+yU101fYe3TwBTa4md2sF3E0zsw2TwlUtU8uTUJ6k1k32s2ynmeOQWYVOheNlXAflxAzgH1hqALbwIMKrxj1ge/ESB8MhP69y8UUSNe51kh2Y1eo2Lca0S5V6UIHZzzuUNHTaHa+TRivQeL+KQepRwsCO6a0NpWbV51KP8iQ7ihNlKa/j96y0BgarFAOHHnlgI0trQ05pwfTDK9E8af6Qvb1aQb5f2Eiyt7Hc3rnfF2INJs7cdK2eI8l+ajZIM6vnEPQgnlA5QPunF2HCOGS3K4bHUU4lNQwcPtIpufmWsXGt5s7sb87prrzirCNvQqB2S4nrGtpALAjOr3kFh/U2mdy6KxuEyxy9AxjE5bGGTWcdDYAKD/U7cndxcVVNF6v7Z7TlgSd22IPArf97HjHI8zMe0kIuSnKOy9eEjEKD+px9NLl5OHeOj9fq2X7/PHkjrmEq9B2v//+t2VRoPExfoHhmiIfmtHP0wlNwSASd4jcwScoHAmUZc9e3FTynXVfKGasUc1aCUt3rkNY+uhU6UUoWbKZB0KsSqe85SwSaeNV1+6qzqXVMo2/LO1gaETmvI8xhnXmfEm9AuKqdKX2nwUZSlHBULCFuZLqh9G0ACl2yu7djX9nLFMMJGIq1WG8aQYu5EGO/xwaTImJRf0Q5B/n7AroQdrJTDXd6DP9nvwdgGPN8mrerg3xmtIEWreDnczsvZpAbhmaFTubp6YFzN+pQjYAIC8G0vRtD+vx0kzwLvX8LL5g7ULQljhtVKd9x09h+idh21t0wr6HbypZFxHc3oSTriUPuguqCkTO1fGOaFpCGvGoXhPC3mF3k71GOoehCWDxVD2LCfDmWlzPhPRh9u2hhy9JH5UuleOHgs6XMXFofeZ9McXvhjIQjn779zrjI+QgUD6m/4FwEvLL2Od/tSg0PswA2nCbCG8+0aJQQyJ+9I47NFlxose045GGhS4Je9c0U0GjV3uDodpPIRA11AUOz84gXBsK5Jj/X6vO", + "reasoningText": "The user wants me to summarize what this application does and list the main entrypoints with file paths. I should:\n\n1. First, explore the repository structure to understand what it is\n2. Look for package.json, README, or other documentation to understand the purpose\n3. Find the main entrypoints (typically in package.json, or main files like index.ts, index.js, main.ts, etc.)\n\nLet me start by looking at the directory structure and key files like package.json, README.md, etc." + } + }, + { + "timestampMs": 1770182488412, + "phase": "withoutInstructions", + "type": "tool.execution_start", + "data": { + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "toolCallId": "toolu_01CzbYettZVEcZ8aE2dMxFGW", + "toolName": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready" + } + } + }, + { + "timestampMs": 1770182488412, + "phase": "withoutInstructions", + "type": "tool.execution_start", + "data": { + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "toolCallId": "toolu_01FQ6TzCWfm56V3EwxeF2MRA", + "toolName": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready/package.json" + } + } + }, + { + "timestampMs": 1770182488412, + "phase": "withoutInstructions", + "type": "tool.execution_start", + "data": { + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "toolCallId": "toolu_01NGYzuJkusQqT4meJPJuhD9", + "toolName": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready/README.md" + } + } + }, + { + "timestampMs": 1770182488413, + "phase": "withoutInstructions", + "type": "tool.execution_complete", + "data": { + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "toolCallId": "toolu_01FQ6TzCWfm56V3EwxeF2MRA", + "success": true, + "result": { + "content": "1. {\n2. \"name\": \"primer\",\n3. \"version\": \"1.0.0\",\n4. \"description\": \"\",\n5. \"main\": \"dist/index.js\",\n6. \"scripts\": {\n7. \"build\": \"tsc && npm link\",\n8. \"prepare\": \"tsc\",\n9. \"lint\": \"eslint .\",\n10. \"format\": \"prettier --write .\",\n11. \"format:check\": \"prettier --check .\",\n12. \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n13. \"test\": \"vitest run\",\n14. \"test:watch\": \"vitest\",\n15. \"test:coverage\": \"vitest run --coverage\"\n16. },\n17. \"keywords\": [],\n18. \"author\": \"\",\n19. \"license\": \"ISC\",\n20. \"dependencies\": {\n21. \"@github/copilot-sdk\": \"^0.1.19\",\n22. \"@inquirer/prompts\": \"^8.2.0\",\n23. \"@octokit/rest\": \"^22.0.1\",\n24. \"chalk\": \"^5.6.2\",\n25. \"commander\": \"^14.0.2\",\n26. \"fast-glob\": \"^3.3.3\",\n27. \"ink\": \"^6.6.0\",\n28. \"react\": \"^19.2.4\",\n29. \"simple-git\": \"^3.30.0\"\n30. },\n31. \"devDependencies\": {\n32. \"@types/node\": \"^25.1.0\",\n33. \"@types/react\": \"^19.2.10\",\n34. \"@typescript-eslint/eslint-plugin\": \"^8.5.0\",\n35. \"@typescript-eslint/parser\": \"^8.5.0\",\n36. \"@vitest/coverage-v8\": \"^2.1.4\",\n37. \"eslint\": \"^9.7.0\",\n38. \"eslint-config-prettier\": \"^9.1.0\",\n39. \"eslint-plugin-import\": \"^2.30.0\",\n40. \"eslint-plugin-n\": \"^17.10.2\",\n41. \"eslint-plugin-promise\": \"^7.1.0\",\n42. \"prettier\": \"^3.3.3\",\n43. \"tsup\": \"^8.5.1\",\n44. \"tsx\": \"^4.21.0\",\n45. \"typescript\": \"^5.9.3\",\n46. \"vitest\": \"^2.1.4\"\n47. },\n48. \"type\": \"module\",\n49. \"bin\": {\n50. \"primer\": \"dist/index.js\"\n51. }\n52. }\n53. ", + "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready/package.json b/Users/pierceboggan/Documents/get-ready/package.json\nindex 0000000..0000000 100644\n--- a/Users/pierceboggan/Documents/get-ready/package.json\n+++ b/Users/pierceboggan/Documents/get-ready/package.json\n@@ -1,53 +1,53 @@\n {\n \"name\": \"primer\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"dist/index.js\",\n \"scripts\": {\n \"build\": \"tsc && npm link\",\n \"prepare\": \"tsc\",\n \"lint\": \"eslint .\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"@github/copilot-sdk\": \"^0.1.19\",\n \"@inquirer/prompts\": \"^8.2.0\",\n \"@octokit/rest\": \"^22.0.1\",\n \"chalk\": \"^5.6.2\",\n \"commander\": \"^14.0.2\",\n \"fast-glob\": \"^3.3.3\",\n \"ink\": \"^6.6.0\",\n \"react\": \"^19.2.4\",\n \"simple-git\": \"^3.30.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^25.1.0\",\n \"@types/react\": \"^19.2.10\",\n \"@typescript-eslint/eslint-plugin\": \"^8.5.0\",\n \"@typescript-eslint/parser\": \"^8.5.0\",\n \"@vitest/coverage-v8\": \"^2.1.4\",\n \"eslint\": \"^9.7.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-import\": \"^2.30.0\",\n \"eslint-plugin-n\": \"^17.10.2\",\n \"eslint-plugin-promise\": \"^7.1.0\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^2.1.4\"\n },\n \"type\": \"module\",\n \"bin\": {\n \"primer\": \"dist/index.js\"\n }\n }\n \n" + } + } + }, + { + "timestampMs": 1770182488413, + "phase": "withoutInstructions", + "type": "tool.execution_complete", + "data": { + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "toolCallId": "toolu_01CzbYettZVEcZ8aE2dMxFGW", + "success": true, + "result": { + "content": ".DS_Store\n.git\n.github\n.gitignore\n.prettierrc.json\n.primer-cache\nCHANGELOG.md\nCODEOWNERS\nCONTRIBUTING.md\nLICENSE\nPLAN.md\nREADME.md\nSECURITY.md\ndist\neslint.config.js\neval-results.html\neval-results.json\nexamples\nnode_modules\npackage-lock.json\npackage.json\nprimer.eval.json\nprimer.png\nrelease-please-config.json\nrelease-please-manifest.json\nsrc\ntsconfig.json\nvitest.config.ts", + "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready b/Users/pierceboggan/Documents/get-ready\ncreate file mode 100644\nindex 0000000..0000000\n--- a/dev/null\n+++ b/Users/pierceboggan/Documents/get-ready\n@@ -1,0 +1,28 @@\n .DS_Store\n .git\n .github\n .gitignore\n .prettierrc.json\n .primer-cache\n CHANGELOG.md\n CODEOWNERS\n CONTRIBUTING.md\n LICENSE\n PLAN.md\n README.md\n SECURITY.md\n dist\n eslint.config.js\n eval-results.html\n eval-results.json\n examples\n node_modules\n package-lock.json\n package.json\n primer.eval.json\n primer.png\n release-please-config.json\n release-please-manifest.json\n src\n tsconfig.json\n vitest.config.ts\n" + } + } + }, + { + "timestampMs": 1770182488430, + "phase": "withoutInstructions", + "type": "tool.execution_complete", + "data": { + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "toolCallId": "toolu_01NGYzuJkusQqT4meJPJuhD9", + "success": true, + "result": { + "content": "1. # Primer\n2. \n3. > Prime your repositories for AI-assisted development.\n4. \n5. [![CI](https://github.com/pierceboggan/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/pierceboggan/primer/actions/workflows/ci.yml)\n6. [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n7. \n8. Primer is a CLI tool that analyzes your codebase and generates `.github/copilot-instructions.md` files to help AI coding assistants understand your project better. It supports single repos, batch processing across organizations, and includes an evaluation framework to measure instruction effectiveness.\n9. \n10. ![Primer](primer.png)\n11. \n12. ## Features\n13. \n14. - **Repository Analysis** - Detects languages, frameworks, and package managers\n15. - **AI-Powered Generation** - Uses the Copilot SDK to analyze your codebase and generate context-aware instructions\n16. - **Batch Processing** - Process multiple repos across organizations with a single command\n17. - **Evaluation Framework** - Test and measure how well your instructions improve AI responses\n18. - **Readiness Report** - Score AI readiness across key pillars with a fix-first checklist\n19. - **GitHub Integration** - Clone repos, create branches, and open PRs automatically\n20. - **Interactive TUI** - Beautiful terminal interface built with Ink\n21. - **Config Generation** - Generate MCP and VS Code configurations\n22. \n23. ## Prerequisites\n24. \n25. 1. **Node.js 18+**\n26. 2. **GitHub Copilot CLI** - Installed via VS Code's Copilot Chat extension\n27. 3. **Copilot CLI Authentication** - Run `copilot` then `/login` to authenticate\n28. 4. **GitHub CLI (optional)** - For batch processing and PR creation: `brew install gh && gh auth login`\n29. 5. **Azure DevOps PAT (optional)** - For Azure DevOps batch/PR workflows: set `AZURE_DEVOPS_PAT`\n30. \n31. ## Installation\n32. \n33. ```bash\n34. # Install from npm\n35. npm install -g primer\n36. ```\n37. \n38. ### Quick Install\n39. \n40. ```bash\n41. primer --help\n42. ```\n43. \n44. ##…", + "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready/README.md b/Users/pierceboggan/Documents/get-ready/README.md\nindex 0000000..0000000 100644\n--- a/Users/pierceboggan/Documents/get-ready/README.md\n+++ b/Users/pierceboggan/Documents/get-ready/README.md\n@@ -1,362 +1,362 @@\n # Primer\n \n > Prime your repositories for AI-assisted development.\n \n [![CI](https://github.com/pierceboggan/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/pierceboggan/primer/actions/workflows/ci.yml)\n [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n \n Primer is a CLI tool that analyzes your codebase and generates `.github/copilot-instructions.md` files to help AI coding assistants understand your project better. It supports single repos, batch processing across organizations, and includes an evaluation framework to measure instruction effectiveness.\n \n ![Primer](primer.png)\n \n ## Features\n \n - **Repository Analysis** - Detects languages, frameworks, and package managers\n - **AI-Powered Generation** - Uses the Copilot SDK to analyze your codebase and generate context-aware instructions\n - **Batch Processing** - Process multiple repos across organizations with a single command\n - **Evaluation Framework** - Test and measure how well your instructions improve AI responses\n - **Readiness Report** - Score AI readiness across key pillars with a fix-first checklist\n - **GitHub Integration** - Clone repos, create branches, and open PRs automatically\n - **Interactive TUI** - Beautiful terminal interface built with Ink\n - **Config Generation** - Generate MCP and VS Code configurations\n \n ## Prerequisites\n \n 1. **Node.js 18+**\n 2. **GitHub Copilot CLI** - Installed via VS Code's Copilot Chat extension\n 3. **Copilot CLI Authentication** - Run `copilot` then `/login` to authenticate\n 4. **GitHub CLI (optional)** - For batch processing and PR creation: `brew install gh && gh auth login`\n 5. **Azure DevOps PAT (optional)** - For Azure DevOps batch/PR workflows: set `AZ…" + } + } + }, + { + "timestampMs": 1770182490847, + "phase": "withoutInstructions", + "type": "assistant.usage", + "data": { + "model": "claude-haiku-4.5", + "inputTokens": 7343, + "outputTokens": 219, + "cacheReadTokens": 0, + "cacheWriteTokens": 0, + "cost": 0.33, + "duration": 2400, + "initiator": "sub-agent", + "apiCallId": "msg_01R8GGE5VmR6reyFGzX8mGHz", + "providerCallId": "E903:35A03D:33F2DB:3DA886:6982D758", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + }, + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg" + } + }, + { + "timestampMs": 1770182490847, + "phase": "withoutInstructions", + "type": "assistant.message", + "data": { + "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "messageId": "f887839e-d030-4ed2-b01a-f4c8902583da", + "content": "## Summary\n\n**Primer** is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It features repository analysis, AI-powered instruction generation, batch processing, evaluation framework, readiness reports, and GitHub integration.\n\n**Main Entrypoints:**\n\n| File | Purpose |\n|------|---------|\n| `/Users/pierceboggan/Documents/get-ready/src/index.ts` | CLI entry point |\n| `/Users/pierceboggan/Documents/get-ready/src/cli.ts` | Commander CLI setup |\n\n**Key Commands:**\n- `primer init` - Interactive setup\n- `primer tui` - Terminal UI\n- `primer instructions` - Generate instructions\n- `primer analyze` - Repository analysis\n- `primer batch` - Batch processing\n- `primer readiness` - Readiness report\n- `primer eval` - Evaluation framework", + "toolRequests": [] + } + }, + { + "timestampMs": 1770182490886, + "phase": "withoutInstructions", + "type": "tool.execution_complete", + "data": { + "toolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", + "success": true, + "result": { + "content": "## Summary\n\n**Primer** is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It features repository analysis, AI-powered instruction generation, batch processing, evaluation framework, readiness reports, and GitHub integration.\n\n**Main Entrypoints:**\n\n| File | Purpose |\n|------|---------|\n| `/Users/pierceboggan/Documents/get-ready/src/index.ts` | CLI entry point |\n| `/Users/pierceboggan/Documents/get-ready/src/cli.ts` | Commander CLI setup |\n\n**Key Commands:**\n- `primer init` - Interactive setup\n- `primer tui` - Terminal UI\n- `primer instructions` - Generate instructions\n- `primer analyze` - Repository analysis\n- `primer batch` - Batch processing\n- `primer readiness` - Readiness report\n- `primer eval` - Evaluation framework", + "detailedContent": "## Summary\n\n(Full response provided to agent)" + }, + "toolTelemetry": { + "properties": { + "prompt_length": "115", + "response_length": "828", + "hashed_agent_name": "6f281157ab246f0e1f35db82165d3448ee1e39077ab0d720fca7dddf014249d6", + "agent_type": "explore", + "execution_mode": "sync" + }, + "restrictedProperties": { + "agent_name": "explore" + }, + "metrics": { + "response_length": 828, + "numberOfToolCallsMadeByAgent": 3 + } + } + } + }, + { + "timestampMs": 1770182490886, + "phase": "withoutInstructions", + "type": "assistant.turn_end", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770182490886, + "phase": "withoutInstructions", + "type": "assistant.turn_start", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770182490886, + "phase": "withoutInstructions", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 10605, + "messagesLength": 5 + } + }, + { + "timestampMs": 1770182491922, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": "This", + "totalResponseSizeBytes": 4 + } + }, + { + "timestampMs": 1770182491923, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 12, + "deltaPreview": " application", + "totalResponseSizeBytes": 16 + } + }, + { + "timestampMs": 1770182491923, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 17 + } + }, + { + "timestampMs": 1770182491923, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 7, + "deltaPreview": " Primer", + "totalResponseSizeBytes": 24 + } + }, + { + "timestampMs": 1770182491923, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 25 + } + }, + { + "timestampMs": 1770182491923, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": " is", + "totalResponseSizeBytes": 28 + } + }, + { + "timestampMs": 1770182491923, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " a", + "totalResponseSizeBytes": 30 + } + }, + { + "timestampMs": 1770182492100, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 34 + } + }, + { + "timestampMs": 1770182492100, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 5, + "deltaPreview": " tool", + "totalResponseSizeBytes": 39 + } + }, + { + "timestampMs": 1770182492101, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 5, + "deltaPreview": " that", + "totalResponseSizeBytes": 44 + } + }, + { + "timestampMs": 1770182492101, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 9, + "deltaPreview": " analyzes", + "totalResponseSizeBytes": 53 + } + }, + { + "timestampMs": 1770182492101, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 5, + "deltaPreview": " code", + "totalResponseSizeBytes": 58 + } + }, + { + "timestampMs": 1770182492101, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 5, + "deltaPreview": "bases", + "totalResponseSizeBytes": 63 + } + }, + { + "timestampMs": 1770182492101, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 67 + } + }, + { + "timestampMs": 1770182492101, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 10, + "deltaPreview": " generates", + "totalResponseSizeBytes": 77 + } + }, + { + "timestampMs": 1770182492101, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": " `.", + "totalResponseSizeBytes": 80 + } + }, + { + "timestampMs": 1770182492101, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "github", + "totalResponseSizeBytes": 86 + } + }, + { + "timestampMs": 1770182492171, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": "/cop", + "totalResponseSizeBytes": 90 + } + }, + { + "timestampMs": 1770182492171, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": "ilot", + "totalResponseSizeBytes": 94 + } + }, + { + "timestampMs": 1770182492172, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": "-in", + "totalResponseSizeBytes": 97 + } + }, + { + "timestampMs": 1770182492172, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 10, + "deltaPreview": "structions", + "totalResponseSizeBytes": 107 + } + }, + { + "timestampMs": 1770182492172, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": ".md", + "totalResponseSizeBytes": 110 + } + }, + { + "timestampMs": 1770182492172, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": "`", + "totalResponseSizeBytes": 111 + } + }, + { + "timestampMs": 1770182492172, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": " files", + "totalResponseSizeBytes": 117 + } + }, + { + "timestampMs": 1770182492172, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": " to", + "totalResponseSizeBytes": 120 + } + }, + { + "timestampMs": 1770182492172, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 5, + "deltaPreview": " help", + "totalResponseSizeBytes": 125 + } + }, + { + "timestampMs": 1770182492172, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": " AI", + "totalResponseSizeBytes": 128 + } + }, + { + "timestampMs": 1770182492287, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 7, + "deltaPreview": " coding", + "totalResponseSizeBytes": 135 + } + }, + { + "timestampMs": 1770182492287, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 11, + "deltaPreview": " assistants", + "totalResponseSizeBytes": 146 + } + }, + { + "timestampMs": 1770182492287, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 11, + "deltaPreview": " understand", + "totalResponseSizeBytes": 157 + } + }, + { + "timestampMs": 1770182492287, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 9, + "deltaPreview": " projects", + "totalResponseSizeBytes": 166 + } + }, + { + "timestampMs": 1770182492288, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 7, + "deltaPreview": " better", + "totalResponseSizeBytes": 173 + } + }, + { + "timestampMs": 1770182492288, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 174 + } + }, + { + "timestampMs": 1770182492288, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": " It", + "totalResponseSizeBytes": 177 + } + }, + { + "timestampMs": 1770182492288, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 9, + "deltaPreview": " supports", + "totalResponseSizeBytes": 186 + } + }, + { + "timestampMs": 1770182492288, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 11, + "deltaPreview": " repository", + "totalResponseSizeBytes": 197 + } + }, + { + "timestampMs": 1770182492288, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 9, + "deltaPreview": " analysis", + "totalResponseSizeBytes": 206 + } + }, + { + "timestampMs": 1770182492404, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 207 + } + }, + { + "timestampMs": 1770182492404, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": " AI", + "totalResponseSizeBytes": 210 + } + }, + { + "timestampMs": 1770182492405, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 8, + "deltaPreview": "-powered", + "totalResponseSizeBytes": 218 + } + }, + { + "timestampMs": 1770182492405, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 12, + "deltaPreview": " instruction", + "totalResponseSizeBytes": 230 + } + }, + { + "timestampMs": 1770182492405, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 11, + "deltaPreview": " generation", + "totalResponseSizeBytes": 241 + } + }, + { + "timestampMs": 1770182492405, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 242 + } + }, + { + "timestampMs": 1770182492405, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": " batch", + "totalResponseSizeBytes": 248 + } + }, + { + "timestampMs": 1770182492405, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 11, + "deltaPreview": " processing", + "totalResponseSizeBytes": 259 + } + }, + { + "timestampMs": 1770182492405, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 260 + } + }, + { + "timestampMs": 1770182492405, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 11, + "deltaPreview": " evaluation", + "totalResponseSizeBytes": 271 + } + }, + { + "timestampMs": 1770182492567, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 272 + } + }, + { + "timestampMs": 1770182492567, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 10, + "deltaPreview": " readiness", + "totalResponseSizeBytes": 282 + } + }, + { + "timestampMs": 1770182492568, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 8, + "deltaPreview": " reports", + "totalResponseSizeBytes": 290 + } + }, + { + "timestampMs": 1770182492568, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 291 + } + }, + { + "timestampMs": 1770182492568, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 295 + } + }, + { + "timestampMs": 1770182492568, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " Git", + "totalResponseSizeBytes": 299 + } + }, + { + "timestampMs": 1770182492568, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": "Hub", + "totalResponseSizeBytes": 302 + } + }, + { + "timestampMs": 1770182492568, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 12, + "deltaPreview": " integration", + "totalResponseSizeBytes": 314 + } + }, + { + "timestampMs": 1770182492568, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": ".\n\n", + "totalResponseSizeBytes": 317 + } + }, + { + "timestampMs": 1770182492568, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": "Main", + "totalResponseSizeBytes": 321 + } + }, + { + "timestampMs": 1770182492747, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": " entry", + "totalResponseSizeBytes": 327 + } + }, + { + "timestampMs": 1770182492747, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "points", + "totalResponseSizeBytes": 333 + } + }, + { + "timestampMs": 1770182492747, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": ":\n", + "totalResponseSizeBytes": 335 + } + }, + { + "timestampMs": 1770182492747, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": "-", + "totalResponseSizeBytes": 336 + } + }, + { + "timestampMs": 1770182492747, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 340 + } + }, + { + "timestampMs": 1770182492747, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "/index", + "totalResponseSizeBytes": 346 + } + }, + { + "timestampMs": 1770182492747, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 349 + } + }, + { + "timestampMs": 1770182492747, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " —", + "totalResponseSizeBytes": 353 + } + }, + { + "timestampMs": 1770182492748, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 357 + } + }, + { + "timestampMs": 1770182492748, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": " entry", + "totalResponseSizeBytes": 363 + } + }, + { + "timestampMs": 1770182492818, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": " point", + "totalResponseSizeBytes": 369 + } + }, + { + "timestampMs": 1770182492818, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": "\n", + "totalResponseSizeBytes": 370 + } + }, + { + "timestampMs": 1770182492819, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": "-", + "totalResponseSizeBytes": 371 + } + }, + { + "timestampMs": 1770182492819, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 375 + } + }, + { + "timestampMs": 1770182492819, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 376 + } + }, + { + "timestampMs": 1770182492819, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": "cli", + "totalResponseSizeBytes": 379 + } + }, + { + "timestampMs": 1770182492819, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 382 + } + }, + { + "timestampMs": 1770182492819, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " —", + "totalResponseSizeBytes": 386 + } + }, + { + "timestampMs": 1770182492819, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 10, + "deltaPreview": " Commander", + "totalResponseSizeBytes": 396 + } + }, + { + "timestampMs": 1770182492819, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 400 + } + }, + { + "timestampMs": 1770182492924, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": " setup", + "totalResponseSizeBytes": 406 + } + }, + { + "timestampMs": 1770182492924, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": "\n\n", + "totalResponseSizeBytes": 408 + } + }, + { + "timestampMs": 1770182492927, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 3, + "deltaPreview": "Key", + "totalResponseSizeBytes": 411 + } + }, + { + "timestampMs": 1770182492927, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 420 + } + }, + { + "timestampMs": 1770182492927, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 8, + "deltaPreview": " include", + "totalResponseSizeBytes": 428 + } + }, + { + "timestampMs": 1770182492927, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 1, + "deltaPreview": ":", + "totalResponseSizeBytes": 429 + } + }, + { + "timestampMs": 1770182492927, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 431 + } + }, + { + "timestampMs": 1770182492927, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "primer", + "totalResponseSizeBytes": 437 + } + }, + { + "timestampMs": 1770182492927, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 5, + "deltaPreview": " init", + "totalResponseSizeBytes": 442 + } + }, + { + "timestampMs": 1770182492927, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 444 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 446 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "primer", + "totalResponseSizeBytes": 452 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " tui", + "totalResponseSizeBytes": 456 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 458 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 460 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "primer", + "totalResponseSizeBytes": 466 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 13, + "deltaPreview": " instructions", + "totalResponseSizeBytes": 479 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 481 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 483 + } + }, + { + "timestampMs": 1770182492962, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "primer", + "totalResponseSizeBytes": 489 + } + }, + { + "timestampMs": 1770182493032, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 8, + "deltaPreview": " analyze", + "totalResponseSizeBytes": 497 + } + }, + { + "timestampMs": 1770182493032, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 499 + } + }, + { + "timestampMs": 1770182493032, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 501 + } + }, + { + "timestampMs": 1770182493032, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "primer", + "totalResponseSizeBytes": 507 + } + }, + { + "timestampMs": 1770182493032, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": " batch", + "totalResponseSizeBytes": 513 + } + }, + { + "timestampMs": 1770182493032, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 515 + } + }, + { + "timestampMs": 1770182493033, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 517 + } + }, + { + "timestampMs": 1770182493033, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "primer", + "totalResponseSizeBytes": 523 + } + }, + { + "timestampMs": 1770182493033, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 10, + "deltaPreview": " readiness", + "totalResponseSizeBytes": 533 + } + }, + { + "timestampMs": 1770182493033, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 535 + } + }, + { + "timestampMs": 1770182493106, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 539 + } + }, + { + "timestampMs": 1770182493106, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 541 + } + }, + { + "timestampMs": 1770182493106, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 6, + "deltaPreview": "primer", + "totalResponseSizeBytes": 547 + } + }, + { + "timestampMs": 1770182493106, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 5, + "deltaPreview": " eval", + "totalResponseSizeBytes": 552 + } + }, + { + "timestampMs": 1770182493106, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "deltaChars": 2, + "deltaPreview": "`.", + "totalResponseSizeBytes": 554 + } + }, + { + "timestampMs": 1770182493106, + "phase": "withoutInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 10005, + "outputTokens": 114, + "cacheReadTokens": 9088, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 2219, + "initiator": "agent", + "apiCallId": "chatcmpl-D5PcRI6T4ILfUtZDNyDGjcQAeURGc", + "providerCallId": "E903:35A03D:33FAB6:3DB199:6982D75A", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770182493107, + "phase": "withoutInstructions", + "type": "assistant.message", + "data": { + "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "content": "This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, evaluation, readiness reports, and GitHub integration.\n\nMain entrypoints:\n- src/index.ts — CLI entry point\n- src/cli.ts — Commander CLI setup\n\nKey commands include: `primer init`, `primer tui`, `primer instructions`, `primer analyze`, `primer batch`, `primer readiness`, and `primer eval`.", + "toolRequests": [] + } + }, + { + "timestampMs": 1770182493107, + "phase": "withoutInstructions", + "type": "assistant.turn_end", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770182493107, + "phase": "withoutInstructions", + "type": "session.idle", + "data": {} + }, + { + "timestampMs": 1770182493132, + "phase": "withInstructions", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770182493132, + "phase": "withInstructions", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770182493866, + "phase": "withInstructions", + "type": "user.message", + "data": { + "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nSummarize what this application does and list the main entrypoints.", + "transformedContent": "2026-02-04T05:21:33.829Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nSummarize what this application does and list the main entrypoints.", + "attachments": [] + } + }, + { + "timestampMs": 1770182493867, + "phase": "withInstructions", + "type": "assistant.turn_start", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770182493867, + "phase": "withInstructions", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 11015, + "messagesLength": 2 + } + }, + { + "timestampMs": 1770182495951, + "phase": "withInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 10382, + "outputTokens": 94, + "cacheReadTokens": 9984, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 2080, + "initiator": "user", + "apiCallId": "chatcmpl-D5PcUtFiguAzEPDeiBTxJYeehvIh9", + "providerCallId": "E903:35A03D:340477:3DBCDB:6982D75D", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770182495951, + "phase": "withInstructions", + "type": "assistant.message", + "data": { + "messageId": "fa934988-cc62-4c45-8c26-b19e0fb419f0", + "content": "", + "toolRequests": [ + { + "toolCallId": "call_gQKcwh4lrRf8iHebDhI7mxBH", + "name": "report_intent", + "arguments": { + "intent": "Summarizing application purpose" + }, + "type": "function" + }, + { + "toolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "name": "task", + "arguments": { + "agent_type": "explore", + "description": "Summarizing app and entrypoints", + "prompt": "Summarize what this application does and list the main entrypoints. Be concise. List the main CLI commands or programmatic entrypoints if present." + }, + "type": "function" + } + ] + } + }, + { + "timestampMs": 1770182495951, + "phase": "withInstructions", + "type": "tool.execution_start", + "data": { + "toolCallId": "call_gQKcwh4lrRf8iHebDhI7mxBH", + "toolName": "report_intent", + "arguments": { + "intent": "Summarizing application purpose" + } + } + }, + { + "timestampMs": 1770182495951, + "phase": "withInstructions", + "type": "tool.execution_start", + "data": { + "toolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolName": "task", + "arguments": { + "agent_type": "explore", + "description": "Summarizing app and entrypoints", + "prompt": "Summarize what this application does and list the main entrypoints. Be concise. List the main CLI commands or programmatic entrypoints if present." + } + } + }, + { + "timestampMs": 1770182495951, + "phase": "withInstructions", + "type": "tool.execution_complete", + "data": { + "toolCallId": "call_gQKcwh4lrRf8iHebDhI7mxBH", + "success": true, + "result": { + "content": "Intent logged", + "detailedContent": "Summarizing application purpose" + }, + "toolTelemetry": {} + } + }, + { + "timestampMs": 1770182499225, + "phase": "withInstructions", + "type": "assistant.usage", + "data": { + "model": "claude-haiku-4.5", + "inputTokens": 2713, + "outputTokens": 335, + "cacheReadTokens": 0, + "cacheWriteTokens": 0, + "cost": 0.33, + "duration": 2960, + "initiator": "sub-agent", + "apiCallId": "msg_017fmNqNjPGntbszM5ineEJx", + "providerCallId": "E903:35A03D:340C7D:3DC60F:6982D760", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + }, + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg" + } + }, + { + "timestampMs": 1770182499225, + "phase": "withInstructions", + "type": "assistant.message", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "messageId": "531da1e7-1e5a-4994-9b81-e88dc0c26449", + "content": "", + "toolRequests": [ + { + "toolCallId": "toolu_01JKTy3e1wKbgcDnacNd6zAL", + "name": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready" + }, + "type": "function" + }, + { + "toolCallId": "toolu_01Gthn6BZZUdvXEe7xij4AxH", + "name": "glob", + "arguments": { + "pattern": "*.{json,md,ts,js}" + }, + "type": "function" + }, + { + "toolCallId": "toolu_018NEuFLeYuySsA57e7ng8dF", + "name": "grep", + "arguments": { + "pattern": "^#!/usr/bin|bin|entry|command", + "glob": "**/*.json", + "output_mode": "content", + "head_limit": 20 + }, + "type": "function" + } + ], + "reasoningOpaque": "Sj+mHN97bEs0KKkaaMzdSj9k5udHmn9TDLgFxNHMmOtmohC5w2RTGHP0gkk4nzgjLjiZXFpqEYIjDphd6pRNYl1buJlL1qwzgHGnbBvaXutwQn3158THudxBZiWZIu5XbbJuQBEeDw6cJ4p/bScgmeFlDS8GmPB9GVxO/eppM8McfXoHTcpCGxNKkWcBsQqrGDd0cYMYEIr5MX2VI7oivTcgXQ8l6oSd8HzzNQakIx6zg95+Pp2BOLzmDX1kj4Yg50FU1P8UvsHJDuIZxfZNDHSrq4w05NGpDDhi/EU+L1gAhr50lhoBkL+/p4Pmf4J2JSdLWK9jhaMjoRIT0NNgLOkweDgdSw2RWIQ/IMxUOLPAmA9gO3vVOYHrOR44t0JREP/kKEbKIAppOnt+bdhNZlmLrTiz89Z8spefLgVO+vA2HiLtaMChRp3SLMEPfWuUPyCOATQIMLaKRBJdj7UPxxs8qxIthVYC3I/OwGx/lYDgn4iyiV3Jldl2eyTTVkQ9I4dX3vMNRX5IEaIqy+KmR/poWT/RdJIeZvE08lnZcAfonYmHk9Y4G0L+d+1NnGsbkZNwDdbWtMgbE1rCeto9mL8F75j7sSDSQ/kbdmSBJB33Pp4Z9LM3mjdIIvdTpoXU4vKj+3tJJkDtW7Wzuk3wp0EWYdPU8g12huU5QA0I1t6UFbKt14NKAmNCvPDCv8BYjEONsvBgWCnjGuTzMZp9D/bFOrGaTT4RVZyO7+krVObs8ONJFeCVTkkMf9KhTrJXGcNxJf73J0JYRaZTp6ZtARjLL5uXOxQUz5mx0qwJYw3GnRctYmooc7WjFUFyHYarl9UVvfg0BrT10n4GWaZZbFWy4YKy0hrPc+yeq7uDM67b2686inCqmiTXXrtoXSchfbz65BYo9sONjRY+WA/ZZCYYeahImPej6UXy55R4pZmKlxGhWqg19RyzfJF5AUbIuK3fsKy3lGO35z328K+XhvKmgv5nUngBW6YVBk4vaqk9Qhq89xp7olwHK07SS+iNNMd+t8Mm9ljBWpzJy7JY+uDllcskjLnDlG14tmlCa69txWFpjHa9uugn0ZwZLWYCE1lRGb7BMT5MPXWr862a+AW+YYuANtYjKMOOh1g7dW9+5GbVO2+LUEbHkAlaUd4vXIpc6XyGl2rX767xFgmkpZKRg3yUPL16sUtdvDC2qowSsusAJwOV+rf5a05eQnA4h+hcpEA2SdXf3ZNk0RVKS7Pabbbvf2zCuIVEHS0Eh8yhqNsgKHO7A2Y9MTXgwYBf5+30oCi1bM1RjfAaBJ3b4jnPp1tRuMQ4dBZYGgjA0MGsA5FJX+X1WTgC1IKfB/LEHIqLBrqeuzanVvb1CHt0ROnf+UOCE6aQlOmi6SwNdw0bBAwjr/77WKbKZuOmlUFRhS/pACRz5qfZQxD37OF3PiwrqNlHjuWQxG6b2+VmH0sfe68qOnwWuZPijybKks8YWr5efUuNWEWTdUkrWC+y96Uh83ApY50iPhd3+qymzZvPI4BWa7LrLMSVMBT3tlgihTxTT3r2OZcOTRI7J/Ar49MNob7XDzJzIg==", + "reasoningText": "The user wants me to:\n1. Summarize what the application does\n2. List the main entrypoints\n3. List main CLI commands or programmatic entrypoints if present\n4. Be concise\n\nI should start by exploring the codebase structure to understand what this app does. Let me look at:\n1. The root directory structure\n2. Package.json or similar config files to understand what it is\n3. Main entry files\n4. README or documentation\n\nLet me start with viewing the root directory and searching for key files in parallel." + } + }, + { + "timestampMs": 1770182499225, + "phase": "withInstructions", + "type": "tool.execution_start", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_01JKTy3e1wKbgcDnacNd6zAL", + "toolName": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready" + } + } + }, + { + "timestampMs": 1770182499225, + "phase": "withInstructions", + "type": "tool.execution_start", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_01Gthn6BZZUdvXEe7xij4AxH", + "toolName": "glob", + "arguments": { + "pattern": "*.{json,md,ts,js}" + } + } + }, + { + "timestampMs": 1770182499225, + "phase": "withInstructions", + "type": "tool.execution_start", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_018NEuFLeYuySsA57e7ng8dF", + "toolName": "grep", + "arguments": { + "pattern": "^#!/usr/bin|bin|entry|command", + "glob": "**/*.json", + "output_mode": "content", + "head_limit": 20 + } + } + }, + { + "timestampMs": 1770182499226, + "phase": "withInstructions", + "type": "tool.execution_complete", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_01JKTy3e1wKbgcDnacNd6zAL", + "success": true, + "result": { + "content": ".DS_Store\n.git\n.github\n.gitignore\n.prettierrc.json\n.primer-cache\nCHANGELOG.md\nCODEOWNERS\nCONTRIBUTING.md\nLICENSE\nPLAN.md\nREADME.md\nSECURITY.md\ndist\neslint.config.js\neval-results.html\neval-results.json\nexamples\nnode_modules\npackage-lock.json\npackage.json\nprimer.eval.json\nprimer.png\nrelease-please-config.json\nrelease-please-manifest.json\nsrc\ntsconfig.json\nvitest.config.ts", + "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready b/Users/pierceboggan/Documents/get-ready\ncreate file mode 100644\nindex 0000000..0000000\n--- a/dev/null\n+++ b/Users/pierceboggan/Documents/get-ready\n@@ -1,0 +1,28 @@\n .DS_Store\n .git\n .github\n .gitignore\n .prettierrc.json\n .primer-cache\n CHANGELOG.md\n CODEOWNERS\n CONTRIBUTING.md\n LICENSE\n PLAN.md\n README.md\n SECURITY.md\n dist\n eslint.config.js\n eval-results.html\n eval-results.json\n examples\n node_modules\n package-lock.json\n package.json\n primer.eval.json\n primer.png\n release-please-config.json\n release-please-manifest.json\n src\n tsconfig.json\n vitest.config.ts\n" + } + } + }, + { + "timestampMs": 1770182499238, + "phase": "withInstructions", + "type": "tool.execution_complete", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_01Gthn6BZZUdvXEe7xij4AxH", + "success": true, + "result": { + "content": "./release-please-config.json\n./vitest.config.ts\n./src/services/git.ts\n./primer.eval.json\n./src/services/instructions.ts\n./eslint.config.js\n./src/services/analyzer.ts\n./tsconfig.json\n./PLAN.md\n./src/index.ts\n./src/services/readiness.ts\n./src/services/github.ts\n./src/services/evaluator.ts\n./src/services/azureDevops.ts\n./src/services/generator.ts\n./.prettierrc.json\n./README.md\n./eval-results.json\n./CHANGELOG.md\n./release-please-manifest.json\n./package.json\n./package-lock.json\n./CONTRIBUTING.md\n./src/services/__tests__/analyzer.test.ts\n./src/cli.ts\n./examples/primer.eval.json\n./examples/README.md\n./SECURITY.md\n./src/utils/logger.ts\n./src/utils/fs.ts\n./.github/PULL_REQUEST_TEMPLATE.md\n./.github/copilot-instructions.md\n./src/commands/pr.ts\n./src/commands/eval.ts\n./src/commands/readiness.ts\n./src/commands/init.ts\n./src/commands/analyze.ts\n./src/commands/generate.ts\n./src/commands/templates.ts\n./src/commands/config.ts\n./src/commands/update.ts\n./.github/ISSUE_TEMPLATE/bug_report.md\n./.github/ISSUE_TEMPLATE/feature_request.md\n./src/ui/index.ts\n./src/ui/README.md", + "detailedContent": "./release-please-config.json\n./vitest.config.ts\n./src/services/git.ts\n./primer.eval.json\n./src/services/instructions.ts\n./eslint.config.js\n./src/services/analyzer.ts\n./tsconfig.json\n./PLAN.md\n./src/index.ts\n./src/services/readiness.ts\n./src/services/github.ts\n./src/services/evaluator.ts\n./src/services/azureDevops.ts\n./src/services/generator.ts\n./.prettierrc.json\n./README.md\n./eval-results.json\n./CHANGELOG.md\n./release-please-manifest.json\n./package.json\n./package-lock.json\n./CONTRIBUTING.md\n./src/services/__tests__/analyzer.test.ts\n./src/cli.ts\n./examples/primer.eval.json\n./examples/README.md\n./SECURITY.md\n./src/utils/logger.ts\n./src/utils/fs.ts\n./.github/PULL_REQUEST_TEMPLATE.md\n./.github/copilot-instructions.md\n./src/commands/pr.ts\n./src/commands/eval.ts\n./src/commands/readiness.ts\n./src/commands/init.ts\n./src/commands/analyze.ts\n./src/commands/generate.ts\n./src/commands/templates.ts\n./src/commands/config.ts\n./src/commands/update.ts\n./.github/ISSUE_TEMPLATE/bug_report.md\n./.github/ISSUE_TEMPLATE/feature_request.md\n./src/ui/index.ts\n./src/ui/README.md" + } + } + }, + { + "timestampMs": 1770182499260, + "phase": "withInstructions", + "type": "tool.execution_complete", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_018NEuFLeYuySsA57e7ng8dF", + "success": true, + "result": { + "content": "./package.json: \"commander\": \"^14.0.2\",\n./package.json: \"bin\": {\n./eval-results.json: \"prompt\": \"Summarize what this application does and list the main entrypoints.\",\n./eval-results.json: \"expectation\": \"Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.\",\n./eval-results.json: \"withInstructions\": \"This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, readiness reporting, evaluation, GitHub integration, and an interactive terminal UI.\\n\\nMain entrypoints:\\n- dist/index.js (npm bin: primer) — Main CLI entry point\\n- src/index.ts — TypeScript entry point\\n- src/cli.ts — CLI command setup\\n\\nPrimary commands include: init, tui, instructions, analyze, batch, readiness, eval, pr, and generate.\",\n./eval-results.json: \"withoutInstructions\": \"This application, \\\"Primer,\\\" is a CLI tool that primes repositories for AI-assisted development. It analyzes codebases, generates `.github/copilot-instructions.md` files to help AI coding assistants, supports batch processing, provides an evaluation framework, and integrates with GitHub for automation.\\n\\n**Main entrypoints:**\\n- CLI command: `primer` (installed globally or run locally)\\n- Programmatic entry: `src/index.ts` (calls `runCli` in `src/cli.ts`)\\n- Key CLI commands: `init`, `analyze`, `generate`, `pr`, `eval`, `tui`, `instructions`, `readiness`, `batch`, `templates`, `update`, `config` (all wired in `src/cli.ts`)\",\n./eval-results.json: \"rationale\": \"Response B best matches the expectation by explicitly mentioning both the CLI entrypoint in src/index.ts and that this is the Primer CLI. It also provides a clear list of main entrypoints and commands, directly addressing the requirements. Response A is also accurate but less explicit about the entryp…", + "detailedContent": "./package.json: \"commander\": \"^14.0.2\",\n./package.json: \"bin\": {\n./eval-results.json: \"prompt\": \"Summarize what this application does and list the main entrypoints.\",\n./eval-results.json: \"expectation\": \"Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.\",\n./eval-results.json: \"withInstructions\": \"This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, readiness reporting, evaluation, GitHub integration, and an interactive terminal UI.\\n\\nMain entrypoints:\\n- dist/index.js (npm bin: primer) — Main CLI entry point\\n- src/index.ts — TypeScript entry point\\n- src/cli.ts — CLI command setup\\n\\nPrimary commands include: init, tui, instructions, analyze, batch, readiness, eval, pr, and generate.\",\n./eval-results.json: \"withoutInstructions\": \"This application, \\\"Primer,\\\" is a CLI tool that primes repositories for AI-assisted development. It analyzes codebases, generates `.github/copilot-instructions.md` files to help AI coding assistants, supports batch processing, provides an evaluation framework, and integrates with GitHub for automation.\\n\\n**Main entrypoints:**\\n- CLI command: `primer` (installed globally or run locally)\\n- Programmatic entry: `src/index.ts` (calls `runCli` in `src/cli.ts`)\\n- Key CLI commands: `init`, `analyze`, `generate`, `pr`, `eval`, `tui`, `instructions`, `readiness`, `batch`, `templates`, `update`, `config` (all wired in `src/cli.ts`)\",\n./eval-results.json: \"rationale\": \"Response B best matches the expectation by explicitly mentioning both the CLI entrypoint in src/index.ts and that this is the Primer CLI. It also provides a clear list of main entrypoints and commands, directly addressing the requirements. Response A is also accurate but less explicit about the entryp…" + } + } + }, + { + "timestampMs": 1770182502888, + "phase": "withInstructions", + "type": "assistant.usage", + "data": { + "model": "claude-haiku-4.5", + "inputTokens": 9496, + "outputTokens": 165, + "cacheReadTokens": 0, + "cacheWriteTokens": 0, + "cost": 0.33, + "duration": 3626, + "initiator": "sub-agent", + "apiCallId": "msg_01285RH3mRmZCCKvqySHWWA9", + "providerCallId": "E903:35A03D:341602:3DD120:6982D763", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + }, + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg" + } + }, + { + "timestampMs": 1770182502888, + "phase": "withInstructions", + "type": "assistant.message", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "messageId": "64122101-f836-4292-b6cf-9b2977b87e51", + "content": "Perfect! Now let me get a quick look at the main index and cli files:", + "toolRequests": [ + { + "toolCallId": "toolu_019LFBnAwWLkTJdZchDi3VH5", + "name": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready/src/index.ts" + }, + "type": "function" + }, + { + "toolCallId": "toolu_019rGWXpe6FY43aGFY64R9XQ", + "name": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready/src/cli.ts", + "view_range": [ + 1, + 95 + ] + }, + "type": "function" + } + ] + } + }, + { + "timestampMs": 1770182502889, + "phase": "withInstructions", + "type": "tool.execution_start", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_019LFBnAwWLkTJdZchDi3VH5", + "toolName": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready/src/index.ts" + } + } + }, + { + "timestampMs": 1770182502889, + "phase": "withInstructions", + "type": "tool.execution_start", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_019rGWXpe6FY43aGFY64R9XQ", + "toolName": "view", + "arguments": { + "path": "/Users/pierceboggan/Documents/get-ready/src/cli.ts", + "view_range": [ + 1, + 95 + ] + } + } + }, + { + "timestampMs": 1770182502893, + "phase": "withInstructions", + "type": "tool.execution_complete", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_019LFBnAwWLkTJdZchDi3VH5", + "success": true, + "result": { + "content": "1. import { runCli } from \"./cli\";\n2. \n3. const [, , ...args] = process.argv;\n4. if (args.length === 0) {\n5. \trunCli([process.argv[0], process.argv[1], \"tui\"]);\n6. } else {\n7. \trunCli(process.argv);\n8. }\n9. ", + "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready/src/index.ts b/Users/pierceboggan/Documents/get-ready/src/index.ts\nindex 0000000..0000000 100644\n--- a/Users/pierceboggan/Documents/get-ready/src/index.ts\n+++ b/Users/pierceboggan/Documents/get-ready/src/index.ts\n@@ -1,9 +1,9 @@\n import { runCli } from \"./cli\";\n \n const [, , ...args] = process.argv;\n if (args.length === 0) {\n \trunCli([process.argv[0], process.argv[1], \"tui\"]);\n } else {\n \trunCli(process.argv);\n }\n \n" + } + } + }, + { + "timestampMs": 1770182502910, + "phase": "withInstructions", + "type": "tool.execution_complete", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "toolCallId": "toolu_019rGWXpe6FY43aGFY64R9XQ", + "success": true, + "result": { + "content": "1. import { Command } from \"commander\";\n2. import { initCommand } from \"./commands/init\";\n3. import { analyzeCommand } from \"./commands/analyze\";\n4. import { generateCommand } from \"./commands/generate\";\n5. import { prCommand } from \"./commands/pr\";\n6. import { templatesCommand } from \"./commands/templates\";\n7. import { updateCommand } from \"./commands/update\";\n8. import { configCommand } from \"./commands/config\";\n9. import { evalCommand } from \"./commands/eval\";\n10. import { tuiCommand } from \"./commands/tui\";\n11. import { instructionsCommand } from \"./commands/instructions\";\n12. import { batchCommand } from \"./commands/batch\";\n13. import { readinessCommand } from \"./commands/readiness\";\n14. \n15. export function runCli(argv: string[]): void {\n16. const program = new Command();\n17. \n18. program\n19. .name(\"primer\")\n20. .description(\"Prime repositories for AI-assisted development\")\n21. .version(\"0.1.0\");\n22. \n23. program\n24. .command(\"init\")\n25. .argument(\"[path]\", \"Path to a local repository\")\n26. .option(\"--github\", \"Use a GitHub repository\")\n27. .option(\"--provider \", \"Repo provider (github|azure)\")\n28. .option(\"--yes\", \"Accept defaults and skip prompts\")\n29. .option(\"--force\", \"Overwrite existing files\")\n30. .action(initCommand);\n31. \n32. program\n33. .command(\"analyze\")\n34. .argument(\"[path]\", \"Path to a local repository\")\n35. .option(\"--json\", \"Output JSON\")\n36. .action(analyzeCommand);\n37. \n38. program\n39. .command(\"generate\")\n40. .argument(\"\", \"prompts|agents|mcp|vscode|aiignore\")\n41. .argument(\"[path]\", \"Path to a local repository\")\n42. .option(\"--force\", \"Overwrite existing files\")\n43. .action(generateCommand);\n44. \n45. program\n46. .command(\"pr\")\n47. .argument(\"[repo]\", \"Repo identifier (github: owner/name, azure: org/project/repo)\")\n48. .option(\"--branch \", \"Branch name\")\n49. .option(\"--provider \", \"Repo provider (github|azu…", + "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready/src/cli.ts b/Users/pierceboggan/Documents/get-ready/src/cli.ts\nindex 0000000..0000000 100644\n--- a/Users/pierceboggan/Documents/get-ready/src/cli.ts\n+++ b/Users/pierceboggan/Documents/get-ready/src/cli.ts\n@@ -1,95 +1,95 @@\n import { Command } from \"commander\";\n import { initCommand } from \"./commands/init\";\n import { analyzeCommand } from \"./commands/analyze\";\n import { generateCommand } from \"./commands/generate\";\n import { prCommand } from \"./commands/pr\";\n import { templatesCommand } from \"./commands/templates\";\n import { updateCommand } from \"./commands/update\";\n import { configCommand } from \"./commands/config\";\n import { evalCommand } from \"./commands/eval\";\n import { tuiCommand } from \"./commands/tui\";\n import { instructionsCommand } from \"./commands/instructions\";\n import { batchCommand } from \"./commands/batch\";\n import { readinessCommand } from \"./commands/readiness\";\n \n export function runCli(argv: string[]): void {\n const program = new Command();\n \n program\n .name(\"primer\")\n .description(\"Prime repositories for AI-assisted development\")\n .version(\"0.1.0\");\n \n program\n .command(\"init\")\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--github\", \"Use a GitHub repository\")\n .option(\"--provider \", \"Repo provider (github|azure)\")\n .option(\"--yes\", \"Accept defaults and skip prompts\")\n .option(\"--force\", \"Overwrite existing files\")\n .action(initCommand);\n \n program\n .command(\"analyze\")\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--json\", \"Output JSON\")\n .action(analyzeCommand);\n \n program\n .command(\"generate\")\n .argument(\"\", \"prompts|agents|mcp|vscode|aiignore\")\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--force\", \"Overwrite existing files\")\n .action(generateCommand);\n \n program\n .command(\"pr\")\n .argument(\"[repo]\", \"Repo identifier (github: owner/name, …" + } + } + }, + { + "timestampMs": 1770182507175, + "phase": "withInstructions", + "type": "assistant.usage", + "data": { + "model": "claude-haiku-4.5", + "inputTokens": 11011, + "outputTokens": 328, + "cacheReadTokens": 9489, + "cacheWriteTokens": 0, + "cost": 0.33, + "duration": 4250, + "initiator": "sub-agent", + "apiCallId": "msg_016HyJsAAcmf6gv9L4xZsF5b", + "providerCallId": "E903:35A03D:342219:3DDECD:6982D766", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + }, + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg" + } + }, + { + "timestampMs": 1770182507175, + "phase": "withInstructions", + "type": "assistant.message", + "data": { + "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "messageId": "0d741c5b-08d1-4f5a-861e-6167380217c7", + "content": "## Summary\n\n**Primer** is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, readiness reporting, evaluation, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\n### Main Entrypoints\n\n**CLI Command:**\n- `primer` — Binary entrypoint (installed globally via `npm install -g primer`)\n\n**Programmatic Entry:**\n- `src/index.ts` → calls `runCli()` in `src/cli.ts`\n- Defaults to `tui` command if no args provided\n\n### Primary Commands\n\n- **init** — Initialize a repository with Primer\n- **analyze** — Analyze codebase structure \n- **generate** — Generate instructions, agents, MCP, VS Code, or .aiignore configs\n- **instructions** — Generate `.github/copilot-instructions.md` using Copilot SDK\n- **tui** — Interactive terminal UI (default)\n- **eval** — Evaluate instruction effectiveness against test cases\n- **readiness** — Score AI readiness across key pillars\n- **pr** — Create PRs with generated instructions (GitHub/Azure DevOps)\n- **batch** — Process multiple repos across organizations\n- **templates**, **config**, **update** — Utility commands", + "toolRequests": [] + } + }, + { + "timestampMs": 1770182507215, + "phase": "withInstructions", + "type": "tool.execution_complete", + "data": { + "toolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", + "success": true, + "result": { + "content": "## Summary\n\n**Primer** is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, readiness reporting, evaluation, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\n### Main Entrypoints\n\n**CLI Command:**\n- `primer` — Binary entrypoint (installed globally via `npm install -g primer`)\n\n**Programmatic Entry:**\n- `src/index.ts` → calls `runCli()` in `src/cli.ts`\n- Defaults to `tui` command if no args provided\n\n### Primary Commands\n\n- **init** — Initialize a repository with Primer\n- **analyze** — Analyze codebase structure \n- **generate** — Generate instructions, agents, MCP, VS Code, or .aiignore configs\n- **instructions** — Generate `.github/copilot-instructions.md` using Copilot SDK\n- **tui** — Interactive terminal UI (default)\n- **eval** — Evaluate instruction effectiveness against test cases\n- **readiness** — Score AI readiness across key pillars\n- **pr** — Create PRs with generated instructions (GitHub/Azure DevOps)\n- **batch** — Process multiple repos across organizations\n- **templates**, **config**, **update** — Utility commands", + "detailedContent": "## Summary\n\n(Full response provided to agent)" + }, + "toolTelemetry": { + "properties": { + "prompt_length": "146", + "response_length": "1262", + "hashed_agent_name": "6f281157ab246f0e1f35db82165d3448ee1e39077ab0d720fca7dddf014249d6", + "agent_type": "explore", + "execution_mode": "sync" + }, + "restrictedProperties": { + "agent_name": "explore" + }, + "metrics": { + "response_length": 1262, + "numberOfToolCallsMadeByAgent": 5 + } + } + } + }, + { + "timestampMs": 1770182507215, + "phase": "withInstructions", + "type": "assistant.turn_end", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770182507215, + "phase": "withInstructions", + "type": "assistant.turn_start", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770182507215, + "phase": "withInstructions", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 11390, + "messagesLength": 5 + } + }, + { + "timestampMs": 1770182508277, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "This", + "totalResponseSizeBytes": 4 + } + }, + { + "timestampMs": 1770182508277, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 12, + "deltaPreview": " application", + "totalResponseSizeBytes": 16 + } + }, + { + "timestampMs": 1770182508277, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 17 + } + }, + { + "timestampMs": 1770182508277, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 7, + "deltaPreview": " Primer", + "totalResponseSizeBytes": 24 + } + }, + { + "timestampMs": 1770182508277, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 25 + } + }, + { + "timestampMs": 1770182508277, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": " is", + "totalResponseSizeBytes": 28 + } + }, + { + "timestampMs": 1770182508277, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " a", + "totalResponseSizeBytes": 30 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 34 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": " tool", + "totalResponseSizeBytes": 39 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": " that", + "totalResponseSizeBytes": 44 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 9, + "deltaPreview": " analyzes", + "totalResponseSizeBytes": 53 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": " code", + "totalResponseSizeBytes": 58 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": "bases", + "totalResponseSizeBytes": 63 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 67 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 10, + "deltaPreview": " generates", + "totalResponseSizeBytes": 77 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": " `.", + "totalResponseSizeBytes": 80 + } + }, + { + "timestampMs": 1770182508411, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 6, + "deltaPreview": "github", + "totalResponseSizeBytes": 86 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "/cop", + "totalResponseSizeBytes": 90 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "ilot", + "totalResponseSizeBytes": 94 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "-in", + "totalResponseSizeBytes": 97 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 10, + "deltaPreview": "structions", + "totalResponseSizeBytes": 107 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": ".md", + "totalResponseSizeBytes": 110 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": "`", + "totalResponseSizeBytes": 111 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 6, + "deltaPreview": " files", + "totalResponseSizeBytes": 117 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": " to", + "totalResponseSizeBytes": 120 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": " help", + "totalResponseSizeBytes": 125 + } + }, + { + "timestampMs": 1770182508656, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": " AI", + "totalResponseSizeBytes": 128 + } + }, + { + "timestampMs": 1770182508685, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 7, + "deltaPreview": " coding", + "totalResponseSizeBytes": 135 + } + }, + { + "timestampMs": 1770182508686, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 11, + "deltaPreview": " assistants", + "totalResponseSizeBytes": 146 + } + }, + { + "timestampMs": 1770182508686, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " (", + "totalResponseSizeBytes": 148 + } + }, + { + "timestampMs": 1770182508686, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "like", + "totalResponseSizeBytes": 152 + } + }, + { + "timestampMs": 1770182508686, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": " Git", + "totalResponseSizeBytes": 156 + } + }, + { + "timestampMs": 1770182508686, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "Hub", + "totalResponseSizeBytes": 159 + } + }, + { + "timestampMs": 1770182508686, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": " Cop", + "totalResponseSizeBytes": 163 + } + }, + { + "timestampMs": 1770182508686, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "ilot", + "totalResponseSizeBytes": 167 + } + }, + { + "timestampMs": 1770182508686, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ")", + "totalResponseSizeBytes": 168 + } + }, + { + "timestampMs": 1770182508686, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 11, + "deltaPreview": " understand", + "totalResponseSizeBytes": 179 + } + }, + { + "timestampMs": 1770182508748, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 9, + "deltaPreview": " projects", + "totalResponseSizeBytes": 188 + } + }, + { + "timestampMs": 1770182508748, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 7, + "deltaPreview": " better", + "totalResponseSizeBytes": 195 + } + }, + { + "timestampMs": 1770182508750, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 196 + } + }, + { + "timestampMs": 1770182508750, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": " It", + "totalResponseSizeBytes": 199 + } + }, + { + "timestampMs": 1770182508750, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 9, + "deltaPreview": " supports", + "totalResponseSizeBytes": 208 + } + }, + { + "timestampMs": 1770182508750, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 11, + "deltaPreview": " repository", + "totalResponseSizeBytes": 219 + } + }, + { + "timestampMs": 1770182508750, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 9, + "deltaPreview": " analysis", + "totalResponseSizeBytes": 228 + } + }, + { + "timestampMs": 1770182508750, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 229 + } + }, + { + "timestampMs": 1770182508750, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": " AI", + "totalResponseSizeBytes": 232 + } + }, + { + "timestampMs": 1770182508750, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 8, + "deltaPreview": "-powered", + "totalResponseSizeBytes": 240 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 12, + "deltaPreview": " instruction", + "totalResponseSizeBytes": 252 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 11, + "deltaPreview": " generation", + "totalResponseSizeBytes": 263 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 264 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 11, + "deltaPreview": " evaluation", + "totalResponseSizeBytes": 275 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 276 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 10, + "deltaPreview": " readiness", + "totalResponseSizeBytes": 286 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 10, + "deltaPreview": " reporting", + "totalResponseSizeBytes": 296 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 297 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": " Git", + "totalResponseSizeBytes": 301 + } + }, + { + "timestampMs": 1770182508991, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "Hub", + "totalResponseSizeBytes": 304 + } + }, + { + "timestampMs": 1770182509181, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "/A", + "totalResponseSizeBytes": 306 + } + }, + { + "timestampMs": 1770182509181, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "zure", + "totalResponseSizeBytes": 310 + } + }, + { + "timestampMs": 1770182509181, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": " Dev", + "totalResponseSizeBytes": 314 + } + }, + { + "timestampMs": 1770182509182, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "Ops", + "totalResponseSizeBytes": 317 + } + }, + { + "timestampMs": 1770182509182, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 12, + "deltaPreview": " integration", + "totalResponseSizeBytes": 329 + } + }, + { + "timestampMs": 1770182509182, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 330 + } + }, + { + "timestampMs": 1770182509182, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 334 + } + }, + { + "timestampMs": 1770182509182, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": " an", + "totalResponseSizeBytes": 337 + } + }, + { + "timestampMs": 1770182509182, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 12, + "deltaPreview": " interactive", + "totalResponseSizeBytes": 349 + } + }, + { + "timestampMs": 1770182509182, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 9, + "deltaPreview": " terminal", + "totalResponseSizeBytes": 358 + } + }, + { + "timestampMs": 1770182509220, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": " UI", + "totalResponseSizeBytes": 361 + } + }, + { + "timestampMs": 1770182509220, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": ".\n\n", + "totalResponseSizeBytes": 364 + } + }, + { + "timestampMs": 1770182509222, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "Main", + "totalResponseSizeBytes": 368 + } + }, + { + "timestampMs": 1770182509222, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 6, + "deltaPreview": " entry", + "totalResponseSizeBytes": 374 + } + }, + { + "timestampMs": 1770182509222, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 6, + "deltaPreview": "points", + "totalResponseSizeBytes": 380 + } + }, + { + "timestampMs": 1770182509222, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": ":\n", + "totalResponseSizeBytes": 382 + } + }, + { + "timestampMs": 1770182509222, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": "-", + "totalResponseSizeBytes": 383 + } + }, + { + "timestampMs": 1770182509222, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 387 + } + }, + { + "timestampMs": 1770182509222, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ":", + "totalResponseSizeBytes": 388 + } + }, + { + "timestampMs": 1770182509222, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 390 + } + }, + { + "timestampMs": 1770182509308, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 6, + "deltaPreview": "primer", + "totalResponseSizeBytes": 396 + } + }, + { + "timestampMs": 1770182509308, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": "`", + "totalResponseSizeBytes": 397 + } + }, + { + "timestampMs": 1770182509308, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " (", + "totalResponseSizeBytes": 399 + } + }, + { + "timestampMs": 1770182509308, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "main", + "totalResponseSizeBytes": 403 + } + }, + { + "timestampMs": 1770182509308, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 7, + "deltaPreview": " binary", + "totalResponseSizeBytes": 410 + } + }, + { + "timestampMs": 1770182509308, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 411 + } + }, + { + "timestampMs": 1770182509308, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 10, + "deltaPreview": " installed", + "totalResponseSizeBytes": 421 + } + }, + { + "timestampMs": 1770182509308, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 9, + "deltaPreview": " globally", + "totalResponseSizeBytes": 430 + } + }, + { + "timestampMs": 1770182509309, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": ")\n", + "totalResponseSizeBytes": 432 + } + }, + { + "timestampMs": 1770182509309, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": "-", + "totalResponseSizeBytes": 433 + } + }, + { + "timestampMs": 1770182509373, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 8, + "deltaPreview": " Program", + "totalResponseSizeBytes": 441 + } + }, + { + "timestampMs": 1770182509373, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": "matic", + "totalResponseSizeBytes": 446 + } + }, + { + "timestampMs": 1770182509373, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ":", + "totalResponseSizeBytes": 447 + } + }, + { + "timestampMs": 1770182509373, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 449 + } + }, + { + "timestampMs": 1770182509373, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "src", + "totalResponseSizeBytes": 452 + } + }, + { + "timestampMs": 1770182509374, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 6, + "deltaPreview": "/index", + "totalResponseSizeBytes": 458 + } + }, + { + "timestampMs": 1770182509374, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 461 + } + }, + { + "timestampMs": 1770182509374, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": "`", + "totalResponseSizeBytes": 462 + } + }, + { + "timestampMs": 1770182509374, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " (", + "totalResponseSizeBytes": 464 + } + }, + { + "timestampMs": 1770182509374, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": "calls", + "totalResponseSizeBytes": 469 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 471 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "run", + "totalResponseSizeBytes": 474 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "Cli", + "totalResponseSizeBytes": 477 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "()`", + "totalResponseSizeBytes": 480 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": " in", + "totalResponseSizeBytes": 483 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 485 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "src", + "totalResponseSizeBytes": 488 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 489 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": "cli", + "totalResponseSizeBytes": 492 + } + }, + { + "timestampMs": 1770182511802, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 495 + } + }, + { + "timestampMs": 1770182515040, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": "`", + "totalResponseSizeBytes": 496 + } + }, + { + "timestampMs": 1770182515040, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 3, + "deltaPreview": ")\n\n", + "totalResponseSizeBytes": 499 + } + }, + { + "timestampMs": 1770182515043, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 7, + "deltaPreview": "Primary", + "totalResponseSizeBytes": 506 + } + }, + { + "timestampMs": 1770182515044, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 515 + } + }, + { + "timestampMs": 1770182515044, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 8, + "deltaPreview": " include", + "totalResponseSizeBytes": 523 + } + }, + { + "timestampMs": 1770182515044, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": ":", + "totalResponseSizeBytes": 524 + } + }, + { + "timestampMs": 1770182515044, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 526 + } + }, + { + "timestampMs": 1770182515044, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "init", + "totalResponseSizeBytes": 530 + } + }, + { + "timestampMs": 1770182515044, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 532 + } + }, + { + "timestampMs": 1770182515044, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 534 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "an", + "totalResponseSizeBytes": 536 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": "alyze", + "totalResponseSizeBytes": 541 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 543 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 545 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 8, + "deltaPreview": "generate", + "totalResponseSizeBytes": 553 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 555 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 557 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 12, + "deltaPreview": "instructions", + "totalResponseSizeBytes": 569 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 571 + } + }, + { + "timestampMs": 1770182515108, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 573 + } + }, + { + "timestampMs": 1770182515170, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 1, + "deltaPreview": "t", + "totalResponseSizeBytes": 574 + } + }, + { + "timestampMs": 1770182515170, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "ui", + "totalResponseSizeBytes": 576 + } + }, + { + "timestampMs": 1770182515172, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 578 + } + }, + { + "timestampMs": 1770182515172, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 580 + } + }, + { + "timestampMs": 1770182515172, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "eval", + "totalResponseSizeBytes": 584 + } + }, + { + "timestampMs": 1770182515172, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 586 + } + }, + { + "timestampMs": 1770182515173, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 588 + } + }, + { + "timestampMs": 1770182515173, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": "read", + "totalResponseSizeBytes": 592 + } + }, + { + "timestampMs": 1770182515173, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": "iness", + "totalResponseSizeBytes": 597 + } + }, + { + "timestampMs": 1770182515173, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 599 + } + }, + { + "timestampMs": 1770182515321, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 601 + } + }, + { + "timestampMs": 1770182515321, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "pr", + "totalResponseSizeBytes": 603 + } + }, + { + "timestampMs": 1770182515322, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 605 + } + }, + { + "timestampMs": 1770182515322, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 607 + } + }, + { + "timestampMs": 1770182515323, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 5, + "deltaPreview": "batch", + "totalResponseSizeBytes": 612 + } + }, + { + "timestampMs": 1770182515323, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 614 + } + }, + { + "timestampMs": 1770182515323, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 616 + } + }, + { + "timestampMs": 1770182515323, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 9, + "deltaPreview": "templates", + "totalResponseSizeBytes": 625 + } + }, + { + "timestampMs": 1770182515323, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 627 + } + }, + { + "timestampMs": 1770182515323, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 629 + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 6, + "deltaPreview": "config", + "totalResponseSizeBytes": 635 + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`,", + "totalResponseSizeBytes": 637 + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 641 + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 643 + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 6, + "deltaPreview": "update", + "totalResponseSizeBytes": 649 + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "deltaChars": 2, + "deltaPreview": "`.", + "totalResponseSizeBytes": 651 + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 10830, + "outputTokens": 155, + "cacheReadTokens": 10368, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 8136, + "initiator": "agent", + "apiCallId": "chatcmpl-D5PchQpqfCG6WGv6mtHggYQqLqUqA", + "providerCallId": "E903:35A03D:342FF2:3DEEEA:6982D76B", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "assistant.message", + "data": { + "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "content": "This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, evaluation, readiness reporting, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\nMain entrypoints:\n- CLI: `primer` (main binary, installed globally)\n- Programmatic: `src/index.ts` (calls `runCli()` in `src/cli.ts`)\n\nPrimary commands include: `init`, `analyze`, `generate`, `instructions`, `tui`, `eval`, `readiness`, `pr`, `batch`, `templates`, `config`, and `update`.", + "toolRequests": [] + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "assistant.turn_end", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770182515351, + "phase": "withInstructions", + "type": "session.idle", + "data": {} + }, + { + "timestampMs": 1770182515373, + "phase": "judge", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770182515373, + "phase": "judge", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770182516066, + "phase": "judge", + "type": "user.message", + "data": { + "content": "Evaluate which response best matches the expectation.\n\nExpectation: Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.\n\nResponse A (without custom instructions):\nThis application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, evaluation, readiness reports, and GitHub integration.\n\nMain entrypoints:\n- src/index.ts — CLI entry point\n- src/cli.ts — Commander CLI setup\n\nKey commands include: `primer init`, `primer tui`, `primer instructions`, `primer analyze`, `primer batch`, `primer readiness`, and `primer eval`.\n\nResponse B (with custom instructions):\nThis application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, evaluation, readiness reporting, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\nMain entrypoints:\n- CLI: `primer` (main binary, installed globally)\n- Programmatic: `src/index.ts` (calls `runCli()` in `src/cli.ts`)\n\nPrimary commands include: `init`, `analyze`, `generate`, `instructions`, `tui`, `eval`, `readiness`, `pr`, `batch`, `templates`, `config`, and `update`.\n\nReturn JSON only.", + "transformedContent": "2026-02-04T05:21:56.033Z\n\nEvaluate which response best matches the expectation.\n\nExpectation: Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.\n\nResponse A (without custom instructions):\nThis application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, evaluation, readiness reports, and GitHub integration.\n\nMain entrypoints:\n- src/index.ts — CLI entry point\n- src/cli.ts — Commander CLI setup\n\nKey commands include: `primer init`, `primer tui`, `primer instructions`, `primer analyze`, `primer batch`, `primer readiness`, and `primer eval`.\n\nResponse B (with custom instructions):\nThis application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, evaluation, readiness reporting, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\nMain entrypoints:\n- CLI: `primer` (main binary, installed globally)\n- Programmatic: `src/index.ts` (calls `runCli()` in `src/cli.ts`)\n\nPrimary commands include: `init`, `analyze`, `generate`, `instructions`, `tui`, `eval`, `readiness`, `pr`, `batch`, `templates`, `config`, and `update`.\n\nReturn JSON only.", + "attachments": [] + } + }, + { + "timestampMs": 1770182516066, + "phase": "judge", + "type": "assistant.turn_start", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770182516066, + "phase": "judge", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 10644, + "messagesLength": 2 + } + }, + { + "timestampMs": 1770182516954, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": "{\n", + "totalResponseSizeBytes": 2 + } + }, + { + "timestampMs": 1770182516954, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": " ", + "totalResponseSizeBytes": 3 + } + }, + { + "timestampMs": 1770182516954, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 5 + } + }, + { + "timestampMs": 1770182516954, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": "ver", + "totalResponseSizeBytes": 8 + } + }, + { + "timestampMs": 1770182516954, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": "dict", + "totalResponseSizeBytes": 12 + } + }, + { + "timestampMs": 1770182516954, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 14 + } + }, + { + "timestampMs": 1770182516954, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 16 + } + }, + { + "timestampMs": 1770182516954, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": "pass", + "totalResponseSizeBytes": 20 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": "\",\n", + "totalResponseSizeBytes": 23 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": " ", + "totalResponseSizeBytes": 24 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 26 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": "score", + "totalResponseSizeBytes": 31 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 33 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": " ", + "totalResponseSizeBytes": 34 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": "100", + "totalResponseSizeBytes": 37 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": ",\n", + "totalResponseSizeBytes": 39 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": " ", + "totalResponseSizeBytes": 40 + } + }, + { + "timestampMs": 1770182517128, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 42 + } + }, + { + "timestampMs": 1770182517320, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": "r", + "totalResponseSizeBytes": 43 + } + }, + { + "timestampMs": 1770182517320, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 8, + "deltaPreview": "ationale", + "totalResponseSizeBytes": 51 + } + }, + { + "timestampMs": 1770182517322, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 53 + } + }, + { + "timestampMs": 1770182517322, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 55 + } + }, + { + "timestampMs": 1770182517322, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 8, + "deltaPreview": "Response", + "totalResponseSizeBytes": 63 + } + }, + { + "timestampMs": 1770182517322, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": " B", + "totalResponseSizeBytes": 65 + } + }, + { + "timestampMs": 1770182517322, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": " best", + "totalResponseSizeBytes": 70 + } + }, + { + "timestampMs": 1770182517322, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 8, + "deltaPreview": " matches", + "totalResponseSizeBytes": 78 + } + }, + { + "timestampMs": 1770182517323, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 82 + } + }, + { + "timestampMs": 1770182517323, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 12, + "deltaPreview": " expectation", + "totalResponseSizeBytes": 94 + } + }, + { + "timestampMs": 1770182517396, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": " by", + "totalResponseSizeBytes": 97 + } + }, + { + "timestampMs": 1770182517396, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 11, + "deltaPreview": " explicitly", + "totalResponseSizeBytes": 108 + } + }, + { + "timestampMs": 1770182517398, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 11, + "deltaPreview": " mentioning", + "totalResponseSizeBytes": 119 + } + }, + { + "timestampMs": 1770182517398, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 123 + } + }, + { + "timestampMs": 1770182517398, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 127 + } + }, + { + "timestampMs": 1770182517398, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 6, + "deltaPreview": " entry", + "totalResponseSizeBytes": 133 + } + }, + { + "timestampMs": 1770182517398, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": "point", + "totalResponseSizeBytes": 138 + } + }, + { + "timestampMs": 1770182517398, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": " in", + "totalResponseSizeBytes": 141 + } + }, + { + "timestampMs": 1770182517398, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 145 + } + }, + { + "timestampMs": 1770182517398, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 6, + "deltaPreview": "/index", + "totalResponseSizeBytes": 151 + } + }, + { + "timestampMs": 1770182517588, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 154 + } + }, + { + "timestampMs": 1770182517588, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 155 + } + }, + { + "timestampMs": 1770182517588, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": " clar", + "totalResponseSizeBytes": 160 + } + }, + { + "timestampMs": 1770182517588, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 6, + "deltaPreview": "ifying", + "totalResponseSizeBytes": 166 + } + }, + { + "timestampMs": 1770182517588, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": " that", + "totalResponseSizeBytes": 171 + } + }, + { + "timestampMs": 1770182517589, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": " it", + "totalResponseSizeBytes": 174 + } + }, + { + "timestampMs": 1770182517589, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 6, + "deltaPreview": " calls", + "totalResponseSizeBytes": 180 + } + }, + { + "timestampMs": 1770182517589, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " run", + "totalResponseSizeBytes": 184 + } + }, + { + "timestampMs": 1770182517589, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": "Cli", + "totalResponseSizeBytes": 187 + } + }, + { + "timestampMs": 1770182517589, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": " in", + "totalResponseSizeBytes": 190 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 194 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 195 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": "cli", + "totalResponseSizeBytes": 198 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 201 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 202 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 206 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 12, + "deltaPreview": " identifying", + "totalResponseSizeBytes": 218 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": " this", + "totalResponseSizeBytes": 223 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": " as", + "totalResponseSizeBytes": 226 + } + }, + { + "timestampMs": 1770182517772, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 230 + } + }, + { + "timestampMs": 1770182517946, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 7, + "deltaPreview": " Primer", + "totalResponseSizeBytes": 237 + } + }, + { + "timestampMs": 1770182517947, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 241 + } + }, + { + "timestampMs": 1770182517947, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 242 + } + }, + { + "timestampMs": 1770182517947, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": " It", + "totalResponseSizeBytes": 245 + } + }, + { + "timestampMs": 1770182517947, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": " also", + "totalResponseSizeBytes": 250 + } + }, + { + "timestampMs": 1770182517947, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 9, + "deltaPreview": " provides", + "totalResponseSizeBytes": 259 + } + }, + { + "timestampMs": 1770182517947, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 2, + "deltaPreview": " a", + "totalResponseSizeBytes": 261 + } + }, + { + "timestampMs": 1770182517947, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": " more", + "totalResponseSizeBytes": 266 + } + }, + { + "timestampMs": 1770182517947, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 9, + "deltaPreview": " complete", + "totalResponseSizeBytes": 275 + } + }, + { + "timestampMs": 1770182517947, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 279 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 9, + "deltaPreview": " accurate", + "totalResponseSizeBytes": 288 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": " list", + "totalResponseSizeBytes": 293 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": " of", + "totalResponseSizeBytes": 296 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 305 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 309 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 9, + "deltaPreview": " features", + "totalResponseSizeBytes": 318 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 319 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 9, + "deltaPreview": " aligning", + "totalResponseSizeBytes": 328 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 8, + "deltaPreview": " closely", + "totalResponseSizeBytes": 336 + } + }, + { + "timestampMs": 1770182518109, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 5, + "deltaPreview": " with", + "totalResponseSizeBytes": 341 + } + }, + { + "timestampMs": 1770182518143, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 345 + } + }, + { + "timestampMs": 1770182518143, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 12, + "deltaPreview": " expectation", + "totalResponseSizeBytes": 357 + } + }, + { + "timestampMs": 1770182518144, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 3, + "deltaPreview": ".\"\n", + "totalResponseSizeBytes": 360 + } + }, + { + "timestampMs": 1770182518144, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "deltaChars": 1, + "deltaPreview": "}", + "totalResponseSizeBytes": 361 + } + }, + { + "timestampMs": 1770182518144, + "phase": "judge", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 10011, + "outputTokens": 84, + "cacheReadTokens": 9088, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 2076, + "initiator": "user", + "apiCallId": "chatcmpl-D5PcqfwwPo46O2E5lE3WeAmcIK1Zi", + "providerCallId": "E903:35A03D:344C2A:3E0F67:6982D774", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770182518144, + "phase": "judge", + "type": "assistant.message", + "data": { + "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "content": "{\n \"verdict\": \"pass\",\n \"score\": 100,\n \"rationale\": \"Response B best matches the expectation by explicitly mentioning the CLI entrypoint in src/index.ts, clarifying that it calls runCli in src/cli.ts, and identifying this as the Primer CLI. It also provides a more complete and accurate list of commands and features, aligning closely with the expectation.\"\n}", + "toolRequests": [] + } + }, + { + "timestampMs": 1770182518144, + "phase": "judge", + "type": "assistant.turn_end", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770182518144, + "phase": "judge", + "type": "session.idle", + "data": {} + } + ] } ] } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4679573..bd529fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,12 +19,25 @@ "react": "^19.2.4", "simple-git": "^3.30.0" }, + "bin": { + "primer": "dist/index.js" + }, "devDependencies": { "@types/node": "^25.1.0", "@types/react": "^19.2.10", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "@typescript-eslint/parser": "^8.5.0", + "@vitest/coverage-v8": "^2.1.4", + "eslint": "^9.7.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-n": "^17.10.2", + "eslint-plugin-promise": "^7.1.0", + "prettier": "^3.3.3", "tsup": "^8.5.1", "tsx": "^4.21.0", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "vitest": "^2.1.4" } }, "node_modules/@alcalzone/ansi-tokenize": { @@ -40,6 +53,77 @@ "node": ">=18" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", @@ -482,6 +566,195 @@ "node": ">=18" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@github/copilot": { "version": "0.0.394", "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.394.tgz", @@ -609,6 +882,58 @@ "copilot-win32-x64": "copilot.exe" } }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@inquirer/ansi": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.3.tgz", @@ -937,6 +1262,77 @@ } } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1180,6 +1576,17 @@ "@octokit/openapi-types": "^27.0.0" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.57.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", @@ -1530,6 +1937,13 @@ "win32" ] }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1537,6 +1951,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "25.1.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.1.0.tgz", @@ -1557,1446 +1985,5914 @@ "csstype": "^3.2.2" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", + "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/type-utils": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": ">=0.4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.54.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/ansi-escapes": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", - "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", + "node_modules/@typescript-eslint/parser": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", + "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", + "dev": true, "license": "MIT", "dependencies": { - "environment": "^1.0.0" + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3" }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", "dev": true, - "license": "MIT" - }, - "node_modules/auto-bind": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", - "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/before-after-hook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", - "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", - "license": "Apache-2.0" - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", + "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", "dev": true, "license": "MIT", "dependencies": { - "load-tsconfig": "^0.2.3" + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "esbuild": ">=0.18" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "node_modules/@typescript-eslint/types": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": ">= 14.16.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "node_modules/@typescript-eslint/utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", + "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "dev": true, "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0" + }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^4.0.0" + "@typescript-eslint/types": "8.54.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/cli-truncate": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", - "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", - "license": "MIT", - "dependencies": { - "slice-ansi": "^7.1.0", - "string-width": "^8.0.0" - }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=20" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "node_modules/@vitest/coverage-v8": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz", + "integrity": "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==", + "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=20" + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.8.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", - "engines": { - "node": ">= 12" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.9", + "vitest": "2.1.9" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "node_modules/code-excerpt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", - "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, "license": "MIT", "dependencies": { - "convert-to-spaces": "^2.0.1" + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=20" + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", "dev": true, "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/convert-to-spaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", - "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, + "node_modules/@vitest/runner/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, "license": "MIT" }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "node_modules/@vitest/snapshot/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, "license": "MIT" }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "tinyspy": "^3.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/es-toolkit": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz", - "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, - "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/fast-content-type-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8.6.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", + "node_modules/ansi-escapes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "node": ">=12" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/fix-dts-default-cjs-exports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "rollup": "^4.34.8" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ink": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/ink/-/ink-6.6.0.tgz", - "integrity": "sha512-QDt6FgJxgmSxAelcOvOHUvFxbIUjVpCH5bx+Slvc5m7IEcpGt3dYwbz/L+oRnqEGeRvwy1tineKK4ect3nW1vQ==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "license": "MIT", "dependencies": { - "@alcalzone/ansi-tokenize": "^0.2.1", - "ansi-escapes": "^7.2.0", - "ansi-styles": "^6.2.1", - "auto-bind": "^5.0.1", - "chalk": "^5.6.0", - "cli-boxes": "^3.0.0", - "cli-cursor": "^4.0.0", - "cli-truncate": "^5.1.1", - "code-excerpt": "^4.0.0", - "es-toolkit": "^1.39.10", - "indent-string": "^5.0.0", - "is-in-ci": "^2.0.0", - "patch-console": "^2.0.0", - "react-reconciler": "^0.33.0", - "signal-exit": "^3.0.7", - "slice-ansi": "^7.1.0", - "stack-utils": "^2.0.6", - "string-width": "^8.1.0", - "type-fest": "^4.27.0", - "widest-line": "^5.0.0", - "wrap-ansi": "^9.0.0", - "ws": "^8.18.0", - "yoga-layout": "~3.2.1" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=20" + "node": ">= 0.4" }, - "peerDependencies": { - "@types/react": ">=19.0.0", - "react": ">=19.0.0", - "react-devtools-core": "^6.1.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react-devtools-core": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ink/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" }, - "node_modules/ink/node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "license": "Apache-2.0" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" }, "engines": { - "node": ">=20" + "node": ">=8" + } + }, + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.1" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/is-in-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz", - "integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, "license": "MIT", - "bin": { - "is-in-ci": "cli.js" + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">=20" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=6" } }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { - "node": ">=14" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/antonk52" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "license": "MIT" }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 16" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8.6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "license": "MIT", + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, "engines": { - "node": ">=8.6" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=6" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "license": "MIT", + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, - "node_modules/mute-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", - "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", - "license": "ISC", + "node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=20" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } + "license": "MIT" }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/patch-console": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", - "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 8" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, "license": "MIT" }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { - "lilconfig": "^3.1.1" + "ms": "^2.1.3" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "node": ">=6.0" }, "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { + "supports-color": { "optional": true } } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/react-reconciler": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", - "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" }, - "peerDependencies": { - "react": "^19.2.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">= 14.18.0" + "node": ">= 0.4" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" }, - "node_modules/rollup": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", - "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.0", - "@rollup/rollup-android-arm64": "4.57.0", - "@rollup/rollup-darwin-arm64": "4.57.0", - "@rollup/rollup-darwin-x64": "4.57.0", - "@rollup/rollup-freebsd-arm64": "4.57.0", - "@rollup/rollup-freebsd-x64": "4.57.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", - "@rollup/rollup-linux-arm-musleabihf": "4.57.0", - "@rollup/rollup-linux-arm64-gnu": "4.57.0", - "@rollup/rollup-linux-arm64-musl": "4.57.0", - "@rollup/rollup-linux-loong64-gnu": "4.57.0", - "@rollup/rollup-linux-loong64-musl": "4.57.0", - "@rollup/rollup-linux-ppc64-gnu": "4.57.0", - "@rollup/rollup-linux-ppc64-musl": "4.57.0", - "@rollup/rollup-linux-riscv64-gnu": "4.57.0", - "@rollup/rollup-linux-riscv64-musl": "4.57.0", - "@rollup/rollup-linux-s390x-gnu": "4.57.0", - "@rollup/rollup-linux-x64-gnu": "4.57.0", - "@rollup/rollup-linux-x64-musl": "4.57.0", - "@rollup/rollup-openbsd-x64": "4.57.0", - "@rollup/rollup-openharmony-arm64": "4.57.0", - "@rollup/rollup-win32-arm64-msvc": "4.57.0", - "@rollup/rollup-win32-ia32-msvc": "4.57.0", - "@rollup/rollup-win32-x64-gnu": "4.57.0", - "@rollup/rollup-win32-x64-msvc": "4.57.0", - "fsevents": "~2.3.2" + "node": ">=10.13.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/simple-git": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", - "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, "license": "MIT", "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.4.0" + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">= 12" + "node": ">= 0.4" } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^2.0.0" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "node_modules/es-toolkit": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz", + "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { - "any-promise": "^1.0.0" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, "license": "MIT", "dependencies": { - "thenify": ">= 3.1.0 < 4" + "semver": "^7.5.4" }, "engines": { - "node": ">=0.8" + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" } }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "node_modules/eslint-config-prettier": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "17.23.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.2.tgz", + "integrity": "sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fix-dts-default-cjs-exports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", + "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "rollup": "^4.34.8" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ink": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/ink/-/ink-6.6.0.tgz", + "integrity": "sha512-QDt6FgJxgmSxAelcOvOHUvFxbIUjVpCH5bx+Slvc5m7IEcpGt3dYwbz/L+oRnqEGeRvwy1tineKK4ect3nW1vQ==", + "license": "MIT", + "dependencies": { + "@alcalzone/ansi-tokenize": "^0.2.1", + "ansi-escapes": "^7.2.0", + "ansi-styles": "^6.2.1", + "auto-bind": "^5.0.1", + "chalk": "^5.6.0", + "cli-boxes": "^3.0.0", + "cli-cursor": "^4.0.0", + "cli-truncate": "^5.1.1", + "code-excerpt": "^4.0.0", + "es-toolkit": "^1.39.10", + "indent-string": "^5.0.0", + "is-in-ci": "^2.0.0", + "patch-console": "^2.0.0", + "react-reconciler": "^0.33.0", + "signal-exit": "^3.0.7", + "slice-ansi": "^7.1.0", + "stack-utils": "^2.0.6", + "string-width": "^8.1.0", + "type-fest": "^4.27.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0", + "ws": "^8.18.0", + "yoga-layout": "~3.2.1" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@types/react": ">=19.0.0", + "react": ">=19.0.0", + "react-devtools-core": "^6.1.2" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } + } + }, + "node_modules/ink/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/ink/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz", + "integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==", + "license": "MIT", + "bin": { + "is-in-ci": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", + "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/patch-console": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", + "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-reconciler": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", + "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", + "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.0", + "@rollup/rollup-android-arm64": "4.57.0", + "@rollup/rollup-darwin-arm64": "4.57.0", + "@rollup/rollup-darwin-x64": "4.57.0", + "@rollup/rollup-freebsd-arm64": "4.57.0", + "@rollup/rollup-freebsd-x64": "4.57.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", + "@rollup/rollup-linux-arm-musleabihf": "4.57.0", + "@rollup/rollup-linux-arm64-gnu": "4.57.0", + "@rollup/rollup-linux-arm64-musl": "4.57.0", + "@rollup/rollup-linux-loong64-gnu": "4.57.0", + "@rollup/rollup-linux-loong64-musl": "4.57.0", + "@rollup/rollup-linux-ppc64-gnu": "4.57.0", + "@rollup/rollup-linux-ppc64-musl": "4.57.0", + "@rollup/rollup-linux-riscv64-gnu": "4.57.0", + "@rollup/rollup-linux-riscv64-musl": "4.57.0", + "@rollup/rollup-linux-s390x-gnu": "4.57.0", + "@rollup/rollup-linux-x64-gnu": "4.57.0", + "@rollup/rollup-linux-x64-musl": "4.57.0", + "@rollup/rollup-openbsd-x64": "4.57.0", + "@rollup/rollup-openharmony-arm64": "4.57.0", + "@rollup/rollup-win32-arm64-msvc": "4.57.0", + "@rollup/rollup-win32-ia32-msvc": "4.57.0", + "@rollup/rollup-win32-x64-gnu": "4.57.0", + "@rollup/rollup-win32-x64-msvc": "4.57.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-git": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", + "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsup": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", + "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.27.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "^0.7.6", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "license": "ISC" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8.0" + "node": ">=12" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "bin": { - "tree-kill": "cli.js" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tsup": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", - "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", "dev": true, "license": "MIT", "dependencies": { - "bundle-require": "^5.1.0", - "cac": "^6.7.14", - "chokidar": "^4.0.3", - "consola": "^3.4.0", - "debug": "^4.4.0", - "esbuild": "^0.27.0", - "fix-dts-default-cjs-exports": "^1.0.0", - "joycon": "^3.1.1", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.34.8", - "source-map": "^0.7.6", - "sucrase": "^3.35.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.11", - "tree-kill": "^1.2.2" + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" }, "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" + "vitest": "vitest.mjs" }, "engines": { - "node": ">=18" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" }, "peerDependenciesMeta": { - "@microsoft/api-extractor": { + "@edge-runtime/vm": { "optional": true }, - "@swc/core": { + "@types/node": { "optional": true }, - "postcss": { + "@vitest/browser": { "optional": true }, - "typescript": { + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { "optional": true } } }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "node_modules/vitest/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, + "license": "MIT" + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", + "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==", "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" + "isexe": "^2.0.0" }, "bin": { - "tsx": "dist/cli.mjs" + "node-which": "bin/node-which" }, "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">= 8" } }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, "engines": { - "node": ">=16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" }, - "engines": { - "node": ">=14.17" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "devOptional": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/universal-user-agent": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", - "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", - "license": "ISC" + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", - "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, "node_modules/widest-line": { @@ -3014,6 +7910,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", @@ -3031,6 +7937,96 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ws": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", @@ -3052,6 +8048,19 @@ } } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yoga-layout": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index adddce6..9437a72 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -466,9 +466,13 @@ function findLatestToolByName( function extractTokenUsage(data: Record | undefined): TokenUsage | null { if (!data) return null; - const usage = (data.usage ?? data.tokenUsage ?? data.tokens) as Record | undefined; - const promptTokens = getNumber(usage?.prompt_tokens ?? usage?.promptTokens ?? data.promptTokens ?? data.inputTokens); - const completionTokens = getNumber(usage?.completion_tokens ?? usage?.completionTokens ?? data.completionTokens ?? data.outputTokens); + const usage = findUsageObject(data); + const promptTokens = getNumber( + usage?.prompt_tokens ?? usage?.promptTokens ?? data.promptTokens ?? data.inputTokens + ); + const completionTokens = getNumber( + usage?.completion_tokens ?? usage?.completionTokens ?? data.completionTokens ?? data.outputTokens + ); const totalTokens = getNumber(usage?.total_tokens ?? usage?.totalTokens ?? data.totalTokens); if (promptTokens == null && completionTokens == null && totalTokens == null) { @@ -482,6 +486,63 @@ function extractTokenUsage(data: Record | undefined): TokenUsag }; } +function findUsageObject(data: Record): Record | undefined { + const direct = (data.usage ?? data.tokenUsage ?? data.tokens) as Record | undefined; + if (direct) return direct; + + const candidates = [ + data.response, + data.result, + data.message, + data.metrics, + data.output + ]; + + for (const candidate of candidates) { + if (candidate && typeof candidate === "object") { + const nested = (candidate as Record).usage ?? (candidate as Record).tokenUsage; + if (nested && typeof nested === "object") return nested as Record; + } + } + + return scanForUsage(data, 0); +} + +function scanForUsage(value: unknown, depth: number): Record | undefined { + if (!value || typeof value !== "object" || depth > 4) return undefined; + if (Array.isArray(value)) { + for (const entry of value) { + const found = scanForUsage(entry, depth + 1); + if (found) return found; + } + return undefined; + } + + const record = value as Record; + if (hasTokenFields(record)) return record; + + for (const entry of Object.values(record)) { + const found = scanForUsage(entry, depth + 1); + if (found) return found; + } + + return undefined; +} + +function hasTokenFields(record: Record): boolean { + const keys = Object.keys(record); + return ( + keys.includes("prompt_tokens") || + keys.includes("completion_tokens") || + keys.includes("total_tokens") || + keys.includes("promptTokens") || + keys.includes("completionTokens") || + keys.includes("totalTokens") || + keys.includes("inputTokens") || + keys.includes("outputTokens") + ); +} + function getNumber(value: unknown): number | null { if (typeof value === "number" && Number.isFinite(value)) return value; if (typeof value === "string" && value.trim()) { @@ -501,6 +562,15 @@ function mergeTokenUsage(existing: TokenUsage, next: TokenUsage): TokenUsage { function normalizeTokenUsage(usage: TokenUsage): TokenUsage | undefined { if (!usage.promptTokens && !usage.completionTokens && !usage.totalTokens) return undefined; + if (!usage.totalTokens) { + const prompt = usage.promptTokens ?? 0; + const completion = usage.completionTokens ?? 0; + const total = prompt + completion; + return { + ...usage, + totalTokens: total || undefined + }; + } return usage; } @@ -593,16 +663,22 @@ function buildTrajectoryViewerHtml(data: Record): string { .replace(/'/g, '''); const results = data.results || []; - summaryEl.textContent = `Repo: ${data.repoPath || 'unknown'} • Model: ${data.model || 'unknown'} • Judge: ${data.judgeModel || 'unknown'}`; + summaryEl.textContent = + 'Repo: ' + + (data.repoPath || 'unknown') + + ' • Model: ' + + (data.model || 'unknown') + + ' • Judge: ' + + (data.judgeModel || 'unknown'); function renderCaseList(activeId) { caseListEl.innerHTML = ''; results.forEach((result) => { const row = document.createElement('div'); - row.className = `case ${result.id === activeId ? 'active' : ''}`; - row.textContent = `${result.id} (${result.verdict ?? 'unknown'})`; + row.className = 'case ' + (result.id === activeId ? 'active' : ''); + row.textContent = result.id + ' (' + (result.verdict ?? 'unknown') + ')'; const sub = document.createElement('span'); - sub.textContent = `Score: ${result.score ?? 0}`; + sub.textContent = 'Score: ' + (result.score ?? 0); row.appendChild(sub); row.addEventListener('click', () => renderCaseDetails(result.id)); caseListEl.appendChild(row); @@ -611,29 +687,65 @@ function buildTrajectoryViewerHtml(data: Record): string { function renderMetrics(metrics) { if (!metrics) return '

No metrics available.

'; - const fmt = (m) => `Duration: ${m.durationMs}ms • Tokens: ${(m.tokenUsage && (m.tokenUsage.totalTokens ?? 'n/a')) || 'n/a'} • Tool calls: ${m.toolCalls?.count ?? 0}`; - return ` -
-
Without Instructions
${fmt(metrics.withoutInstructions)}
-
With Instructions
${fmt(metrics.withInstructions)}
-
Judge
${fmt(metrics.judge)}
-
Total
${metrics.totalDurationMs}ms -
- `; + const fmt = (m) => { + const usage = m.tokenUsage; + const prompt = usage?.promptTokens ?? 'n/a'; + const completion = usage?.completionTokens ?? 'n/a'; + const total = usage?.totalTokens ?? (usage ? (Number(usage.promptTokens ?? 0) + Number(usage.completionTokens ?? 0)) : 'n/a'); + return ( + 'Duration: ' + + m.durationMs + + 'ms • Tokens: ' + + prompt + + ' / ' + + completion + + ' / ' + + total + + ' • Tool calls: ' + + (m.toolCalls?.count ?? 0) + ); + }; + return ( + '
' + + '
Without Instructions
' + + fmt(metrics.withoutInstructions) + + '
' + + '
With Instructions
' + + fmt(metrics.withInstructions) + + '
' + + '
Judge
' + + fmt(metrics.judge) + + '
' + + '
Total
' + + metrics.totalDurationMs + + 'ms' + + '
' + ); } function renderTrajectory(events) { if (!events || !events.length) return '

No trajectory events captured.

'; - return ` -
- ${events.map((event) => ` -
-
${event.type} ${event.phase} ${new Date(event.timestampMs).toISOString()}
-
${JSON.stringify(event.data ?? {}, null, 2)}
-
- `).join('')} -
- `; + return ( + '
' + + events + .map( + (event) => + '
' + + '
' + + event.type + + ' ' + + event.phase + + ' ' + + new Date(event.timestampMs).toISOString() + + '
' + + '
' +
+                JSON.stringify(event.data ?? {}, null, 2) +
+                '
' + + '
' + ) + .join('') + + '
' + ); } function renderCaseDetails(caseId) { @@ -643,16 +755,25 @@ function buildTrajectoryViewerHtml(data: Record): string { return; } renderCaseList(result.id); - caseDetailsEl.innerHTML = ` -

${escapeHtml(result.id)}

-

Verdict: ${escapeHtml(result.verdict ?? 'unknown')} (score: ${escapeHtml(result.score ?? 0)})

-

Prompt: ${escapeHtml(result.prompt ?? '')}

-

Expectation: ${escapeHtml(result.expectation ?? '')}

-

Metrics

- ${renderMetrics(result.metrics)} -

Trajectory

- ${renderTrajectory(result.trajectory)} - `; + caseDetailsEl.innerHTML = + '

' + + escapeHtml(result.id) + + '

' + + '

Verdict: ' + + escapeHtml(result.verdict ?? 'unknown') + + ' (score: ' + + escapeHtml(result.score ?? 0) + + ')

' + + '

Prompt: ' + + escapeHtml(result.prompt ?? '') + + '

' + + '

Expectation: ' + + escapeHtml(result.expectation ?? '') + + '

' + + '

Metrics

' + + renderMetrics(result.metrics) + + '

Trajectory

' + + renderTrajectory(result.trajectory); } renderCaseDetails(results[0]?.id); diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 7991865..23f02b2 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -263,6 +263,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX if (input.toLowerCase() === "e") { const configPath = path.join(repoPath, "primer.eval.json"); + const outputPath = path.join(repoPath, "eval-results.json"); try { await fs.access(configPath); } catch { @@ -281,6 +282,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX repoPath, model: "gpt-4.1", judgeModel: "gpt-4.1", + outputPath, // Note: onProgress removed - causes issues with SDK in React/Ink context }); setEvalResults(results); @@ -303,7 +305,16 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX } }); - const statusLabel = status === "intro" ? "..." : status === "idle" ? "ready (awaiting input)" : status; + const statusLabel = status === "intro" ? "starting" : status === "idle" ? "ready" : status; + const statusColor = status === "error" ? "red" : status === "done" ? "green" : "yellow"; + const formatTokens = (result: EvalResult): string => { + const withUsage = result.metrics?.withInstructions?.tokenUsage; + const withoutUsage = result.metrics?.withoutInstructions?.tokenUsage; + const withTotal = withUsage?.totalTokens ?? (withUsage ? (withUsage.promptTokens ?? 0) + (withUsage.completionTokens ?? 0) : undefined); + const withoutTotal = withoutUsage?.totalTokens ?? (withoutUsage ? (withoutUsage.promptTokens ?? 0) + (withoutUsage.completionTokens ?? 0) : undefined); + if (withTotal == null && withoutTotal == null) return "tokens n/a"; + return `tokens w/: ${withTotal ?? "n/a"} • w/o: ${withoutTotal ?? "n/a"}`; + }; // Truncate preview to fit terminal const previewLines = generatedContent.split("\n").slice(0, 20); @@ -315,26 +326,41 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX } return ( - + {status === "intro" ? ( ) : ( )} - Prime your repo for AI. + + Prime your repo for AI + ● {statusLabel} + Repo: {repoLabel} - - Status: {statusLabel} - {analysis && ( - + + + + Repository signals + + {analysis ? ( + Languages: {analysis.languages.join(", ") || "unknown"} Frameworks: {analysis.frameworks.join(", ") || "none"} Package manager: {analysis.packageManager ?? "unknown"} + {analysis.isMonorepo && ( + Monorepo: yes ({analysis.apps?.length ?? 0} apps) + )} + ) : ( + Run analysis to populate repo signals. )} - - {message} + + + + Activity + + {message || "Awaiting input."} {status === "bootstrapEvalCount" && ( @@ -352,7 +378,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX Eval Results: {evalResults.map((r) => ( - {r.verdict === "pass" ? "✓" : r.verdict === "fail" ? "✗" : "?"} {r.id}: {r.verdict} (score: {r.score}) + {r.verdict === "pass" ? "✓" : r.verdict === "fail" ? "✗" : "?"} {r.id}: {r.verdict} (score: {r.score}) • {formatTokens(r)} ))} {evalViewerPath && ( From 4019d4e7cc08629a22fa204173317a9f42c60abe Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Tue, 3 Feb 2026 22:29:57 -0700 Subject: [PATCH 03/84] Enhance Copilot integration and evaluation features with new scaffolding and CLI options --- .github/copilot-instructions.md | 11 ++- primer.eval.json | 16 +++- src/cli.ts | 1 + src/commands/eval.ts | 31 +++----- src/services/copilot.ts | 45 ++++++++++++ src/services/evalScaffold.ts | 125 ++++++++++++++++++++++++++++++++ src/services/evaluator.ts | 84 ++++++++++++++++++++- src/services/instructions.ts | 50 +------------ src/ui/tui.tsx | 100 +++++++++---------------- 9 files changed, 319 insertions(+), 144 deletions(-) create mode 100644 src/services/copilot.ts create mode 100644 src/services/evalScaffold.ts diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 968515a..2bdc7ef 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,4 +1,13 @@ -# Copilot Instructions for Primer +# Copilot Instructions for This Repository + +- Use ESM syntax everywhere (see "type": "module" in package.json). +- TypeScript is strict; target ES2022, module ESNext (see tsconfig.json). +- Use Commander for CLI, Ink/React for TUI, and simple-git/Octokit for GitHub automation. +- Only overwrite config files (e.g., .vscode/settings.json, .vscode/mcp.json) with --force. +- All Copilot/VS Code settings reference this file and enable MCP. +- Place new CLI commands in src/commands/, core logic in src/services/, and TUI in src/ui/. +- Do not add new build/lint/test tools unless necessary; use existing npm scripts. + ## Overview diff --git a/primer.eval.json b/primer.eval.json index bc1fa99..bc8bd6a 100644 --- a/primer.eval.json +++ b/primer.eval.json @@ -2,9 +2,19 @@ "instructionFile": ".github/copilot-instructions.md", "cases": [ { - "id": "overview", - "prompt": "Summarize what this application does and list the main entrypoints.", - "expectation": "Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI." + "id": "case-1", + "prompt": "What is the main purpose of the Primer CLI tool and what are its key features?", + "expectation": "Primer is a CLI tool that analyzes codebases and generates .github/copilot-instructions.md files to help AI coding assistants understand projects better. Key features include repository analysis, AI-powered instruction generation, batch processing, an evaluation framework, readiness reports, GitHub integration, an interactive TUI, and config generation." + }, + { + "id": "case-2", + "prompt": "How do you run the Primer CLI locally to analyze a repository and generate VS Code settings?", + "expectation": "To analyze a repository, run `npx tsx src/index.ts analyze [path] --json`. To generate VS Code settings, run `npx tsx src/index.ts generate vscode [path] [--force]`." + }, + { + "id": "case-3", + "prompt": "Where should new CLI commands and core logic be placed in the Primer codebase, and what architectural patterns are followed?", + "expectation": "New CLI commands should be placed in src/commands/, and core logic in src/services/. The architecture uses Commander for CLI, Ink/React for TUI, and simple-git/Octokit for GitHub automation, following strict ESM TypeScript conventions." } ] } \ No newline at end of file diff --git a/src/cli.ts b/src/cli.ts index 3a667c1..4382f71 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -57,6 +57,7 @@ export function runCli(argv: string[]): void { .option("--judge-model ", "Model for judging", "gpt-5") .option("--output ", "Write results JSON to file") .option("--init", "Create a starter primer.eval.json file") + .option("--count ", "Number of eval cases to generate (with --init)") .action(evalCommand); program diff --git a/src/commands/eval.ts b/src/commands/eval.ts index bee399d..c592b1a 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -1,6 +1,7 @@ import path from "path"; import fs from "fs/promises"; import { runEval } from "../services/evaluator"; +import { generateEvalScaffold } from "../services/evalScaffold"; type EvalOptions = { repo?: string; @@ -8,27 +9,7 @@ type EvalOptions = { judgeModel?: string; output?: string; init?: boolean; -}; - -const EVAL_SCAFFOLD = { - instructionFile: ".github/copilot-instructions.md", - cases: [ - { - id: "project-overview", - prompt: "Summarize what this project does and list the main entry points.", - expectation: "Should mention the primary purpose and key files/directories." - }, - { - id: "tech-stack", - prompt: "What languages and frameworks does this project use?", - expectation: "Should correctly identify the main languages and frameworks." - }, - { - id: "build-commands", - prompt: "How do I build and test this project?", - expectation: "Should provide the correct build and test commands from package.json or equivalent." - } - ] + count?: string; }; export async function evalCommand(configPathArg: string | undefined, options: EvalOptions): Promise { @@ -37,6 +18,7 @@ export async function evalCommand(configPathArg: string | undefined, options: Ev // Handle --init flag if (options.init) { const outputPath = path.join(repoPath, "primer.eval.json"); + const desiredCount = Math.max(1, Number.parseInt(options.count ?? "5", 10) || 5); try { await fs.access(outputPath); console.error(`primer.eval.json already exists at ${outputPath}`); @@ -45,7 +27,12 @@ export async function evalCommand(configPathArg: string | undefined, options: Ev } catch { // File doesn't exist, create it } - await fs.writeFile(outputPath, JSON.stringify(EVAL_SCAFFOLD, null, 2), "utf8"); + const scaffold = await generateEvalScaffold({ + repoPath, + count: desiredCount, + model: options.model + }); + await fs.writeFile(outputPath, JSON.stringify(scaffold, null, 2), "utf8"); console.log(`Created ${outputPath}`); console.log("Edit the file to add your own test cases, then run 'primer eval' to test."); return; diff --git a/src/services/copilot.ts b/src/services/copilot.ts new file mode 100644 index 0000000..0cec90a --- /dev/null +++ b/src/services/copilot.ts @@ -0,0 +1,45 @@ +import fs from "fs/promises"; +import { execFile } from "node:child_process"; +import { promisify } from "node:util"; + +const execFileAsync = promisify(execFile); + +export async function assertCopilotCliReady(): Promise { + const cliPath = await findCopilotCliPath(); + + try { + await execFileAsync(cliPath, ["--version"], { timeout: 5000 }); + } catch { + throw new Error(`Copilot CLI at ${cliPath} is not working.`); + } + + return cliPath; +} + +async function findCopilotCliPath(): Promise { + try { + const { stdout } = await execFileAsync("which", ["copilot"], { timeout: 5000 }); + return stdout.trim(); + } catch { + // Ignore - will try VS Code location + } + + const home = process.env.HOME ?? ""; + const vscodeLocations = [ + `${home}/Library/Application Support/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`, + `${home}/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`, + `${home}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot`, + `${home}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot` + ]; + + for (const location of vscodeLocations) { + try { + await fs.access(location); + return location; + } catch { + // Try next location + } + } + + throw new Error("Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code."); +} diff --git a/src/services/evalScaffold.ts b/src/services/evalScaffold.ts new file mode 100644 index 0000000..4fa19ea --- /dev/null +++ b/src/services/evalScaffold.ts @@ -0,0 +1,125 @@ +import process from "node:process"; + +import { assertCopilotCliReady } from "./copilot"; + +export type EvalCase = { + id: string; + prompt: string; + expectation: string; +}; + +export type EvalConfig = { + instructionFile?: string; + cases: EvalCase[]; + systemMessage?: string; + outputPath?: string; +}; + +type EvalScaffoldOptions = { + repoPath: string; + count: number; + model?: string; + // eslint-disable-next-line no-unused-vars + onProgress?: (message: string) => void; +}; + +export async function generateEvalScaffold(options: EvalScaffoldOptions): Promise { + const repoPath = options.repoPath; + const count = Math.max(1, options.count); + const progress = options.onProgress ?? (() => {}); + + const originalCwd = process.cwd(); + process.chdir(repoPath); + + progress("Checking Copilot CLI..."); + const cliPath = await assertCopilotCliReady(); + + progress("Starting Copilot SDK..."); + const sdk = await import("@github/copilot-sdk"); + const client = new sdk.CopilotClient({ cliPath }); + + try { + progress("Creating session..."); + const preferredModel = options.model ?? "gpt-4.1"; + const session = await client.createSession({ + model: preferredModel, + streaming: true, + systemMessage: { + content: + "You are an expert codebase analyst. Generate developer-oriented eval cases for this repository. Use tools (glob, view, grep) to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation})." + }, + infiniteSessions: { enabled: false } + }); + + let content = ""; + session.on((event: { type: string; data?: Record }) => { + if (event.type === "assistant.message_delta") { + const delta = event.data?.deltaContent as string | undefined; + if (delta) { + content += delta; + progress("Generating eval cases..."); + } + } else if (event.type === "tool.execution_start") { + const toolName = event.data?.toolName as string | undefined; + progress(`Using tool: ${toolName ?? "..."}`); + } else if (event.type === "session.error") { + const errorMsg = (event.data?.message as string) ?? "Unknown error"; + if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { + throw new Error("Copilot CLI not logged in. Run `copilot` then `/login` to authenticate."); + } + } + }); + + const prompt = [ + `Analyze the repository at ${repoPath} and generate ${count} eval cases.`, + "The cases should mirror realistic developer questions about this repo.", + "Use tools to inspect README, package.json, CLI commands, and key files.", + "Ensure cases cover a range of topics: purpose, entrypoints, build/test, configuration, workflows.", + "Return JSON ONLY (no markdown, no commentary) in this schema:", + "{\n \"instructionFile\": \".github/copilot-instructions.md\",\n \"cases\": [\n {\"id\": \"case-1\", \"prompt\": \"...\", \"expectation\": \"...\"}\n ]\n}" + ].join("\n"); + + progress("Analyzing codebase..."); + await session.sendAndWait({ prompt }, 180000); + await session.destroy(); + + const parsed = parseEvalConfig(content); + const normalized = normalizeEvalConfig(parsed, count); + return normalized; + } finally { + await client.stop(); + process.chdir(originalCwd); + } +} + +function parseEvalConfig(raw: string): EvalConfig { + const match = raw.match(/\{[\s\S]*\}/u); + if (!match) { + throw new Error("Failed to parse eval scaffold JSON."); + } + const parsed = JSON.parse(match[0]) as EvalConfig; + if (!parsed || !Array.isArray(parsed.cases)) { + throw new Error("Eval scaffold JSON is missing cases."); + } + return parsed; +} + +function normalizeEvalConfig(parsed: EvalConfig, count: number): EvalConfig { + const cases = (parsed.cases ?? []).slice(0, count).map((entry, index) => { + const id = typeof entry.id === "string" && entry.id.trim() ? entry.id : `case-${index + 1}`; + return { + id, + prompt: String(entry.prompt ?? "").trim(), + expectation: String(entry.expectation ?? "").trim() + }; + }); + + if (!cases.length) { + throw new Error("Eval scaffold JSON did not include any usable cases."); + } + + return { + instructionFile: parsed.instructionFile ?? ".github/copilot-instructions.md", + cases + }; +} diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index 9437a72..d325e87 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -632,6 +632,13 @@ function buildTrajectoryViewerHtml(data: Record): string { .summary { margin-bottom: 24px; color: #b7bdc8; } .layout { display: grid; grid-template-columns: 280px 1fr; gap: 16px; } .panel { background: #151924; border: 1px solid #23283b; border-radius: 10px; padding: 12px; } + .section { margin-top: 16px; } + .section h3 { margin: 8px 0; font-size: 14px; color: #c7ccd6; } + .chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; } + .chip { background: #1e2232; border: 1px solid #2c3250; border-radius: 999px; padding: 2px 8px; font-size: 12px; color: #c9d1e3; } + .muted { color: #8a93a5; font-size: 12px; } + .filters { display: flex; gap: 12px; align-items: center; margin-top: 8px; } + .filters label { font-size: 12px; color: #b7bdc8; } .case { padding: 8px; border-radius: 8px; cursor: pointer; margin-bottom: 6px; } .case.active { background: #23283b; } .case span { display: block; font-size: 12px; color: #9aa3b2; } @@ -645,6 +652,7 @@ function buildTrajectoryViewerHtml(data: Record): string {

Primer Eval Trajectory

+
@@ -652,6 +660,7 @@ function buildTrajectoryViewerHtml(data: Record): string { diff --git a/src/services/instructions.ts b/src/services/instructions.ts index a1ea882..1d7cf62 100644 --- a/src/services/instructions.ts +++ b/src/services/instructions.ts @@ -1,6 +1,4 @@ -import fs from "fs/promises"; -import { execFile } from "node:child_process"; -import { promisify } from "node:util"; +import { assertCopilotCliReady } from "./copilot"; type GenerateInstructionsOptions = { repoPath: string; @@ -86,49 +84,3 @@ Output ONLY the markdown content for the instructions file.`; process.chdir(originalCwd); } } - -const execFileAsync = promisify(execFile); - -async function findCopilotCliPath(): Promise { - // Try standard PATH first - try { - const { stdout } = await execFileAsync("which", ["copilot"], { timeout: 5000 }); - return stdout.trim(); - } catch { - // Ignore - will try VS Code location - } - - // VS Code Copilot Chat extension location - const home = process.env.HOME ?? ""; - const vscodeLocations = [ - `${home}/Library/Application Support/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`, - `${home}/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`, - `${home}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot`, - `${home}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot`, - ]; - - for (const location of vscodeLocations) { - try { - await fs.access(location); - return location; - } catch { - // Try next location - } - } - - throw new Error("Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code."); -} - -async function assertCopilotCliReady(): Promise { - const cliPath = await findCopilotCliPath(); - - try { - await execFileAsync(cliPath, ["--version"], { timeout: 5000 }); - } catch { - throw new Error(`Copilot CLI at ${cliPath} is not working.`); - } - - // Note: Copilot CLI uses its own auth system, not gh CLI. - // User must run: copilot, then /login inside the CLI. - return cliPath; -} \ No newline at end of file diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 23f02b2..02949d7 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -5,6 +5,7 @@ import path from "path"; import { analyzeRepo, RepoAnalysis } from "../services/analyzer"; import { generateCopilotInstructions } from "../services/instructions"; import { runEval, type EvalResult } from "../services/evaluator"; +import { generateEvalScaffold } from "../services/evalScaffold"; import { AnimatedBanner, StaticBanner } from "./AnimatedBanner"; import { BatchTui } from "./BatchTui"; import { getGitHubToken } from "../services/github"; @@ -20,6 +21,7 @@ type Status = | "idle" | "analyzing" | "generating" + | "bootstrapping" | "evaluating" | "preview" | "done" @@ -28,60 +30,13 @@ type Status = | "bootstrapEvalCount" | "bootstrapEvalConfirm"; -type EvalCase = { - id: string; - prompt: string; - expectation: string; -}; - type EvalConfig = { instructionFile?: string; - cases: EvalCase[]; + cases: Array<{ id: string; prompt: string; expectation: string }>; systemMessage?: string; outputPath?: string; }; -function buildBootstrapEvalConfig(count: number): EvalConfig { - const templates = [ - { - prompt: "Summarize this repository's purpose and main entry points. Use the README and package.json if available.", - expectation: "A concise summary of repo purpose plus key entry points (CLI or main files) and how to run it." - }, - { - prompt: "Identify the primary languages, frameworks, and package manager used in this repo.", - expectation: "A brief list of languages/frameworks and the detected package manager, with short justification." - }, - { - prompt: "Draft a minimal .github/copilot-instructions.md tailored to this repo's conventions.", - expectation: "A short instruction file referencing observed conventions, avoiding assumptions or secrets." - }, - { - prompt: "Describe how to run the CLI and list its core commands and flags.", - expectation: "Clear usage instructions with command names and key flags derived from docs or source." - }, - { - prompt: "Propose an eval case that checks consistency between CLI and TUI behaviors.", - expectation: "One eval case that validates parity between CLI and TUI outputs or workflows." - } - ]; - - const cases = Array.from({ length: count }, (_, index) => { - const template = templates[index % templates.length]; - const variant = Math.floor(index / templates.length); - const suffix = variant > 0 ? ` (variant ${variant + 1})` : ""; - return { - id: `case-${index + 1}`, - prompt: `${template.prompt}${suffix}`, - expectation: `${template.expectation}${suffix}` - } satisfies EvalCase; - }); - - return { - instructionFile: ".github/copilot-instructions.md", - cases - }; -} - export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX.Element { const app = useApp(); const [status, setStatus] = useState(skipAnimation ? "idle" : "intro"); @@ -99,6 +54,34 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setStatus("idle"); }; + const bootstrapEvalConfig = async (count: number, force: boolean): Promise => { + const configPath = path.join(repoPath, "primer.eval.json"); + try { + setStatus("bootstrapping"); + setMessage("Generating eval cases with Copilot SDK..."); + const config = await generateEvalScaffold({ + repoPath, + count, + model: "gpt-4.1", + onProgress: (msg) => setMessage(msg) + }); + const resultMessage = await safeWriteFile(configPath, JSON.stringify(config, null, 2), force); + setStatus("done"); + setMessage(`Bootstrapped eval: ${resultMessage}`); + } catch (error) { + setStatus("error"); + const message = error instanceof Error ? error.message : "Failed to generate eval cases."; + if (message.toLowerCase().includes("auth") || message.toLowerCase().includes("login")) { + setMessage(`${message} Run 'copilot' then '/login' in a separate terminal.`); + } else { + setMessage(message); + } + } finally { + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + } + }; + useInput(async (input: string, key: Key) => { // During intro animation, any key skips it if (status === "intro") { @@ -152,12 +135,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setStatus("bootstrapEvalConfirm"); setMessage("primer.eval.json exists. Overwrite? (Y/N)"); } catch { - const config = buildBootstrapEvalConfig(count); - const resultMessage = await safeWriteFile(configPath, JSON.stringify(config, null, 2), false); - setStatus("done"); - setMessage(`Bootstrapped eval: ${resultMessage}`); - setEvalCaseCountInput(""); - setEvalBootstrapCount(null); + await bootstrapEvalConfig(count, false); } return; } @@ -183,19 +161,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setMessage("Missing eval case count. Restart bootstrap."); return; } - try { - const configPath = path.join(repoPath, "primer.eval.json"); - const config = buildBootstrapEvalConfig(count); - const resultMessage = await safeWriteFile(configPath, JSON.stringify(config, null, 2), true); - setStatus("done"); - setMessage(`Bootstrapped eval: ${resultMessage}`); - } catch (error) { - setStatus("error"); - setMessage(error instanceof Error ? error.message : "Failed to write eval config."); - } finally { - setEvalCaseCountInput(""); - setEvalBootstrapCount(null); - } + await bootstrapEvalConfig(count, true); return; } From ac7f562699dd180ab41e5613883980b918a1defc Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Tue, 3 Feb 2026 22:41:37 -0700 Subject: [PATCH 04/84] feat(cli): add option to list available Copilot models feat(eval): implement model listing functionality in eval command feat(copilot): create function to extract and list Copilot models from CLI help feat(evaluator): enhance trajectory viewer with phase filtering for tool calls feat(tui): add readiness report feature with detailed output and user interaction --- eval-results.html | 125 +- eval-results.json | 10406 ++++++++++++++++++++++++++---------- src/cli.ts | 1 + src/commands/eval.ts | 12 + src/services/copilot.ts | 36 + src/services/evaluator.ts | 47 +- src/ui/tui.tsx | 106 +- 7 files changed, 7935 insertions(+), 2798 deletions(-) diff --git a/eval-results.html b/eval-results.html index cdc38d9..3d2da62 100644 --- a/eval-results.html +++ b/eval-results.html @@ -10,6 +10,14 @@ .summary { margin-bottom: 24px; color: #b7bdc8; } .layout { display: grid; grid-template-columns: 280px 1fr; gap: 16px; } .panel { background: #151924; border: 1px solid #23283b; border-radius: 10px; padding: 12px; } + .section { margin-top: 16px; } + .section h3 { margin: 8px 0; font-size: 14px; color: #c7ccd6; } + .chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; } + .chip { background: #1e2232; border: 1px solid #2c3250; border-radius: 999px; padding: 2px 8px; font-size: 12px; color: #c9d1e3; } + .chip.phase { background: #23283b; border-color: #3a4163; color: #aeb7c6; } + .muted { color: #8a93a5; font-size: 12px; } + .filters { display: flex; gap: 12px; align-items: center; margin-top: 8px; } + .filters label { font-size: 12px; color: #b7bdc8; } .case { padding: 8px; border-radius: 8px; cursor: pointer; margin-bottom: 6px; } .case.active { background: #23283b; } .case span { display: block; font-size: 12px; color: #9aa3b2; } @@ -23,13 +31,15 @@

Primer Eval Trajectory

+
diff --git a/eval-results.json b/eval-results.json index da3cda4..a61da80 100644 --- a/eval-results.json +++ b/eval-results.json @@ -3,63 +3,57 @@ "model": "gpt-4.1", "judgeModel": "gpt-4.1", "runMetrics": { - "startedAt": "2026-02-04T05:21:19.668Z", - "finishedAt": "2026-02-04T05:21:58.146Z", - "durationMs": 38478 + "startedAt": "2026-02-04T05:38:08.043Z", + "finishedAt": "2026-02-04T05:38:34.698Z", + "durationMs": 26655 }, "results": [ { - "id": "overview", - "prompt": "Summarize what this application does and list the main entrypoints.", - "expectation": "Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.", - "withInstructions": "This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, evaluation, readiness reporting, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\nMain entrypoints:\n- CLI: `primer` (main binary, installed globally)\n- Programmatic: `src/index.ts` (calls `runCli()` in `src/cli.ts`)\n\nPrimary commands include: `init`, `analyze`, `generate`, `instructions`, `tui`, `eval`, `readiness`, `pr`, `batch`, `templates`, `config`, and `update`.", - "withoutInstructions": "This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, evaluation, readiness reports, and GitHub integration.\n\nMain entrypoints:\n- src/index.ts — CLI entry point\n- src/cli.ts — Commander CLI setup\n\nKey commands include: `primer init`, `primer tui`, `primer instructions`, `primer analyze`, `primer batch`, `primer readiness`, and `primer eval`.", + "id": "case-1", + "prompt": "What is the main purpose of the Primer CLI tool and what are its key features?", + "expectation": "Primer is a CLI tool that analyzes codebases and generates .github/copilot-instructions.md files to help AI coding assistants understand projects better. Key features include repository analysis, AI-powered instruction generation, batch processing, an evaluation framework, readiness reports, GitHub integration, an interactive TUI, and config generation.", + "withInstructions": "The main purpose of the Primer CLI tool is to prime repositories for AI-assisted development and evaluation, especially for use with GitHub Copilot and similar agents. Its key features include analyzing repositories to infer languages and frameworks, generating Copilot instructions and VS Code settings, automating GitHub workflows (clone, branch, PR), and evaluating agent responses with/without instructions. It uses TypeScript, Commander for CLI, Ink/React for TUI, and integrates tightly with Copilot and GitHub automation.", + "withoutInstructions": "The Primer CLI tool is a TypeScript-based CLI for priming repositories for AI-assisted development and evaluation. Its key features include analyzing repositories to infer languages and frameworks, generating Copilot instructions and VS Code settings, automating GitHub workflows (clone/branch/PR), and providing an interactive TUI. It is designed for ESM/strict TypeScript, uses Commander for CLI, Ink/React for TUI, and integrates with Copilot and GitHub for automation and evaluation.", "verdict": "pass", - "score": 100, - "rationale": "Response B best matches the expectation by explicitly mentioning the CLI entrypoint in src/index.ts, clarifying that it calls runCli in src/cli.ts, and identifying this as the Primer CLI. It also provides a more complete and accurate list of commands and features, aligning closely with the expectation.", + "score": 95, + "rationale": "Response B best matches the expectation. It covers all key features: repository analysis, instruction generation, config generation, GitHub automation, and evaluation framework. Response A is also accurate but omits explicit mention of the evaluation framework and readiness reports, which are present in the expectation.", "metrics": { "withoutInstructions": { - "durationMs": 11934, + "durationMs": 4925, "tokenUsage": { - "promptTokens": 10005, - "completionTokens": 289, - "totalTokens": 10294 + "promptTokens": 12602, + "completionTokens": 98, + "totalTokens": 12700 }, "toolCalls": { - "count": 5, + "count": 1, "byName": { - "report_intent": 1, - "task": 1, - "view": 3 + "fetch_copilot_cli_documentation": 1 }, "totalDurationMs": 0 } }, "withInstructions": { - "durationMs": 22221, + "durationMs": 4457, "tokenUsage": { - "promptTokens": 11011, - "completionTokens": 335, - "totalTokens": 11346 + "promptTokens": 13420, + "completionTokens": 101, + "totalTokens": 13521 }, "toolCalls": { - "count": 7, + "count": 1, "byName": { - "report_intent": 1, - "task": 1, - "view": 3, - "glob": 1, - "grep": 1 + "fetch_copilot_cli_documentation": 1 }, "totalDurationMs": 0 } }, "judge": { - "durationMs": 2774, + "durationMs": 2212, "tokenUsage": { - "promptTokens": 10011, - "completionTokens": 84, - "totalTokens": 10095 + "promptTokens": 10133, + "completionTokens": 75, + "totalTokens": 10208 }, "toolCalls": { "count": 0, @@ -67,33 +61,33 @@ "totalDurationMs": 0 } }, - "totalDurationMs": 38461 + "totalDurationMs": 13112 }, "trajectory": [ { - "timestampMs": 1770182481178, + "timestampMs": 1770183489544, "phase": "withoutInstructions", "type": "pending_messages.modified", "data": {} }, { - "timestampMs": 1770182481178, + "timestampMs": 1770183489544, "phase": "withoutInstructions", "type": "pending_messages.modified", "data": {} }, { - "timestampMs": 1770182483604, + "timestampMs": 1770183492141, "phase": "withoutInstructions", "type": "user.message", "data": { - "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nSummarize what this application does and list the main entrypoints.", - "transformedContent": "2026-02-04T05:21:23.352Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nSummarize what this application does and list the main entrypoints.", + "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nWhat is the main purpose of the Primer CLI tool and what are its key features?", + "transformedContent": "2026-02-04T05:38:11.890Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nWhat is the main purpose of the Primer CLI tool and what are its key features?", "attachments": [] } }, { - "timestampMs": 1770182483604, + "timestampMs": 1770183492142, "phase": "withoutInstructions", "type": "assistant.turn_start", "data": { @@ -101,30 +95,30 @@ } }, { - "timestampMs": 1770182483604, + "timestampMs": 1770183492142, "phase": "withoutInstructions", "type": "session.usage_info", "data": { "tokenLimit": 64000, - "currentTokens": 10343, + "currentTokens": 10492, "messagesLength": 2 } }, { - "timestampMs": 1770182485828, + "timestampMs": 1770183493060, "phase": "withoutInstructions", "type": "assistant.usage", "data": { "model": "gpt-4.1", - "inputTokens": 9710, - "outputTokens": 85, - "cacheReadTokens": 3840, + "inputTokens": 9859, + "outputTokens": 15, + "cacheReadTokens": 0, "cacheWriteTokens": 0, "cost": 0, - "duration": 2197, + "duration": 919, "initiator": "user", - "apiCallId": "chatcmpl-D5PcKj8TBk6a1XH5WkxrNpJSXawfs", - "providerCallId": "E903:35A03D:33E28A:3D9614:6982D753", + "apiCallId": "chatcmpl-D5PsaIGMjW9rWUXpnMpRLIzN0Ib5a", + "providerCallId": "EEC8:177A35:701447:840410:6982DB43", "quotaSnapshots": { "chat": { "isUnlimitedEntitlement": true, @@ -170,1626 +164,1154 @@ } }, { - "timestampMs": 1770182485829, + "timestampMs": 1770183493060, "phase": "withoutInstructions", "type": "assistant.message", "data": { - "messageId": "93ddd8e5-b53b-4e65-ae4d-3c9ab4f51f3b", + "messageId": "574878eb-7d54-46c6-bb0b-396f8fafa6a3", "content": "", "toolRequests": [ { - "toolCallId": "call_tpnJMuSM0sryKLy4z7k2W06H", - "name": "report_intent", - "arguments": { - "intent": "Exploring codebase" - }, - "type": "function" - }, - { - "toolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "name": "task", - "arguments": { - "agent_type": "explore", - "description": "Summarizing application purpose", - "prompt": "Summarize what this application does and list the main entrypoints. Be concise and list file paths for entrypoints." - }, + "toolCallId": "call_AO5bxlCkmdExvADeTf3OAEod", + "name": "fetch_copilot_cli_documentation", + "arguments": {}, "type": "function" } ] } }, { - "timestampMs": 1770182485834, - "phase": "withoutInstructions", - "type": "tool.execution_start", - "data": { - "toolCallId": "call_tpnJMuSM0sryKLy4z7k2W06H", - "toolName": "report_intent", - "arguments": { - "intent": "Exploring codebase" - } - } - }, - { - "timestampMs": 1770182485837, + "timestampMs": 1770183493061, "phase": "withoutInstructions", "type": "tool.execution_start", "data": { - "toolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "toolName": "task", - "arguments": { - "agent_type": "explore", - "description": "Summarizing application purpose", - "prompt": "Summarize what this application does and list the main entrypoints. Be concise and list file paths for entrypoints." - } + "toolCallId": "call_AO5bxlCkmdExvADeTf3OAEod", + "toolName": "fetch_copilot_cli_documentation", + "arguments": {} } }, { - "timestampMs": 1770182485837, + "timestampMs": 1770183493098, "phase": "withoutInstructions", "type": "tool.execution_complete", "data": { - "toolCallId": "call_tpnJMuSM0sryKLy4z7k2W06H", + "toolCallId": "call_AO5bxlCkmdExvADeTf3OAEod", "success": true, "result": { - "content": "Intent logged", - "detailedContent": "Exploring codebase" + "content": "# GitHub Copilot CLI Documentation\n\n## README\n# GitHub Copilot CLI (Public Preview)\n\nThe power of GitHub Copilot, now in your terminal.\n\nGitHub Copilot CLI brings AI-powered coding assistance directly to your command line, enabling you to build, debug, and understand code through natural language conversations. Powered by the same agentic harness as GitHub's Copilot coding agent, it provides intelligent assistance while staying deeply integrated with your GitHub workflow.\n\nSee [our official documentation](https://docs.github.com/copilot/concepts/agents/about-copilot-cli) for more information.\n\n![Image of the splash screen for the Copilot CLI](https://github.com/user-attachments/assets/f40aa23d-09dd-499e-9457-1d57d3368887)\n\n\n## 🚀 Introduction and Overview\n\nWe're bringing the power of GitHub Copilot coding agent directly to your terminal. With GitHub Copilot CLI, you can work locally and synchronously with an AI agent that understands your code and GitHub context.\n\n- **Terminal-native development:** Work with Copilot coding agent directly in your command line — no context switching required.\n- **GitHub integration out of the box:** Access your repositories, issues, and pull requests using natural language, all authenticated with your existing GitHub account.\n- **Agentic capabilities:** Build, edit, debug, and refactor code with an AI collaborator that can plan and execute complex tasks.\n- **MCP-powered extensibility:** Take advantage of the fact that the coding agent ships with GitHub's MCP server by default and supports custom MCP servers to extend capabilities.\n- **Full control:** Preview every action before execution — nothing happens without your explicit approval.\n\nWe're still early in our journey, but with your feedback, we're rapidly iterating to make the GitHub Copilot CLI the best possible companion in your terminal.\n\n## 📦 Getting Started\n\n### Supported Platforms\n\n- **Linux**\n- **macOS**\n- **Windows**\n\n### Prerequisites\n\n- (On Windows) **PowerShell** v6 or …", + "detailedContent": "Fetched CLI documentation" }, "toolTelemetry": {} } }, { - "timestampMs": 1770182488411, + "timestampMs": 1770183493098, "phase": "withoutInstructions", - "type": "assistant.usage", + "type": "assistant.turn_end", "data": { - "model": "claude-haiku-4.5", - "inputTokens": 2707, - "outputTokens": 289, - "cacheReadTokens": 0, - "cacheWriteTokens": 0, - "cost": 0.33, - "duration": 2250, - "initiator": "sub-agent", - "apiCallId": "msg_016BDLf3uZartGeaCcNnSoWD", - "providerCallId": "E903:35A03D:33EB57:3DA002:6982D756", - "quotaSnapshots": { - "chat": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "completions": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "premium_interactions": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "premium_interactions_tbb": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - } - }, - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg" + "turnId": "0" } }, { - "timestampMs": 1770182488411, + "timestampMs": 1770183493098, "phase": "withoutInstructions", - "type": "assistant.message", + "type": "assistant.turn_start", "data": { - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "messageId": "7b744914-d9fc-49f0-80de-7c84c32a6b2c", - "content": "", - "toolRequests": [ - { - "toolCallId": "toolu_01CzbYettZVEcZ8aE2dMxFGW", - "name": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready" - }, - "type": "function" - }, - { - "toolCallId": "toolu_01FQ6TzCWfm56V3EwxeF2MRA", - "name": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready/package.json" - }, - "type": "function" - }, - { - "toolCallId": "toolu_01NGYzuJkusQqT4meJPJuhD9", - "name": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready/README.md" - }, - "type": "function" - } - ], - "reasoningOpaque": "3IOUA34d654sP/xOhtYd0oHMHIP6BSEfihGf5GWOyWK7q6GXOek2hymkrZygkkIadRZ4TN0p6q0c68r5514Y9GJBJYvm+dmAwPNxF1EP2lFKZowIJ2CxDiEydSmtN4FsoqK9SENjWhrk8SL/Vy3OGKEAFQP9UTJzSYLVc1EHT8RnBzA0vgAi7YMCma7ch40DCjCvwQUdQJMhoxVjUYXfVkIW041JasRO3g5SBz6EJjZEynwbAyf41sgLSyXJGYEP2IsTHRqHv6jmVHwZVd6ZS5Z13rUFDJewL+k1Krl10f4M1dVhTu9QXLkiuIYSBTQ65q8GengLmnoiSCaLwLIaOpyAe5l5Dqj1x2gWiS5jK9UDvnwlTyLCtoOxH6iGBY8SoqkPOhjuy2nuuODytX96I9Am+lPG11rgKfnhrsM7IJM/AmXEQCLb8kxRKlvqoRU3rmC3nozTQEXRLfyCY9ODN2OoRTc+Uhc4Ew1ZAi6WGFY01AiPJaSKCtgZ2O4+p8kp1p7dk2AKv2bGVe5k+yU101fYe3TwBTa4md2sF3E0zsw2TwlUtU8uTUJ6k1k32s2ynmeOQWYVOheNlXAflxAzgH1hqALbwIMKrxj1ge/ESB8MhP69y8UUSNe51kh2Y1eo2Lca0S5V6UIHZzzuUNHTaHa+TRivQeL+KQepRwsCO6a0NpWbV51KP8iQ7ihNlKa/j96y0BgarFAOHHnlgI0trQ05pwfTDK9E8af6Qvb1aQb5f2Eiyt7Hc3rnfF2INJs7cdK2eI8l+ajZIM6vnEPQgnlA5QPunF2HCOGS3K4bHUU4lNQwcPtIpufmWsXGt5s7sb87prrzirCNvQqB2S4nrGtpALAjOr3kFh/U2mdy6KxuEyxy9AxjE5bGGTWcdDYAKD/U7cndxcVVNF6v7Z7TlgSd22IPArf97HjHI8zMe0kIuSnKOy9eEjEKD+px9NLl5OHeOj9fq2X7/PHkjrmEq9B2v//+t2VRoPExfoHhmiIfmtHP0wlNwSASd4jcwScoHAmUZc9e3FTynXVfKGasUc1aCUt3rkNY+uhU6UUoWbKZB0KsSqe85SwSaeNV1+6qzqXVMo2/LO1gaETmvI8xhnXmfEm9AuKqdKX2nwUZSlHBULCFuZLqh9G0ACl2yu7djX9nLFMMJGIq1WG8aQYu5EGO/xwaTImJRf0Q5B/n7AroQdrJTDXd6DP9nvwdgGPN8mrerg3xmtIEWreDnczsvZpAbhmaFTubp6YFzN+pQjYAIC8G0vRtD+vx0kzwLvX8LL5g7ULQljhtVKd9x09h+idh21t0wr6HbypZFxHc3oSTriUPuguqCkTO1fGOaFpCGvGoXhPC3mF3k71GOoehCWDxVD2LCfDmWlzPhPRh9u2hhy9JH5UuleOHgs6XMXFofeZ9McXvhjIQjn779zrjI+QgUD6m/4FwEvLL2Od/tSg0PswA2nCbCG8+0aJQQyJ+9I47NFlxose045GGhS4Je9c0U0GjV3uDodpPIRA11AUOz84gXBsK5Jj/X6vO", - "reasoningText": "The user wants me to summarize what this application does and list the main entrypoints with file paths. I should:\n\n1. First, explore the repository structure to understand what it is\n2. Look for package.json, README, or other documentation to understand the purpose\n3. Find the main entrypoints (typically in package.json, or main files like index.ts, index.js, main.ts, etc.)\n\nLet me start by looking at the directory structure and key files like package.json, README.md, etc." + "turnId": "1" } }, { - "timestampMs": 1770182488412, + "timestampMs": 1770183493098, "phase": "withoutInstructions", - "type": "tool.execution_start", + "type": "session.usage_info", "data": { - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "toolCallId": "toolu_01CzbYettZVEcZ8aE2dMxFGW", - "toolName": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready" - } + "tokenLimit": 64000, + "currentTokens": 13226, + "messagesLength": 4 } }, { - "timestampMs": 1770182488412, + "timestampMs": 1770183493980, "phase": "withoutInstructions", - "type": "tool.execution_start", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "toolCallId": "toolu_01FQ6TzCWfm56V3EwxeF2MRA", - "toolName": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready/package.json" - } + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 3, + "deltaPreview": "The", + "totalResponseSizeBytes": 3 } }, { - "timestampMs": 1770182488412, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "tool.execution_start", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "toolCallId": "toolu_01NGYzuJkusQqT4meJPJuhD9", - "toolName": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready/README.md" - } + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 7, + "deltaPreview": " Primer", + "totalResponseSizeBytes": 10 } }, { - "timestampMs": 1770182488413, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "tool.execution_complete", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "toolCallId": "toolu_01FQ6TzCWfm56V3EwxeF2MRA", - "success": true, - "result": { - "content": "1. {\n2. \"name\": \"primer\",\n3. \"version\": \"1.0.0\",\n4. \"description\": \"\",\n5. \"main\": \"dist/index.js\",\n6. \"scripts\": {\n7. \"build\": \"tsc && npm link\",\n8. \"prepare\": \"tsc\",\n9. \"lint\": \"eslint .\",\n10. \"format\": \"prettier --write .\",\n11. \"format:check\": \"prettier --check .\",\n12. \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n13. \"test\": \"vitest run\",\n14. \"test:watch\": \"vitest\",\n15. \"test:coverage\": \"vitest run --coverage\"\n16. },\n17. \"keywords\": [],\n18. \"author\": \"\",\n19. \"license\": \"ISC\",\n20. \"dependencies\": {\n21. \"@github/copilot-sdk\": \"^0.1.19\",\n22. \"@inquirer/prompts\": \"^8.2.0\",\n23. \"@octokit/rest\": \"^22.0.1\",\n24. \"chalk\": \"^5.6.2\",\n25. \"commander\": \"^14.0.2\",\n26. \"fast-glob\": \"^3.3.3\",\n27. \"ink\": \"^6.6.0\",\n28. \"react\": \"^19.2.4\",\n29. \"simple-git\": \"^3.30.0\"\n30. },\n31. \"devDependencies\": {\n32. \"@types/node\": \"^25.1.0\",\n33. \"@types/react\": \"^19.2.10\",\n34. \"@typescript-eslint/eslint-plugin\": \"^8.5.0\",\n35. \"@typescript-eslint/parser\": \"^8.5.0\",\n36. \"@vitest/coverage-v8\": \"^2.1.4\",\n37. \"eslint\": \"^9.7.0\",\n38. \"eslint-config-prettier\": \"^9.1.0\",\n39. \"eslint-plugin-import\": \"^2.30.0\",\n40. \"eslint-plugin-n\": \"^17.10.2\",\n41. \"eslint-plugin-promise\": \"^7.1.0\",\n42. \"prettier\": \"^3.3.3\",\n43. \"tsup\": \"^8.5.1\",\n44. \"tsx\": \"^4.21.0\",\n45. \"typescript\": \"^5.9.3\",\n46. \"vitest\": \"^2.1.4\"\n47. },\n48. \"type\": \"module\",\n49. \"bin\": {\n50. \"primer\": \"dist/index.js\"\n51. }\n52. }\n53. ", - "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready/package.json b/Users/pierceboggan/Documents/get-ready/package.json\nindex 0000000..0000000 100644\n--- a/Users/pierceboggan/Documents/get-ready/package.json\n+++ b/Users/pierceboggan/Documents/get-ready/package.json\n@@ -1,53 +1,53 @@\n {\n \"name\": \"primer\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"dist/index.js\",\n \"scripts\": {\n \"build\": \"tsc && npm link\",\n \"prepare\": \"tsc\",\n \"lint\": \"eslint .\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"@github/copilot-sdk\": \"^0.1.19\",\n \"@inquirer/prompts\": \"^8.2.0\",\n \"@octokit/rest\": \"^22.0.1\",\n \"chalk\": \"^5.6.2\",\n \"commander\": \"^14.0.2\",\n \"fast-glob\": \"^3.3.3\",\n \"ink\": \"^6.6.0\",\n \"react\": \"^19.2.4\",\n \"simple-git\": \"^3.30.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^25.1.0\",\n \"@types/react\": \"^19.2.10\",\n \"@typescript-eslint/eslint-plugin\": \"^8.5.0\",\n \"@typescript-eslint/parser\": \"^8.5.0\",\n \"@vitest/coverage-v8\": \"^2.1.4\",\n \"eslint\": \"^9.7.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"eslint-plugin-import\": \"^2.30.0\",\n \"eslint-plugin-n\": \"^17.10.2\",\n \"eslint-plugin-promise\": \"^7.1.0\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^2.1.4\"\n },\n \"type\": \"module\",\n \"bin\": {\n \"primer\": \"dist/index.js\"\n }\n }\n \n" - } + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 14 } }, { - "timestampMs": 1770182488413, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "tool.execution_complete", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "toolCallId": "toolu_01CzbYettZVEcZ8aE2dMxFGW", - "success": true, - "result": { - "content": ".DS_Store\n.git\n.github\n.gitignore\n.prettierrc.json\n.primer-cache\nCHANGELOG.md\nCODEOWNERS\nCONTRIBUTING.md\nLICENSE\nPLAN.md\nREADME.md\nSECURITY.md\ndist\neslint.config.js\neval-results.html\neval-results.json\nexamples\nnode_modules\npackage-lock.json\npackage.json\nprimer.eval.json\nprimer.png\nrelease-please-config.json\nrelease-please-manifest.json\nsrc\ntsconfig.json\nvitest.config.ts", - "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready b/Users/pierceboggan/Documents/get-ready\ncreate file mode 100644\nindex 0000000..0000000\n--- a/dev/null\n+++ b/Users/pierceboggan/Documents/get-ready\n@@ -1,0 +1,28 @@\n .DS_Store\n .git\n .github\n .gitignore\n .prettierrc.json\n .primer-cache\n CHANGELOG.md\n CODEOWNERS\n CONTRIBUTING.md\n LICENSE\n PLAN.md\n README.md\n SECURITY.md\n dist\n eslint.config.js\n eval-results.html\n eval-results.json\n examples\n node_modules\n package-lock.json\n package.json\n primer.eval.json\n primer.png\n release-please-config.json\n release-please-manifest.json\n src\n tsconfig.json\n vitest.config.ts\n" - } + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": " tool", + "totalResponseSizeBytes": 19 } }, { - "timestampMs": 1770182488430, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "tool.execution_complete", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "toolCallId": "toolu_01NGYzuJkusQqT4meJPJuhD9", - "success": true, - "result": { - "content": "1. # Primer\n2. \n3. > Prime your repositories for AI-assisted development.\n4. \n5. [![CI](https://github.com/pierceboggan/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/pierceboggan/primer/actions/workflows/ci.yml)\n6. [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n7. \n8. Primer is a CLI tool that analyzes your codebase and generates `.github/copilot-instructions.md` files to help AI coding assistants understand your project better. It supports single repos, batch processing across organizations, and includes an evaluation framework to measure instruction effectiveness.\n9. \n10. ![Primer](primer.png)\n11. \n12. ## Features\n13. \n14. - **Repository Analysis** - Detects languages, frameworks, and package managers\n15. - **AI-Powered Generation** - Uses the Copilot SDK to analyze your codebase and generate context-aware instructions\n16. - **Batch Processing** - Process multiple repos across organizations with a single command\n17. - **Evaluation Framework** - Test and measure how well your instructions improve AI responses\n18. - **Readiness Report** - Score AI readiness across key pillars with a fix-first checklist\n19. - **GitHub Integration** - Clone repos, create branches, and open PRs automatically\n20. - **Interactive TUI** - Beautiful terminal interface built with Ink\n21. - **Config Generation** - Generate MCP and VS Code configurations\n22. \n23. ## Prerequisites\n24. \n25. 1. **Node.js 18+**\n26. 2. **GitHub Copilot CLI** - Installed via VS Code's Copilot Chat extension\n27. 3. **Copilot CLI Authentication** - Run `copilot` then `/login` to authenticate\n28. 4. **GitHub CLI (optional)** - For batch processing and PR creation: `brew install gh && gh auth login`\n29. 5. **Azure DevOps PAT (optional)** - For Azure DevOps batch/PR workflows: set `AZURE_DEVOPS_PAT`\n30. \n31. ## Installation\n32. \n33. ```bash\n34. # Install from npm\n35. npm install -g primer\n36. ```\n37. \n38. ### Quick Install\n39. \n40. ```bash\n41. primer --help\n42. ```\n43. \n44. ##…", - "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready/README.md b/Users/pierceboggan/Documents/get-ready/README.md\nindex 0000000..0000000 100644\n--- a/Users/pierceboggan/Documents/get-ready/README.md\n+++ b/Users/pierceboggan/Documents/get-ready/README.md\n@@ -1,362 +1,362 @@\n # Primer\n \n > Prime your repositories for AI-assisted development.\n \n [![CI](https://github.com/pierceboggan/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/pierceboggan/primer/actions/workflows/ci.yml)\n [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n \n Primer is a CLI tool that analyzes your codebase and generates `.github/copilot-instructions.md` files to help AI coding assistants understand your project better. It supports single repos, batch processing across organizations, and includes an evaluation framework to measure instruction effectiveness.\n \n ![Primer](primer.png)\n \n ## Features\n \n - **Repository Analysis** - Detects languages, frameworks, and package managers\n - **AI-Powered Generation** - Uses the Copilot SDK to analyze your codebase and generate context-aware instructions\n - **Batch Processing** - Process multiple repos across organizations with a single command\n - **Evaluation Framework** - Test and measure how well your instructions improve AI responses\n - **Readiness Report** - Score AI readiness across key pillars with a fix-first checklist\n - **GitHub Integration** - Clone repos, create branches, and open PRs automatically\n - **Interactive TUI** - Beautiful terminal interface built with Ink\n - **Config Generation** - Generate MCP and VS Code configurations\n \n ## Prerequisites\n \n 1. **Node.js 18+**\n 2. **GitHub Copilot CLI** - Installed via VS Code's Copilot Chat extension\n 3. **Copilot CLI Authentication** - Run `copilot` then `/login` to authenticate\n 4. **GitHub CLI (optional)** - For batch processing and PR creation: `brew install gh && gh auth login`\n 5. **Azure DevOps PAT (optional)** - For Azure DevOps batch/PR workflows: set `AZ…" - } + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 3, + "deltaPreview": " is", + "totalResponseSizeBytes": 22 } }, { - "timestampMs": 1770182490847, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "assistant.usage", + "type": "assistant.message_delta", "data": { - "model": "claude-haiku-4.5", - "inputTokens": 7343, - "outputTokens": 219, - "cacheReadTokens": 0, - "cacheWriteTokens": 0, - "cost": 0.33, - "duration": 2400, - "initiator": "sub-agent", - "apiCallId": "msg_01R8GGE5VmR6reyFGzX8mGHz", - "providerCallId": "E903:35A03D:33F2DB:3DA886:6982D758", - "quotaSnapshots": { - "chat": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "completions": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "premium_interactions": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "premium_interactions_tbb": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - } - }, - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg" + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": " a", + "totalResponseSizeBytes": 24 } }, { - "timestampMs": 1770182490847, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "assistant.message", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "messageId": "f887839e-d030-4ed2-b01a-f4c8902583da", - "content": "## Summary\n\n**Primer** is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It features repository analysis, AI-powered instruction generation, batch processing, evaluation framework, readiness reports, and GitHub integration.\n\n**Main Entrypoints:**\n\n| File | Purpose |\n|------|---------|\n| `/Users/pierceboggan/Documents/get-ready/src/index.ts` | CLI entry point |\n| `/Users/pierceboggan/Documents/get-ready/src/cli.ts` | Commander CLI setup |\n\n**Key Commands:**\n- `primer init` - Interactive setup\n- `primer tui` - Terminal UI\n- `primer instructions` - Generate instructions\n- `primer analyze` - Repository analysis\n- `primer batch` - Batch processing\n- `primer readiness` - Readiness report\n- `primer eval` - Evaluation framework", - "toolRequests": [] + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": " Type", + "totalResponseSizeBytes": 29 } }, { - "timestampMs": 1770182490886, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "tool.execution_complete", + "type": "assistant.message_delta", "data": { - "toolCallId": "call_ijMhZpBYRRRLazj3rstyRJlg", - "success": true, - "result": { - "content": "## Summary\n\n**Primer** is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It features repository analysis, AI-powered instruction generation, batch processing, evaluation framework, readiness reports, and GitHub integration.\n\n**Main Entrypoints:**\n\n| File | Purpose |\n|------|---------|\n| `/Users/pierceboggan/Documents/get-ready/src/index.ts` | CLI entry point |\n| `/Users/pierceboggan/Documents/get-ready/src/cli.ts` | Commander CLI setup |\n\n**Key Commands:**\n- `primer init` - Interactive setup\n- `primer tui` - Terminal UI\n- `primer instructions` - Generate instructions\n- `primer analyze` - Repository analysis\n- `primer batch` - Batch processing\n- `primer readiness` - Readiness report\n- `primer eval` - Evaluation framework", - "detailedContent": "## Summary\n\n(Full response provided to agent)" - }, - "toolTelemetry": { - "properties": { - "prompt_length": "115", - "response_length": "828", - "hashed_agent_name": "6f281157ab246f0e1f35db82165d3448ee1e39077ab0d720fca7dddf014249d6", - "agent_type": "explore", - "execution_mode": "sync" - }, - "restrictedProperties": { - "agent_name": "explore" - }, - "metrics": { - "response_length": 828, - "numberOfToolCallsMadeByAgent": 3 - } - } + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 6, + "deltaPreview": "Script", + "totalResponseSizeBytes": 35 } }, { - "timestampMs": 1770182490886, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "assistant.turn_end", + "type": "assistant.message_delta", "data": { - "turnId": "0" + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 6, + "deltaPreview": "-based", + "totalResponseSizeBytes": 41 } }, { - "timestampMs": 1770182490886, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "assistant.turn_start", + "type": "assistant.message_delta", "data": { - "turnId": "1" + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 45 } }, { - "timestampMs": 1770182490886, + "timestampMs": 1770183493981, "phase": "withoutInstructions", - "type": "session.usage_info", + "type": "assistant.message_delta", "data": { - "tokenLimit": 64000, - "currentTokens": 10605, - "messagesLength": 5 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 49 } }, { - "timestampMs": 1770182491922, + "timestampMs": 1770183493981, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 4, - "deltaPreview": "This", - "totalResponseSizeBytes": 4 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": " prim", + "totalResponseSizeBytes": 54 } }, { - "timestampMs": 1770182491923, + "timestampMs": 1770183493981, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 12, - "deltaPreview": " application", - "totalResponseSizeBytes": 16 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 3, + "deltaPreview": "ing", + "totalResponseSizeBytes": 57 } }, { - "timestampMs": 1770182491923, + "timestampMs": 1770183493981, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 17 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 13, + "deltaPreview": " repositories", + "totalResponseSizeBytes": 70 } }, { - "timestampMs": 1770182491923, + "timestampMs": 1770183493981, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 7, - "deltaPreview": " Primer", - "totalResponseSizeBytes": 24 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 74 } }, { - "timestampMs": 1770182491923, + "timestampMs": 1770183493981, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 25 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 3, + "deltaPreview": " AI", + "totalResponseSizeBytes": 77 } }, { - "timestampMs": 1770182491923, + "timestampMs": 1770183494031, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": " is", - "totalResponseSizeBytes": 28 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 9, + "deltaPreview": "-assisted", + "totalResponseSizeBytes": 86 } }, { - "timestampMs": 1770182491923, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " a", - "totalResponseSizeBytes": 30 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 12, + "deltaPreview": " development", + "totalResponseSizeBytes": 98 } }, { - "timestampMs": 1770182492100, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 4, - "deltaPreview": " CLI", - "totalResponseSizeBytes": 34 + "deltaPreview": " and", + "totalResponseSizeBytes": 102 } }, { - "timestampMs": 1770182492100, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 5, - "deltaPreview": " tool", - "totalResponseSizeBytes": 39 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 11, + "deltaPreview": " evaluation", + "totalResponseSizeBytes": 113 } }, { - "timestampMs": 1770182492101, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 5, - "deltaPreview": " that", - "totalResponseSizeBytes": 44 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 114 } }, { - "timestampMs": 1770182492101, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 9, - "deltaPreview": " analyzes", - "totalResponseSizeBytes": 53 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " Its", + "totalResponseSizeBytes": 118 } }, { - "timestampMs": 1770182492101, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 5, - "deltaPreview": " code", - "totalResponseSizeBytes": 58 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " key", + "totalResponseSizeBytes": 122 } }, { - "timestampMs": 1770182492101, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 5, - "deltaPreview": "bases", - "totalResponseSizeBytes": 63 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 9, + "deltaPreview": " features", + "totalResponseSizeBytes": 131 } }, { - "timestampMs": 1770182492101, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 4, - "deltaPreview": " and", - "totalResponseSizeBytes": 67 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 8, + "deltaPreview": " include", + "totalResponseSizeBytes": 139 } }, { - "timestampMs": 1770182492101, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 10, - "deltaPreview": " generates", - "totalResponseSizeBytes": 77 + "deltaPreview": " analyzing", + "totalResponseSizeBytes": 149 + } + }, + { + "timestampMs": 1770183494032, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 13, + "deltaPreview": " repositories", + "totalResponseSizeBytes": 162 } }, { - "timestampMs": 1770182492101, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 3, - "deltaPreview": " `.", - "totalResponseSizeBytes": 80 + "deltaPreview": " to", + "totalResponseSizeBytes": 165 } }, { - "timestampMs": 1770182492101, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 6, - "deltaPreview": "github", - "totalResponseSizeBytes": 86 + "deltaPreview": " infer", + "totalResponseSizeBytes": 171 } }, { - "timestampMs": 1770182492171, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 4, - "deltaPreview": "/cop", - "totalResponseSizeBytes": 90 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 10, + "deltaPreview": " languages", + "totalResponseSizeBytes": 181 } }, { - "timestampMs": 1770182492171, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 4, - "deltaPreview": "ilot", - "totalResponseSizeBytes": 94 + "deltaPreview": " and", + "totalResponseSizeBytes": 185 } }, { - "timestampMs": 1770182492172, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": "-in", - "totalResponseSizeBytes": 97 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 11, + "deltaPreview": " frameworks", + "totalResponseSizeBytes": 196 } }, { - "timestampMs": 1770182492172, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 10, - "deltaPreview": "structions", - "totalResponseSizeBytes": 107 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 197 } }, { - "timestampMs": 1770182492172, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": ".md", - "totalResponseSizeBytes": 110 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 11, + "deltaPreview": " generating", + "totalResponseSizeBytes": 208 } }, { - "timestampMs": 1770182492172, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": "`", - "totalResponseSizeBytes": 111 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " Cop", + "totalResponseSizeBytes": 212 } }, { - "timestampMs": 1770182492172, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": " files", - "totalResponseSizeBytes": 117 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": "ilot", + "totalResponseSizeBytes": 216 } }, { - "timestampMs": 1770182492172, + "timestampMs": 1770183494032, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": " to", - "totalResponseSizeBytes": 120 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 13, + "deltaPreview": " instructions", + "totalResponseSizeBytes": 229 } }, { - "timestampMs": 1770182492172, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 5, - "deltaPreview": " help", - "totalResponseSizeBytes": 125 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 233 } }, { - "timestampMs": 1770182492172, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 3, - "deltaPreview": " AI", - "totalResponseSizeBytes": 128 + "deltaPreview": " VS", + "totalResponseSizeBytes": 236 } }, { - "timestampMs": 1770182492287, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 7, - "deltaPreview": " coding", - "totalResponseSizeBytes": 135 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": " Code", + "totalResponseSizeBytes": 241 } }, { - "timestampMs": 1770182492287, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 11, - "deltaPreview": " assistants", - "totalResponseSizeBytes": 146 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 9, + "deltaPreview": " settings", + "totalResponseSizeBytes": 250 } }, { - "timestampMs": 1770182492287, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 11, - "deltaPreview": " understand", - "totalResponseSizeBytes": 157 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 251 } }, { - "timestampMs": 1770182492287, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 9, - "deltaPreview": " projects", - "totalResponseSizeBytes": 166 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 6, + "deltaPreview": " autom", + "totalResponseSizeBytes": 257 } }, { - "timestampMs": 1770182492288, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 7, - "deltaPreview": " better", - "totalResponseSizeBytes": 173 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": "ating", + "totalResponseSizeBytes": 262 } }, { - "timestampMs": 1770182492288, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": ".", - "totalResponseSizeBytes": 174 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " Git", + "totalResponseSizeBytes": 266 } }, { - "timestampMs": 1770182492288, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 3, - "deltaPreview": " It", - "totalResponseSizeBytes": 177 + "deltaPreview": "Hub", + "totalResponseSizeBytes": 269 } }, { - "timestampMs": 1770182492288, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 9, - "deltaPreview": " supports", - "totalResponseSizeBytes": 186 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 10, + "deltaPreview": " workflows", + "totalResponseSizeBytes": 279 } }, { - "timestampMs": 1770182492288, + "timestampMs": 1770183494172, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 11, - "deltaPreview": " repository", - "totalResponseSizeBytes": 197 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": " (", + "totalResponseSizeBytes": 281 } }, { - "timestampMs": 1770182492288, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 9, - "deltaPreview": " analysis", - "totalResponseSizeBytes": 206 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": "clone", + "totalResponseSizeBytes": 286 } }, { - "timestampMs": 1770182492404, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 207 + "deltaPreview": "/", + "totalResponseSizeBytes": 287 } }, { - "timestampMs": 1770182492404, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": " AI", - "totalResponseSizeBytes": 210 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 6, + "deltaPreview": "branch", + "totalResponseSizeBytes": 293 } }, { - "timestampMs": 1770182492405, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 8, - "deltaPreview": "-powered", - "totalResponseSizeBytes": 218 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 294 } }, { - "timestampMs": 1770182492405, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 12, - "deltaPreview": " instruction", - "totalResponseSizeBytes": 230 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": "PR", + "totalResponseSizeBytes": 296 } }, { - "timestampMs": 1770182492405, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 11, - "deltaPreview": " generation", - "totalResponseSizeBytes": 241 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": "),", + "totalResponseSizeBytes": 298 } }, { - "timestampMs": 1770182492405, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 242 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 302 } }, { - "timestampMs": 1770182492405, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": " batch", - "totalResponseSizeBytes": 248 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 10, + "deltaPreview": " providing", + "totalResponseSizeBytes": 312 } }, { - "timestampMs": 1770182492405, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 11, - "deltaPreview": " processing", - "totalResponseSizeBytes": 259 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 3, + "deltaPreview": " an", + "totalResponseSizeBytes": 315 } }, { - "timestampMs": 1770182492405, + "timestampMs": 1770183494173, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 260 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 12, + "deltaPreview": " interactive", + "totalResponseSizeBytes": 327 } }, { - "timestampMs": 1770182492405, + "timestampMs": 1770183494323, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 11, - "deltaPreview": " evaluation", - "totalResponseSizeBytes": 271 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": " T", + "totalResponseSizeBytes": 329 } }, { - "timestampMs": 1770182492567, + "timestampMs": 1770183494323, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 272 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": "UI", + "totalResponseSizeBytes": 331 } }, { - "timestampMs": 1770182492567, + "timestampMs": 1770183494323, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 10, - "deltaPreview": " readiness", - "totalResponseSizeBytes": 282 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 332 } }, { - "timestampMs": 1770182492568, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 8, - "deltaPreview": " reports", - "totalResponseSizeBytes": 290 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 3, + "deltaPreview": " It", + "totalResponseSizeBytes": 335 } }, { - "timestampMs": 1770182492568, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 291 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 3, + "deltaPreview": " is", + "totalResponseSizeBytes": 338 } }, { - "timestampMs": 1770182492568, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 4, - "deltaPreview": " and", - "totalResponseSizeBytes": 295 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 9, + "deltaPreview": " designed", + "totalResponseSizeBytes": 347 } }, { - "timestampMs": 1770182492568, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 4, - "deltaPreview": " Git", - "totalResponseSizeBytes": 299 + "deltaPreview": " for", + "totalResponseSizeBytes": 351 } }, { - "timestampMs": 1770182492568, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": "Hub", - "totalResponseSizeBytes": 302 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": " E", + "totalResponseSizeBytes": 353 } }, { - "timestampMs": 1770182492568, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 12, - "deltaPreview": " integration", - "totalResponseSizeBytes": 314 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": "SM", + "totalResponseSizeBytes": 355 } }, { - "timestampMs": 1770182492568, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": ".\n\n", - "totalResponseSizeBytes": 317 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 356 } }, { - "timestampMs": 1770182492568, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 4, - "deltaPreview": "Main", - "totalResponseSizeBytes": 321 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 6, + "deltaPreview": "strict", + "totalResponseSizeBytes": 362 } }, { - "timestampMs": 1770182492747, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": " entry", - "totalResponseSizeBytes": 327 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": " Type", + "totalResponseSizeBytes": 367 } }, { - "timestampMs": 1770182492747, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 6, - "deltaPreview": "points", - "totalResponseSizeBytes": 333 + "deltaPreview": "Script", + "totalResponseSizeBytes": 373 } }, { - "timestampMs": 1770182492747, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": ":\n", - "totalResponseSizeBytes": 335 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 374 } }, { - "timestampMs": 1770182492747, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": "-", - "totalResponseSizeBytes": 336 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": " uses", + "totalResponseSizeBytes": 379 } }, { - "timestampMs": 1770182492747, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 4, - "deltaPreview": " src", - "totalResponseSizeBytes": 340 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 10, + "deltaPreview": " Commander", + "totalResponseSizeBytes": 389 } }, { - "timestampMs": 1770182492747, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": "/index", - "totalResponseSizeBytes": 346 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 393 } }, { - "timestampMs": 1770182492747, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": ".ts", - "totalResponseSizeBytes": 349 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 397 } }, { - "timestampMs": 1770182492747, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " —", - "totalResponseSizeBytes": 353 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 398 } }, { - "timestampMs": 1770182492748, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 4, - "deltaPreview": " CLI", - "totalResponseSizeBytes": 357 + "deltaPreview": " Ink", + "totalResponseSizeBytes": 402 } }, { - "timestampMs": 1770182492748, + "timestampMs": 1770183494324, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": " entry", - "totalResponseSizeBytes": 363 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 403 } }, { - "timestampMs": 1770182492818, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": " point", - "totalResponseSizeBytes": 369 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": "React", + "totalResponseSizeBytes": 408 } }, { - "timestampMs": 1770182492818, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": "\n", - "totalResponseSizeBytes": 370 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 412 } }, { - "timestampMs": 1770182492819, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": "-", - "totalResponseSizeBytes": 371 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": " T", + "totalResponseSizeBytes": 414 } }, { - "timestampMs": 1770182492819, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 4, - "deltaPreview": " src", - "totalResponseSizeBytes": 375 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 2, + "deltaPreview": "UI", + "totalResponseSizeBytes": 416 } }, { - "timestampMs": 1770182492819, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 1, - "deltaPreview": "/", - "totalResponseSizeBytes": 376 + "deltaPreview": ",", + "totalResponseSizeBytes": 417 } }, { - "timestampMs": 1770182492819, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": "cli", - "totalResponseSizeBytes": 379 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 421 } }, { - "timestampMs": 1770182492819, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 3, - "deltaPreview": ".ts", - "totalResponseSizeBytes": 382 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 11, + "deltaPreview": " integrates", + "totalResponseSizeBytes": 432 } }, { - "timestampMs": 1770182492819, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " —", - "totalResponseSizeBytes": 386 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 5, + "deltaPreview": " with", + "totalResponseSizeBytes": 437 } }, { - "timestampMs": 1770182492819, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 10, - "deltaPreview": " Commander", - "totalResponseSizeBytes": 396 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " Cop", + "totalResponseSizeBytes": 441 } }, { - "timestampMs": 1770182492819, + "timestampMs": 1770183494464, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 4, - "deltaPreview": " CLI", - "totalResponseSizeBytes": 400 + "deltaPreview": "ilot", + "totalResponseSizeBytes": 445 } }, { - "timestampMs": 1770182492924, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": " setup", - "totalResponseSizeBytes": 406 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 449 } }, { - "timestampMs": 1770182492924, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": "\n\n", - "totalResponseSizeBytes": 408 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " Git", + "totalResponseSizeBytes": 453 } }, { - "timestampMs": 1770182492927, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 3, - "deltaPreview": "Key", - "totalResponseSizeBytes": 411 + "deltaPreview": "Hub", + "totalResponseSizeBytes": 456 } }, { - "timestampMs": 1770182492927, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 9, - "deltaPreview": " commands", - "totalResponseSizeBytes": 420 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 460 } }, { - "timestampMs": 1770182492927, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 8, - "deltaPreview": " include", - "totalResponseSizeBytes": 428 - } - }, - { - "timestampMs": 1770182492927, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 1, - "deltaPreview": ":", - "totalResponseSizeBytes": 429 - } - }, - { - "timestampMs": 1770182492927, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 431 - } - }, - { - "timestampMs": 1770182492927, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": "primer", - "totalResponseSizeBytes": 437 - } - }, - { - "timestampMs": 1770182492927, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 5, - "deltaPreview": " init", - "totalResponseSizeBytes": 442 - } - }, - { - "timestampMs": 1770182492927, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 444 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 446 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": "primer", - "totalResponseSizeBytes": 452 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 4, - "deltaPreview": " tui", - "totalResponseSizeBytes": 456 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 458 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 460 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": "primer", - "totalResponseSizeBytes": 466 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 13, - "deltaPreview": " instructions", - "totalResponseSizeBytes": 479 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 481 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 483 - } - }, - { - "timestampMs": 1770182492962, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": "primer", - "totalResponseSizeBytes": 489 - } - }, - { - "timestampMs": 1770182493032, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 8, - "deltaPreview": " analyze", - "totalResponseSizeBytes": 497 - } - }, - { - "timestampMs": 1770182493032, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 499 - } - }, - { - "timestampMs": 1770182493032, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 501 - } - }, - { - "timestampMs": 1770182493032, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": "primer", - "totalResponseSizeBytes": 507 - } - }, - { - "timestampMs": 1770182493032, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": " batch", - "totalResponseSizeBytes": 513 - } - }, - { - "timestampMs": 1770182493032, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 515 - } - }, - { - "timestampMs": 1770182493033, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 517 - } - }, - { - "timestampMs": 1770182493033, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": "primer", - "totalResponseSizeBytes": 523 - } - }, - { - "timestampMs": 1770182493033, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 10, - "deltaPreview": " readiness", - "totalResponseSizeBytes": 533 - } - }, - { - "timestampMs": 1770182493033, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 535 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 11, + "deltaPreview": " automation", + "totalResponseSizeBytes": 471 } }, { - "timestampMs": 1770182493106, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", "deltaChars": 4, "deltaPreview": " and", - "totalResponseSizeBytes": 539 - } - }, - { - "timestampMs": 1770182493106, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 541 - } - }, - { - "timestampMs": 1770182493106, - "phase": "withoutInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 6, - "deltaPreview": "primer", - "totalResponseSizeBytes": 547 + "totalResponseSizeBytes": 475 } }, { - "timestampMs": 1770182493106, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 5, - "deltaPreview": " eval", - "totalResponseSizeBytes": 552 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 11, + "deltaPreview": " evaluation", + "totalResponseSizeBytes": 486 } }, { - "timestampMs": 1770182493106, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "deltaChars": 2, - "deltaPreview": "`.", - "totalResponseSizeBytes": 554 + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 487 } }, { - "timestampMs": 1770182493106, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.usage", "data": { "model": "gpt-4.1", - "inputTokens": 10005, - "outputTokens": 114, - "cacheReadTokens": 9088, + "inputTokens": 12602, + "outputTokens": 98, + "cacheReadTokens": 9856, "cacheWriteTokens": 0, "cost": 0, - "duration": 2219, + "duration": 1366, "initiator": "agent", - "apiCallId": "chatcmpl-D5PcRI6T4ILfUtZDNyDGjcQAeURGc", - "providerCallId": "E903:35A03D:33FAB6:3DB199:6982D75A", + "apiCallId": "chatcmpl-D5PsbzZBK3OPKNyoECnazAxf9UHku", + "providerCallId": "EEC8:177A35:7016EF:840736:6982DB45", "quotaSnapshots": { "chat": { "isUnlimitedEntitlement": true, @@ -1835,17 +1357,17 @@ } }, { - "timestampMs": 1770182493107, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.message", "data": { - "messageId": "4ff91b27-59f2-4757-a441-57cad2001acc", - "content": "This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, evaluation, readiness reports, and GitHub integration.\n\nMain entrypoints:\n- src/index.ts — CLI entry point\n- src/cli.ts — Commander CLI setup\n\nKey commands include: `primer init`, `primer tui`, `primer instructions`, `primer analyze`, `primer batch`, `primer readiness`, and `primer eval`.", + "messageId": "58370827-c0a0-4a5b-86b0-73ebaacd08a9", + "content": "The Primer CLI tool is a TypeScript-based CLI for priming repositories for AI-assisted development and evaluation. Its key features include analyzing repositories to infer languages and frameworks, generating Copilot instructions and VS Code settings, automating GitHub workflows (clone/branch/PR), and providing an interactive TUI. It is designed for ESM/strict TypeScript, uses Commander for CLI, Ink/React for TUI, and integrates with Copilot and GitHub for automation and evaluation.", "toolRequests": [] } }, { - "timestampMs": 1770182493107, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "assistant.turn_end", "data": { @@ -1853,35 +1375,35 @@ } }, { - "timestampMs": 1770182493107, + "timestampMs": 1770183494465, "phase": "withoutInstructions", "type": "session.idle", "data": {} }, { - "timestampMs": 1770182493132, + "timestampMs": 1770183494487, "phase": "withInstructions", "type": "pending_messages.modified", "data": {} }, { - "timestampMs": 1770182493132, + "timestampMs": 1770183494487, "phase": "withInstructions", "type": "pending_messages.modified", "data": {} }, { - "timestampMs": 1770182493866, + "timestampMs": 1770183495193, "phase": "withInstructions", "type": "user.message", "data": { - "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nSummarize what this application does and list the main entrypoints.", - "transformedContent": "2026-02-04T05:21:33.829Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nSummarize what this application does and list the main entrypoints.", + "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nWhat is the main purpose of the Primer CLI tool and what are its key features?", + "transformedContent": "2026-02-04T05:38:15.153Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nWhat is the main purpose of the Primer CLI tool and what are its key features?", "attachments": [] } }, { - "timestampMs": 1770182493867, + "timestampMs": 1770183495193, "phase": "withInstructions", "type": "assistant.turn_start", "data": { @@ -1889,30 +1411,30 @@ } }, { - "timestampMs": 1770182493867, + "timestampMs": 1770183495193, "phase": "withInstructions", "type": "session.usage_info", "data": { "tokenLimit": 64000, - "currentTokens": 11015, + "currentTokens": 11310, "messagesLength": 2 } }, { - "timestampMs": 1770182495951, + "timestampMs": 1770183496821, "phase": "withInstructions", "type": "assistant.usage", "data": { "model": "gpt-4.1", - "inputTokens": 10382, - "outputTokens": 94, - "cacheReadTokens": 9984, + "inputTokens": 10677, + "outputTokens": 15, + "cacheReadTokens": 0, "cacheWriteTokens": 0, "cost": 0, - "duration": 2080, + "duration": 1628, "initiator": "user", - "apiCallId": "chatcmpl-D5PcUtFiguAzEPDeiBTxJYeehvIh9", - "providerCallId": "E903:35A03D:340477:3DBCDB:6982D75D", + "apiCallId": "chatcmpl-D5PsdXXf8TXVsE9J7gwq3IK6hIN3T", + "providerCallId": "EEC8:177A35:701CC6:840DF8:6982DB47", "quotaSnapshots": { "chat": { "isUnlimitedEntitlement": true, @@ -1958,110 +1480,4813 @@ } }, { - "timestampMs": 1770182495951, + "timestampMs": 1770183496821, "phase": "withInstructions", "type": "assistant.message", "data": { - "messageId": "fa934988-cc62-4c45-8c26-b19e0fb419f0", + "messageId": "8f252ef5-b37e-44cb-8225-6b3a8ba2aedb", "content": "", "toolRequests": [ { - "toolCallId": "call_gQKcwh4lrRf8iHebDhI7mxBH", - "name": "report_intent", - "arguments": { - "intent": "Summarizing application purpose" - }, - "type": "function" - }, - { - "toolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "name": "task", - "arguments": { - "agent_type": "explore", - "description": "Summarizing app and entrypoints", - "prompt": "Summarize what this application does and list the main entrypoints. Be concise. List the main CLI commands or programmatic entrypoints if present." - }, + "toolCallId": "call_fge4ooiF8Y28j2OmwsFlyRxC", + "name": "fetch_copilot_cli_documentation", + "arguments": {}, "type": "function" } ] } }, { - "timestampMs": 1770182495951, - "phase": "withInstructions", - "type": "tool.execution_start", - "data": { - "toolCallId": "call_gQKcwh4lrRf8iHebDhI7mxBH", - "toolName": "report_intent", - "arguments": { - "intent": "Summarizing application purpose" - } - } - }, - { - "timestampMs": 1770182495951, + "timestampMs": 1770183496821, "phase": "withInstructions", "type": "tool.execution_start", "data": { - "toolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolName": "task", - "arguments": { - "agent_type": "explore", - "description": "Summarizing app and entrypoints", - "prompt": "Summarize what this application does and list the main entrypoints. Be concise. List the main CLI commands or programmatic entrypoints if present." - } + "toolCallId": "call_fge4ooiF8Y28j2OmwsFlyRxC", + "toolName": "fetch_copilot_cli_documentation", + "arguments": {} } }, { - "timestampMs": 1770182495951, + "timestampMs": 1770183496852, "phase": "withInstructions", "type": "tool.execution_complete", "data": { - "toolCallId": "call_gQKcwh4lrRf8iHebDhI7mxBH", + "toolCallId": "call_fge4ooiF8Y28j2OmwsFlyRxC", "success": true, "result": { - "content": "Intent logged", - "detailedContent": "Summarizing application purpose" + "content": "# GitHub Copilot CLI Documentation\n\n## README\n# GitHub Copilot CLI (Public Preview)\n\nThe power of GitHub Copilot, now in your terminal.\n\nGitHub Copilot CLI brings AI-powered coding assistance directly to your command line, enabling you to build, debug, and understand code through natural language conversations. Powered by the same agentic harness as GitHub's Copilot coding agent, it provides intelligent assistance while staying deeply integrated with your GitHub workflow.\n\nSee [our official documentation](https://docs.github.com/copilot/concepts/agents/about-copilot-cli) for more information.\n\n![Image of the splash screen for the Copilot CLI](https://github.com/user-attachments/assets/f40aa23d-09dd-499e-9457-1d57d3368887)\n\n\n## 🚀 Introduction and Overview\n\nWe're bringing the power of GitHub Copilot coding agent directly to your terminal. With GitHub Copilot CLI, you can work locally and synchronously with an AI agent that understands your code and GitHub context.\n\n- **Terminal-native development:** Work with Copilot coding agent directly in your command line — no context switching required.\n- **GitHub integration out of the box:** Access your repositories, issues, and pull requests using natural language, all authenticated with your existing GitHub account.\n- **Agentic capabilities:** Build, edit, debug, and refactor code with an AI collaborator that can plan and execute complex tasks.\n- **MCP-powered extensibility:** Take advantage of the fact that the coding agent ships with GitHub's MCP server by default and supports custom MCP servers to extend capabilities.\n- **Full control:** Preview every action before execution — nothing happens without your explicit approval.\n\nWe're still early in our journey, but with your feedback, we're rapidly iterating to make the GitHub Copilot CLI the best possible companion in your terminal.\n\n## 📦 Getting Started\n\n### Supported Platforms\n\n- **Linux**\n- **macOS**\n- **Windows**\n\n### Prerequisites\n\n- (On Windows) **PowerShell** v6 or …", + "detailedContent": "Fetched CLI documentation" }, "toolTelemetry": {} } }, { - "timestampMs": 1770182499225, + "timestampMs": 1770183496852, "phase": "withInstructions", - "type": "assistant.usage", + "type": "assistant.turn_end", "data": { - "model": "claude-haiku-4.5", - "inputTokens": 2713, - "outputTokens": 335, - "cacheReadTokens": 0, - "cacheWriteTokens": 0, - "cost": 0.33, - "duration": 2960, - "initiator": "sub-agent", - "apiCallId": "msg_017fmNqNjPGntbszM5ineEJx", - "providerCallId": "E903:35A03D:340C7D:3DC60F:6982D760", - "quotaSnapshots": { - "chat": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "completions": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, + "turnId": "0" + } + }, + { + "timestampMs": 1770183496852, + "phase": "withInstructions", + "type": "assistant.turn_start", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770183496852, + "phase": "withInstructions", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 14044, + "messagesLength": 4 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": "The", + "totalResponseSizeBytes": 3 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": " main", + "totalResponseSizeBytes": 8 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 8, + "deltaPreview": " purpose", + "totalResponseSizeBytes": 16 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": " of", + "totalResponseSizeBytes": 19 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 23 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 7, + "deltaPreview": " Primer", + "totalResponseSizeBytes": 30 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 34 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": " tool", + "totalResponseSizeBytes": 39 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": " is", + "totalResponseSizeBytes": 42 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": " to", + "totalResponseSizeBytes": 45 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 6, + "deltaPreview": " prime", + "totalResponseSizeBytes": 51 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 13, + "deltaPreview": " repositories", + "totalResponseSizeBytes": 64 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 68 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": " AI", + "totalResponseSizeBytes": 71 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 9, + "deltaPreview": "-assisted", + "totalResponseSizeBytes": 80 + } + }, + { + "timestampMs": 1770183497985, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 12, + "deltaPreview": " development", + "totalResponseSizeBytes": 92 + } + }, + { + "timestampMs": 1770183498282, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 96 + } + }, + { + "timestampMs": 1770183498282, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 11, + "deltaPreview": " evaluation", + "totalResponseSizeBytes": 107 + } + }, + { + "timestampMs": 1770183498282, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 108 + } + }, + { + "timestampMs": 1770183498282, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 11, + "deltaPreview": " especially", + "totalResponseSizeBytes": 119 + } + }, + { + "timestampMs": 1770183498282, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 123 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " use", + "totalResponseSizeBytes": 127 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": " with", + "totalResponseSizeBytes": 132 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " Git", + "totalResponseSizeBytes": 136 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": "Hub", + "totalResponseSizeBytes": 139 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " Cop", + "totalResponseSizeBytes": 143 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": "ilot", + "totalResponseSizeBytes": 147 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 151 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 8, + "deltaPreview": " similar", + "totalResponseSizeBytes": 159 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 7, + "deltaPreview": " agents", + "totalResponseSizeBytes": 166 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 167 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " Its", + "totalResponseSizeBytes": 171 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " key", + "totalResponseSizeBytes": 175 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 9, + "deltaPreview": " features", + "totalResponseSizeBytes": 184 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 8, + "deltaPreview": " include", + "totalResponseSizeBytes": 192 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 10, + "deltaPreview": " analyzing", + "totalResponseSizeBytes": 202 + } + }, + { + "timestampMs": 1770183498283, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 13, + "deltaPreview": " repositories", + "totalResponseSizeBytes": 215 + } + }, + { + "timestampMs": 1770183498428, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": " to", + "totalResponseSizeBytes": 218 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 6, + "deltaPreview": " infer", + "totalResponseSizeBytes": 224 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 10, + "deltaPreview": " languages", + "totalResponseSizeBytes": 234 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 238 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 11, + "deltaPreview": " frameworks", + "totalResponseSizeBytes": 249 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 250 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 11, + "deltaPreview": " generating", + "totalResponseSizeBytes": 261 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " Cop", + "totalResponseSizeBytes": 265 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": "ilot", + "totalResponseSizeBytes": 269 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 13, + "deltaPreview": " instructions", + "totalResponseSizeBytes": 282 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 286 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": " VS", + "totalResponseSizeBytes": 289 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": " Code", + "totalResponseSizeBytes": 294 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 9, + "deltaPreview": " settings", + "totalResponseSizeBytes": 303 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 304 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 6, + "deltaPreview": " autom", + "totalResponseSizeBytes": 310 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": "ating", + "totalResponseSizeBytes": 315 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " Git", + "totalResponseSizeBytes": 319 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": "Hub", + "totalResponseSizeBytes": 322 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 10, + "deltaPreview": " workflows", + "totalResponseSizeBytes": 332 + } + }, + { + "timestampMs": 1770183498429, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 2, + "deltaPreview": " (", + "totalResponseSizeBytes": 334 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": "clone", + "totalResponseSizeBytes": 339 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 340 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 7, + "deltaPreview": " branch", + "totalResponseSizeBytes": 347 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 348 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": " PR", + "totalResponseSizeBytes": 351 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 2, + "deltaPreview": "),", + "totalResponseSizeBytes": 353 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 357 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 11, + "deltaPreview": " evaluating", + "totalResponseSizeBytes": 368 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 6, + "deltaPreview": " agent", + "totalResponseSizeBytes": 374 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 10, + "deltaPreview": " responses", + "totalResponseSizeBytes": 384 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": " with", + "totalResponseSizeBytes": 389 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 390 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 7, + "deltaPreview": "without", + "totalResponseSizeBytes": 397 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 13, + "deltaPreview": " instructions", + "totalResponseSizeBytes": 410 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 411 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": " It", + "totalResponseSizeBytes": 414 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": " uses", + "totalResponseSizeBytes": 419 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": " Type", + "totalResponseSizeBytes": 424 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 6, + "deltaPreview": "Script", + "totalResponseSizeBytes": 430 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 431 + } + }, + { + "timestampMs": 1770183498591, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 10, + "deltaPreview": " Commander", + "totalResponseSizeBytes": 441 + } + }, + { + "timestampMs": 1770183498937, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 445 + } + }, + { + "timestampMs": 1770183498937, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 449 + } + }, + { + "timestampMs": 1770183498937, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 450 + } + }, + { + "timestampMs": 1770183498937, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " Ink", + "totalResponseSizeBytes": 454 + } + }, + { + "timestampMs": 1770183498941, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 455 + } + }, + { + "timestampMs": 1770183498941, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": "React", + "totalResponseSizeBytes": 460 + } + }, + { + "timestampMs": 1770183498941, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 464 + } + }, + { + "timestampMs": 1770183498941, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 2, + "deltaPreview": " T", + "totalResponseSizeBytes": 466 + } + }, + { + "timestampMs": 1770183498941, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 2, + "deltaPreview": "UI", + "totalResponseSizeBytes": 468 + } + }, + { + "timestampMs": 1770183498941, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 469 + } + }, + { + "timestampMs": 1770183498941, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 473 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 11, + "deltaPreview": " integrates", + "totalResponseSizeBytes": 484 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 8, + "deltaPreview": " tightly", + "totalResponseSizeBytes": 492 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 5, + "deltaPreview": " with", + "totalResponseSizeBytes": 497 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " Cop", + "totalResponseSizeBytes": 501 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": "ilot", + "totalResponseSizeBytes": 505 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 509 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 4, + "deltaPreview": " Git", + "totalResponseSizeBytes": 513 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 3, + "deltaPreview": "Hub", + "totalResponseSizeBytes": 516 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 11, + "deltaPreview": " automation", + "totalResponseSizeBytes": 527 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 528 + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 13420, + "outputTokens": 101, + "cacheReadTokens": 0, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 2090, + "initiator": "agent", + "apiCallId": "chatcmpl-D5Psf6vuQCGSvrdcTADGNeKRGib5T", + "providerCallId": "EEC8:177A35:702225:841435:6982DB48", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.message", + "data": { + "messageId": "d9bf556a-5048-44b1-9a82-c451005ab990", + "content": "The main purpose of the Primer CLI tool is to prime repositories for AI-assisted development and evaluation, especially for use with GitHub Copilot and similar agents. Its key features include analyzing repositories to infer languages and frameworks, generating Copilot instructions and VS Code settings, automating GitHub workflows (clone, branch, PR), and evaluating agent responses with/without instructions. It uses TypeScript, Commander for CLI, Ink/React for TUI, and integrates tightly with Copilot and GitHub automation.", + "toolRequests": [] + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "assistant.turn_end", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770183498942, + "phase": "withInstructions", + "type": "session.idle", + "data": {} + }, + { + "timestampMs": 1770183498961, + "phase": "judge", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770183498961, + "phase": "judge", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770183499607, + "phase": "judge", + "type": "user.message", + "data": { + "content": "Evaluate which response best matches the expectation.\n\nExpectation: Primer is a CLI tool that analyzes codebases and generates .github/copilot-instructions.md files to help AI coding assistants understand projects better. Key features include repository analysis, AI-powered instruction generation, batch processing, an evaluation framework, readiness reports, GitHub integration, an interactive TUI, and config generation.\n\nResponse A (without custom instructions):\nThe Primer CLI tool is a TypeScript-based CLI for priming repositories for AI-assisted development and evaluation. Its key features include analyzing repositories to infer languages and frameworks, generating Copilot instructions and VS Code settings, automating GitHub workflows (clone/branch/PR), and providing an interactive TUI. It is designed for ESM/strict TypeScript, uses Commander for CLI, Ink/React for TUI, and integrates with Copilot and GitHub for automation and evaluation.\n\nResponse B (with custom instructions):\nThe main purpose of the Primer CLI tool is to prime repositories for AI-assisted development and evaluation, especially for use with GitHub Copilot and similar agents. Its key features include analyzing repositories to infer languages and frameworks, generating Copilot instructions and VS Code settings, automating GitHub workflows (clone, branch, PR), and evaluating agent responses with/without instructions. It uses TypeScript, Commander for CLI, Ink/React for TUI, and integrates tightly with Copilot and GitHub automation.\n\nReturn JSON only.", + "transformedContent": "2026-02-04T05:38:19.581Z\n\nEvaluate which response best matches the expectation.\n\nExpectation: Primer is a CLI tool that analyzes codebases and generates .github/copilot-instructions.md files to help AI coding assistants understand projects better. Key features include repository analysis, AI-powered instruction generation, batch processing, an evaluation framework, readiness reports, GitHub integration, an interactive TUI, and config generation.\n\nResponse A (without custom instructions):\nThe Primer CLI tool is a TypeScript-based CLI for priming repositories for AI-assisted development and evaluation. Its key features include analyzing repositories to infer languages and frameworks, generating Copilot instructions and VS Code settings, automating GitHub workflows (clone/branch/PR), and providing an interactive TUI. It is designed for ESM/strict TypeScript, uses Commander for CLI, Ink/React for TUI, and integrates with Copilot and GitHub for automation and evaluation.\n\nResponse B (with custom instructions):\nThe main purpose of the Primer CLI tool is to prime repositories for AI-assisted development and evaluation, especially for use with GitHub Copilot and similar agents. Its key features include analyzing repositories to infer languages and frameworks, generating Copilot instructions and VS Code settings, automating GitHub workflows (clone, branch, PR), and evaluating agent responses with/without instructions. It uses TypeScript, Commander for CLI, Ink/React for TUI, and integrates tightly with Copilot and GitHub automation.\n\nReturn JSON only.", + "attachments": [] + } + }, + { + "timestampMs": 1770183499607, + "phase": "judge", + "type": "assistant.turn_start", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770183499608, + "phase": "judge", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 10766, + "messagesLength": 2 + } + }, + { + "timestampMs": 1770183500658, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": "{\"", + "totalResponseSizeBytes": 2 + } + }, + { + "timestampMs": 1770183500658, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 3, + "deltaPreview": "ver", + "totalResponseSizeBytes": 5 + } + }, + { + "timestampMs": 1770183500658, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": "dict", + "totalResponseSizeBytes": 9 + } + }, + { + "timestampMs": 1770183500658, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 11 + } + }, + { + "timestampMs": 1770183500658, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 13 + } + }, + { + "timestampMs": 1770183500658, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": "pass", + "totalResponseSizeBytes": 17 + } + }, + { + "timestampMs": 1770183500658, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": "\",", + "totalResponseSizeBytes": 19 + } + }, + { + "timestampMs": 1770183500658, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 21 + } + }, + { + "timestampMs": 1770183500658, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 5, + "deltaPreview": "score", + "totalResponseSizeBytes": 26 + } + }, + { + "timestampMs": 1770183500659, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 28 + } + }, + { + "timestampMs": 1770183500659, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": " ", + "totalResponseSizeBytes": 29 + } + }, + { + "timestampMs": 1770183500659, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": "95", + "totalResponseSizeBytes": 31 + } + }, + { + "timestampMs": 1770183500659, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 32 + } + }, + { + "timestampMs": 1770183500659, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 34 + } + }, + { + "timestampMs": 1770183500659, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": "r", + "totalResponseSizeBytes": 35 + } + }, + { + "timestampMs": 1770183500659, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 8, + "deltaPreview": "ationale", + "totalResponseSizeBytes": 43 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 45 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 47 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 8, + "deltaPreview": "Response", + "totalResponseSizeBytes": 55 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": " B", + "totalResponseSizeBytes": 57 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 5, + "deltaPreview": " best", + "totalResponseSizeBytes": 62 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 8, + "deltaPreview": " matches", + "totalResponseSizeBytes": 70 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 74 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 12, + "deltaPreview": " expectation", + "totalResponseSizeBytes": 86 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 87 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 3, + "deltaPreview": " It", + "totalResponseSizeBytes": 90 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 7, + "deltaPreview": " covers", + "totalResponseSizeBytes": 97 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " all", + "totalResponseSizeBytes": 101 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " key", + "totalResponseSizeBytes": 105 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 9, + "deltaPreview": " features", + "totalResponseSizeBytes": 114 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": ":", + "totalResponseSizeBytes": 115 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 11, + "deltaPreview": " repository", + "totalResponseSizeBytes": 126 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 9, + "deltaPreview": " analysis", + "totalResponseSizeBytes": 135 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 136 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 12, + "deltaPreview": " instruction", + "totalResponseSizeBytes": 148 + } + }, + { + "timestampMs": 1770183500828, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 11, + "deltaPreview": " generation", + "totalResponseSizeBytes": 159 + } + }, + { + "timestampMs": 1770183500829, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 160 + } + }, + { + "timestampMs": 1770183501044, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 7, + "deltaPreview": " config", + "totalResponseSizeBytes": 167 + } + }, + { + "timestampMs": 1770183501044, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 11, + "deltaPreview": " generation", + "totalResponseSizeBytes": 178 + } + }, + { + "timestampMs": 1770183501044, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 179 + } + }, + { + "timestampMs": 1770183501044, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " Git", + "totalResponseSizeBytes": 183 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 3, + "deltaPreview": "Hub", + "totalResponseSizeBytes": 186 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 11, + "deltaPreview": " automation", + "totalResponseSizeBytes": 197 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 198 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 202 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 11, + "deltaPreview": " evaluation", + "totalResponseSizeBytes": 213 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 10, + "deltaPreview": " framework", + "totalResponseSizeBytes": 223 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 224 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 9, + "deltaPreview": " Response", + "totalResponseSizeBytes": 233 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": " A", + "totalResponseSizeBytes": 235 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 3, + "deltaPreview": " is", + "totalResponseSizeBytes": 238 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 5, + "deltaPreview": " also", + "totalResponseSizeBytes": 243 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 9, + "deltaPreview": " accurate", + "totalResponseSizeBytes": 252 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " but", + "totalResponseSizeBytes": 256 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 3, + "deltaPreview": " om", + "totalResponseSizeBytes": 259 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 3, + "deltaPreview": "its", + "totalResponseSizeBytes": 262 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 9, + "deltaPreview": " explicit", + "totalResponseSizeBytes": 271 + } + }, + { + "timestampMs": 1770183501045, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 8, + "deltaPreview": " mention", + "totalResponseSizeBytes": 279 + } + }, + { + "timestampMs": 1770183501168, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 3, + "deltaPreview": " of", + "totalResponseSizeBytes": 282 + } + }, + { + "timestampMs": 1770183501168, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 286 + } + }, + { + "timestampMs": 1770183501168, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 11, + "deltaPreview": " evaluation", + "totalResponseSizeBytes": 297 + } + }, + { + "timestampMs": 1770183501168, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 10, + "deltaPreview": " framework", + "totalResponseSizeBytes": 307 + } + }, + { + "timestampMs": 1770183501169, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 311 + } + }, + { + "timestampMs": 1770183501169, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 10, + "deltaPreview": " readiness", + "totalResponseSizeBytes": 321 + } + }, + { + "timestampMs": 1770183501169, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 8, + "deltaPreview": " reports", + "totalResponseSizeBytes": 329 + } + }, + { + "timestampMs": 1770183501169, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 330 + } + }, + { + "timestampMs": 1770183501169, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 6, + "deltaPreview": " which", + "totalResponseSizeBytes": 336 + } + }, + { + "timestampMs": 1770183501169, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " are", + "totalResponseSizeBytes": 340 + } + }, + { + "timestampMs": 1770183501169, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 8, + "deltaPreview": " present", + "totalResponseSizeBytes": 348 + } + }, + { + "timestampMs": 1770183501170, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 3, + "deltaPreview": " in", + "totalResponseSizeBytes": 351 + } + }, + { + "timestampMs": 1770183501171, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 355 + } + }, + { + "timestampMs": 1770183501171, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 12, + "deltaPreview": " expectation", + "totalResponseSizeBytes": 367 + } + }, + { + "timestampMs": 1770183501171, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 2, + "deltaPreview": ".\"", + "totalResponseSizeBytes": 369 + } + }, + { + "timestampMs": 1770183501171, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "deltaChars": 1, + "deltaPreview": "}", + "totalResponseSizeBytes": 370 + } + }, + { + "timestampMs": 1770183501171, + "phase": "judge", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 10133, + "outputTokens": 75, + "cacheReadTokens": 0, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 1563, + "initiator": "user", + "apiCallId": "chatcmpl-D5PshX1lJ8uHcLqAdNFcoSYvs6GF2", + "providerCallId": "EEC8:177A35:702AFF:841E35:6982DB4B", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770183501171, + "phase": "judge", + "type": "assistant.message", + "data": { + "messageId": "63ed28dc-2e03-4578-a990-c89be4fcb0f7", + "content": "{\"verdict\": \"pass\", \"score\": 95, \"rationale\": \"Response B best matches the expectation. It covers all key features: repository analysis, instruction generation, config generation, GitHub automation, and evaluation framework. Response A is also accurate but omits explicit mention of the evaluation framework and readiness reports, which are present in the expectation.\"}", + "toolRequests": [] + } + }, + { + "timestampMs": 1770183501171, + "phase": "judge", + "type": "assistant.turn_end", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770183501171, + "phase": "judge", + "type": "session.idle", + "data": {} + } + ] + }, + { + "id": "case-2", + "prompt": "How do you run the Primer CLI locally to analyze a repository and generate VS Code settings?", + "expectation": "To analyze a repository, run `npx tsx src/index.ts analyze [path] --json`. To generate VS Code settings, run `npx tsx src/index.ts generate vscode [path] [--force]`.", + "withInstructions": "To run the Primer CLI locally for analyzing a repository and generating VS Code settings, use these commands:\n\n1. Analyze a repository: \n `npx tsx src/index.ts analyze [path] --json`\n\n2. Generate VS Code settings: \n `npx tsx src/index.ts generate vscode [path] [--force]`\n\nReplace `[path]` with your target repo path. No build step is required; just run these commands from the project root.", + "withoutInstructions": "To run the Primer CLI locally for analyzing a repository and generating VS Code settings, use these commands:\n\n1. Analyze the repository:\n ```\n npx tsx src/index.ts analyze [path] --json\n ```\n2. Generate VS Code settings:\n ```\n npx tsx src/index.ts generate vscode [path] [--force]\n ```\nReplace `[path]` with your target repository path. Use `--force` to overwrite existing settings if needed.", + "verdict": "pass", + "score": 100, + "rationale": "Both responses accurately match the expectation by providing the correct commands for analyzing a repository and generating VS Code settings. Response B is slightly better as it adds the helpful clarification that no build step is required and to run the commands from the project root, which aligns with the custom instructions. Therefore, Response B best matches the expectation.", + "metrics": { + "withoutInstructions": { + "durationMs": 3289, + "tokenUsage": { + "promptTokens": 12603, + "completionTokens": 97, + "totalTokens": 12700 + }, + "toolCalls": { + "count": 1, + "byName": { + "fetch_copilot_cli_documentation": 1 + }, + "totalDurationMs": 0 + } + }, + "withInstructions": { + "durationMs": 2813, + "tokenUsage": { + "promptTokens": 13421, + "completionTokens": 97, + "totalTokens": 13518 + }, + "toolCalls": { + "count": 1, + "byName": { + "fetch_copilot_cli_documentation": 1 + }, + "totalDurationMs": 0 + } + }, + "judge": { + "durationMs": 1822, + "tokenUsage": { + "promptTokens": 10112, + "completionTokens": 84, + "totalTokens": 10196 + }, + "toolCalls": { + "count": 0, + "byName": {}, + "totalDurationMs": 0 + } + }, + "totalDurationMs": 7977 + }, + "trajectory": [ + { + "timestampMs": 1770183501190, + "phase": "withoutInstructions", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770183501190, + "phase": "withoutInstructions", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770183501848, + "phase": "withoutInstructions", + "type": "user.message", + "data": { + "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nHow do you run the Primer CLI locally to analyze a repository and generate VS Code settings?", + "transformedContent": "2026-02-04T05:38:21.819Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nHow do you run the Primer CLI locally to analyze a repository and generate VS Code settings?", + "attachments": [] + } + }, + { + "timestampMs": 1770183501848, + "phase": "withoutInstructions", + "type": "assistant.turn_start", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770183501848, + "phase": "withoutInstructions", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 10493, + "messagesLength": 2 + } + }, + { + "timestampMs": 1770183502957, + "phase": "withoutInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 9860, + "outputTokens": 15, + "cacheReadTokens": 0, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 1109, + "initiator": "user", + "apiCallId": "chatcmpl-D5PskDSy8z6soSsOeNEg4kCMPiYc1", + "providerCallId": "EEC8:177A35:70323F:8426B5:6982DB4D", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770183502957, + "phase": "withoutInstructions", + "type": "assistant.message", + "data": { + "messageId": "93cbbe16-a12a-41e9-a269-5c3bca6a6455", + "content": "", + "toolRequests": [ + { + "toolCallId": "call_7q4HHCZijMSTe83IliMRnQZz", + "name": "fetch_copilot_cli_documentation", + "arguments": {}, + "type": "function" + } + ] + } + }, + { + "timestampMs": 1770183502957, + "phase": "withoutInstructions", + "type": "tool.execution_start", + "data": { + "toolCallId": "call_7q4HHCZijMSTe83IliMRnQZz", + "toolName": "fetch_copilot_cli_documentation", + "arguments": {} + } + }, + { + "timestampMs": 1770183502992, + "phase": "withoutInstructions", + "type": "tool.execution_complete", + "data": { + "toolCallId": "call_7q4HHCZijMSTe83IliMRnQZz", + "success": true, + "result": { + "content": "# GitHub Copilot CLI Documentation\n\n## README\n# GitHub Copilot CLI (Public Preview)\n\nThe power of GitHub Copilot, now in your terminal.\n\nGitHub Copilot CLI brings AI-powered coding assistance directly to your command line, enabling you to build, debug, and understand code through natural language conversations. Powered by the same agentic harness as GitHub's Copilot coding agent, it provides intelligent assistance while staying deeply integrated with your GitHub workflow.\n\nSee [our official documentation](https://docs.github.com/copilot/concepts/agents/about-copilot-cli) for more information.\n\n![Image of the splash screen for the Copilot CLI](https://github.com/user-attachments/assets/f40aa23d-09dd-499e-9457-1d57d3368887)\n\n\n## 🚀 Introduction and Overview\n\nWe're bringing the power of GitHub Copilot coding agent directly to your terminal. With GitHub Copilot CLI, you can work locally and synchronously with an AI agent that understands your code and GitHub context.\n\n- **Terminal-native development:** Work with Copilot coding agent directly in your command line — no context switching required.\n- **GitHub integration out of the box:** Access your repositories, issues, and pull requests using natural language, all authenticated with your existing GitHub account.\n- **Agentic capabilities:** Build, edit, debug, and refactor code with an AI collaborator that can plan and execute complex tasks.\n- **MCP-powered extensibility:** Take advantage of the fact that the coding agent ships with GitHub's MCP server by default and supports custom MCP servers to extend capabilities.\n- **Full control:** Preview every action before execution — nothing happens without your explicit approval.\n\nWe're still early in our journey, but with your feedback, we're rapidly iterating to make the GitHub Copilot CLI the best possible companion in your terminal.\n\n## 📦 Getting Started\n\n### Supported Platforms\n\n- **Linux**\n- **macOS**\n- **Windows**\n\n### Prerequisites\n\n- (On Windows) **PowerShell** v6 or …", + "detailedContent": "Fetched CLI documentation" + }, + "toolTelemetry": {} + } + }, + { + "timestampMs": 1770183502992, + "phase": "withoutInstructions", + "type": "assistant.turn_end", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770183502992, + "phase": "withoutInstructions", + "type": "assistant.turn_start", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770183502992, + "phase": "withoutInstructions", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 13227, + "messagesLength": 4 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": "To", + "totalResponseSizeBytes": 2 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " run", + "totalResponseSizeBytes": 6 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 10 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 7, + "deltaPreview": " Primer", + "totalResponseSizeBytes": 17 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 21 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 8, + "deltaPreview": " locally", + "totalResponseSizeBytes": 29 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 33 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 10, + "deltaPreview": " analyzing", + "totalResponseSizeBytes": 43 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " a", + "totalResponseSizeBytes": 45 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 11, + "deltaPreview": " repository", + "totalResponseSizeBytes": 56 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 60 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 11, + "deltaPreview": " generating", + "totalResponseSizeBytes": 71 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": " VS", + "totalResponseSizeBytes": 74 + } + }, + { + "timestampMs": 1770183504069, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": " Code", + "totalResponseSizeBytes": 79 + } + }, + { + "timestampMs": 1770183504070, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 9, + "deltaPreview": " settings", + "totalResponseSizeBytes": 88 + } + }, + { + "timestampMs": 1770183504070, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 89 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " use", + "totalResponseSizeBytes": 93 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 6, + "deltaPreview": " these", + "totalResponseSizeBytes": 99 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 108 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": ":\n\n", + "totalResponseSizeBytes": 111 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "1", + "totalResponseSizeBytes": 112 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 113 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 8, + "deltaPreview": " Analyze", + "totalResponseSizeBytes": 121 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 125 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 11, + "deltaPreview": " repository", + "totalResponseSizeBytes": 136 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": ":\n", + "totalResponseSizeBytes": 138 + } + }, + { + "timestampMs": 1770183504177, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " ", + "totalResponseSizeBytes": 140 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": " ```\n", + "totalResponseSizeBytes": 145 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " ", + "totalResponseSizeBytes": 147 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " n", + "totalResponseSizeBytes": 149 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": "px", + "totalResponseSizeBytes": 151 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": " ts", + "totalResponseSizeBytes": 154 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "x", + "totalResponseSizeBytes": 155 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 159 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 6, + "deltaPreview": "/index", + "totalResponseSizeBytes": 165 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 168 + } + }, + { + "timestampMs": 1770183504178, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 8, + "deltaPreview": " analyze", + "totalResponseSizeBytes": 176 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " [", + "totalResponseSizeBytes": 178 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": "path", + "totalResponseSizeBytes": 182 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "]", + "totalResponseSizeBytes": 183 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": " --", + "totalResponseSizeBytes": 186 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": "json", + "totalResponseSizeBytes": 190 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "\n", + "totalResponseSizeBytes": 191 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " ", + "totalResponseSizeBytes": 193 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": " ```\n", + "totalResponseSizeBytes": 198 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "2", + "totalResponseSizeBytes": 199 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 200 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 9, + "deltaPreview": " Generate", + "totalResponseSizeBytes": 209 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": " VS", + "totalResponseSizeBytes": 212 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": " Code", + "totalResponseSizeBytes": 217 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 9, + "deltaPreview": " settings", + "totalResponseSizeBytes": 226 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": ":\n", + "totalResponseSizeBytes": 228 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " ", + "totalResponseSizeBytes": 230 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": " ```\n", + "totalResponseSizeBytes": 235 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " ", + "totalResponseSizeBytes": 237 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " n", + "totalResponseSizeBytes": 239 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": "px", + "totalResponseSizeBytes": 241 + } + }, + { + "timestampMs": 1770183504265, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": " ts", + "totalResponseSizeBytes": 244 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "x", + "totalResponseSizeBytes": 245 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 249 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 6, + "deltaPreview": "/index", + "totalResponseSizeBytes": 255 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 258 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 9, + "deltaPreview": " generate", + "totalResponseSizeBytes": 267 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 7, + "deltaPreview": " vscode", + "totalResponseSizeBytes": 274 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " [", + "totalResponseSizeBytes": 276 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": "path", + "totalResponseSizeBytes": 280 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "]", + "totalResponseSizeBytes": 281 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " [", + "totalResponseSizeBytes": 283 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": "--", + "totalResponseSizeBytes": 285 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": "force", + "totalResponseSizeBytes": 290 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": "]\n", + "totalResponseSizeBytes": 292 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " ", + "totalResponseSizeBytes": 294 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": " ```\n", + "totalResponseSizeBytes": 299 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 7, + "deltaPreview": "Replace", + "totalResponseSizeBytes": 306 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": " `[", + "totalResponseSizeBytes": 309 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": "path", + "totalResponseSizeBytes": 313 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "]", + "totalResponseSizeBytes": 314 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "`", + "totalResponseSizeBytes": 315 + } + }, + { + "timestampMs": 1770183504369, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": " with", + "totalResponseSizeBytes": 320 + } + }, + { + "timestampMs": 1770183504473, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": " your", + "totalResponseSizeBytes": 325 + } + }, + { + "timestampMs": 1770183504473, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 7, + "deltaPreview": " target", + "totalResponseSizeBytes": 332 + } + }, + { + "timestampMs": 1770183504473, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 11, + "deltaPreview": " repository", + "totalResponseSizeBytes": 343 + } + }, + { + "timestampMs": 1770183504473, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": " path", + "totalResponseSizeBytes": 348 + } + }, + { + "timestampMs": 1770183504473, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 349 + } + }, + { + "timestampMs": 1770183504473, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 4, + "deltaPreview": " Use", + "totalResponseSizeBytes": 353 + } + }, + { + "timestampMs": 1770183504474, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 355 + } + }, + { + "timestampMs": 1770183504476, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 2, + "deltaPreview": "--", + "totalResponseSizeBytes": 357 + } + }, + { + "timestampMs": 1770183504476, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 5, + "deltaPreview": "force", + "totalResponseSizeBytes": 362 + } + }, + { + "timestampMs": 1770183504476, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": "`", + "totalResponseSizeBytes": 363 + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": " to", + "totalResponseSizeBytes": 366 + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 10, + "deltaPreview": " overwrite", + "totalResponseSizeBytes": 376 + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 9, + "deltaPreview": " existing", + "totalResponseSizeBytes": 385 + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 9, + "deltaPreview": " settings", + "totalResponseSizeBytes": 394 + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 3, + "deltaPreview": " if", + "totalResponseSizeBytes": 397 + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 7, + "deltaPreview": " needed", + "totalResponseSizeBytes": 404 + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 405 + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 12603, + "outputTokens": 97, + "cacheReadTokens": 0, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 1485, + "initiator": "agent", + "apiCallId": "chatcmpl-D5PslwGlMdwLwAwIjbdM5V2PFX51e", + "providerCallId": "EEC8:177A35:7035BF:842AC1:6982DB4E", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.message", + "data": { + "messageId": "71562cd7-39d4-4150-958f-85a1103bd207", + "content": "To run the Primer CLI locally for analyzing a repository and generating VS Code settings, use these commands:\n\n1. Analyze the repository:\n ```\n npx tsx src/index.ts analyze [path] --json\n ```\n2. Generate VS Code settings:\n ```\n npx tsx src/index.ts generate vscode [path] [--force]\n ```\nReplace `[path]` with your target repository path. Use `--force` to overwrite existing settings if needed.", + "toolRequests": [] + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "assistant.turn_end", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770183504477, + "phase": "withoutInstructions", + "type": "session.idle", + "data": {} + }, + { + "timestampMs": 1770183504497, + "phase": "withInstructions", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770183504497, + "phase": "withInstructions", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770183505272, + "phase": "withInstructions", + "type": "user.message", + "data": { + "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nHow do you run the Primer CLI locally to analyze a repository and generate VS Code settings?", + "transformedContent": "2026-02-04T05:38:25.233Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nHow do you run the Primer CLI locally to analyze a repository and generate VS Code settings?", + "attachments": [] + } + }, + { + "timestampMs": 1770183505273, + "phase": "withInstructions", + "type": "assistant.turn_start", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770183505273, + "phase": "withInstructions", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 11311, + "messagesLength": 2 + } + }, + { + "timestampMs": 1770183506112, + "phase": "withInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 10678, + "outputTokens": 15, + "cacheReadTokens": 0, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 841, + "initiator": "user", + "apiCallId": "chatcmpl-D5PsnRJnzbxrkVCDQzbfX3uuuTCcM", + "providerCallId": "EEC8:177A35:703D58:843385:6982DB51", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } + } + }, + { + "timestampMs": 1770183506112, + "phase": "withInstructions", + "type": "assistant.message", + "data": { + "messageId": "aefbbfd1-5f3c-46db-829d-c501d0cd854e", + "content": "", + "toolRequests": [ + { + "toolCallId": "call_HxAKzUsg4mVPC0yQGgxXcbxz", + "name": "fetch_copilot_cli_documentation", + "arguments": {}, + "type": "function" + } + ] + } + }, + { + "timestampMs": 1770183506112, + "phase": "withInstructions", + "type": "tool.execution_start", + "data": { + "toolCallId": "call_HxAKzUsg4mVPC0yQGgxXcbxz", + "toolName": "fetch_copilot_cli_documentation", + "arguments": {} + } + }, + { + "timestampMs": 1770183506145, + "phase": "withInstructions", + "type": "tool.execution_complete", + "data": { + "toolCallId": "call_HxAKzUsg4mVPC0yQGgxXcbxz", + "success": true, + "result": { + "content": "# GitHub Copilot CLI Documentation\n\n## README\n# GitHub Copilot CLI (Public Preview)\n\nThe power of GitHub Copilot, now in your terminal.\n\nGitHub Copilot CLI brings AI-powered coding assistance directly to your command line, enabling you to build, debug, and understand code through natural language conversations. Powered by the same agentic harness as GitHub's Copilot coding agent, it provides intelligent assistance while staying deeply integrated with your GitHub workflow.\n\nSee [our official documentation](https://docs.github.com/copilot/concepts/agents/about-copilot-cli) for more information.\n\n![Image of the splash screen for the Copilot CLI](https://github.com/user-attachments/assets/f40aa23d-09dd-499e-9457-1d57d3368887)\n\n\n## 🚀 Introduction and Overview\n\nWe're bringing the power of GitHub Copilot coding agent directly to your terminal. With GitHub Copilot CLI, you can work locally and synchronously with an AI agent that understands your code and GitHub context.\n\n- **Terminal-native development:** Work with Copilot coding agent directly in your command line — no context switching required.\n- **GitHub integration out of the box:** Access your repositories, issues, and pull requests using natural language, all authenticated with your existing GitHub account.\n- **Agentic capabilities:** Build, edit, debug, and refactor code with an AI collaborator that can plan and execute complex tasks.\n- **MCP-powered extensibility:** Take advantage of the fact that the coding agent ships with GitHub's MCP server by default and supports custom MCP servers to extend capabilities.\n- **Full control:** Preview every action before execution — nothing happens without your explicit approval.\n\nWe're still early in our journey, but with your feedback, we're rapidly iterating to make the GitHub Copilot CLI the best possible companion in your terminal.\n\n## 📦 Getting Started\n\n### Supported Platforms\n\n- **Linux**\n- **macOS**\n- **Windows**\n\n### Prerequisites\n\n- (On Windows) **PowerShell** v6 or …", + "detailedContent": "Fetched CLI documentation" + }, + "toolTelemetry": {} + } + }, + { + "timestampMs": 1770183506145, + "phase": "withInstructions", + "type": "assistant.turn_end", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770183506145, + "phase": "withInstructions", + "type": "assistant.turn_start", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770183506145, + "phase": "withInstructions", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 14045, + "messagesLength": 4 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": "To", + "totalResponseSizeBytes": 2 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " run", + "totalResponseSizeBytes": 6 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 10 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 7, + "deltaPreview": " Primer", + "totalResponseSizeBytes": 17 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 21 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 8, + "deltaPreview": " locally", + "totalResponseSizeBytes": 29 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 33 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 10, + "deltaPreview": " analyzing", + "totalResponseSizeBytes": 43 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": " a", + "totalResponseSizeBytes": 45 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 11, + "deltaPreview": " repository", + "totalResponseSizeBytes": 56 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 60 + } + }, + { + "timestampMs": 1770183506986, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 11, + "deltaPreview": " generating", + "totalResponseSizeBytes": 71 + } + }, + { + "timestampMs": 1770183506987, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " VS", + "totalResponseSizeBytes": 74 + } + }, + { + "timestampMs": 1770183506987, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " Code", + "totalResponseSizeBytes": 79 + } + }, + { + "timestampMs": 1770183506987, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 9, + "deltaPreview": " settings", + "totalResponseSizeBytes": 88 + } + }, + { + "timestampMs": 1770183506987, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 89 + } + }, + { + "timestampMs": 1770183507005, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " use", + "totalResponseSizeBytes": 93 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 6, + "deltaPreview": " these", + "totalResponseSizeBytes": 99 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 108 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": ":\n\n", + "totalResponseSizeBytes": 111 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "1", + "totalResponseSizeBytes": 112 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 113 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 8, + "deltaPreview": " Analyze", + "totalResponseSizeBytes": 121 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": " a", + "totalResponseSizeBytes": 123 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 11, + "deltaPreview": " repository", + "totalResponseSizeBytes": 134 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": ":", + "totalResponseSizeBytes": 135 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " \n", + "totalResponseSizeBytes": 138 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": " ", + "totalResponseSizeBytes": 140 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 142 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "n", + "totalResponseSizeBytes": 143 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": "px", + "totalResponseSizeBytes": 145 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " ts", + "totalResponseSizeBytes": 148 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "x", + "totalResponseSizeBytes": 149 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 153 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 6, + "deltaPreview": "/index", + "totalResponseSizeBytes": 159 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 162 + } + }, + { + "timestampMs": 1770183507006, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 8, + "deltaPreview": " analyze", + "totalResponseSizeBytes": 170 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": " [", + "totalResponseSizeBytes": 172 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": "path", + "totalResponseSizeBytes": 176 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "]", + "totalResponseSizeBytes": 177 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " --", + "totalResponseSizeBytes": 180 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": "json", + "totalResponseSizeBytes": 184 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": "`\n\n", + "totalResponseSizeBytes": 187 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "2", + "totalResponseSizeBytes": 188 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 189 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 9, + "deltaPreview": " Generate", + "totalResponseSizeBytes": 198 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " VS", + "totalResponseSizeBytes": 201 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " Code", + "totalResponseSizeBytes": 206 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 9, + "deltaPreview": " settings", + "totalResponseSizeBytes": 215 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": ":", + "totalResponseSizeBytes": 216 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " \n", + "totalResponseSizeBytes": 219 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": " ", + "totalResponseSizeBytes": 221 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": " `", + "totalResponseSizeBytes": 223 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "n", + "totalResponseSizeBytes": 224 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": "px", + "totalResponseSizeBytes": 226 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " ts", + "totalResponseSizeBytes": 229 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "x", + "totalResponseSizeBytes": 230 + } + }, + { + "timestampMs": 1770183507079, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 234 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 6, + "deltaPreview": "/index", + "totalResponseSizeBytes": 240 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": ".ts", + "totalResponseSizeBytes": 243 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 9, + "deltaPreview": " generate", + "totalResponseSizeBytes": 252 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 7, + "deltaPreview": " vscode", + "totalResponseSizeBytes": 259 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": " [", + "totalResponseSizeBytes": 261 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": "path", + "totalResponseSizeBytes": 265 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "]", + "totalResponseSizeBytes": 266 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": " [", + "totalResponseSizeBytes": 268 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 2, + "deltaPreview": "--", + "totalResponseSizeBytes": 270 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": "force", + "totalResponseSizeBytes": 275 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "]", + "totalResponseSizeBytes": 276 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": "`\n\n", + "totalResponseSizeBytes": 279 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 7, + "deltaPreview": "Replace", + "totalResponseSizeBytes": 286 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " `[", + "totalResponseSizeBytes": 289 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": "path", + "totalResponseSizeBytes": 293 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "]", + "totalResponseSizeBytes": 294 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": "`", + "totalResponseSizeBytes": 295 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " with", + "totalResponseSizeBytes": 300 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " your", + "totalResponseSizeBytes": 305 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 7, + "deltaPreview": " target", + "totalResponseSizeBytes": 312 + } + }, + { + "timestampMs": 1770183507205, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " repo", + "totalResponseSizeBytes": 317 + } + }, + { + "timestampMs": 1770183507303, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " path", + "totalResponseSizeBytes": 322 + } + }, + { + "timestampMs": 1770183507303, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 323 + } + }, + { + "timestampMs": 1770183507303, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " No", + "totalResponseSizeBytes": 326 + } + }, + { + "timestampMs": 1770183507303, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 6, + "deltaPreview": " build", + "totalResponseSizeBytes": 332 + } + }, + { + "timestampMs": 1770183507306, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " step", + "totalResponseSizeBytes": 337 + } + }, + { + "timestampMs": 1770183507306, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 3, + "deltaPreview": " is", + "totalResponseSizeBytes": 340 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 9, + "deltaPreview": " required", + "totalResponseSizeBytes": 349 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": ";", + "totalResponseSizeBytes": 350 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " just", + "totalResponseSizeBytes": 355 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " run", + "totalResponseSizeBytes": 359 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 6, + "deltaPreview": " these", + "totalResponseSizeBytes": 365 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 374 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " from", + "totalResponseSizeBytes": 379 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 383 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 8, + "deltaPreview": " project", + "totalResponseSizeBytes": 391 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 5, + "deltaPreview": " root", + "totalResponseSizeBytes": 396 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message_delta", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 397 + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 13421, + "outputTokens": 97, + "cacheReadTokens": 9984, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 1162, + "initiator": "agent", + "apiCallId": "chatcmpl-D5PsoAis5ridP3QySXsYxVOmPqLUs", + "providerCallId": "EEC8:177A35:70406D:843703:6982DB52", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, "premium_interactions": { "isUnlimitedEntitlement": true, "entitlementRequests": -1, @@ -2082,150 +6307,1001 @@ "remainingPercentage": 100, "resetDate": "2026-03-01T00:00:00.000Z" } - }, - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg" + } + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.message", + "data": { + "messageId": "e44fb711-6d6c-4ced-9a41-0b60a05854fb", + "content": "To run the Primer CLI locally for analyzing a repository and generating VS Code settings, use these commands:\n\n1. Analyze a repository: \n `npx tsx src/index.ts analyze [path] --json`\n\n2. Generate VS Code settings: \n `npx tsx src/index.ts generate vscode [path] [--force]`\n\nReplace `[path]` with your target repo path. No build step is required; just run these commands from the project root.", + "toolRequests": [] + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "assistant.turn_end", + "data": { + "turnId": "1" + } + }, + { + "timestampMs": 1770183507307, + "phase": "withInstructions", + "type": "session.idle", + "data": {} + }, + { + "timestampMs": 1770183507328, + "phase": "judge", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770183507328, + "phase": "judge", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770183507951, + "phase": "judge", + "type": "user.message", + "data": { + "content": "Evaluate which response best matches the expectation.\n\nExpectation: To analyze a repository, run `npx tsx src/index.ts analyze [path] --json`. To generate VS Code settings, run `npx tsx src/index.ts generate vscode [path] [--force]`.\n\nResponse A (without custom instructions):\nTo run the Primer CLI locally for analyzing a repository and generating VS Code settings, use these commands:\n\n1. Analyze the repository:\n ```\n npx tsx src/index.ts analyze [path] --json\n ```\n2. Generate VS Code settings:\n ```\n npx tsx src/index.ts generate vscode [path] [--force]\n ```\nReplace `[path]` with your target repository path. Use `--force` to overwrite existing settings if needed.\n\nResponse B (with custom instructions):\nTo run the Primer CLI locally for analyzing a repository and generating VS Code settings, use these commands:\n\n1. Analyze a repository: \n `npx tsx src/index.ts analyze [path] --json`\n\n2. Generate VS Code settings: \n `npx tsx src/index.ts generate vscode [path] [--force]`\n\nReplace `[path]` with your target repo path. No build step is required; just run these commands from the project root.\n\nReturn JSON only.", + "transformedContent": "2026-02-04T05:38:27.927Z\n\nEvaluate which response best matches the expectation.\n\nExpectation: To analyze a repository, run `npx tsx src/index.ts analyze [path] --json`. To generate VS Code settings, run `npx tsx src/index.ts generate vscode [path] [--force]`.\n\nResponse A (without custom instructions):\nTo run the Primer CLI locally for analyzing a repository and generating VS Code settings, use these commands:\n\n1. Analyze the repository:\n ```\n npx tsx src/index.ts analyze [path] --json\n ```\n2. Generate VS Code settings:\n ```\n npx tsx src/index.ts generate vscode [path] [--force]\n ```\nReplace `[path]` with your target repository path. Use `--force` to overwrite existing settings if needed.\n\nResponse B (with custom instructions):\nTo run the Primer CLI locally for analyzing a repository and generating VS Code settings, use these commands:\n\n1. Analyze a repository: \n `npx tsx src/index.ts analyze [path] --json`\n\n2. Generate VS Code settings: \n `npx tsx src/index.ts generate vscode [path] [--force]`\n\nReplace `[path]` with your target repo path. No build step is required; just run these commands from the project root.\n\nReturn JSON only.", + "attachments": [] + } + }, + { + "timestampMs": 1770183507951, + "phase": "judge", + "type": "assistant.turn_start", + "data": { + "turnId": "0" + } + }, + { + "timestampMs": 1770183507951, + "phase": "judge", + "type": "session.usage_info", + "data": { + "tokenLimit": 64000, + "currentTokens": 10745, + "messagesLength": 2 + } + }, + { + "timestampMs": 1770183508787, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": "{\"", + "totalResponseSizeBytes": 2 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": "ver", + "totalResponseSizeBytes": 5 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": "dict", + "totalResponseSizeBytes": 9 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 11 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 13 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": "pass", + "totalResponseSizeBytes": 17 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": "\",", + "totalResponseSizeBytes": 19 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 21 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 5, + "deltaPreview": "score", + "totalResponseSizeBytes": 26 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 28 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 1, + "deltaPreview": " ", + "totalResponseSizeBytes": 29 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": "100", + "totalResponseSizeBytes": 32 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 33 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 35 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 1, + "deltaPreview": "r", + "totalResponseSizeBytes": 36 + } + }, + { + "timestampMs": 1770183508788, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 8, + "deltaPreview": "ationale", + "totalResponseSizeBytes": 44 + } + }, + { + "timestampMs": 1770183508897, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 46 + } + }, + { + "timestampMs": 1770183508897, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 48 + } + }, + { + "timestampMs": 1770183508897, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": "Both", + "totalResponseSizeBytes": 52 + } + }, + { + "timestampMs": 1770183508897, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 10, + "deltaPreview": " responses", + "totalResponseSizeBytes": 62 + } + }, + { + "timestampMs": 1770183508899, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 11, + "deltaPreview": " accurately", + "totalResponseSizeBytes": 73 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 6, + "deltaPreview": " match", + "totalResponseSizeBytes": 79 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 83 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 12, + "deltaPreview": " expectation", + "totalResponseSizeBytes": 95 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": " by", + "totalResponseSizeBytes": 98 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 10, + "deltaPreview": " providing", + "totalResponseSizeBytes": 108 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 112 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 8, + "deltaPreview": " correct", + "totalResponseSizeBytes": 120 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 129 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 133 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 10, + "deltaPreview": " analyzing", + "totalResponseSizeBytes": 143 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": " a", + "totalResponseSizeBytes": 145 + } + }, + { + "timestampMs": 1770183508900, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 11, + "deltaPreview": " repository", + "totalResponseSizeBytes": 156 + } + }, + { + "timestampMs": 1770183508901, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 160 + } + }, + { + "timestampMs": 1770183508901, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 11, + "deltaPreview": " generating", + "totalResponseSizeBytes": 171 + } + }, + { + "timestampMs": 1770183508901, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": " VS", + "totalResponseSizeBytes": 174 + } + }, + { + "timestampMs": 1770183508901, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 5, + "deltaPreview": " Code", + "totalResponseSizeBytes": 179 + } + }, + { + "timestampMs": 1770183509008, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 9, + "deltaPreview": " settings", + "totalResponseSizeBytes": 188 + } + }, + { + "timestampMs": 1770183509008, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 189 + } + }, + { + "timestampMs": 1770183509008, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 9, + "deltaPreview": " Response", + "totalResponseSizeBytes": 198 + } + }, + { + "timestampMs": 1770183509008, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": " B", + "totalResponseSizeBytes": 200 + } + }, + { + "timestampMs": 1770183509008, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": " is", + "totalResponseSizeBytes": 203 + } + }, + { + "timestampMs": 1770183509008, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 9, + "deltaPreview": " slightly", + "totalResponseSizeBytes": 212 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 7, + "deltaPreview": " better", + "totalResponseSizeBytes": 219 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": " as", + "totalResponseSizeBytes": 222 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": " it", + "totalResponseSizeBytes": 225 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 5, + "deltaPreview": " adds", + "totalResponseSizeBytes": 230 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 234 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 8, + "deltaPreview": " helpful", + "totalResponseSizeBytes": 242 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 14, + "deltaPreview": " clarification", + "totalResponseSizeBytes": 256 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 5, + "deltaPreview": " that", + "totalResponseSizeBytes": 261 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": " no", + "totalResponseSizeBytes": 264 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 6, + "deltaPreview": " build", + "totalResponseSizeBytes": 270 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 5, + "deltaPreview": " step", + "totalResponseSizeBytes": 275 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": " is", + "totalResponseSizeBytes": 278 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 9, + "deltaPreview": " required", + "totalResponseSizeBytes": 287 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 291 + } + }, + { + "timestampMs": 1770183509009, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 3, + "deltaPreview": " to", + "totalResponseSizeBytes": 294 + } + }, + { + "timestampMs": 1770183509133, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " run", + "totalResponseSizeBytes": 298 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 302 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 311 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 5, + "deltaPreview": " from", + "totalResponseSizeBytes": 316 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 320 } }, { - "timestampMs": 1770182499225, - "phase": "withInstructions", - "type": "assistant.message", + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "messageId": "531da1e7-1e5a-4994-9b81-e88dc0c26449", - "content": "", - "toolRequests": [ - { - "toolCallId": "toolu_01JKTy3e1wKbgcDnacNd6zAL", - "name": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready" - }, - "type": "function" - }, - { - "toolCallId": "toolu_01Gthn6BZZUdvXEe7xij4AxH", - "name": "glob", - "arguments": { - "pattern": "*.{json,md,ts,js}" - }, - "type": "function" - }, - { - "toolCallId": "toolu_018NEuFLeYuySsA57e7ng8dF", - "name": "grep", - "arguments": { - "pattern": "^#!/usr/bin|bin|entry|command", - "glob": "**/*.json", - "output_mode": "content", - "head_limit": 20 - }, - "type": "function" - } - ], - "reasoningOpaque": "Sj+mHN97bEs0KKkaaMzdSj9k5udHmn9TDLgFxNHMmOtmohC5w2RTGHP0gkk4nzgjLjiZXFpqEYIjDphd6pRNYl1buJlL1qwzgHGnbBvaXutwQn3158THudxBZiWZIu5XbbJuQBEeDw6cJ4p/bScgmeFlDS8GmPB9GVxO/eppM8McfXoHTcpCGxNKkWcBsQqrGDd0cYMYEIr5MX2VI7oivTcgXQ8l6oSd8HzzNQakIx6zg95+Pp2BOLzmDX1kj4Yg50FU1P8UvsHJDuIZxfZNDHSrq4w05NGpDDhi/EU+L1gAhr50lhoBkL+/p4Pmf4J2JSdLWK9jhaMjoRIT0NNgLOkweDgdSw2RWIQ/IMxUOLPAmA9gO3vVOYHrOR44t0JREP/kKEbKIAppOnt+bdhNZlmLrTiz89Z8spefLgVO+vA2HiLtaMChRp3SLMEPfWuUPyCOATQIMLaKRBJdj7UPxxs8qxIthVYC3I/OwGx/lYDgn4iyiV3Jldl2eyTTVkQ9I4dX3vMNRX5IEaIqy+KmR/poWT/RdJIeZvE08lnZcAfonYmHk9Y4G0L+d+1NnGsbkZNwDdbWtMgbE1rCeto9mL8F75j7sSDSQ/kbdmSBJB33Pp4Z9LM3mjdIIvdTpoXU4vKj+3tJJkDtW7Wzuk3wp0EWYdPU8g12huU5QA0I1t6UFbKt14NKAmNCvPDCv8BYjEONsvBgWCnjGuTzMZp9D/bFOrGaTT4RVZyO7+krVObs8ONJFeCVTkkMf9KhTrJXGcNxJf73J0JYRaZTp6ZtARjLL5uXOxQUz5mx0qwJYw3GnRctYmooc7WjFUFyHYarl9UVvfg0BrT10n4GWaZZbFWy4YKy0hrPc+yeq7uDM67b2686inCqmiTXXrtoXSchfbz65BYo9sONjRY+WA/ZZCYYeahImPej6UXy55R4pZmKlxGhWqg19RyzfJF5AUbIuK3fsKy3lGO35z328K+XhvKmgv5nUngBW6YVBk4vaqk9Qhq89xp7olwHK07SS+iNNMd+t8Mm9ljBWpzJy7JY+uDllcskjLnDlG14tmlCa69txWFpjHa9uugn0ZwZLWYCE1lRGb7BMT5MPXWr862a+AW+YYuANtYjKMOOh1g7dW9+5GbVO2+LUEbHkAlaUd4vXIpc6XyGl2rX767xFgmkpZKRg3yUPL16sUtdvDC2qowSsusAJwOV+rf5a05eQnA4h+hcpEA2SdXf3ZNk0RVKS7Pabbbvf2zCuIVEHS0Eh8yhqNsgKHO7A2Y9MTXgwYBf5+30oCi1bM1RjfAaBJ3b4jnPp1tRuMQ4dBZYGgjA0MGsA5FJX+X1WTgC1IKfB/LEHIqLBrqeuzanVvb1CHt0ROnf+UOCE6aQlOmi6SwNdw0bBAwjr/77WKbKZuOmlUFRhS/pACRz5qfZQxD37OF3PiwrqNlHjuWQxG6b2+VmH0sfe68qOnwWuZPijybKks8YWr5efUuNWEWTdUkrWC+y96Uh83ApY50iPhd3+qymzZvPI4BWa7LrLMSVMBT3tlgihTxTT3r2OZcOTRI7J/Ar49MNob7XDzJzIg==", - "reasoningText": "The user wants me to:\n1. Summarize what the application does\n2. List the main entrypoints\n3. List main CLI commands or programmatic entrypoints if present\n4. Be concise\n\nI should start by exploring the codebase structure to understand what this app does. Let me look at:\n1. The root directory structure\n2. Package.json or similar config files to understand what it is\n3. Main entry files\n4. README or documentation\n\nLet me start with viewing the root directory and searching for key files in parallel." + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 8, + "deltaPreview": " project", + "totalResponseSizeBytes": 328 } }, { - "timestampMs": 1770182499225, - "phase": "withInstructions", - "type": "tool.execution_start", + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_01JKTy3e1wKbgcDnacNd6zAL", - "toolName": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready" - } + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 5, + "deltaPreview": " root", + "totalResponseSizeBytes": 333 } }, { - "timestampMs": 1770182499225, - "phase": "withInstructions", - "type": "tool.execution_start", + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_01Gthn6BZZUdvXEe7xij4AxH", - "toolName": "glob", - "arguments": { - "pattern": "*.{json,md,ts,js}" - } + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 334 } }, { - "timestampMs": 1770182499225, - "phase": "withInstructions", - "type": "tool.execution_start", + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_018NEuFLeYuySsA57e7ng8dF", - "toolName": "grep", - "arguments": { - "pattern": "^#!/usr/bin|bin|entry|command", - "glob": "**/*.json", - "output_mode": "content", - "head_limit": 20 - } + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 6, + "deltaPreview": " which", + "totalResponseSizeBytes": 340 } }, { - "timestampMs": 1770182499226, - "phase": "withInstructions", - "type": "tool.execution_complete", + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_01JKTy3e1wKbgcDnacNd6zAL", - "success": true, - "result": { - "content": ".DS_Store\n.git\n.github\n.gitignore\n.prettierrc.json\n.primer-cache\nCHANGELOG.md\nCODEOWNERS\nCONTRIBUTING.md\nLICENSE\nPLAN.md\nREADME.md\nSECURITY.md\ndist\neslint.config.js\neval-results.html\neval-results.json\nexamples\nnode_modules\npackage-lock.json\npackage.json\nprimer.eval.json\nprimer.png\nrelease-please-config.json\nrelease-please-manifest.json\nsrc\ntsconfig.json\nvitest.config.ts", - "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready b/Users/pierceboggan/Documents/get-ready\ncreate file mode 100644\nindex 0000000..0000000\n--- a/dev/null\n+++ b/Users/pierceboggan/Documents/get-ready\n@@ -1,0 +1,28 @@\n .DS_Store\n .git\n .github\n .gitignore\n .prettierrc.json\n .primer-cache\n CHANGELOG.md\n CODEOWNERS\n CONTRIBUTING.md\n LICENSE\n PLAN.md\n README.md\n SECURITY.md\n dist\n eslint.config.js\n eval-results.html\n eval-results.json\n examples\n node_modules\n package-lock.json\n package.json\n primer.eval.json\n primer.png\n release-please-config.json\n release-please-manifest.json\n src\n tsconfig.json\n vitest.config.ts\n" - } + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 7, + "deltaPreview": " aligns", + "totalResponseSizeBytes": 347 } }, { - "timestampMs": 1770182499238, - "phase": "withInstructions", - "type": "tool.execution_complete", + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_01Gthn6BZZUdvXEe7xij4AxH", - "success": true, - "result": { - "content": "./release-please-config.json\n./vitest.config.ts\n./src/services/git.ts\n./primer.eval.json\n./src/services/instructions.ts\n./eslint.config.js\n./src/services/analyzer.ts\n./tsconfig.json\n./PLAN.md\n./src/index.ts\n./src/services/readiness.ts\n./src/services/github.ts\n./src/services/evaluator.ts\n./src/services/azureDevops.ts\n./src/services/generator.ts\n./.prettierrc.json\n./README.md\n./eval-results.json\n./CHANGELOG.md\n./release-please-manifest.json\n./package.json\n./package-lock.json\n./CONTRIBUTING.md\n./src/services/__tests__/analyzer.test.ts\n./src/cli.ts\n./examples/primer.eval.json\n./examples/README.md\n./SECURITY.md\n./src/utils/logger.ts\n./src/utils/fs.ts\n./.github/PULL_REQUEST_TEMPLATE.md\n./.github/copilot-instructions.md\n./src/commands/pr.ts\n./src/commands/eval.ts\n./src/commands/readiness.ts\n./src/commands/init.ts\n./src/commands/analyze.ts\n./src/commands/generate.ts\n./src/commands/templates.ts\n./src/commands/config.ts\n./src/commands/update.ts\n./.github/ISSUE_TEMPLATE/bug_report.md\n./.github/ISSUE_TEMPLATE/feature_request.md\n./src/ui/index.ts\n./src/ui/README.md", - "detailedContent": "./release-please-config.json\n./vitest.config.ts\n./src/services/git.ts\n./primer.eval.json\n./src/services/instructions.ts\n./eslint.config.js\n./src/services/analyzer.ts\n./tsconfig.json\n./PLAN.md\n./src/index.ts\n./src/services/readiness.ts\n./src/services/github.ts\n./src/services/evaluator.ts\n./src/services/azureDevops.ts\n./src/services/generator.ts\n./.prettierrc.json\n./README.md\n./eval-results.json\n./CHANGELOG.md\n./release-please-manifest.json\n./package.json\n./package-lock.json\n./CONTRIBUTING.md\n./src/services/__tests__/analyzer.test.ts\n./src/cli.ts\n./examples/primer.eval.json\n./examples/README.md\n./SECURITY.md\n./src/utils/logger.ts\n./src/utils/fs.ts\n./.github/PULL_REQUEST_TEMPLATE.md\n./.github/copilot-instructions.md\n./src/commands/pr.ts\n./src/commands/eval.ts\n./src/commands/readiness.ts\n./src/commands/init.ts\n./src/commands/analyze.ts\n./src/commands/generate.ts\n./src/commands/templates.ts\n./src/commands/config.ts\n./src/commands/update.ts\n./.github/ISSUE_TEMPLATE/bug_report.md\n./.github/ISSUE_TEMPLATE/feature_request.md\n./src/ui/index.ts\n./src/ui/README.md" - } + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 5, + "deltaPreview": " with", + "totalResponseSizeBytes": 352 } }, { - "timestampMs": 1770182499260, - "phase": "withInstructions", - "type": "tool.execution_complete", + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_018NEuFLeYuySsA57e7ng8dF", - "success": true, - "result": { - "content": "./package.json: \"commander\": \"^14.0.2\",\n./package.json: \"bin\": {\n./eval-results.json: \"prompt\": \"Summarize what this application does and list the main entrypoints.\",\n./eval-results.json: \"expectation\": \"Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.\",\n./eval-results.json: \"withInstructions\": \"This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, readiness reporting, evaluation, GitHub integration, and an interactive terminal UI.\\n\\nMain entrypoints:\\n- dist/index.js (npm bin: primer) — Main CLI entry point\\n- src/index.ts — TypeScript entry point\\n- src/cli.ts — CLI command setup\\n\\nPrimary commands include: init, tui, instructions, analyze, batch, readiness, eval, pr, and generate.\",\n./eval-results.json: \"withoutInstructions\": \"This application, \\\"Primer,\\\" is a CLI tool that primes repositories for AI-assisted development. It analyzes codebases, generates `.github/copilot-instructions.md` files to help AI coding assistants, supports batch processing, provides an evaluation framework, and integrates with GitHub for automation.\\n\\n**Main entrypoints:**\\n- CLI command: `primer` (installed globally or run locally)\\n- Programmatic entry: `src/index.ts` (calls `runCli` in `src/cli.ts`)\\n- Key CLI commands: `init`, `analyze`, `generate`, `pr`, `eval`, `tui`, `instructions`, `readiness`, `batch`, `templates`, `update`, `config` (all wired in `src/cli.ts`)\",\n./eval-results.json: \"rationale\": \"Response B best matches the expectation by explicitly mentioning both the CLI entrypoint in src/index.ts and that this is the Primer CLI. It also provides a clear list of main entrypoints and commands, directly addressing the requirements. Response A is also accurate but less explicit about the entryp…", - "detailedContent": "./package.json: \"commander\": \"^14.0.2\",\n./package.json: \"bin\": {\n./eval-results.json: \"prompt\": \"Summarize what this application does and list the main entrypoints.\",\n./eval-results.json: \"expectation\": \"Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.\",\n./eval-results.json: \"withInstructions\": \"This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, readiness reporting, evaluation, GitHub integration, and an interactive terminal UI.\\n\\nMain entrypoints:\\n- dist/index.js (npm bin: primer) — Main CLI entry point\\n- src/index.ts — TypeScript entry point\\n- src/cli.ts — CLI command setup\\n\\nPrimary commands include: init, tui, instructions, analyze, batch, readiness, eval, pr, and generate.\",\n./eval-results.json: \"withoutInstructions\": \"This application, \\\"Primer,\\\" is a CLI tool that primes repositories for AI-assisted development. It analyzes codebases, generates `.github/copilot-instructions.md` files to help AI coding assistants, supports batch processing, provides an evaluation framework, and integrates with GitHub for automation.\\n\\n**Main entrypoints:**\\n- CLI command: `primer` (installed globally or run locally)\\n- Programmatic entry: `src/index.ts` (calls `runCli` in `src/cli.ts`)\\n- Key CLI commands: `init`, `analyze`, `generate`, `pr`, `eval`, `tui`, `instructions`, `readiness`, `batch`, `templates`, `update`, `config` (all wired in `src/cli.ts`)\",\n./eval-results.json: \"rationale\": \"Response B best matches the expectation by explicitly mentioning both the CLI entrypoint in src/index.ts and that this is the Primer CLI. It also provides a clear list of main entrypoints and commands, directly addressing the requirements. Response A is also accurate but less explicit about the entryp…" - } + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 356 } }, { - "timestampMs": 1770182502888, - "phase": "withInstructions", + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 7, + "deltaPreview": " custom", + "totalResponseSizeBytes": 363 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 13, + "deltaPreview": " instructions", + "totalResponseSizeBytes": 376 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 377 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 10, + "deltaPreview": " Therefore", + "totalResponseSizeBytes": 387 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 388 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 9, + "deltaPreview": " Response", + "totalResponseSizeBytes": 397 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": " B", + "totalResponseSizeBytes": 399 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 5, + "deltaPreview": " best", + "totalResponseSizeBytes": 404 + } + }, + { + "timestampMs": 1770183509134, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 8, + "deltaPreview": " matches", + "totalResponseSizeBytes": 412 + } + }, + { + "timestampMs": 1770183509148, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 416 + } + }, + { + "timestampMs": 1770183509148, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 12, + "deltaPreview": " expectation", + "totalResponseSizeBytes": 428 + } + }, + { + "timestampMs": 1770183509148, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 2, + "deltaPreview": ".\"", + "totalResponseSizeBytes": 430 + } + }, + { + "timestampMs": 1770183509148, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "deltaChars": 1, + "deltaPreview": "}", + "totalResponseSizeBytes": 431 + } + }, + { + "timestampMs": 1770183509148, + "phase": "judge", "type": "assistant.usage", "data": { - "model": "claude-haiku-4.5", - "inputTokens": 9496, - "outputTokens": 165, - "cacheReadTokens": 0, + "model": "gpt-4.1", + "inputTokens": 10112, + "outputTokens": 84, + "cacheReadTokens": 3840, "cacheWriteTokens": 0, - "cost": 0.33, - "duration": 3626, - "initiator": "sub-agent", - "apiCallId": "msg_01285RH3mRmZCCKvqySHWWA9", - "providerCallId": "E903:35A03D:341602:3DD120:6982D763", + "cost": 0, + "duration": 1197, + "initiator": "user", + "apiCallId": "chatcmpl-D5PsqinluI9OxpYPwmZyg1qJa11tr", + "providerCallId": "EEC8:177A35:704664:843DA6:6982DB53", "quotaSnapshots": { "chat": { "isUnlimitedEntitlement": true, @@ -2267,1924 +7343,1860 @@ "remainingPercentage": 100, "resetDate": "2026-03-01T00:00:00.000Z" } - }, - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg" + } } }, { - "timestampMs": 1770182502888, - "phase": "withInstructions", + "timestampMs": 1770183509148, + "phase": "judge", "type": "assistant.message", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "messageId": "64122101-f836-4292-b6cf-9b2977b87e51", - "content": "Perfect! Now let me get a quick look at the main index and cli files:", - "toolRequests": [ - { - "toolCallId": "toolu_019LFBnAwWLkTJdZchDi3VH5", - "name": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready/src/index.ts" - }, - "type": "function" - }, - { - "toolCallId": "toolu_019rGWXpe6FY43aGFY64R9XQ", - "name": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready/src/cli.ts", - "view_range": [ - 1, - 95 - ] - }, - "type": "function" - } - ] + "messageId": "fa7b3b63-f78a-412d-9ab4-bfda1de7828f", + "content": "{\"verdict\": \"pass\", \"score\": 100, \"rationale\": \"Both responses accurately match the expectation by providing the correct commands for analyzing a repository and generating VS Code settings. Response B is slightly better as it adds the helpful clarification that no build step is required and to run the commands from the project root, which aligns with the custom instructions. Therefore, Response B best matches the expectation.\"}", + "toolRequests": [] } }, { - "timestampMs": 1770182502889, - "phase": "withInstructions", - "type": "tool.execution_start", + "timestampMs": 1770183509148, + "phase": "judge", + "type": "assistant.turn_end", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_019LFBnAwWLkTJdZchDi3VH5", - "toolName": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready/src/index.ts" - } + "turnId": "0" } }, { - "timestampMs": 1770182502889, - "phase": "withInstructions", - "type": "tool.execution_start", - "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_019rGWXpe6FY43aGFY64R9XQ", - "toolName": "view", - "arguments": { - "path": "/Users/pierceboggan/Documents/get-ready/src/cli.ts", - "view_range": [ - 1, - 95 - ] - } + "timestampMs": 1770183509148, + "phase": "judge", + "type": "session.idle", + "data": {} + } + ] + }, + { + "id": "case-3", + "prompt": "Where should new CLI commands and core logic be placed in the Primer codebase, and what architectural patterns are followed?", + "expectation": "New CLI commands should be placed in src/commands/, and core logic in src/services/. The architecture uses Commander for CLI, Ink/React for TUI, and simple-git/Octokit for GitHub automation, following strict ESM TypeScript conventions.", + "withInstructions": "New CLI commands should be placed in src/commands/, and core logic should go in src/services/. The architecture uses Commander for CLI wiring, Ink/React for TUI, and separates concerns by directory: commands for CLI entrypoints, services for business logic, and ui for terminal interfaces. The codebase follows strict TypeScript with ESM, and all new features should adhere to these patterns.", + "withoutInstructions": "New CLI commands should be placed in src/commands/, and core logic should go in src/services/. The architecture uses Commander for CLI wiring, Ink/React for TUI, and separates command definitions from service logic. This modular structure ensures CLI commands are thin wrappers that delegate to reusable service functions, following a clear separation of concerns.", + "verdict": "pass", + "score": 100, + "rationale": "Both responses accurately describe the directory structure and architectural conventions. However, Response B explicitly mentions strict TypeScript with ESM and emphasizes adherence to these patterns, which aligns more closely with the expectation. Therefore, Response B best matches the expectation.", + "metrics": { + "withoutInstructions": { + "durationMs": 1741, + "tokenUsage": { + "promptTokens": 9865, + "completionTokens": 67, + "totalTokens": 9932 + }, + "toolCalls": { + "count": 0, + "byName": {}, + "totalDurationMs": 0 } }, - { - "timestampMs": 1770182502893, - "phase": "withInstructions", - "type": "tool.execution_complete", - "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_019LFBnAwWLkTJdZchDi3VH5", - "success": true, - "result": { - "content": "1. import { runCli } from \"./cli\";\n2. \n3. const [, , ...args] = process.argv;\n4. if (args.length === 0) {\n5. \trunCli([process.argv[0], process.argv[1], \"tui\"]);\n6. } else {\n7. \trunCli(process.argv);\n8. }\n9. ", - "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready/src/index.ts b/Users/pierceboggan/Documents/get-ready/src/index.ts\nindex 0000000..0000000 100644\n--- a/Users/pierceboggan/Documents/get-ready/src/index.ts\n+++ b/Users/pierceboggan/Documents/get-ready/src/index.ts\n@@ -1,9 +1,9 @@\n import { runCli } from \"./cli\";\n \n const [, , ...args] = process.argv;\n if (args.length === 0) {\n \trunCli([process.argv[0], process.argv[1], \"tui\"]);\n } else {\n \trunCli(process.argv);\n }\n \n" - } + "withInstructions": { + "durationMs": 1946, + "tokenUsage": { + "promptTokens": 10683, + "completionTokens": 80, + "totalTokens": 10763 + }, + "toolCalls": { + "count": 0, + "byName": {}, + "totalDurationMs": 0 + } + }, + "judge": { + "durationMs": 1811, + "tokenUsage": { + "promptTokens": 10071, + "completionTokens": 67, + "totalTokens": 10138 + }, + "toolCalls": { + "count": 0, + "byName": {}, + "totalDurationMs": 0 } }, + "totalDurationMs": 5549 + }, + "trajectory": [ + { + "timestampMs": 1770183509171, + "phase": "withoutInstructions", + "type": "pending_messages.modified", + "data": {} + }, + { + "timestampMs": 1770183509171, + "phase": "withoutInstructions", + "type": "pending_messages.modified", + "data": {} + }, { - "timestampMs": 1770182502910, - "phase": "withInstructions", - "type": "tool.execution_complete", + "timestampMs": 1770183509778, + "phase": "withoutInstructions", + "type": "user.message", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "toolCallId": "toolu_019rGWXpe6FY43aGFY64R9XQ", - "success": true, - "result": { - "content": "1. import { Command } from \"commander\";\n2. import { initCommand } from \"./commands/init\";\n3. import { analyzeCommand } from \"./commands/analyze\";\n4. import { generateCommand } from \"./commands/generate\";\n5. import { prCommand } from \"./commands/pr\";\n6. import { templatesCommand } from \"./commands/templates\";\n7. import { updateCommand } from \"./commands/update\";\n8. import { configCommand } from \"./commands/config\";\n9. import { evalCommand } from \"./commands/eval\";\n10. import { tuiCommand } from \"./commands/tui\";\n11. import { instructionsCommand } from \"./commands/instructions\";\n12. import { batchCommand } from \"./commands/batch\";\n13. import { readinessCommand } from \"./commands/readiness\";\n14. \n15. export function runCli(argv: string[]): void {\n16. const program = new Command();\n17. \n18. program\n19. .name(\"primer\")\n20. .description(\"Prime repositories for AI-assisted development\")\n21. .version(\"0.1.0\");\n22. \n23. program\n24. .command(\"init\")\n25. .argument(\"[path]\", \"Path to a local repository\")\n26. .option(\"--github\", \"Use a GitHub repository\")\n27. .option(\"--provider \", \"Repo provider (github|azure)\")\n28. .option(\"--yes\", \"Accept defaults and skip prompts\")\n29. .option(\"--force\", \"Overwrite existing files\")\n30. .action(initCommand);\n31. \n32. program\n33. .command(\"analyze\")\n34. .argument(\"[path]\", \"Path to a local repository\")\n35. .option(\"--json\", \"Output JSON\")\n36. .action(analyzeCommand);\n37. \n38. program\n39. .command(\"generate\")\n40. .argument(\"\", \"prompts|agents|mcp|vscode|aiignore\")\n41. .argument(\"[path]\", \"Path to a local repository\")\n42. .option(\"--force\", \"Overwrite existing files\")\n43. .action(generateCommand);\n44. \n45. program\n46. .command(\"pr\")\n47. .argument(\"[repo]\", \"Repo identifier (github: owner/name, azure: org/project/repo)\")\n48. .option(\"--branch \", \"Branch name\")\n49. .option(\"--provider \", \"Repo provider (github|azu…", - "detailedContent": "\ndiff --git a/Users/pierceboggan/Documents/get-ready/src/cli.ts b/Users/pierceboggan/Documents/get-ready/src/cli.ts\nindex 0000000..0000000 100644\n--- a/Users/pierceboggan/Documents/get-ready/src/cli.ts\n+++ b/Users/pierceboggan/Documents/get-ready/src/cli.ts\n@@ -1,95 +1,95 @@\n import { Command } from \"commander\";\n import { initCommand } from \"./commands/init\";\n import { analyzeCommand } from \"./commands/analyze\";\n import { generateCommand } from \"./commands/generate\";\n import { prCommand } from \"./commands/pr\";\n import { templatesCommand } from \"./commands/templates\";\n import { updateCommand } from \"./commands/update\";\n import { configCommand } from \"./commands/config\";\n import { evalCommand } from \"./commands/eval\";\n import { tuiCommand } from \"./commands/tui\";\n import { instructionsCommand } from \"./commands/instructions\";\n import { batchCommand } from \"./commands/batch\";\n import { readinessCommand } from \"./commands/readiness\";\n \n export function runCli(argv: string[]): void {\n const program = new Command();\n \n program\n .name(\"primer\")\n .description(\"Prime repositories for AI-assisted development\")\n .version(\"0.1.0\");\n \n program\n .command(\"init\")\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--github\", \"Use a GitHub repository\")\n .option(\"--provider \", \"Repo provider (github|azure)\")\n .option(\"--yes\", \"Accept defaults and skip prompts\")\n .option(\"--force\", \"Overwrite existing files\")\n .action(initCommand);\n \n program\n .command(\"analyze\")\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--json\", \"Output JSON\")\n .action(analyzeCommand);\n \n program\n .command(\"generate\")\n .argument(\"\", \"prompts|agents|mcp|vscode|aiignore\")\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--force\", \"Overwrite existing files\")\n .action(generateCommand);\n \n program\n .command(\"pr\")\n .argument(\"[repo]\", \"Repo identifier (github: owner/name, …" - } + "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nWhere should new CLI commands and core logic be placed in the Primer codebase, and what architectural patterns are followed?", + "transformedContent": "2026-02-04T05:38:29.754Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nWhere should new CLI commands and core logic be placed in the Primer codebase, and what architectural patterns are followed?", + "attachments": [] } }, { - "timestampMs": 1770182507175, - "phase": "withInstructions", - "type": "assistant.usage", + "timestampMs": 1770183509778, + "phase": "withoutInstructions", + "type": "assistant.turn_start", "data": { - "model": "claude-haiku-4.5", - "inputTokens": 11011, - "outputTokens": 328, - "cacheReadTokens": 9489, - "cacheWriteTokens": 0, - "cost": 0.33, - "duration": 4250, - "initiator": "sub-agent", - "apiCallId": "msg_016HyJsAAcmf6gv9L4xZsF5b", - "providerCallId": "E903:35A03D:342219:3DDECD:6982D766", - "quotaSnapshots": { - "chat": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "completions": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "premium_interactions": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - }, - "premium_interactions_tbb": { - "isUnlimitedEntitlement": true, - "entitlementRequests": -1, - "usedRequests": 0, - "usageAllowedWithExhaustedQuota": true, - "overage": 0, - "overageAllowedWithExhaustedQuota": true, - "remainingPercentage": 100, - "resetDate": "2026-03-01T00:00:00.000Z" - } - }, - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg" + "turnId": "0" } }, { - "timestampMs": 1770182507175, - "phase": "withInstructions", - "type": "assistant.message", + "timestampMs": 1770183509778, + "phase": "withoutInstructions", + "type": "session.usage_info", "data": { - "parentToolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "messageId": "0d741c5b-08d1-4f5a-861e-6167380217c7", - "content": "## Summary\n\n**Primer** is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, readiness reporting, evaluation, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\n### Main Entrypoints\n\n**CLI Command:**\n- `primer` — Binary entrypoint (installed globally via `npm install -g primer`)\n\n**Programmatic Entry:**\n- `src/index.ts` → calls `runCli()` in `src/cli.ts`\n- Defaults to `tui` command if no args provided\n\n### Primary Commands\n\n- **init** — Initialize a repository with Primer\n- **analyze** — Analyze codebase structure \n- **generate** — Generate instructions, agents, MCP, VS Code, or .aiignore configs\n- **instructions** — Generate `.github/copilot-instructions.md` using Copilot SDK\n- **tui** — Interactive terminal UI (default)\n- **eval** — Evaluate instruction effectiveness against test cases\n- **readiness** — Score AI readiness across key pillars\n- **pr** — Create PRs with generated instructions (GitHub/Azure DevOps)\n- **batch** — Process multiple repos across organizations\n- **templates**, **config**, **update** — Utility commands", - "toolRequests": [] + "tokenLimit": 64000, + "currentTokens": 10498, + "messagesLength": 2 } }, { - "timestampMs": 1770182507215, - "phase": "withInstructions", - "type": "tool.execution_complete", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", + "type": "assistant.message_delta", "data": { - "toolCallId": "call_fpSxFMssTyDrgnKcYJ2KLnRg", - "success": true, - "result": { - "content": "## Summary\n\n**Primer** is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, readiness reporting, evaluation, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\n### Main Entrypoints\n\n**CLI Command:**\n- `primer` — Binary entrypoint (installed globally via `npm install -g primer`)\n\n**Programmatic Entry:**\n- `src/index.ts` → calls `runCli()` in `src/cli.ts`\n- Defaults to `tui` command if no args provided\n\n### Primary Commands\n\n- **init** — Initialize a repository with Primer\n- **analyze** — Analyze codebase structure \n- **generate** — Generate instructions, agents, MCP, VS Code, or .aiignore configs\n- **instructions** — Generate `.github/copilot-instructions.md` using Copilot SDK\n- **tui** — Interactive terminal UI (default)\n- **eval** — Evaluate instruction effectiveness against test cases\n- **readiness** — Score AI readiness across key pillars\n- **pr** — Create PRs with generated instructions (GitHub/Azure DevOps)\n- **batch** — Process multiple repos across organizations\n- **templates**, **config**, **update** — Utility commands", - "detailedContent": "## Summary\n\n(Full response provided to agent)" - }, - "toolTelemetry": { - "properties": { - "prompt_length": "146", - "response_length": "1262", - "hashed_agent_name": "6f281157ab246f0e1f35db82165d3448ee1e39077ab0d720fca7dddf014249d6", - "agent_type": "explore", - "execution_mode": "sync" - }, - "restrictedProperties": { - "agent_name": "explore" - }, - "metrics": { - "response_length": 1262, - "numberOfToolCallsMadeByAgent": 5 - } - } + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 3, + "deltaPreview": "New", + "totalResponseSizeBytes": 3 } }, { - "timestampMs": 1770182507215, - "phase": "withInstructions", - "type": "assistant.turn_end", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", + "type": "assistant.message_delta", "data": { - "turnId": "0" + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 7 } }, { - "timestampMs": 1770182507215, - "phase": "withInstructions", - "type": "assistant.turn_start", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", + "type": "assistant.message_delta", "data": { - "turnId": "1" + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 16 } }, { - "timestampMs": 1770182507215, - "phase": "withInstructions", - "type": "session.usage_info", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", + "type": "assistant.message_delta", "data": { - "tokenLimit": 64000, - "currentTokens": 11390, - "messagesLength": 5 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 7, + "deltaPreview": " should", + "totalResponseSizeBytes": 23 } }, { - "timestampMs": 1770182508277, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": "This", - "totalResponseSizeBytes": 4 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 3, + "deltaPreview": " be", + "totalResponseSizeBytes": 26 } }, { - "timestampMs": 1770182508277, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 12, - "deltaPreview": " application", - "totalResponseSizeBytes": 16 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 7, + "deltaPreview": " placed", + "totalResponseSizeBytes": 33 } }, { - "timestampMs": 1770182508277, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 17 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 3, + "deltaPreview": " in", + "totalResponseSizeBytes": 36 } }, { - "timestampMs": 1770182508277, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 7, - "deltaPreview": " Primer", - "totalResponseSizeBytes": 24 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 40 } }, { - "timestampMs": 1770182508277, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 25 + "deltaPreview": "/", + "totalResponseSizeBytes": 41 } }, { - "timestampMs": 1770182508277, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": " is", - "totalResponseSizeBytes": 28 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 8, + "deltaPreview": "commands", + "totalResponseSizeBytes": 49 } }, { - "timestampMs": 1770182508277, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", "deltaChars": 2, - "deltaPreview": " a", - "totalResponseSizeBytes": 30 + "deltaPreview": "/,", + "totalResponseSizeBytes": 51 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", "deltaChars": 4, - "deltaPreview": " CLI", - "totalResponseSizeBytes": 34 + "deltaPreview": " and", + "totalResponseSizeBytes": 55 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", "deltaChars": 5, - "deltaPreview": " tool", - "totalResponseSizeBytes": 39 + "deltaPreview": " core", + "totalResponseSizeBytes": 60 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 5, - "deltaPreview": " that", - "totalResponseSizeBytes": 44 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 6, + "deltaPreview": " logic", + "totalResponseSizeBytes": 66 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 9, - "deltaPreview": " analyzes", - "totalResponseSizeBytes": 53 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 7, + "deltaPreview": " should", + "totalResponseSizeBytes": 73 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510565, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 5, - "deltaPreview": " code", - "totalResponseSizeBytes": 58 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 3, + "deltaPreview": " go", + "totalResponseSizeBytes": 76 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510699, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 5, - "deltaPreview": "bases", - "totalResponseSizeBytes": 63 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 3, + "deltaPreview": " in", + "totalResponseSizeBytes": 79 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510699, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", "deltaChars": 4, - "deltaPreview": " and", - "totalResponseSizeBytes": 67 + "deltaPreview": " src", + "totalResponseSizeBytes": 83 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 10, - "deltaPreview": " generates", - "totalResponseSizeBytes": 77 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 9, + "deltaPreview": "/services", + "totalResponseSizeBytes": 92 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": " `.", - "totalResponseSizeBytes": 80 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 2, + "deltaPreview": "/.", + "totalResponseSizeBytes": 94 } }, { - "timestampMs": 1770182508411, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 6, - "deltaPreview": "github", - "totalResponseSizeBytes": 86 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 4, + "deltaPreview": " The", + "totalResponseSizeBytes": 98 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": "/cop", - "totalResponseSizeBytes": 90 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 13, + "deltaPreview": " architecture", + "totalResponseSizeBytes": 111 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": "ilot", - "totalResponseSizeBytes": 94 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 5, + "deltaPreview": " uses", + "totalResponseSizeBytes": 116 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "-in", - "totalResponseSizeBytes": 97 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 10, + "deltaPreview": " Commander", + "totalResponseSizeBytes": 126 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 10, - "deltaPreview": "structions", - "totalResponseSizeBytes": 107 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 130 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": ".md", - "totalResponseSizeBytes": 110 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 134 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": "`", - "totalResponseSizeBytes": 111 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 7, + "deltaPreview": " wiring", + "totalResponseSizeBytes": 141 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 6, - "deltaPreview": " files", - "totalResponseSizeBytes": 117 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 142 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": " to", - "totalResponseSizeBytes": 120 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 4, + "deltaPreview": " Ink", + "totalResponseSizeBytes": 146 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 5, - "deltaPreview": " help", - "totalResponseSizeBytes": 125 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 147 } }, { - "timestampMs": 1770182508656, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": " AI", - "totalResponseSizeBytes": 128 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 5, + "deltaPreview": "React", + "totalResponseSizeBytes": 152 } }, { - "timestampMs": 1770182508685, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", - "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 7, - "deltaPreview": " coding", - "totalResponseSizeBytes": 135 + "data": { + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 156 } }, { - "timestampMs": 1770182508686, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 11, - "deltaPreview": " assistants", - "totalResponseSizeBytes": 146 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 2, + "deltaPreview": " T", + "totalResponseSizeBytes": 158 } }, { - "timestampMs": 1770182508686, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", "deltaChars": 2, - "deltaPreview": " (", - "totalResponseSizeBytes": 148 + "deltaPreview": "UI", + "totalResponseSizeBytes": 160 } }, { - "timestampMs": 1770182508686, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": "like", - "totalResponseSizeBytes": 152 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 161 } }, { - "timestampMs": 1770182508686, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", "deltaChars": 4, - "deltaPreview": " Git", - "totalResponseSizeBytes": 156 + "deltaPreview": " and", + "totalResponseSizeBytes": 165 } }, { - "timestampMs": 1770182508686, - "phase": "withInstructions", + "timestampMs": 1770183510700, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "Hub", - "totalResponseSizeBytes": 159 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 10, + "deltaPreview": " separates", + "totalResponseSizeBytes": 175 } }, { - "timestampMs": 1770182508686, - "phase": "withInstructions", + "timestampMs": 1770183510853, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": " Cop", - "totalResponseSizeBytes": 163 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 8, + "deltaPreview": " command", + "totalResponseSizeBytes": 183 } }, { - "timestampMs": 1770182508686, - "phase": "withInstructions", + "timestampMs": 1770183510853, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": "ilot", - "totalResponseSizeBytes": 167 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 12, + "deltaPreview": " definitions", + "totalResponseSizeBytes": 195 } }, { - "timestampMs": 1770182508686, - "phase": "withInstructions", + "timestampMs": 1770183510853, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ")", - "totalResponseSizeBytes": 168 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 5, + "deltaPreview": " from", + "totalResponseSizeBytes": 200 } }, { - "timestampMs": 1770182508686, - "phase": "withInstructions", + "timestampMs": 1770183510853, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 11, - "deltaPreview": " understand", - "totalResponseSizeBytes": 179 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 8, + "deltaPreview": " service", + "totalResponseSizeBytes": 208 } }, { - "timestampMs": 1770182508748, - "phase": "withInstructions", + "timestampMs": 1770183510853, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 9, - "deltaPreview": " projects", - "totalResponseSizeBytes": 188 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 6, + "deltaPreview": " logic", + "totalResponseSizeBytes": 214 } }, { - "timestampMs": 1770182508748, - "phase": "withInstructions", + "timestampMs": 1770183510853, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 7, - "deltaPreview": " better", - "totalResponseSizeBytes": 195 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 215 } }, { - "timestampMs": 1770182508750, - "phase": "withInstructions", + "timestampMs": 1770183510853, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ".", - "totalResponseSizeBytes": 196 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 5, + "deltaPreview": " This", + "totalResponseSizeBytes": 220 } }, { - "timestampMs": 1770182508750, - "phase": "withInstructions", + "timestampMs": 1770183510853, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": " It", - "totalResponseSizeBytes": 199 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 8, + "deltaPreview": " modular", + "totalResponseSizeBytes": 228 } }, { - "timestampMs": 1770182508750, - "phase": "withInstructions", + "timestampMs": 1770183510853, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 9, - "deltaPreview": " supports", - "totalResponseSizeBytes": 208 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 10, + "deltaPreview": " structure", + "totalResponseSizeBytes": 238 } }, { - "timestampMs": 1770182508750, - "phase": "withInstructions", + "timestampMs": 1770183510854, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 11, - "deltaPreview": " repository", - "totalResponseSizeBytes": 219 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 8, + "deltaPreview": " ensures", + "totalResponseSizeBytes": 246 } }, { - "timestampMs": 1770182508750, - "phase": "withInstructions", + "timestampMs": 1770183510854, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 9, - "deltaPreview": " analysis", - "totalResponseSizeBytes": 228 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 250 } }, { - "timestampMs": 1770182508750, - "phase": "withInstructions", + "timestampMs": 1770183510854, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 229 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 259 } }, { - "timestampMs": 1770182508750, - "phase": "withInstructions", + "timestampMs": 1770183510854, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": " AI", - "totalResponseSizeBytes": 232 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 4, + "deltaPreview": " are", + "totalResponseSizeBytes": 263 } }, { - "timestampMs": 1770182508750, - "phase": "withInstructions", + "timestampMs": 1770183510854, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 8, - "deltaPreview": "-powered", - "totalResponseSizeBytes": 240 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 5, + "deltaPreview": " thin", + "totalResponseSizeBytes": 268 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510854, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 12, - "deltaPreview": " instruction", - "totalResponseSizeBytes": 252 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 9, + "deltaPreview": " wrappers", + "totalResponseSizeBytes": 277 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510854, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 11, - "deltaPreview": " generation", - "totalResponseSizeBytes": 263 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 5, + "deltaPreview": " that", + "totalResponseSizeBytes": 282 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510854, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 264 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 9, + "deltaPreview": " delegate", + "totalResponseSizeBytes": 291 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510854, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 11, - "deltaPreview": " evaluation", - "totalResponseSizeBytes": 275 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 3, + "deltaPreview": " to", + "totalResponseSizeBytes": 294 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510856, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 276 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 9, + "deltaPreview": " reusable", + "totalResponseSizeBytes": 303 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510856, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 10, - "deltaPreview": " readiness", - "totalResponseSizeBytes": 286 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 8, + "deltaPreview": " service", + "totalResponseSizeBytes": 311 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510856, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", "deltaChars": 10, - "deltaPreview": " reporting", - "totalResponseSizeBytes": 296 + "deltaPreview": " functions", + "totalResponseSizeBytes": 321 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", "deltaChars": 1, "deltaPreview": ",", - "totalResponseSizeBytes": 297 + "totalResponseSizeBytes": 322 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": " Git", - "totalResponseSizeBytes": 301 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 10, + "deltaPreview": " following", + "totalResponseSizeBytes": 332 } }, { - "timestampMs": 1770182508991, - "phase": "withInstructions", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "Hub", - "totalResponseSizeBytes": 304 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 2, + "deltaPreview": " a", + "totalResponseSizeBytes": 334 } }, { - "timestampMs": 1770182509181, - "phase": "withInstructions", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "/A", - "totalResponseSizeBytes": 306 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 6, + "deltaPreview": " clear", + "totalResponseSizeBytes": 340 } }, { - "timestampMs": 1770182509181, - "phase": "withInstructions", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": "zure", - "totalResponseSizeBytes": 310 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 11, + "deltaPreview": " separation", + "totalResponseSizeBytes": 351 } }, { - "timestampMs": 1770182509181, - "phase": "withInstructions", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": " Dev", - "totalResponseSizeBytes": 314 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 3, + "deltaPreview": " of", + "totalResponseSizeBytes": 354 } }, { - "timestampMs": 1770182509182, - "phase": "withInstructions", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "Ops", - "totalResponseSizeBytes": 317 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 9, + "deltaPreview": " concerns", + "totalResponseSizeBytes": 363 } }, { - "timestampMs": 1770182509182, - "phase": "withInstructions", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 12, - "deltaPreview": " integration", - "totalResponseSizeBytes": 329 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 364 + } + }, + { + "timestampMs": 1770183510911, + "phase": "withoutInstructions", + "type": "assistant.usage", + "data": { + "model": "gpt-4.1", + "inputTokens": 9865, + "outputTokens": 67, + "cacheReadTokens": 9728, + "cacheWriteTokens": 0, + "cost": 0, + "duration": 1133, + "initiator": "user", + "apiCallId": "chatcmpl-D5Pss0idQc01h1Zn1PbmAqLROEQfz", + "providerCallId": "EEC8:177A35:704C54:84447B:6982DB55", + "quotaSnapshots": { + "chat": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "completions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + }, + "premium_interactions_tbb": { + "isUnlimitedEntitlement": true, + "entitlementRequests": -1, + "usedRequests": 0, + "usageAllowedWithExhaustedQuota": true, + "overage": 0, + "overageAllowedWithExhaustedQuota": true, + "remainingPercentage": 100, + "resetDate": "2026-03-01T00:00:00.000Z" + } + } } }, { - "timestampMs": 1770182509182, - "phase": "withInstructions", - "type": "assistant.message_delta", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", + "type": "assistant.message", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 330 + "messageId": "6e0b5102-6f63-4f76-b0d8-9bd7e7d7a28a", + "content": "New CLI commands should be placed in src/commands/, and core logic should go in src/services/. The architecture uses Commander for CLI wiring, Ink/React for TUI, and separates command definitions from service logic. This modular structure ensures CLI commands are thin wrappers that delegate to reusable service functions, following a clear separation of concerns.", + "toolRequests": [] } }, { - "timestampMs": 1770182509182, - "phase": "withInstructions", - "type": "assistant.message_delta", + "timestampMs": 1770183510911, + "phase": "withoutInstructions", + "type": "assistant.turn_end", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": " and", - "totalResponseSizeBytes": 334 + "turnId": "0" } }, { - "timestampMs": 1770182509182, - "phase": "withInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": " an", - "totalResponseSizeBytes": 337 - } + "timestampMs": 1770183510911, + "phase": "withoutInstructions", + "type": "session.idle", + "data": {} }, { - "timestampMs": 1770182509182, + "timestampMs": 1770183510928, "phase": "withInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 12, - "deltaPreview": " interactive", - "totalResponseSizeBytes": 349 - } + "type": "pending_messages.modified", + "data": {} }, { - "timestampMs": 1770182509182, + "timestampMs": 1770183510928, "phase": "withInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 9, - "deltaPreview": " terminal", - "totalResponseSizeBytes": 358 - } + "type": "pending_messages.modified", + "data": {} }, { - "timestampMs": 1770182509220, + "timestampMs": 1770183511591, "phase": "withInstructions", - "type": "assistant.message_delta", + "type": "user.message", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": " UI", - "totalResponseSizeBytes": 361 + "content": "You are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nWhere should new CLI commands and core logic be placed in the Primer codebase, and what architectural patterns are followed?", + "transformedContent": "2026-02-04T05:38:31.564Z\n\nYou are working in this repository:\n/Users/pierceboggan/Documents/get-ready\nUse the file system tools when needed to inspect the codebase.\n\nWhere should new CLI commands and core logic be placed in the Primer codebase, and what architectural patterns are followed?", + "attachments": [] } }, { - "timestampMs": 1770182509220, + "timestampMs": 1770183511592, "phase": "withInstructions", - "type": "assistant.message_delta", + "type": "assistant.turn_start", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": ".\n\n", - "totalResponseSizeBytes": 364 + "turnId": "0" } }, { - "timestampMs": 1770182509222, + "timestampMs": 1770183511592, "phase": "withInstructions", - "type": "assistant.message_delta", + "type": "session.usage_info", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": "Main", - "totalResponseSizeBytes": 368 + "tokenLimit": 64000, + "currentTokens": 11316, + "messagesLength": 2 } }, { - "timestampMs": 1770182509222, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 6, - "deltaPreview": " entry", - "totalResponseSizeBytes": 374 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 3, + "deltaPreview": "New", + "totalResponseSizeBytes": 3 } }, { - "timestampMs": 1770182509222, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 6, - "deltaPreview": "points", - "totalResponseSizeBytes": 380 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 7 } }, { - "timestampMs": 1770182509222, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": ":\n", - "totalResponseSizeBytes": 382 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 16 } }, { - "timestampMs": 1770182509222, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": "-", - "totalResponseSizeBytes": 383 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 7, + "deltaPreview": " should", + "totalResponseSizeBytes": 23 } }, { - "timestampMs": 1770182509222, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": " CLI", - "totalResponseSizeBytes": 387 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 3, + "deltaPreview": " be", + "totalResponseSizeBytes": 26 } }, { - "timestampMs": 1770182509222, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ":", - "totalResponseSizeBytes": 388 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 7, + "deltaPreview": " placed", + "totalResponseSizeBytes": 33 } }, { - "timestampMs": 1770182509222, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 390 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 3, + "deltaPreview": " in", + "totalResponseSizeBytes": 36 } }, { - "timestampMs": 1770182509308, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 6, - "deltaPreview": "primer", - "totalResponseSizeBytes": 396 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 40 } }, { - "timestampMs": 1770182509308, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", "deltaChars": 1, - "deltaPreview": "`", - "totalResponseSizeBytes": 397 + "deltaPreview": "/", + "totalResponseSizeBytes": 41 } }, { - "timestampMs": 1770182509308, + "timestampMs": 1770183512432, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " (", - "totalResponseSizeBytes": 399 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 8, + "deltaPreview": "commands", + "totalResponseSizeBytes": 49 } }, { - "timestampMs": 1770182509308, + "timestampMs": 1770183512433, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": "main", - "totalResponseSizeBytes": 403 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 2, + "deltaPreview": "/,", + "totalResponseSizeBytes": 51 } }, { - "timestampMs": 1770182509308, + "timestampMs": 1770183512433, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 7, - "deltaPreview": " binary", - "totalResponseSizeBytes": 410 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 55 } }, { - "timestampMs": 1770182509308, + "timestampMs": 1770183512433, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 411 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 5, + "deltaPreview": " core", + "totalResponseSizeBytes": 60 } }, { - "timestampMs": 1770182509308, + "timestampMs": 1770183512433, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 10, - "deltaPreview": " installed", - "totalResponseSizeBytes": 421 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 6, + "deltaPreview": " logic", + "totalResponseSizeBytes": 66 } }, { - "timestampMs": 1770182509308, + "timestampMs": 1770183512433, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 9, - "deltaPreview": " globally", - "totalResponseSizeBytes": 430 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 7, + "deltaPreview": " should", + "totalResponseSizeBytes": 73 } }, { - "timestampMs": 1770182509309, + "timestampMs": 1770183512433, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": ")\n", - "totalResponseSizeBytes": 432 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 3, + "deltaPreview": " go", + "totalResponseSizeBytes": 76 } }, { - "timestampMs": 1770182509309, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": "-", - "totalResponseSizeBytes": 433 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 3, + "deltaPreview": " in", + "totalResponseSizeBytes": 79 } }, { - "timestampMs": 1770182509373, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 8, - "deltaPreview": " Program", - "totalResponseSizeBytes": 441 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " src", + "totalResponseSizeBytes": 83 } }, { - "timestampMs": 1770182509373, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 5, - "deltaPreview": "matic", - "totalResponseSizeBytes": 446 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 9, + "deltaPreview": "/services", + "totalResponseSizeBytes": 92 } }, { - "timestampMs": 1770182509373, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": ":", - "totalResponseSizeBytes": 447 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 2, + "deltaPreview": "/.", + "totalResponseSizeBytes": 94 } }, { - "timestampMs": 1770182509373, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 449 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " The", + "totalResponseSizeBytes": 98 } }, { - "timestampMs": 1770182509373, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "src", - "totalResponseSizeBytes": 452 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 13, + "deltaPreview": " architecture", + "totalResponseSizeBytes": 111 } }, { - "timestampMs": 1770182509374, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 6, - "deltaPreview": "/index", - "totalResponseSizeBytes": 458 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 5, + "deltaPreview": " uses", + "totalResponseSizeBytes": 116 } }, { - "timestampMs": 1770182509374, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": ".ts", - "totalResponseSizeBytes": 461 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 10, + "deltaPreview": " Commander", + "totalResponseSizeBytes": 126 } }, { - "timestampMs": 1770182509374, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": "`", - "totalResponseSizeBytes": 462 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 130 } }, { - "timestampMs": 1770182509374, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " (", - "totalResponseSizeBytes": 464 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 134 } }, { - "timestampMs": 1770182509374, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 5, - "deltaPreview": "calls", - "totalResponseSizeBytes": 469 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 7, + "deltaPreview": " wiring", + "totalResponseSizeBytes": 141 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 471 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 142 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "run", - "totalResponseSizeBytes": 474 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " Ink", + "totalResponseSizeBytes": 146 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "Cli", - "totalResponseSizeBytes": 477 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 1, + "deltaPreview": "/", + "totalResponseSizeBytes": 147 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "()`", - "totalResponseSizeBytes": 480 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 5, + "deltaPreview": "React", + "totalResponseSizeBytes": 152 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": " in", - "totalResponseSizeBytes": 483 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 156 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 485 + "deltaPreview": " T", + "totalResponseSizeBytes": 158 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "src", - "totalResponseSizeBytes": 488 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 2, + "deltaPreview": "UI", + "totalResponseSizeBytes": 160 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", "deltaChars": 1, - "deltaPreview": "/", - "totalResponseSizeBytes": 489 + "deltaPreview": ",", + "totalResponseSizeBytes": 161 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": "cli", - "totalResponseSizeBytes": 492 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 165 } }, { - "timestampMs": 1770182511802, + "timestampMs": 1770183512570, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 3, - "deltaPreview": ".ts", - "totalResponseSizeBytes": 495 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 10, + "deltaPreview": " separates", + "totalResponseSizeBytes": 175 } }, { - "timestampMs": 1770182515040, + "timestampMs": 1770183512726, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": "`", - "totalResponseSizeBytes": 496 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 9, + "deltaPreview": " concerns", + "totalResponseSizeBytes": 184 } }, { - "timestampMs": 1770182515040, + "timestampMs": 1770183512726, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", "deltaChars": 3, - "deltaPreview": ")\n\n", - "totalResponseSizeBytes": 499 - } - }, - { - "timestampMs": 1770182515043, - "phase": "withInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 7, - "deltaPreview": "Primary", - "totalResponseSizeBytes": 506 - } - }, - { - "timestampMs": 1770182515044, - "phase": "withInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 9, - "deltaPreview": " commands", - "totalResponseSizeBytes": 515 + "deltaPreview": " by", + "totalResponseSizeBytes": 187 } }, { - "timestampMs": 1770182515044, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 8, - "deltaPreview": " include", - "totalResponseSizeBytes": 523 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 10, + "deltaPreview": " directory", + "totalResponseSizeBytes": 197 } }, { - "timestampMs": 1770182515044, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", "deltaChars": 1, "deltaPreview": ":", - "totalResponseSizeBytes": 524 + "totalResponseSizeBytes": 198 } }, { - "timestampMs": 1770182515044, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 526 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 9, + "deltaPreview": " commands", + "totalResponseSizeBytes": 207 } }, { - "timestampMs": 1770182515044, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", "deltaChars": 4, - "deltaPreview": "init", - "totalResponseSizeBytes": 530 - } - }, - { - "timestampMs": 1770182515044, - "phase": "withInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 532 - } - }, - { - "timestampMs": 1770182515044, - "phase": "withInstructions", - "type": "assistant.message_delta", - "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 534 + "deltaPreview": " for", + "totalResponseSizeBytes": 211 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "an", - "totalResponseSizeBytes": 536 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " CLI", + "totalResponseSizeBytes": 215 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 5, - "deltaPreview": "alyze", - "totalResponseSizeBytes": 541 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 6, + "deltaPreview": " entry", + "totalResponseSizeBytes": 221 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 543 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 6, + "deltaPreview": "points", + "totalResponseSizeBytes": 227 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 545 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 228 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 8, - "deltaPreview": "generate", - "totalResponseSizeBytes": 553 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 9, + "deltaPreview": " services", + "totalResponseSizeBytes": 237 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 555 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 241 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 557 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 9, + "deltaPreview": " business", + "totalResponseSizeBytes": 250 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 12, - "deltaPreview": "instructions", - "totalResponseSizeBytes": 569 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 6, + "deltaPreview": " logic", + "totalResponseSizeBytes": 256 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 571 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 257 } }, { - "timestampMs": 1770182515108, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 573 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 261 } }, { - "timestampMs": 1770182515170, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 1, - "deltaPreview": "t", - "totalResponseSizeBytes": 574 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 3, + "deltaPreview": " ui", + "totalResponseSizeBytes": 264 } }, { - "timestampMs": 1770182515170, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "ui", - "totalResponseSizeBytes": 576 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " for", + "totalResponseSizeBytes": 268 } }, { - "timestampMs": 1770182515172, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 578 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 9, + "deltaPreview": " terminal", + "totalResponseSizeBytes": 277 } }, { - "timestampMs": 1770182515172, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 580 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 11, + "deltaPreview": " interfaces", + "totalResponseSizeBytes": 288 } }, { - "timestampMs": 1770182515172, + "timestampMs": 1770183512727, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": "eval", - "totalResponseSizeBytes": 584 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 289 } }, { - "timestampMs": 1770182515172, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 586 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " The", + "totalResponseSizeBytes": 293 } }, { - "timestampMs": 1770182515173, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 588 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 5, + "deltaPreview": " code", + "totalResponseSizeBytes": 298 } }, { - "timestampMs": 1770182515173, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", "deltaChars": 4, - "deltaPreview": "read", - "totalResponseSizeBytes": 592 + "deltaPreview": "base", + "totalResponseSizeBytes": 302 } }, { - "timestampMs": 1770182515173, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 5, - "deltaPreview": "iness", - "totalResponseSizeBytes": 597 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 8, + "deltaPreview": " follows", + "totalResponseSizeBytes": 310 } }, { - "timestampMs": 1770182515173, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 599 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 7, + "deltaPreview": " strict", + "totalResponseSizeBytes": 317 } }, { - "timestampMs": 1770182515321, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 601 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 5, + "deltaPreview": " Type", + "totalResponseSizeBytes": 322 } }, { - "timestampMs": 1770182515321, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "pr", - "totalResponseSizeBytes": 603 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 6, + "deltaPreview": "Script", + "totalResponseSizeBytes": 328 } }, { - "timestampMs": 1770182515322, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 605 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 5, + "deltaPreview": " with", + "totalResponseSizeBytes": 333 } }, { - "timestampMs": 1770182515322, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 607 + "deltaPreview": " E", + "totalResponseSizeBytes": 335 } }, { - "timestampMs": 1770182515323, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 5, - "deltaPreview": "batch", - "totalResponseSizeBytes": 612 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 2, + "deltaPreview": "SM", + "totalResponseSizeBytes": 337 } }, { - "timestampMs": 1770182515323, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 614 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 338 } }, { - "timestampMs": 1770182515323, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 616 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 342 } }, { - "timestampMs": 1770182515323, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 9, - "deltaPreview": "templates", - "totalResponseSizeBytes": 625 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " all", + "totalResponseSizeBytes": 346 } }, { - "timestampMs": 1770182515323, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 627 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 4, + "deltaPreview": " new", + "totalResponseSizeBytes": 350 } }, { - "timestampMs": 1770182515323, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 629 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 9, + "deltaPreview": " features", + "totalResponseSizeBytes": 359 } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 6, - "deltaPreview": "config", - "totalResponseSizeBytes": 635 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 7, + "deltaPreview": " should", + "totalResponseSizeBytes": 366 } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`,", - "totalResponseSizeBytes": 637 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 7, + "deltaPreview": " adhere", + "totalResponseSizeBytes": 373 } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512871, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 4, - "deltaPreview": " and", - "totalResponseSizeBytes": 641 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 3, + "deltaPreview": " to", + "totalResponseSizeBytes": 376 } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512872, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": " `", - "totalResponseSizeBytes": 643 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 6, + "deltaPreview": " these", + "totalResponseSizeBytes": 382 } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512872, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 6, - "deltaPreview": "update", - "totalResponseSizeBytes": 649 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 9, + "deltaPreview": " patterns", + "totalResponseSizeBytes": 391 } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512872, "phase": "withInstructions", "type": "assistant.message_delta", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "deltaChars": 2, - "deltaPreview": "`.", - "totalResponseSizeBytes": 651 + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 392 } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512872, "phase": "withInstructions", "type": "assistant.usage", "data": { "model": "gpt-4.1", - "inputTokens": 10830, - "outputTokens": 155, - "cacheReadTokens": 10368, + "inputTokens": 10683, + "outputTokens": 80, + "cacheReadTokens": 0, "cacheWriteTokens": 0, "cost": 0, - "duration": 8136, - "initiator": "agent", - "apiCallId": "chatcmpl-D5PchQpqfCG6WGv6mtHggYQqLqUqA", - "providerCallId": "E903:35A03D:342FF2:3DEEEA:6982D76B", + "duration": 1280, + "initiator": "user", + "apiCallId": "chatcmpl-D5Pst1SRyrfoaXfmP71NWHGhxDTbx", + "providerCallId": "EEC8:177A35:7051FD:844B6C:6982DB57", "quotaSnapshots": { "chat": { "isUnlimitedEntitlement": true, @@ -4230,53 +9242,53 @@ } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512872, "phase": "withInstructions", "type": "assistant.message", "data": { - "messageId": "b60af17a-24cd-4187-bbde-c7884f33ab13", - "content": "This application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, evaluation, readiness reporting, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\nMain entrypoints:\n- CLI: `primer` (main binary, installed globally)\n- Programmatic: `src/index.ts` (calls `runCli()` in `src/cli.ts`)\n\nPrimary commands include: `init`, `analyze`, `generate`, `instructions`, `tui`, `eval`, `readiness`, `pr`, `batch`, `templates`, `config`, and `update`.", + "messageId": "2d5cd1de-4ae7-4051-9934-5ffb545682d9", + "content": "New CLI commands should be placed in src/commands/, and core logic should go in src/services/. The architecture uses Commander for CLI wiring, Ink/React for TUI, and separates concerns by directory: commands for CLI entrypoints, services for business logic, and ui for terminal interfaces. The codebase follows strict TypeScript with ESM, and all new features should adhere to these patterns.", "toolRequests": [] } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512872, "phase": "withInstructions", "type": "assistant.turn_end", "data": { - "turnId": "1" + "turnId": "0" } }, { - "timestampMs": 1770182515351, + "timestampMs": 1770183512872, "phase": "withInstructions", "type": "session.idle", "data": {} }, { - "timestampMs": 1770182515373, + "timestampMs": 1770183512888, "phase": "judge", "type": "pending_messages.modified", "data": {} }, { - "timestampMs": 1770182515373, + "timestampMs": 1770183512888, "phase": "judge", "type": "pending_messages.modified", "data": {} }, { - "timestampMs": 1770182516066, + "timestampMs": 1770183513503, "phase": "judge", "type": "user.message", "data": { - "content": "Evaluate which response best matches the expectation.\n\nExpectation: Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.\n\nResponse A (without custom instructions):\nThis application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, evaluation, readiness reports, and GitHub integration.\n\nMain entrypoints:\n- src/index.ts — CLI entry point\n- src/cli.ts — Commander CLI setup\n\nKey commands include: `primer init`, `primer tui`, `primer instructions`, `primer analyze`, `primer batch`, `primer readiness`, and `primer eval`.\n\nResponse B (with custom instructions):\nThis application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, evaluation, readiness reporting, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\nMain entrypoints:\n- CLI: `primer` (main binary, installed globally)\n- Programmatic: `src/index.ts` (calls `runCli()` in `src/cli.ts`)\n\nPrimary commands include: `init`, `analyze`, `generate`, `instructions`, `tui`, `eval`, `readiness`, `pr`, `batch`, `templates`, `config`, and `update`.\n\nReturn JSON only.", - "transformedContent": "2026-02-04T05:21:56.033Z\n\nEvaluate which response best matches the expectation.\n\nExpectation: Mentions the CLI entrypoint in src/index.ts and that this is the Primer CLI.\n\nResponse A (without custom instructions):\nThis application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants understand projects better. It supports repository analysis, AI-powered instruction generation, batch processing, evaluation, readiness reports, and GitHub integration.\n\nMain entrypoints:\n- src/index.ts — CLI entry point\n- src/cli.ts — Commander CLI setup\n\nKey commands include: `primer init`, `primer tui`, `primer instructions`, `primer analyze`, `primer batch`, `primer readiness`, and `primer eval`.\n\nResponse B (with custom instructions):\nThis application, Primer, is a CLI tool that analyzes codebases and generates `.github/copilot-instructions.md` files to help AI coding assistants (like GitHub Copilot) understand projects better. It supports repository analysis, AI-powered instruction generation, evaluation, readiness reporting, GitHub/Azure DevOps integration, and an interactive terminal UI.\n\nMain entrypoints:\n- CLI: `primer` (main binary, installed globally)\n- Programmatic: `src/index.ts` (calls `runCli()` in `src/cli.ts`)\n\nPrimary commands include: `init`, `analyze`, `generate`, `instructions`, `tui`, `eval`, `readiness`, `pr`, `batch`, `templates`, `config`, and `update`.\n\nReturn JSON only.", + "content": "Evaluate which response best matches the expectation.\n\nExpectation: New CLI commands should be placed in src/commands/, and core logic in src/services/. The architecture uses Commander for CLI, Ink/React for TUI, and simple-git/Octokit for GitHub automation, following strict ESM TypeScript conventions.\n\nResponse A (without custom instructions):\nNew CLI commands should be placed in src/commands/, and core logic should go in src/services/. The architecture uses Commander for CLI wiring, Ink/React for TUI, and separates command definitions from service logic. This modular structure ensures CLI commands are thin wrappers that delegate to reusable service functions, following a clear separation of concerns.\n\nResponse B (with custom instructions):\nNew CLI commands should be placed in src/commands/, and core logic should go in src/services/. The architecture uses Commander for CLI wiring, Ink/React for TUI, and separates concerns by directory: commands for CLI entrypoints, services for business logic, and ui for terminal interfaces. The codebase follows strict TypeScript with ESM, and all new features should adhere to these patterns.\n\nReturn JSON only.", + "transformedContent": "2026-02-04T05:38:33.477Z\n\nEvaluate which response best matches the expectation.\n\nExpectation: New CLI commands should be placed in src/commands/, and core logic in src/services/. The architecture uses Commander for CLI, Ink/React for TUI, and simple-git/Octokit for GitHub automation, following strict ESM TypeScript conventions.\n\nResponse A (without custom instructions):\nNew CLI commands should be placed in src/commands/, and core logic should go in src/services/. The architecture uses Commander for CLI wiring, Ink/React for TUI, and separates command definitions from service logic. This modular structure ensures CLI commands are thin wrappers that delegate to reusable service functions, following a clear separation of concerns.\n\nResponse B (with custom instructions):\nNew CLI commands should be placed in src/commands/, and core logic should go in src/services/. The architecture uses Commander for CLI wiring, Ink/React for TUI, and separates concerns by directory: commands for CLI entrypoints, services for business logic, and ui for terminal interfaces. The codebase follows strict TypeScript with ESM, and all new features should adhere to these patterns.\n\nReturn JSON only.", "attachments": [] } }, { - "timestampMs": 1770182516066, + "timestampMs": 1770183513503, "phase": "judge", "type": "assistant.turn_start", "data": { @@ -4284,932 +9296,756 @@ } }, { - "timestampMs": 1770182516066, + "timestampMs": 1770183513503, "phase": "judge", "type": "session.usage_info", "data": { "tokenLimit": 64000, - "currentTokens": 10644, + "currentTokens": 10704, "messagesLength": 2 } }, { - "timestampMs": 1770182516954, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 2, - "deltaPreview": "{\n", + "deltaPreview": "{\"", "totalResponseSizeBytes": 2 } }, { - "timestampMs": 1770182516954, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 1, - "deltaPreview": " ", - "totalResponseSizeBytes": 3 - } - }, - { - "timestampMs": 1770182516954, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 2, - "deltaPreview": " \"", - "totalResponseSizeBytes": 5 - } - }, - { - "timestampMs": 1770182516954, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 3, "deltaPreview": "ver", - "totalResponseSizeBytes": 8 + "totalResponseSizeBytes": 5 } }, { - "timestampMs": 1770182516954, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 4, "deltaPreview": "dict", - "totalResponseSizeBytes": 12 + "totalResponseSizeBytes": 9 } }, { - "timestampMs": 1770182516954, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 2, "deltaPreview": "\":", - "totalResponseSizeBytes": 14 + "totalResponseSizeBytes": 11 } }, { - "timestampMs": 1770182516954, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 2, "deltaPreview": " \"", - "totalResponseSizeBytes": 16 + "totalResponseSizeBytes": 13 } }, { - "timestampMs": 1770182516954, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 4, "deltaPreview": "pass", - "totalResponseSizeBytes": 20 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": "\",\n", - "totalResponseSizeBytes": 23 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 1, - "deltaPreview": " ", - "totalResponseSizeBytes": 24 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 2, - "deltaPreview": " \"", - "totalResponseSizeBytes": 26 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 5, - "deltaPreview": "score", - "totalResponseSizeBytes": 31 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 2, - "deltaPreview": "\":", - "totalResponseSizeBytes": 33 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 1, - "deltaPreview": " ", - "totalResponseSizeBytes": 34 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": "100", - "totalResponseSizeBytes": 37 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 2, - "deltaPreview": ",\n", - "totalResponseSizeBytes": 39 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 1, - "deltaPreview": " ", - "totalResponseSizeBytes": 40 - } - }, - { - "timestampMs": 1770182517128, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 2, - "deltaPreview": " \"", - "totalResponseSizeBytes": 42 - } - }, - { - "timestampMs": 1770182517320, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 1, - "deltaPreview": "r", - "totalResponseSizeBytes": 43 - } - }, - { - "timestampMs": 1770182517320, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 8, - "deltaPreview": "ationale", - "totalResponseSizeBytes": 51 - } - }, - { - "timestampMs": 1770182517322, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 2, - "deltaPreview": "\":", - "totalResponseSizeBytes": 53 - } - }, - { - "timestampMs": 1770182517322, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 2, - "deltaPreview": " \"", - "totalResponseSizeBytes": 55 - } - }, - { - "timestampMs": 1770182517322, - "phase": "judge", - "type": "assistant.message_delta", - "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 8, - "deltaPreview": "Response", - "totalResponseSizeBytes": 63 + "totalResponseSizeBytes": 17 } }, { - "timestampMs": 1770182517322, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 2, - "deltaPreview": " B", - "totalResponseSizeBytes": 65 + "deltaPreview": "\",", + "totalResponseSizeBytes": 19 } }, { - "timestampMs": 1770182517322, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 5, - "deltaPreview": " best", - "totalResponseSizeBytes": 70 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 21 } }, { - "timestampMs": 1770182517322, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 8, - "deltaPreview": " matches", - "totalResponseSizeBytes": 78 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 5, + "deltaPreview": "score", + "totalResponseSizeBytes": 26 } }, { - "timestampMs": 1770182517323, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " the", - "totalResponseSizeBytes": 82 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 28 } }, { - "timestampMs": 1770182517323, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 12, - "deltaPreview": " expectation", - "totalResponseSizeBytes": 94 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 1, + "deltaPreview": " ", + "totalResponseSizeBytes": 29 } }, { - "timestampMs": 1770182517396, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 3, - "deltaPreview": " by", - "totalResponseSizeBytes": 97 + "deltaPreview": "100", + "totalResponseSizeBytes": 32 } }, { - "timestampMs": 1770182517396, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 11, - "deltaPreview": " explicitly", - "totalResponseSizeBytes": 108 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 33 } }, { - "timestampMs": 1770182517398, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 11, - "deltaPreview": " mentioning", - "totalResponseSizeBytes": 119 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 35 } }, { - "timestampMs": 1770182517398, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " the", - "totalResponseSizeBytes": 123 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 1, + "deltaPreview": "r", + "totalResponseSizeBytes": 36 } }, { - "timestampMs": 1770182517398, + "timestampMs": 1770183514361, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " CLI", - "totalResponseSizeBytes": 127 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 8, + "deltaPreview": "ationale", + "totalResponseSizeBytes": 44 } }, { - "timestampMs": 1770182517398, + "timestampMs": 1770183514513, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 6, - "deltaPreview": " entry", - "totalResponseSizeBytes": 133 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": "\":", + "totalResponseSizeBytes": 46 } }, { - "timestampMs": 1770182517398, + "timestampMs": 1770183514513, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 5, - "deltaPreview": "point", - "totalResponseSizeBytes": 138 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": " \"", + "totalResponseSizeBytes": 48 } }, { - "timestampMs": 1770182517398, + "timestampMs": 1770183514513, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": " in", - "totalResponseSizeBytes": 141 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 4, + "deltaPreview": "Both", + "totalResponseSizeBytes": 52 } }, { - "timestampMs": 1770182517398, + "timestampMs": 1770183514513, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " src", - "totalResponseSizeBytes": 145 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 10, + "deltaPreview": " responses", + "totalResponseSizeBytes": 62 } }, { - "timestampMs": 1770182517398, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 6, - "deltaPreview": "/index", - "totalResponseSizeBytes": 151 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 11, + "deltaPreview": " accurately", + "totalResponseSizeBytes": 73 } }, { - "timestampMs": 1770182517588, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": ".ts", - "totalResponseSizeBytes": 154 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 9, + "deltaPreview": " describe", + "totalResponseSizeBytes": 82 } }, { - "timestampMs": 1770182517588, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 155 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 86 } }, { - "timestampMs": 1770182517588, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 5, - "deltaPreview": " clar", - "totalResponseSizeBytes": 160 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 10, + "deltaPreview": " directory", + "totalResponseSizeBytes": 96 } }, { - "timestampMs": 1770182517588, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 6, - "deltaPreview": "ifying", - "totalResponseSizeBytes": 166 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 10, + "deltaPreview": " structure", + "totalResponseSizeBytes": 106 } }, { - "timestampMs": 1770182517588, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 5, - "deltaPreview": " that", - "totalResponseSizeBytes": 171 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 110 } }, { - "timestampMs": 1770182517589, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": " it", - "totalResponseSizeBytes": 174 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 14, + "deltaPreview": " architectural", + "totalResponseSizeBytes": 124 } }, { - "timestampMs": 1770182517589, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 6, - "deltaPreview": " calls", - "totalResponseSizeBytes": 180 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 12, + "deltaPreview": " conventions", + "totalResponseSizeBytes": 136 } }, { - "timestampMs": 1770182517589, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " run", - "totalResponseSizeBytes": 184 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 137 } }, { - "timestampMs": 1770182517589, + "timestampMs": 1770183514516, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": "Cli", - "totalResponseSizeBytes": 187 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 8, + "deltaPreview": " However", + "totalResponseSizeBytes": 145 } }, { - "timestampMs": 1770182517589, + "timestampMs": 1770183514517, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": " in", - "totalResponseSizeBytes": 190 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 146 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514517, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " src", - "totalResponseSizeBytes": 194 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 9, + "deltaPreview": " Response", + "totalResponseSizeBytes": 155 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514517, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 1, - "deltaPreview": "/", - "totalResponseSizeBytes": 195 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": " B", + "totalResponseSizeBytes": 157 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514517, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": "cli", - "totalResponseSizeBytes": 198 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 11, + "deltaPreview": " explicitly", + "totalResponseSizeBytes": 168 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514517, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": ".ts", - "totalResponseSizeBytes": 201 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 9, + "deltaPreview": " mentions", + "totalResponseSizeBytes": 177 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514517, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 1, - "deltaPreview": ",", - "totalResponseSizeBytes": 202 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 7, + "deltaPreview": " strict", + "totalResponseSizeBytes": 184 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514517, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " and", - "totalResponseSizeBytes": 206 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 5, + "deltaPreview": " Type", + "totalResponseSizeBytes": 189 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 12, - "deltaPreview": " identifying", - "totalResponseSizeBytes": 218 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 6, + "deltaPreview": "Script", + "totalResponseSizeBytes": 195 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 5, - "deltaPreview": " this", - "totalResponseSizeBytes": 223 + "deltaPreview": " with", + "totalResponseSizeBytes": 200 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": " as", - "totalResponseSizeBytes": 226 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": " E", + "totalResponseSizeBytes": 202 } }, { - "timestampMs": 1770182517772, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " the", - "totalResponseSizeBytes": 230 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": "SM", + "totalResponseSizeBytes": 204 } }, { - "timestampMs": 1770182517946, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 7, - "deltaPreview": " Primer", - "totalResponseSizeBytes": 237 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 4, + "deltaPreview": " and", + "totalResponseSizeBytes": 208 } }, { - "timestampMs": 1770182517947, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " CLI", - "totalResponseSizeBytes": 241 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 11, + "deltaPreview": " emphasizes", + "totalResponseSizeBytes": 219 } }, { - "timestampMs": 1770182517947, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 1, - "deltaPreview": ".", - "totalResponseSizeBytes": 242 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 10, + "deltaPreview": " adherence", + "totalResponseSizeBytes": 229 } }, { - "timestampMs": 1770182517947, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 3, - "deltaPreview": " It", - "totalResponseSizeBytes": 245 + "deltaPreview": " to", + "totalResponseSizeBytes": 232 } }, { - "timestampMs": 1770182517947, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 5, - "deltaPreview": " also", - "totalResponseSizeBytes": 250 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 6, + "deltaPreview": " these", + "totalResponseSizeBytes": 238 } }, { - "timestampMs": 1770182517947, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 9, - "deltaPreview": " provides", - "totalResponseSizeBytes": 259 + "deltaPreview": " patterns", + "totalResponseSizeBytes": 247 } }, { - "timestampMs": 1770182517947, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 2, - "deltaPreview": " a", - "totalResponseSizeBytes": 261 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 1, + "deltaPreview": ",", + "totalResponseSizeBytes": 248 } }, { - "timestampMs": 1770182517947, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 5, - "deltaPreview": " more", - "totalResponseSizeBytes": 266 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 6, + "deltaPreview": " which", + "totalResponseSizeBytes": 254 } }, { - "timestampMs": 1770182517947, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 9, - "deltaPreview": " complete", - "totalResponseSizeBytes": 275 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 7, + "deltaPreview": " aligns", + "totalResponseSizeBytes": 261 } }, { - "timestampMs": 1770182517947, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " and", - "totalResponseSizeBytes": 279 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 5, + "deltaPreview": " more", + "totalResponseSizeBytes": 266 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 9, - "deltaPreview": " accurate", - "totalResponseSizeBytes": 288 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 8, + "deltaPreview": " closely", + "totalResponseSizeBytes": 274 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 5, - "deltaPreview": " list", - "totalResponseSizeBytes": 293 + "deltaPreview": " with", + "totalResponseSizeBytes": 279 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": " of", - "totalResponseSizeBytes": 296 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 4, + "deltaPreview": " the", + "totalResponseSizeBytes": 283 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 9, - "deltaPreview": " commands", - "totalResponseSizeBytes": 305 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 12, + "deltaPreview": " expectation", + "totalResponseSizeBytes": 295 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 4, - "deltaPreview": " and", - "totalResponseSizeBytes": 309 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 1, + "deltaPreview": ".", + "totalResponseSizeBytes": 296 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514647, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 9, - "deltaPreview": " features", - "totalResponseSizeBytes": 318 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 10, + "deltaPreview": " Therefore", + "totalResponseSizeBytes": 306 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514648, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 1, "deltaPreview": ",", - "totalResponseSizeBytes": 319 + "totalResponseSizeBytes": 307 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514696, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 9, - "deltaPreview": " aligning", - "totalResponseSizeBytes": 328 + "deltaPreview": " Response", + "totalResponseSizeBytes": 316 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514697, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 8, - "deltaPreview": " closely", - "totalResponseSizeBytes": 336 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": " B", + "totalResponseSizeBytes": 318 } }, { - "timestampMs": 1770182518109, + "timestampMs": 1770183514697, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 5, - "deltaPreview": " with", - "totalResponseSizeBytes": 341 + "deltaPreview": " best", + "totalResponseSizeBytes": 323 + } + }, + { + "timestampMs": 1770183514697, + "phase": "judge", + "type": "assistant.message_delta", + "data": { + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 8, + "deltaPreview": " matches", + "totalResponseSizeBytes": 331 } }, { - "timestampMs": 1770182518143, + "timestampMs": 1770183514697, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 4, "deltaPreview": " the", - "totalResponseSizeBytes": 345 + "totalResponseSizeBytes": 335 } }, { - "timestampMs": 1770182518143, + "timestampMs": 1770183514697, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 12, "deltaPreview": " expectation", - "totalResponseSizeBytes": 357 + "totalResponseSizeBytes": 347 } }, { - "timestampMs": 1770182518144, + "timestampMs": 1770183514697, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "deltaChars": 3, - "deltaPreview": ".\"\n", - "totalResponseSizeBytes": 360 + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "deltaChars": 2, + "deltaPreview": ".\"", + "totalResponseSizeBytes": 349 } }, { - "timestampMs": 1770182518144, + "timestampMs": 1770183514697, "phase": "judge", "type": "assistant.message_delta", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", "deltaChars": 1, "deltaPreview": "}", - "totalResponseSizeBytes": 361 + "totalResponseSizeBytes": 350 } }, { - "timestampMs": 1770182518144, + "timestampMs": 1770183514697, "phase": "judge", "type": "assistant.usage", "data": { "model": "gpt-4.1", - "inputTokens": 10011, - "outputTokens": 84, - "cacheReadTokens": 9088, + "inputTokens": 10071, + "outputTokens": 67, + "cacheReadTokens": 0, "cacheWriteTokens": 0, "cost": 0, - "duration": 2076, + "duration": 1193, "initiator": "user", - "apiCallId": "chatcmpl-D5PcqfwwPo46O2E5lE3WeAmcIK1Zi", - "providerCallId": "E903:35A03D:344C2A:3E0F67:6982D774", + "apiCallId": "chatcmpl-D5PsvwVHQq8uzYv8tYIeUbH1KGMBI", + "providerCallId": "EEC8:177A35:7058AD:84531E:6982DB59", "quotaSnapshots": { "chat": { "isUnlimitedEntitlement": true, @@ -5255,17 +10091,17 @@ } }, { - "timestampMs": 1770182518144, + "timestampMs": 1770183514697, "phase": "judge", "type": "assistant.message", "data": { - "messageId": "6ad656ac-ac73-46bf-84ec-17eb192a7cbe", - "content": "{\n \"verdict\": \"pass\",\n \"score\": 100,\n \"rationale\": \"Response B best matches the expectation by explicitly mentioning the CLI entrypoint in src/index.ts, clarifying that it calls runCli in src/cli.ts, and identifying this as the Primer CLI. It also provides a more complete and accurate list of commands and features, aligning closely with the expectation.\"\n}", + "messageId": "4f11d677-e5a6-4faa-ad11-da2ace577be9", + "content": "{\"verdict\": \"pass\", \"score\": 100, \"rationale\": \"Both responses accurately describe the directory structure and architectural conventions. However, Response B explicitly mentions strict TypeScript with ESM and emphasizes adherence to these patterns, which aligns more closely with the expectation. Therefore, Response B best matches the expectation.\"}", "toolRequests": [] } }, { - "timestampMs": 1770182518144, + "timestampMs": 1770183514697, "phase": "judge", "type": "assistant.turn_end", "data": { @@ -5273,7 +10109,7 @@ } }, { - "timestampMs": 1770182518144, + "timestampMs": 1770183514697, "phase": "judge", "type": "session.idle", "data": {} diff --git a/src/cli.ts b/src/cli.ts index 4382f71..77cf4a9 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -55,6 +55,7 @@ export function runCli(argv: string[]): void { .option("--repo ", "Repository path", process.cwd()) .option("--model ", "Model for responses", "gpt-5") .option("--judge-model ", "Model for judging", "gpt-5") + .option("--list-models", "List Copilot CLI models and exit") .option("--output ", "Write results JSON to file") .option("--init", "Create a starter primer.eval.json file") .option("--count ", "Number of eval cases to generate (with --init)") diff --git a/src/commands/eval.ts b/src/commands/eval.ts index c592b1a..104a069 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -1,6 +1,7 @@ import path from "path"; import fs from "fs/promises"; import { runEval } from "../services/evaluator"; +import { listCopilotModels } from "../services/copilot"; import { generateEvalScaffold } from "../services/evalScaffold"; type EvalOptions = { @@ -10,10 +11,21 @@ type EvalOptions = { output?: string; init?: boolean; count?: string; + listModels?: boolean; }; export async function evalCommand(configPathArg: string | undefined, options: EvalOptions): Promise { const repoPath = path.resolve(options.repo ?? process.cwd()); + + if (options.listModels) { + const models = await listCopilotModels(); + if (!models.length) { + console.log("No models detected from Copilot CLI."); + return; + } + console.log(models.join("\n")); + return; + } // Handle --init flag if (options.init) { diff --git a/src/services/copilot.ts b/src/services/copilot.ts index 0cec90a..38af3eb 100644 --- a/src/services/copilot.ts +++ b/src/services/copilot.ts @@ -16,6 +16,12 @@ export async function assertCopilotCliReady(): Promise { return cliPath; } +export async function listCopilotModels(): Promise { + const cliPath = await assertCopilotCliReady(); + const { stdout } = await execFileAsync(cliPath, ["--help"], { timeout: 5000 }); + return extractModelChoices(stdout); +} + async function findCopilotCliPath(): Promise { try { const { stdout } = await execFileAsync("which", ["copilot"], { timeout: 5000 }); @@ -43,3 +49,33 @@ async function findCopilotCliPath(): Promise { throw new Error("Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code."); } + +function extractModelChoices(helpText: string): string[] { + const lines = helpText.split("\n"); + let captured = ""; + + for (let index = 0; index < lines.length; index += 1) { + const line = lines[index]; + if (!line.includes("--model")) continue; + + captured = line.trim(); + while (!captured.includes(")") && index + 1 < lines.length) { + index += 1; + captured += ` ${lines[index].trim()}`; + } + break; + } + + const match = captured.match(/choices:\s*([^)]*)/); + if (!match) return []; + + const models: string[] = []; + const matcher = /"([^"]+)"/g; + let entry = matcher.exec(match[1]); + while (entry) { + models.push(entry[1]); + entry = matcher.exec(match[1]); + } + + return models; +} diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index d325e87..ed7fce5 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -636,6 +636,7 @@ function buildTrajectoryViewerHtml(data: Record): string { .section h3 { margin: 8px 0; font-size: 14px; color: #c7ccd6; } .chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; } .chip { background: #1e2232; border: 1px solid #2c3250; border-radius: 999px; padding: 2px 8px; font-size: 12px; color: #c9d1e3; } + .chip.phase { background: #23283b; border-color: #3a4163; color: #aeb7c6; } .muted { color: #8a93a5; font-size: 12px; } .filters { display: flex; gap: 12px; align-items: center; margin-top: 8px; } .filters label { font-size: 12px; color: #b7bdc8; } @@ -674,6 +675,7 @@ function buildTrajectoryViewerHtml(data: Record): string { const results = data.results || []; let activeCaseId = null; let toolsOnly = false; + let phaseFilter = 'all'; summaryEl.textContent = 'Repo: ' + (data.repoPath || 'unknown') + @@ -682,10 +684,11 @@ function buildTrajectoryViewerHtml(data: Record): string { ' • Judge: ' + (data.judgeModel || 'unknown'); - function collectToolCounts(events) { + function collectToolCounts(events, phase) { const counts = { total: 0, byName: {} }; if (!events) return counts; events.forEach((event) => { + if (phase && event.phase !== phase) return; if (event.type !== 'tool.execution_start') return; const name = (event.data && event.data.toolName) || 'unknown'; counts.total += 1; @@ -746,7 +749,7 @@ function buildTrajectoryViewerHtml(data: Record): string { return ( 'Duration: ' + m.durationMs + - 'ms • Tokens: ' + + 'ms • Tokens (prompt/completion/total): ' + prompt + ' / ' + completion + @@ -776,9 +779,11 @@ function buildTrajectoryViewerHtml(data: Record): string { function renderTrajectory(events) { if (!events || !events.length) return '

No trajectory events captured.

'; - const filtered = toolsOnly - ? events.filter((event) => event.type.startsWith('tool.')) - : events; + const filtered = events.filter((event) => { + if (phaseFilter !== 'all' && event.phase !== phaseFilter) return false; + if (toolsOnly && !event.type.startsWith('tool.')) return false; + return true; + }); return ( '
' + filtered @@ -811,12 +816,23 @@ function buildTrajectoryViewerHtml(data: Record): string { activeCaseId = result.id; renderCaseList(result.id); const toolCounts = collectToolCounts(result.trajectory || []); + const toolCountsWithout = collectToolCounts(result.trajectory || [], 'withoutInstructions'); + const toolCountsWith = collectToolCounts(result.trajectory || [], 'withInstructions'); + const toolCountsJudge = collectToolCounts(result.trajectory || [], 'judge'); caseDetailsEl.innerHTML = '

' + escapeHtml(result.id) + '

' + '
' + '' + + '' + '
' + '
' + '

Tool calls

' + @@ -824,6 +840,19 @@ function buildTrajectoryViewerHtml(data: Record): string { renderToolChips(toolCounts, 8) + '
' + '
' + + '

Tool calls by phase

' + + '
Without: ' + toolCountsWithout.total + ' • With: ' + toolCountsWith.total + ' • Judge: ' + toolCountsJudge.total + '
' + + '
' + + 'withoutInstructions' + renderToolChips(toolCountsWithout, 6) + + '
' + + '
' + + 'withInstructions' + renderToolChips(toolCountsWith, 6) + + '
' + + '
' + + 'judge' + renderToolChips(toolCountsJudge, 6) + + '
' + + '
' + + '
' + '

Summary

' + '

Verdict: ' + escapeHtml(result.verdict ?? 'unknown') + @@ -853,6 +882,14 @@ function buildTrajectoryViewerHtml(data: Record): string { renderCaseDetails(activeCaseId); }); } + + const phaseSelect = document.getElementById('phaseFilter'); + if (phaseSelect) { + phaseSelect.addEventListener('change', (event) => { + phaseFilter = event.target.value || 'all'; + renderCaseDetails(activeCaseId); + }); + } } renderOverallToolSummary(); diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 02949d7..9c16ce6 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -8,8 +8,11 @@ import { runEval, type EvalResult } from "../services/evaluator"; import { generateEvalScaffold } from "../services/evalScaffold"; import { AnimatedBanner, StaticBanner } from "./AnimatedBanner"; import { BatchTui } from "./BatchTui"; +import { BatchTuiAzure } from "./BatchTuiAzure"; import { getGitHubToken } from "../services/github"; +import { getAzureDevOpsToken } from "../services/azureDevops"; import { safeWriteFile } from "../utils/fs"; +import { ReadinessReport, ReadinessCriterionResult, runReadinessReport } from "../services/readiness"; type Props = { repoPath: string; @@ -21,12 +24,14 @@ type Status = | "idle" | "analyzing" | "generating" + | "readiness" | "bootstrapping" | "evaluating" | "preview" | "done" | "error" - | "batch" + | "batch-github" + | "batch-azure" | "bootstrapEvalCount" | "bootstrapEvalConfirm"; @@ -46,8 +51,10 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const [evalResults, setEvalResults] = useState(null); const [evalViewerPath, setEvalViewerPath] = useState(null); const [batchToken, setBatchToken] = useState(null); + const [batchAzureToken, setBatchAzureToken] = useState(null); const [evalCaseCountInput, setEvalCaseCountInput] = useState(""); const [evalBootstrapCount, setEvalBootstrapCount] = useState(null); + const [readinessReport, setReadinessReport] = useState(null); const repoLabel = useMemo(() => repoPath, [repoPath]); const handleAnimationComplete = () => { @@ -223,7 +230,21 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return; } setBatchToken(token); - setStatus("batch"); + setStatus("batch-github"); + return; + } + + if (input.toLowerCase() === "z") { + setStatus("analyzing"); + setMessage("Checking Azure DevOps authentication..."); + const token = getAzureDevOpsToken(); + if (!token) { + setStatus("error"); + setMessage("Azure DevOps PAT required. Set AZURE_DEVOPS_PAT or AZDO_PAT."); + return; + } + setBatchAzureToken(token); + setStatus("batch-azure"); return; } @@ -269,6 +290,21 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setEvalCaseCountInput(""); setEvalBootstrapCount(null); } + + if (input.toLowerCase() === "r") { + setStatus("readiness"); + setMessage("Running readiness report..."); + setReadinessReport(null); + try { + const report = await runReadinessReport({ repoPath }); + setReadinessReport(report); + setStatus("done"); + setMessage("Readiness report complete."); + } catch (error) { + setStatus("error"); + setMessage(error instanceof Error ? error.message : "Readiness report failed."); + } + } }); const statusLabel = status === "intro" ? "starting" : status === "idle" ? "ready" : status; @@ -287,10 +323,14 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const truncatedPreview = previewLines.join("\n") + (generatedContent.split("\n").length > 20 ? "\n..." : ""); // Render BatchTui when in batch mode - if (status === "batch" && batchToken) { + if (status === "batch-github" && batchToken) { return ; } + if (status === "batch-azure" && batchAzureToken) { + return ; + } + return ( {status === "intro" ? ( @@ -352,6 +392,29 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX )} )} + {readinessReport && ( + + Readiness Report: + Level: {readinessReport.achievedLevel || 1} ({levelName(readinessReport.achievedLevel || 1)}) + Monorepo: {readinessReport.isMonorepo ? "yes" : "no"}{readinessReport.apps.length ? ` (${readinessReport.apps.length} apps)` : ""} + Pillars: + {readinessReport.pillars.map((pillar) => ( + = 0.8 ? "green" : "yellow"}> + {pillar.name}: {pillar.passed}/{pillar.total} ({formatPercent(pillar.passRate)}) + + ))} + {topFixes(readinessReport.criteria).length > 0 && ( + <> + Fix first: + {topFixes(readinessReport.criteria).map((fix) => ( + + - {fix.title} ({fix.impact}/{fix.effort}) + + ))} + + )} + + )} {status === "intro" ? ( Press any key to skip animation... @@ -360,9 +423,44 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX ) : status === "bootstrapEvalConfirm" ? ( Keys: [Y] Overwrite [N] Cancel [Q] Quit ) : ( - Keys: [A] Analyze [G] Generate [E] Eval [I] Init Eval [B] Batch [Q] Quit + Keys: [A] Analyze [G] Generate [R] Readiness [E] Eval [I] Init Eval [B] Batch [Z] Batch Azure [Q] Quit )} ); } + +function topFixes(criteria: ReadinessCriterionResult[]): ReadinessCriterionResult[] { + return criteria + .filter((criterion) => criterion.status === "fail") + .sort((a, b) => { + const impactDelta = impactWeight(b.impact) - impactWeight(a.impact); + if (impactDelta !== 0) return impactDelta; + return effortWeight(a.effort) - effortWeight(b.effort); + }) + .slice(0, 5); +} + +function impactWeight(value: "high" | "medium" | "low"): number { + if (value === "high") return 3; + if (value === "medium") return 2; + return 1; +} + +function effortWeight(value: "low" | "medium" | "high"): number { + if (value === "low") return 1; + if (value === "medium") return 2; + return 3; +} + +function formatPercent(value: number): string { + return `${Math.round(value * 100)}%`; +} + +function levelName(level: number): string { + if (level === 2) return "Documented"; + if (level === 3) return "Standardized"; + if (level === 4) return "Optimized"; + if (level === 5) return "Autonomous"; + return "Functional"; +} From 3dc1fe6e77dbf938319031a48a0ca52ce290d854 Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Tue, 3 Feb 2026 22:46:33 -0700 Subject: [PATCH 05/84] Enhance evaluation scaffolding with system message for repository context - Added a systemMessage field to primer.eval.json to clarify response context. - Updated evalScaffold.ts to include instructions for incorporating the system message in generated cases. - Modified evaluator.ts to use a default system message when none is provided, ensuring responses are relevant to the repository. --- eval-results.html | 2 +- eval-results.json | 6687 ++++++++++++++-------------------- examples/primer.eval.json | 1 + src/services/evalScaffold.ts | 7 +- src/services/evaluator.ts | 8 +- 5 files changed, 2813 insertions(+), 3892 deletions(-) diff --git a/eval-results.html b/eval-results.html index 3d2da62..b7babab 100644 --- a/eval-results.html +++ b/eval-results.html @@ -37,7 +37,7 @@

Primer Eval Trajectory

`; } +// ── Helper Functions ────────────────────────────────────────────────── + function calculatePillarStats(reports: Array<{ repo: string; report: ReadinessReport }>): Array<{ id: string; name: string; @@ -494,18 +604,18 @@ function getTopFixesHtml(report: ReadinessReport): string { .slice(0, 3); if (failedCriteria.length === 0) { - return '
✅ All criteria passing!
'; + return '
All criteria passing
'; } return ` -
-
Top Fixes Needed:
-
    +
    +
    Top Fixes Needed
    +
      ${failedCriteria.map(c => ` -
    • - - ${escapeHtml(c.title)} - (${c.impact} impact, ${c.effort} effort) +
    • + + ${escapeHtml(c.title)} + ${c.impact} impact, ${c.effort} effort
    • `).join('')}
    @@ -524,12 +634,165 @@ function getLevelName(level: number): string { return names[level] || "Unknown"; } +function getLevelDescription(level: number): string { + const descriptions: Record = { + 1: "Repo builds, tests run, and basic tooling (linter, lockfile) is in place. AI agents can clone and get started.", + 2: "README, CONTRIBUTING guide, and custom AI instructions exist. Agents understand project context and conventions.", + 3: "CI/CD, security policies, CODEOWNERS, and observability are configured. Agents operate within well-defined guardrails.", + 4: "MCP servers, custom agents, and AI skills are set up. Agents have deep integration with project-specific tools and workflows.", + 5: "Full AI-native development: agents can independently plan, implement, test, and ship changes with minimal human oversight." + }; + return descriptions[level] || ""; +} + function getProgressClass(passRate: number): string { if (passRate >= 0.8) return "high"; if (passRate >= 0.5) return "medium"; return "low"; } +// ── AI Tooling Hero ─────────────────────────────────────────────────── + +type AiToolingCriterionSummary = { + id: string; + title: string; + passCount: number; + totalRepos: number; + status: "pass" | "fail"; + evidence: string[]; + reason: string; +}; + +type AiToolingData = { + criteria: AiToolingCriterionSummary[]; + passed: number; + total: number; + passRate: number; +}; + +function calculateAiToolingData(reports: Array<{ repo: string; report: ReadinessReport }>): AiToolingData { + const criterionMap = new Map(); + + for (const { report } of reports) { + const aiCriteria = report.criteria.filter(c => c.pillar === "ai-tooling"); + for (const c of aiCriteria) { + const existing = criterionMap.get(c.id); + if (existing) { + existing.totalRepos += 1; + if (c.status === "pass") existing.passCount += 1; + if (c.evidence) existing.evidence.push(...c.evidence); + } else { + criterionMap.set(c.id, { + id: c.id, + title: c.title, + passCount: c.status === "pass" ? 1 : 0, + totalRepos: 1, + status: c.status === "pass" ? "pass" : "fail", + evidence: c.evidence ? [...c.evidence] : [], + reason: c.reason || "" + }); + } + } + } + + const criteria = Array.from(criterionMap.values()).map(c => ({ + ...c, + status: (c.passCount / c.totalRepos >= 0.5 ? "pass" : "fail") as "pass" | "fail", + evidence: [...new Set(c.evidence)] + })); + + const passed = criteria.filter(c => c.status === "pass").length; + return { + criteria, + passed, + total: criteria.length, + passRate: criteria.length > 0 ? passed / criteria.length : 0 + }; +} + +function getAiScoreClass(passRate: number): string { + if (passRate >= 0.6) return "score-high"; + if (passRate >= 0.3) return "score-medium"; + return "score-low"; +} + +function getAiScoreLabel(passRate: number): string { + if (passRate >= 0.8) return "Excellent"; + if (passRate >= 0.6) return "Good"; + if (passRate >= 0.4) return "Fair"; + if (passRate >= 0.2) return "Getting Started"; + return "Not Started"; +} + +function getAiCriterionIcon(id: string): string { + const icons: Record = { + "custom-instructions": "📝", + "mcp-config": "🔌", + "custom-agents": "🤖", + "copilot-skills": "⚡" + }; + return icons[id] || "🔧"; +} + +function buildAiToolingHeroHtml(data: AiToolingData, reports: Array<{ repo: string; report: ReadinessReport }>): string { + if (data.criteria.length === 0) return ""; + + const pct = Math.round(data.passRate * 100); + const scoreClass = getAiScoreClass(data.passRate); + const scoreLabel = getAiScoreLabel(data.passRate); + + const multiRepo = reports.length > 1; + const perRepoHtml = multiRepo ? ` +
    +
    Per Repository
    +
    + ${reports.map(({ repo, report }) => { + const aiPillar = report.pillars.find(p => p.id === "ai-tooling"); + const repoPct = aiPillar ? Math.round(aiPillar.passRate * 100) : 0; + const repoPass = aiPillar?.passed ?? 0; + const repoTotal = aiPillar?.total ?? 0; + return `
    + ${escapeHtml(repo)} + ${repoPass}/${repoTotal} (${repoPct}%) +
    `; + }).join('')} +
    +
    + ` : ''; + + return ` +
    +

    AI Tooling Readiness

    +

    How well prepared ${multiRepo ? 'your repositories are' : 'this repository is'} for AI-assisted development

    + +
    +
    ${pct}%
    +
    +
    ${scoreLabel}
    +
    ${data.passed} of ${data.total} AI tooling checks passing${multiRepo ? ` across ${reports.length} repositories` : ''}
    +
    +
    + +
    + ${data.criteria.map(c => ` +
    +
    + ${c.status === 'pass' ? '✓' : '✗'} +
    +
    +
    ${getAiCriterionIcon(c.id)} ${escapeHtml(c.title)}
    +
    ${c.status === 'pass' + ? (multiRepo ? `${c.passCount}/${c.totalRepos} repos` : 'Detected') + : escapeHtml(c.reason)}
    +
    +
    + `).join('')} +
    + ${perRepoHtml} +
    + `; +} + function escapeHtml(text: string): string { const map: Record = { "&": "&", diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 517e767..1399448 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useMemo, useState } from "react"; +import React, { useEffect, useMemo, useState, useRef } from "react"; import { Box, Key, Text, useApp, useInput } from "ink"; import fs from "fs/promises"; import path from "path"; @@ -12,7 +12,6 @@ import { BatchTuiAzure } from "./BatchTuiAzure"; import { getGitHubToken } from "../services/github"; import { getAzureDevOpsToken } from "../services/azureDevops"; import { safeWriteFile } from "../utils/fs"; -import { ReadinessReport, ReadinessCriterionResult, runReadinessReport } from "../services/readiness"; type Props = { repoPath: string; @@ -23,24 +22,70 @@ type Status = | "intro" | "idle" | "generating" - | "readiness" | "bootstrapping" | "evaluating" | "preview" | "done" | "error" + | "batch-pick" | "batch-github" | "batch-azure" + | "eval-pick" | "bootstrapEvalCount" | "bootstrapEvalConfirm"; -type EvalConfig = { - instructionFile?: string; - cases: Array<{ id: string; prompt: string; expectation: string }>; - systemMessage?: string; - outputPath?: string; +type LogEntry = { + text: string; + type: "info" | "success" | "error" | "progress"; + time: string; }; +const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]; + +function useSpinner(active: boolean): string { + const [frame, setFrame] = useState(0); + useEffect(() => { + if (!active) return; + const interval = setInterval(() => { + setFrame((f) => (f + 1) % SPINNER_FRAMES.length); + }, 80); + return () => clearInterval(interval); + }, [active]); + return active ? SPINNER_FRAMES[frame] : ""; +} + +function timestamp(): string { + return new Date().toLocaleTimeString("en-US", { hour12: false, hour: "2-digit", minute: "2-digit", second: "2-digit" }); +} + +function KeyHint({ k, label }: { k: string; label: string }): React.JSX.Element { + return ( + + {"["} + {k} + {"]"} + {label} + + ); +} + +function Divider({ label }: { label?: string }): React.JSX.Element { + if (label) { + return ( + + {"── "} + {label} + {" ──────────────────────────────────────────"} + + ); + } + return ( + + {"────────────────────────────────────────────────────"} + + ); +} + export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX.Element { const app = useApp(); const [status, setStatus] = useState(skipAnimation ? "idle" : "intro"); @@ -52,11 +97,19 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const [batchAzureToken, setBatchAzureToken] = useState(null); const [evalCaseCountInput, setEvalCaseCountInput] = useState(""); const [evalBootstrapCount, setEvalBootstrapCount] = useState(null); - const [readinessReport, setReadinessReport] = useState(null); const [availableModels, setAvailableModels] = useState([]); const [evalModel, setEvalModel] = useState("gpt-4.1"); const [judgeModel, setJudgeModel] = useState("gpt-4.1"); - const repoLabel = useMemo(() => repoPath, [repoPath]); + const [hasEvalConfig, setHasEvalConfig] = useState(null); + const [activityLog, setActivityLog] = useState([]); + const repoLabel = useMemo(() => path.basename(repoPath), [repoPath]); + const repoFull = useMemo(() => repoPath, [repoPath]); + const isLoading = status === "generating" || status === "bootstrapping" || status === "evaluating"; + const spinner = useSpinner(isLoading); + + const addLog = (text: string, type: LogEntry["type"] = "info") => { + setActivityLog((prev) => [...prev.slice(-4), { text, type, time: timestamp() }]); + }; const handleAnimationComplete = () => { setStatus("idle"); @@ -69,6 +122,12 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return availableModels[nextIndex]; }; + // Check for eval config on mount + useEffect(() => { + const configPath = path.join(repoPath, "primer.eval.json"); + fs.access(configPath).then(() => setHasEvalConfig(true)).catch(() => setHasEvalConfig(false)); + }, [repoPath]); + useEffect(() => { let active = true; listCopilotModels() @@ -93,6 +152,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX try { setStatus("bootstrapping"); setMessage("Generating eval cases with Copilot SDK..."); + addLog("Generating eval scaffold...", "progress"); const config = await generateEvalScaffold({ repoPath, count, @@ -100,11 +160,16 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX onProgress: (msg) => setMessage(msg) }); await safeWriteFile(configPath, JSON.stringify(config, null, 2), force); + setHasEvalConfig(true); setStatus("idle"); - setMessage(`Generated primer.eval.json with ${config.cases.length} cases.`); + const msg = `Generated primer.eval.json with ${config.cases.length} cases.`; + setMessage(msg); + addLog(msg, "success"); } catch (error) { setStatus("error"); - setMessage(error instanceof Error ? error.message : "Failed to generate eval config."); + const msg = error instanceof Error ? error.message : "Failed to generate eval config."; + setMessage(msg); + addLog(msg, "error"); } }; @@ -126,17 +191,22 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX await fs.mkdir(path.dirname(outputPath), { recursive: true }); await fs.writeFile(outputPath, generatedContent, "utf8"); setStatus("done"); - setMessage("Saved to .github/copilot-instructions.md"); + const msg = "Saved to .github/copilot-instructions.md"; + setMessage(msg); + addLog(msg, "success"); setGeneratedContent(""); } catch (error) { setStatus("error"); - setMessage(error instanceof Error ? error.message : "Failed to save."); + const msg = error instanceof Error ? error.message : "Failed to save."; + setMessage(msg); + addLog(msg, "error"); } return; } if (input.toLowerCase() === "d") { setStatus("idle"); setMessage("Discarded generated instructions."); + addLog("Discarded instructions.", "info"); setGeneratedContent(""); return; } @@ -198,9 +268,110 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return; } + if (status === "eval-pick") { + if (input.toLowerCase() === "r") { + // Run eval + const configPath = path.join(repoPath, "primer.eval.json"); + const outputPath = path.join(repoPath, ".primer", "evals", buildTimestampedName("eval-results")); + try { + await fs.access(configPath); + } catch { + setStatus("error"); + const msg = "No primer.eval.json found. Press [E] then [I] to create one."; + setMessage(msg); + addLog(msg, "error"); + return; + } + + setStatus("evaluating"); + setMessage("Running evals... (this may take a few minutes)"); + addLog("Running evals...", "progress"); + setEvalResults(null); + setEvalViewerPath(null); + try { + const { results, viewerPath } = await runEval({ + configPath, + repoPath, + model: evalModel, + judgeModel: judgeModel, + outputPath + }); + setEvalResults(results); + setEvalViewerPath(viewerPath ?? null); + const passed = results.filter((r) => r.verdict === "pass").length; + const failed = results.filter((r) => r.verdict === "fail").length; + setStatus("done"); + const msg = `Eval complete: ${passed} pass, ${failed} fail out of ${results.length} cases.`; + setMessage(msg); + addLog(msg, "success"); + } catch (error) { + setStatus("error"); + const msg = error instanceof Error ? error.message : "Eval failed."; + setMessage(msg); + addLog(msg, "error"); + } + return; + } + if (input.toLowerCase() === "i") { + setStatus("bootstrapEvalCount"); + setMessage("Enter number of eval cases, then press Enter."); + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + return; + } + if (key.escape || input.toLowerCase() === "b") { + setStatus("idle"); + setMessage(""); + return; + } + return; + } + + if (status === "batch-pick") { + if (input.toLowerCase() === "g") { + setStatus("generating"); + setMessage("Checking GitHub authentication..."); + addLog("Starting batch (GitHub)...", "progress"); + const token = await getGitHubToken(); + if (!token) { + setStatus("error"); + const msg = "GitHub auth required. Run 'gh auth login' or set GITHUB_TOKEN."; + setMessage(msg); + addLog(msg, "error"); + return; + } + setBatchToken(token); + setStatus("batch-github"); + return; + } + if (input.toLowerCase() === "a") { + setStatus("generating"); + setMessage("Checking Azure DevOps authentication..."); + addLog("Starting batch (Azure DevOps)...", "progress"); + const token = getAzureDevOpsToken(); + if (!token) { + setStatus("error"); + const msg = "Azure DevOps PAT required. Set AZURE_DEVOPS_PAT or AZDO_PAT."; + setMessage(msg); + addLog(msg, "error"); + return; + } + setBatchAzureToken(token); + setStatus("batch-azure"); + return; + } + if (key.escape || input.toLowerCase() === "b") { + setStatus("idle"); + setMessage(""); + return; + } + return; + } + if (input.toLowerCase() === "g") { setStatus("generating"); setMessage("Starting generation..."); + addLog("Generating copilot instructions...", "progress"); try { const content = await generateCopilotInstructions({ repoPath, @@ -212,78 +383,29 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setGeneratedContent(content); setStatus("preview"); setMessage("Review the generated instructions below."); + addLog("Instructions generated — review and save.", "success"); } catch (error) { setStatus("error"); - const message = error instanceof Error ? error.message : "Generation failed."; - if (message.toLowerCase().includes("auth") || message.toLowerCase().includes("login")) { - setMessage(`${message} Run 'copilot' then '/login' in a separate terminal.`); + const msg = error instanceof Error ? error.message : "Generation failed."; + if (msg.toLowerCase().includes("auth") || msg.toLowerCase().includes("login")) { + setMessage(`${msg} Run 'copilot' then '/login' in a separate terminal.`); } else { - setMessage(message); + setMessage(msg); } + addLog(msg, "error"); } } if (input.toLowerCase() === "b") { - setStatus("generating"); - setMessage("Checking GitHub authentication..."); - const token = await getGitHubToken(); - if (!token) { - setStatus("error"); - setMessage("GitHub auth required. Run 'gh auth login' or set GITHUB_TOKEN."); - return; - } - setBatchToken(token); - setStatus("batch-github"); - return; - } - - if (input.toLowerCase() === "z") { - setStatus("generating"); - setMessage("Checking Azure DevOps authentication..."); - const token = getAzureDevOpsToken(); - if (!token) { - setStatus("error"); - setMessage("Azure DevOps PAT required. Set AZURE_DEVOPS_PAT or AZDO_PAT."); - return; - } - setBatchAzureToken(token); - setStatus("batch-azure"); + setStatus("batch-pick"); + setMessage("Select batch provider."); return; } if (input.toLowerCase() === "e") { - const configPath = path.join(repoPath, "primer.eval.json"); - const outputPath = path.join(repoPath, ".primer", "evals", buildTimestampedName("eval-results")); - try { - await fs.access(configPath); - } catch { - setStatus("error"); - setMessage("No primer.eval.json found. Run 'primer eval --init' to create one."); - return; - } - - setStatus("evaluating"); - setMessage("Running evals... (this may take a few minutes)"); - setEvalResults(null); - setEvalViewerPath(null); - try { - const { results, viewerPath } = await runEval({ - configPath, - repoPath, - model: evalModel, - judgeModel: judgeModel, - outputPath - }); - setEvalResults(results); - setEvalViewerPath(viewerPath ?? null); - const passed = results.filter((r) => r.verdict === "pass").length; - const failed = results.filter((r) => r.verdict === "fail").length; - setStatus("done"); - setMessage(`Eval complete: ${passed} pass, ${failed} fail out of ${results.length} cases.`); - } catch (error) { - setStatus("error"); - setMessage(error instanceof Error ? error.message : "Eval failed."); - } + setStatus("eval-pick"); + setMessage("Select eval action."); + return; } if (input.toLowerCase() === "m") { @@ -293,7 +415,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX } const next = cycleModel(evalModel); setEvalModel(next); - setMessage(`Eval model: ${next}`); + setMessage(`Eval model → ${next}`); return; } @@ -304,35 +426,15 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX } const next = cycleModel(judgeModel); setJudgeModel(next); - setMessage(`Judge model: ${next}`); + setMessage(`Judge model → ${next}`); return; } - - if (input.toLowerCase() === "i") { - setStatus("bootstrapEvalCount"); - setMessage("Enter number of eval cases, then press Enter."); - setEvalCaseCountInput(""); - setEvalBootstrapCount(null); - } - - if (input.toLowerCase() === "r") { - setStatus("readiness"); - setMessage("Running readiness report..."); - setReadinessReport(null); - try { - const report = await runReadinessReport({ repoPath }); - setReadinessReport(report); - setStatus("done"); - setMessage("Readiness report complete."); - } catch (error) { - setStatus("error"); - setMessage(error instanceof Error ? error.message : "Readiness report failed."); - } - } }); - const statusLabel = status === "intro" ? "starting" : status === "idle" ? "ready" : status; - const statusColor = status === "error" ? "red" : status === "done" ? "green" : "yellow"; + const statusIcon = status === "error" ? "✗" : status === "done" ? "✓" : isLoading ? spinner : "●"; + const statusLabel = status === "intro" ? "starting" : status === "idle" ? "ready" : status === "bootstrapEvalCount" ? "input" : status === "bootstrapEvalConfirm" ? "confirm" : status === "eval-pick" ? "eval" : status === "batch-pick" ? "batch" : status; + const statusColor = status === "error" ? "red" : status === "done" ? "green" : isLoading ? "yellow" : "cyanBright"; + const formatTokens = (result: EvalResult): string => { const withUsage = result.metrics?.withInstructions?.tokenUsage; const withoutUsage = result.metrics?.withoutInstructions?.tokenUsage; @@ -342,11 +444,9 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return `tokens w/: ${withTotal ?? "n/a"} • w/o: ${withoutTotal ?? "n/a"}`; }; - // Truncate preview to fit terminal const previewLines = generatedContent.split("\n").slice(0, 20); const truncatedPreview = previewLines.join("\n") + (generatedContent.split("\n").length > 20 ? "\n..." : ""); - // Render BatchTui when in batch mode if (status === "batch-github" && batchToken) { return ; } @@ -362,75 +462,143 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX ) : ( )} + + {/* Status Bar */} - Prime your repo for AI - ● {statusLabel} + Prime your repo for AI + {statusIcon} {statusLabel} - Repo: {repoLabel} - Eval model: {evalModel} • Judge model: {judgeModel} - - - Activity + {/* Context */} + + + + Repo + {repoLabel} + {repoFull} + + + Model + {evalModel} + • Judge + {judgeModel} + {availableModels.length > 0 && ({availableModels.length} available)} + + + Eval + {hasEvalConfig === null ? ( + checking... + ) : hasEvalConfig ? ( + primer.eval.json found + ) : ( + no eval config — press [I] to create + )} - {message || "Awaiting input."} + + {/* Activity */} + + + {activityLog.length === 0 && !message ? ( + Awaiting input. + ) : ( + <> + {activityLog.slice(-3).map((entry, i) => ( + + {entry.time} + + {entry.text} + + + ))} + {message && !activityLog.some(e => e.text === message) && ( + + {isLoading ? `${spinner} ` : ""}{message} + + )} + + )} + + + {/* Input: eval case count */} {status === "bootstrapEvalCount" && ( - - Eval case count: {evalCaseCountInput || ""} + + Eval case count: + {evalCaseCountInput || "▍"} )} + + {/* Preview */} {status === "preview" && generatedContent && ( - Preview (.github/copilot-instructions.md): + Preview (.github/copilot-instructions.md) {truncatedPreview} )} + + {/* Eval Results */} {evalResults && evalResults.length > 0 && ( - - Eval Results: - {evalResults.map((r) => ( - - {r.verdict === "pass" ? "✓" : r.verdict === "fail" ? "✗" : "?"} {r.id}: {r.verdict} (score: {r.score}) • {formatTokens(r)} - - ))} - {evalViewerPath && ( - Trajectory viewer: {evalViewerPath} - )} - - )} - {readinessReport && ( - - Readiness Report: - Level: {readinessReport.achievedLevel || 1} ({levelName(readinessReport.achievedLevel || 1)}) - Monorepo: {readinessReport.isMonorepo ? "yes" : "no"}{readinessReport.apps.length ? ` (${readinessReport.apps.length} apps)` : ""} - Pillars: - {readinessReport.pillars.map((pillar) => ( - = 0.8 ? "green" : "yellow"}> - {pillar.name}: {pillar.passed}/{pillar.total} ({formatPercent(pillar.passRate)}) - - ))} - {topFixes(readinessReport.criteria).length > 0 && ( - <> - Fix first: - {topFixes(readinessReport.criteria).map((fix) => ( - - - {fix.title} ({fix.impact}/{fix.effort}) + <> + + + {evalResults.map((r) => ( + + + {r.verdict === "pass" ? "✓" : r.verdict === "fail" ? "✗" : "?"}{" "} - ))} - - )} - + {r.id} + score:{r.score} • {formatTokens(r)} + + ))} + {evalViewerPath && ( + Viewer: {evalViewerPath} + )} + + )} - + + {/* Commands */} + + {status === "intro" ? ( Press any key to skip animation... ) : status === "preview" ? ( - Keys: [S] Save [D] Discard [Q] Quit + + + + + ) : status === "bootstrapEvalConfirm" ? ( - Keys: [Y] Overwrite [N] Cancel [Q] Quit + + + + + + ) : status === "eval-pick" ? ( + + + + + + ) : status === "batch-pick" ? ( + + + + + ) : ( - Keys: [A] Analyze [G] Generate [R] Readiness [E] Eval [I] Init Eval [M] Model [J] Judge [B] Batch [Z] Batch Azure [Q] Quit + + + + + + + + + + + + )} @@ -441,38 +609,3 @@ function buildTimestampedName(baseName: string): string { const stamp = new Date().toISOString().replace(/[:.]/gu, "-"); return `${baseName}-${stamp}.json`; } - -function topFixes(criteria: ReadinessCriterionResult[]): ReadinessCriterionResult[] { - return criteria - .filter((criterion) => criterion.status === "fail") - .sort((a, b) => { - const impactDelta = impactWeight(b.impact) - impactWeight(a.impact); - if (impactDelta !== 0) return impactDelta; - return effortWeight(a.effort) - effortWeight(b.effort); - }) - .slice(0, 5); -} - -function impactWeight(value: "high" | "medium" | "low"): number { - if (value === "high") return 3; - if (value === "medium") return 2; - return 1; -} - -function effortWeight(value: "low" | "medium" | "high"): number { - if (value === "low") return 1; - if (value === "medium") return 2; - return 3; -} - -function formatPercent(value: number): string { - return `${Math.round(value * 100)}%`; -} - -function levelName(level: number): string { - if (level === 2) return "Documented"; - if (level === 3) return "Standardized"; - if (level === 4) return "Optimized"; - if (level === 5) return "Autonomous"; - return "Functional"; -} From 4fd6286c7bd081185b5fc67a9de10fb01d44376b Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Sun, 8 Feb 2026 20:43:37 -0700 Subject: [PATCH 10/84] Add tests for filesystem utilities, readiness report, and visual report generation - Implement tests for `ensureDir` and `safeWriteFile` in `fs.test.ts`. - Create comprehensive tests for `runReadinessReport` in `readiness.test.ts`, covering various criteria and pillars. - Add tests for `generateVisualReport` in `visualReport.test.ts`, ensuring correct HTML output and content. - Update `generateCopilotInstructions` to use a new preferred model. - Enhance TUI to support model selection and generation options for copilot instructions and agents. - Introduce `tsup` configuration for building the project. --- .github/workflows/ci.yml | 9 +- README.md | 374 +++++++------------- package.json | 19 +- src/cli.ts | 9 +- src/commands/generate.ts | 46 ++- src/services/__tests__/fs.test.ts | 73 ++++ src/services/__tests__/readiness.test.ts | 360 +++++++++++++++++++ src/services/__tests__/visualReport.test.ts | 190 ++++++++++ src/services/instructions.ts | 2 +- src/ui/tui.tsx | 319 ++++++++++++++--- tsup.config.ts | 20 ++ 11 files changed, 1103 insertions(+), 318 deletions(-) create mode 100644 src/services/__tests__/fs.test.ts create mode 100644 src/services/__tests__/readiness.test.ts create mode 100644 src/services/__tests__/visualReport.test.ts create mode 100644 tsup.config.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb9b04c..d336a10 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: - branches: [main] + branches: [main, vnext] pull_request: jobs: @@ -23,10 +23,15 @@ jobs: - name: Typecheck run: npm run typecheck - name: Test - run: npm run test:coverage + run: npm run test - name: Build run: npm run build + - name: Verify CLI + run: | + chmod +x dist/index.js + node dist/index.js --version - name: Upload coverage + if: always() uses: actions/upload-artifact@v4 with: name: coverage diff --git a/README.md b/README.md index 597d110..dd4a7f5 100644 --- a/README.md +++ b/README.md @@ -5,293 +5,190 @@ [![CI](https://github.com/pierceboggan/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/pierceboggan/primer/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) -Primer is a CLI tool that analyzes your codebase and generates `.github/copilot-instructions.md` files to help AI coding assistants understand your project better. It supports single repos, batch processing across organizations, and includes an evaluation framework to measure instruction effectiveness. - -![Primer](primer.png) +Primer is a CLI tool that helps teams prepare repositories for AI-assisted development. It generates custom instructions, assesses AI readiness with a maturity model, and supports batch processing across organizations — with an interactive TUI and beautiful visual reports. ## Features -- **Repository Analysis** - Detects languages, frameworks, and package managers -- **AI-Powered Generation** - Uses the Copilot SDK to analyze your codebase and generate context-aware instructions -- **Batch Processing** - Process multiple repos across organizations with a single command -- **Evaluation Framework** - Test and measure how well your instructions improve AI responses -- **Readiness Report** - Score AI readiness across key pillars with a fix-first checklist -- **Visual Reports** - Generate beautiful HTML reports for single or multiple repositories -- **Batch Readiness** - Consolidated visual reports for tracking AI readiness across entire organizations -- **GitHub Integration** - Clone repos, create branches, and open PRs automatically -- **Interactive TUI** - Beautiful terminal interface built with Ink -- **Config Generation** - Generate MCP and VS Code configurations +- **AI Readiness Reports** — Score repos across 9 pillars with a maturity model (Functional → Autonomous), including an AI tooling pillar that checks for MCP, custom agents, Copilot skills, and custom instructions +- **Visual Reports** — GitHub-themed HTML reports with light/dark toggle, expandable pillar details, and maturity model descriptions +- **Instruction Generation** — Generate `copilot-instructions.md` or `AGENTS.md` using the Copilot SDK, with per-app support for monorepos +- **Batch Processing** — Process multiple repos across GitHub or Azure DevOps organizations +- **Evaluation Framework** — Measure how instructions improve AI responses with a judge model +- **Interactive TUI** — Ink-based terminal UI with submenus, model picker, activity log, and animated banner +- **Config Generation** — Generate MCP and VS Code configurations +- **GitHub Integration** — Clone repos, create branches, and open PRs automatically ## Prerequisites -1. **Node.js 18+** -2. **GitHub Copilot CLI** - Installed via VS Code's Copilot Chat extension -3. **Copilot CLI Authentication** - Run `copilot` then `/login` to authenticate -4. **GitHub CLI (optional)** - For batch processing and PR creation: `brew install gh && gh auth login` -5. **Azure DevOps PAT (optional)** - For Azure DevOps batch/PR workflows: set `AZURE_DEVOPS_PAT` +1. **Node.js 20+** +2. **GitHub Copilot CLI** — Installed via VS Code's Copilot Chat extension +3. **Copilot CLI Authentication** — Run `copilot` then `/login` to authenticate +4. **GitHub CLI (optional)** — For batch processing and PR creation: `brew install gh && gh auth login` +5. **Azure DevOps PAT (optional)** — For Azure DevOps workflows: set `AZURE_DEVOPS_PAT` ## Installation ```bash -# Install from npm -npm install -g primer +# Clone and install +git clone https://github.com/pierceboggan/primer.git +cd primer +npm install +npm run build +npm link ``` -### Quick Install +Then use `primer` anywhere: ```bash primer --help ``` -### Local Development Install - -```bash -# Clone and install dependencies -git clone https://github.com/pierceboggan/primer.git -cd primer -npm install - -# Build and link the local CLI -npm run build -``` - ## Usage -### Quick Start (Init) - -The easiest way to get started is with the `init` command: +### Quick Start ```bash # Interactive setup for current directory primer init -# Accept defaults and generate instructions automatically +# Accept defaults and generate everything primer init --yes - -# Work with a GitHub repository -primer init --github - -# Work with an Azure DevOps repository -primer init --provider azure ``` -### Interactive Mode (TUI) +### Interactive TUI ```bash -# Run TUI in current directory primer tui - -# Run on a specific repo primer tui --repo /path/to/repo - -# Skip the animated intro -primer tui --no-animation ``` -**Keys:** -- `[A]` Analyze - Detect languages, frameworks, and package manager -- `[G]` Generate - Generate copilot-instructions.md using Copilot SDK -- `[S]` Save - Save generated instructions (in preview mode) -- `[D]` Discard - Discard generated instructions (in preview mode) +**Main menu:** +- `[G]` Generate → choose Copilot instructions or AGENTS.md (with per-app support for monorepos) +- `[E]` Eval → run evals or init eval config +- `[B]` Batch → pick GitHub or Azure DevOps +- `[M]` / `[J]` → pick eval/judge model from available models (arrow keys + Enter) - `[Q]` Quit ### Generate Instructions ```bash -# Generate instructions for current directory -primer instructions +# Generate copilot-instructions.md +primer generate instructions -# Generate for specific repo with custom output -primer instructions --repo /path/to/repo --output ./instructions.md +# Generate AGENTS.md +primer generate agents -# Use a specific model -primer instructions --model gpt-5 -``` +# Generate per-app in monorepos +primer generate instructions --per-app -### Batch Processing +# Generate MCP or VS Code configs +primer generate mcp +primer generate vscode --force +``` -Process multiple repositories across organizations: +Or use the standalone command: ```bash -# Launch batch TUI -primer batch - -# Launch batch TUI for Azure DevOps -primer batch --provider azure - -# Save results to file -primer batch --output results.json +primer instructions --repo /path/to/repo --model claude-sonnet-4.5 ``` -**Batch TUI Keys:** -- `[Space]` Toggle selection -- `[A]` Select all repos -- `[Enter]` Confirm selection -- `[Y/N]` Confirm/cancel processing -- `[Q]` Quit - ### Readiness Report -Assess how ready a repository is for AI agents and get a prioritized checklist of fixes: +Assess AI readiness across 9 pillars with a maturity model: ```bash -# Run readiness report in current directory +# Terminal output primer readiness -# Run readiness report on a specific repo -primer readiness /path/to/repo +# Visual HTML report (GitHub-themed, light/dark toggle) +primer readiness --visual -# Output JSON only +# JSON output primer readiness --json -# Write JSON report to a file -primer readiness --output readiness.json - -# Generate a beautiful visual HTML report -primer readiness --visual - -# Save visual report to a specific file +# Save to file primer readiness --output report.html ``` -#### Batch Readiness Report +**Maturity levels:** +| Level | Name | Description | +|-------|------|-------------| +| 1 | Functional | Builds, tests, basic tooling in place | +| 2 | Documented | README, CONTRIBUTING, custom AI instructions exist | +| 3 | Standardized | CI/CD, security policies, CODEOWNERS, observability | +| 4 | Optimized | MCP servers, custom agents, AI skills configured | +| 5 | Autonomous | Full AI-native development with minimal oversight | + +**AI Tooling checks:** +- Custom instructions (`copilot-instructions.md`, `CLAUDE.md`, `AGENTS.md`, `.cursorrules`) +- MCP configuration (`.vscode/mcp.json`, settings) +- Custom AI agents (`.github/agents/`, `.copilot/agents/`) +- Copilot/Claude skills (`.copilot/skills/`, `.github/skills/`) -Generate a consolidated visual report for multiple repositories across organizations: +#### Batch Readiness + +Consolidated visual report across multiple repositories: ```bash -# Launch interactive batch readiness report primer batch-readiness - -# Save report to a custom file primer batch-readiness --output team-readiness.html ``` -The visual report includes: -- **Summary Cards** - Total repositories, average readiness level, success rate -- **Pillar Performance** - AI readiness metrics across all repositories -- **Level Distribution** - Visual breakdown of repositories by maturity level -- **Repository Details** - Individual scores and top fixes for each repository -- **Beautiful UI** - Gradient backgrounds, responsive design, and interactive elements - -Perfect for AI enablement teams tracking improvement targets! - -### Examples - -See [examples/README.md](examples/README.md) for quick usage snippets and a sample eval config. - -### Generate Configs +### Batch Processing -Generate configuration files for your repo: +Process multiple repos across organizations: ```bash -# Generate MCP config -primer generate mcp - -# Generate VS Code settings -primer generate vscode --force - -# Generate custom prompts -primer generate prompts - -# Generate agent configs -primer generate agents - -# Generate .aiignore file -primer generate aiignore -``` - -### Manage Templates - -View available instruction templates: +# GitHub +primer batch -```bash -primer templates +# Azure DevOps +primer batch --provider azure ``` -### Configuration +### Evaluation Framework -View and manage Primer configuration: +Measure instruction effectiveness: ```bash -primer config -``` - -### Update +# Create eval config +primer eval --init -Check for and apply updates: +# Run evaluation (defaults to claude-sonnet-4.5) +primer eval primer.eval.json --repo /path/to/repo -```bash -primer update +# Custom models +primer eval --model claude-sonnet-4.5 --judge-model claude-sonnet-4.5 ``` ### Create Pull Requests -Automatically create a PR to add Primer configs to a repository: - ```bash -# Create PR for a GitHub repo primer pr owner/repo-name - -# Use custom branch name -primer pr owner/repo-name --branch primer/custom-branch - -# Create PR for an Azure DevOps repo (org/project/repo) primer pr my-org/my-project/my-repo --provider azure ``` -### Evaluation Framework - -Test how well your instructions improve AI responses: +## Development ```bash -# Create a starter eval config -primer eval --init - -# Run evaluation -primer eval primer.eval.json --repo /path/to/repo - -# Save results and use specific models -primer eval --output results.json --model gpt-5 --judge-model gpt-5 -``` - -When `--output` is provided (or `outputPath` is set in the eval config), Primer writes a JSON report that includes per-case metrics and trajectory events, and also generates a companion HTML trajectory viewer next to the JSON file. - -Example `primer.eval.json`: -```json -{ - "instructionFile": ".github/copilot-instructions.md", - "outputPath": "eval-results.json", - "cases": [ - { - "id": "project-overview", - "prompt": "Summarize what this project does and list the main entry points.", - "expectation": "Should mention the primary purpose and key files/directories." - } - ] -} -``` +# Type check +npm run typecheck -## How It Works +# Lint +npm run lint -1. **Analysis** - Scans the repository for: - - Language files (`.ts`, `.js`, `.py`, `.go`, etc.) - - Framework indicators (`package.json`, `tsconfig.json`, etc.) - - Package manager lock files +# Test (51 tests) +npm run test -2. **Generation** - Uses the Copilot SDK to: - - Start a Copilot CLI session - - Let the AI agent explore your codebase using tools (`glob`, `view`, `grep`) - - Generate concise, project-specific instructions +# Test with coverage +npm run test:coverage -3. **Batch Processing** - For multiple repos: - - Select organizations and repositories via TUI - - Clone, branch, generate, commit, push, and create PRs - - Track success/failure for each repository +# Build +npm run build -4. **Evaluation** - Measure instruction quality: - - Run prompts with and without instructions - - Use a judge model to score responses - - Generate comparison reports +# Run from source +npx tsx src/index.ts --help +``` ## Project Structure @@ -301,60 +198,37 @@ primer/ │ ├── index.ts # Entry point │ ├── cli.ts # Commander CLI setup │ ├── commands/ # CLI commands -│ │ ├── analyze.ts # Repository analysis -│ │ ├── batch.tsx # Batch processing -│ │ ├── config.ts # Config management -│ │ ├── eval.ts # Evaluation framework -│ │ ├── generate.ts # Config generation -│ │ ├── init.ts # Interactive setup -│ │ ├── instructions.tsx # Instructions generation -│ │ ├── pr.ts # PR creation -│ │ ├── templates.ts # Template management -│ │ ├── tui.tsx # TUI launcher -│ │ └── update.ts # Update command -│ ├── services/ # Core business logic -│ │ ├── analyzer.ts # Repository analysis -│ │ ├── evaluator.ts # Eval runner -│ │ ├── generator.ts # Config generation -│ │ ├── git.ts # Git operations -│ │ ├── github.ts # GitHub API -│ │ └── instructions.ts # Copilot SDK integration -│ ├── ui/ # Terminal UI +│ │ ├── batch.tsx # Batch processing (GitHub) +│ │ ├── batchReadiness.tsx # Batch readiness reports +│ │ ├── eval.ts # Evaluation framework +│ │ ├── generate.ts # Generate instructions/configs +│ │ ├── init.ts # Interactive setup +│ │ ├── instructions.tsx # Instructions generation +│ │ ├── pr.ts # PR creation +│ │ ├── readiness.ts # Readiness command +│ │ └── tui.tsx # TUI launcher +│ ├── services/ # Core logic +│ │ ├── analyzer.ts # Repository analysis +│ │ ├── evaluator.ts # Eval runner +│ │ ├── generator.ts # Config generation +│ │ ├── git.ts # Git operations +│ │ ├── github.ts # GitHub API +│ │ ├── instructions.ts # Copilot SDK integration +│ │ ├── readiness.ts # Readiness scoring engine +│ │ ├── visualReport.ts # HTML report generator +│ │ └── __tests__/ # Test suite +│ ├── ui/ # Terminal UI (Ink/React) │ │ ├── AnimatedBanner.tsx -│ │ ├── BatchTui.tsx # Batch processing UI -│ │ └── tui.tsx # Main TUI -│ └── utils/ # Helpers +│ │ ├── BatchTui.tsx +│ │ ├── BatchTuiAzure.tsx +│ │ ├── BatchReadinessTui.tsx +│ │ └── tui.tsx +│ └── utils/ │ ├── fs.ts │ └── logger.ts -├── package.json -├── tsconfig.json -├── primer.eval.json # Example eval config -└── PLAN.md # Project roadmap -``` - -## Development - -```bash -# Type check -npx tsc -p tsconfig.json --noEmit - -# Lint -npm run lint - -# Format -npm run format - -# Test -npm run test - -# Coverage -npm run test:coverage - -# Build and link the local CLI -npm run build - -# Run locally -primer +├── tsup.config.ts # Bundler config +├── vitest.config.ts # Test config +└── primer.eval.json # Example eval config ``` ## Troubleshooting @@ -365,16 +239,10 @@ Install the GitHub Copilot Chat extension in VS Code. The CLI is bundled with it ### "Copilot CLI not logged in" Run `copilot` in your terminal, then type `/login` to authenticate. -### "GitHub authentication required" (batch/PR commands) +### "GitHub authentication required" Install GitHub CLI and authenticate: `brew install gh && gh auth login` - Or set a token: `export GITHUB_TOKEN=` -### Generation hangs or times out -- Ensure you're authenticated with the Copilot CLI -- Check your network connection -- Try a smaller repository first - ## License MIT diff --git a/package.json b/package.json index bf64dc8..3c6fd55 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,18 @@ { - "name": "primer", + "name": "@anthropic/primer", "version": "1.0.0", - "description": "", + "description": "Prime repositories for AI-assisted development", "main": "dist/index.js", + "type": "module", + "bin": { + "primer": "dist/index.js" + }, + "files": [ + "dist" + ], "scripts": { - "build": "tsc && npm link", - "prepare": "tsc", + "build": "tsup", + "prepare": "test \"$CI\" = true || tsup", "lint": "eslint .", "format": "prettier --write .", "format:check": "prettier --check .", @@ -44,9 +51,5 @@ "tsx": "^4.21.0", "typescript": "^5.9.3", "vitest": "^2.1.4" - }, - "type": "module", - "bin": { - "primer": "dist/index.js" } } diff --git a/src/cli.ts b/src/cli.ts index 27f150e..6d8a169 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -29,9 +29,10 @@ export function runCli(argv: string[]): void { program .command("generate") - .argument("", "prompts|agents|mcp|vscode|aiignore") + .argument("", "instructions|agents|mcp|vscode") .argument("[path]", "Path to a local repository") .option("--force", "Overwrite existing files") + .option("--per-app", "Generate per-app in monorepos") .action(generateCommand); program @@ -45,8 +46,8 @@ export function runCli(argv: string[]): void { .command("eval") .argument("[path]", "Path to eval config JSON") .option("--repo ", "Repository path", process.cwd()) - .option("--model ", "Model for responses", "gpt-5") - .option("--judge-model ", "Model for judging", "gpt-5") + .option("--model ", "Model for responses", "claude-sonnet-4.5") + .option("--judge-model ", "Model for judging", "claude-sonnet-4.5") .option("--list-models", "List Copilot CLI models and exit") .option("--output ", "Write results JSON to file") .option("--init", "Create a starter primer.eval.json file") @@ -63,7 +64,7 @@ export function runCli(argv: string[]): void { .command("instructions") .option("--repo ", "Repository path", process.cwd()) .option("--output ", "Output path for copilot instructions") - .option("--model ", "Model for instructions generation", "gpt-4.1") + .option("--model ", "Model for instructions generation", "claude-sonnet-4.5") .action(instructionsCommand); program diff --git a/src/commands/generate.ts b/src/commands/generate.ts index a4c69c7..891f078 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -1,15 +1,19 @@ import path from "path"; +import fs from "fs/promises"; import { analyzeRepo } from "../services/analyzer"; import { generateConfigs } from "../services/generator"; +import { generateCopilotInstructions } from "../services/instructions"; +import { ensureDir } from "../utils/fs"; type GenerateOptions = { force?: boolean; + perApp?: boolean; }; export async function generateCommand(type: string, repoPathArg: string | undefined, options: GenerateOptions): Promise { - const allowed = new Set(["mcp", "vscode"]); + const allowed = new Set(["mcp", "vscode", "instructions", "agents"]); if (!allowed.has(type)) { - console.error("Invalid type. Use: mcp, vscode."); + console.error("Invalid type. Use: instructions, agents, mcp, vscode."); process.exitCode = 1; return; } @@ -17,6 +21,44 @@ export async function generateCommand(type: string, repoPathArg: string | undefi const repoPath = path.resolve(repoPathArg ?? process.cwd()); const analysis = await analyzeRepo(repoPath); + if (type === "instructions" || type === "agents") { + const apps = analysis.apps ?? []; + const targets: Array<{ repoPath: string; savePath: string; label: string }> = []; + + if (options.perApp && analysis.isMonorepo && apps.length > 1) { + for (const app of apps) { + const savePath = type === "instructions" + ? path.join(app.path, ".github", "copilot-instructions.md") + : path.join(app.path, "AGENTS.md"); + targets.push({ repoPath: app.path, savePath, label: app.name }); + } + } else { + const savePath = type === "instructions" + ? path.join(repoPath, ".github", "copilot-instructions.md") + : path.join(repoPath, "AGENTS.md"); + targets.push({ repoPath, savePath, label: path.basename(repoPath) }); + } + + for (const target of targets) { + console.log(`Generating ${type} for ${target.label}...`); + try { + const content = await generateCopilotInstructions({ + repoPath: target.repoPath, + }); + if (!content.trim()) { + console.error(` No content generated for ${target.label}.`); + continue; + } + await ensureDir(path.dirname(target.savePath)); + await fs.writeFile(target.savePath, content, "utf8"); + console.log(` ✓ ${path.relative(process.cwd(), target.savePath)}`); + } catch (error) { + console.error(` ✗ ${error instanceof Error ? error.message : String(error)}`); + } + } + return; + } + const selections = [type]; const result = await generateConfigs({ repoPath, diff --git a/src/services/__tests__/fs.test.ts b/src/services/__tests__/fs.test.ts new file mode 100644 index 0000000..bd9e28e --- /dev/null +++ b/src/services/__tests__/fs.test.ts @@ -0,0 +1,73 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; + +import { ensureDir, safeWriteFile } from "../../utils/fs"; + +describe("ensureDir", () => { + let tmpDir: string; + + beforeEach(async () => { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "primer-fs-")); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + it("creates a directory that does not exist", async () => { + const target = path.join(tmpDir, "a", "b", "c"); + await ensureDir(target); + + const stat = await fs.stat(target); + expect(stat.isDirectory()).toBe(true); + }); + + it("does not throw if directory already exists", async () => { + const target = path.join(tmpDir, "existing"); + await fs.mkdir(target); + await expect(ensureDir(target)).resolves.toBeUndefined(); + }); +}); + +describe("safeWriteFile", () => { + let tmpDir: string; + + beforeEach(async () => { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "primer-fs-")); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + it("writes a new file", async () => { + const filePath = path.join(tmpDir, "test.txt"); + const result = await safeWriteFile(filePath, "hello", false); + + const content = await fs.readFile(filePath, "utf8"); + expect(content).toBe("hello"); + expect(result).toContain("Wrote"); + }); + + it("skips existing file without force", async () => { + const filePath = path.join(tmpDir, "test.txt"); + await fs.writeFile(filePath, "original"); + const result = await safeWriteFile(filePath, "new content", false); + + const content = await fs.readFile(filePath, "utf8"); + expect(content).toBe("original"); + expect(result).toContain("Skipped"); + }); + + it("overwrites existing file with force", async () => { + const filePath = path.join(tmpDir, "test.txt"); + await fs.writeFile(filePath, "original"); + const result = await safeWriteFile(filePath, "new content", true); + + const content = await fs.readFile(filePath, "utf8"); + expect(content).toBe("new content"); + expect(result).toContain("Wrote"); + }); +}); diff --git a/src/services/__tests__/readiness.test.ts b/src/services/__tests__/readiness.test.ts new file mode 100644 index 0000000..b6825cc --- /dev/null +++ b/src/services/__tests__/readiness.test.ts @@ -0,0 +1,360 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; + +import { runReadinessReport, type ReadinessReport } from "../readiness"; + +describe("runReadinessReport", () => { + let repoPath: string; + + beforeEach(async () => { + repoPath = await fs.mkdtemp(path.join(os.tmpdir(), "primer-readiness-")); + }); + + afterEach(async () => { + await fs.rm(repoPath, { recursive: true, force: true }); + }); + + async function writeFile(relativePath: string, content: string): Promise { + const fullPath = path.join(repoPath, relativePath); + await fs.mkdir(path.dirname(fullPath), { recursive: true }); + await fs.writeFile(fullPath, content, "utf8"); + } + + async function writePackageJson(pkg: Record): Promise { + await writeFile("package.json", JSON.stringify(pkg, null, 2)); + } + + it("returns a valid report structure", async () => { + await writePackageJson({ name: "test-repo", scripts: { build: "tsc", test: "vitest" } }); + const report = await runReadinessReport({ repoPath }); + + expect(report.repoPath).toBe(repoPath); + expect(report.generatedAt).toBeTruthy(); + expect(report.pillars).toBeInstanceOf(Array); + expect(report.levels).toBeInstanceOf(Array); + expect(report.criteria).toBeInstanceOf(Array); + expect(typeof report.achievedLevel).toBe("number"); + }); + + it("has all expected pillars", async () => { + await writePackageJson({ name: "test-repo" }); + const report = await runReadinessReport({ repoPath }); + + const pillarIds = report.pillars.map((p) => p.id); + expect(pillarIds).toContain("style-validation"); + expect(pillarIds).toContain("build-system"); + expect(pillarIds).toContain("testing"); + expect(pillarIds).toContain("documentation"); + expect(pillarIds).toContain("dev-environment"); + expect(pillarIds).toContain("code-quality"); + expect(pillarIds).toContain("observability"); + expect(pillarIds).toContain("security-governance"); + expect(pillarIds).toContain("ai-tooling"); + }); + + it("has 5 maturity levels", async () => { + await writePackageJson({ name: "test-repo" }); + const report = await runReadinessReport({ repoPath }); + + expect(report.levels).toHaveLength(5); + expect(report.levels.map((l) => l.level)).toEqual([1, 2, 3, 4, 5]); + }); + + describe("style-validation pillar", () => { + it("passes lint-config when eslint.config.js exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("eslint.config.js", "export default [];"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "lint-config"); + + expect(criterion?.status).toBe("pass"); + }); + + it("fails lint-config when no lint config exists", async () => { + await writePackageJson({ name: "test-repo" }); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "lint-config"); + + expect(criterion?.status).toBe("fail"); + }); + + it("passes typecheck-config when tsconfig.json exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("tsconfig.json", "{}"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "typecheck-config"); + + expect(criterion?.status).toBe("pass"); + }); + }); + + describe("documentation pillar", () => { + it("passes readme when README.md exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("README.md", "# Test"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "readme"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes contributing when CONTRIBUTING.md exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("CONTRIBUTING.md", "# Contributing"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "contributing"); + + expect(criterion?.status).toBe("pass"); + }); + }); + + describe("dev-environment pillar", () => { + it("passes lockfile when package-lock.json exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("package-lock.json", "{}"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "lockfile"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes env-example when .env.example exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile(".env.example", "API_KEY=your-key"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "env-example"); + + expect(criterion?.status).toBe("pass"); + }); + }); + + describe("security-governance pillar", () => { + it("passes codeowners when CODEOWNERS exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("CODEOWNERS", "* @owner"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "codeowners"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes codeowners when .github/CODEOWNERS exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile(".github/CODEOWNERS", "* @owner"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "codeowners"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes license when LICENSE exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("LICENSE", "MIT License"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "license"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes security-policy when SECURITY.md exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("SECURITY.md", "# Security"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "security-policy"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes dependabot when .github/dependabot.yml exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile(".github/dependabot.yml", "version: 2"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "dependabot"); + + expect(criterion?.status).toBe("pass"); + }); + }); + + describe("ai-tooling pillar", () => { + it("passes custom-instructions when copilot-instructions.md exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile(".github/copilot-instructions.md", "# Instructions"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "custom-instructions"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes custom-instructions when CLAUDE.md exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("CLAUDE.md", "# Claude instructions"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "custom-instructions"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes custom-instructions when AGENTS.md exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("AGENTS.md", "# Agents guidance"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "custom-instructions"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes custom-instructions when .cursorrules exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile(".cursorrules", "rules here"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "custom-instructions"); + + expect(criterion?.status).toBe("pass"); + }); + + it("fails custom-instructions when none exist", async () => { + await writePackageJson({ name: "test-repo" }); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "custom-instructions"); + + expect(criterion?.status).toBe("fail"); + }); + + it("passes mcp-config when .vscode/mcp.json exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile(".vscode/mcp.json", "{}"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "mcp-config"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes mcp-config when .vscode/settings.json has mcp key", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile( + ".vscode/settings.json", + JSON.stringify({ "github.copilot.chat.mcp.enabled": true }) + ); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "mcp-config"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes custom-agents when .github/agents directory exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile(".github/agents/.gitkeep", ""); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "custom-agents"); + + expect(criterion?.status).toBe("pass"); + }); + + it("passes copilot-skills when .copilot/skills directory exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile(".copilot/skills/.gitkeep", ""); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "copilot-skills"); + + expect(criterion?.status).toBe("pass"); + }); + }); + + describe("build-system pillar", () => { + it("passes ci-config when .github/workflows exists", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile(".github/workflows/ci.yml", "name: CI"); + + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria.find((c) => c.id === "ci-config"); + + expect(criterion?.status).toBe("pass"); + }); + }); + + describe("achieved level", () => { + it("achieves level 1 with basic setup", async () => { + await writePackageJson({ + name: "test-repo", + scripts: { build: "tsc", test: "vitest" } + }); + await writeFile("eslint.config.js", "export default [];"); + await writeFile("README.md", "# Test"); + await writeFile("package-lock.json", "{}"); + await writeFile("LICENSE", "MIT"); + + const report = await runReadinessReport({ repoPath }); + + expect(report.achievedLevel).toBeGreaterThanOrEqual(1); + }); + + it("is 0 for an empty repo", async () => { + await writePackageJson({ name: "empty-repo" }); + + const report = await runReadinessReport({ repoPath }); + + // Level 0 means nothing achieved (most L1 checks fail) + expect(report.achievedLevel).toBeLessThanOrEqual(1); + }); + }); + + describe("pillar summaries", () => { + it("calculates passRate correctly", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("eslint.config.js", "export default [];"); + + const report = await runReadinessReport({ repoPath }); + const stylePillar = report.pillars.find((p) => p.id === "style-validation"); + + expect(stylePillar).toBeDefined(); + expect(stylePillar!.passed).toBeGreaterThanOrEqual(1); + expect(stylePillar!.total).toBeGreaterThanOrEqual(1); + expect(stylePillar!.passRate).toBe(stylePillar!.passed / stylePillar!.total); + }); + }); + + describe("extras", () => { + it("includes extras by default", async () => { + await writePackageJson({ name: "test-repo" }); + + const report = await runReadinessReport({ repoPath }); + + expect(report.extras.length).toBeGreaterThan(0); + const extraIds = report.extras.map((e) => e.id); + expect(extraIds).toContain("pr-template"); + expect(extraIds).toContain("pre-commit"); + expect(extraIds).toContain("architecture-doc"); + }); + + it("excludes extras when disabled", async () => { + await writePackageJson({ name: "test-repo" }); + + const report = await runReadinessReport({ repoPath, includeExtras: false }); + + expect(report.extras).toHaveLength(0); + }); + }); +}); diff --git a/src/services/__tests__/visualReport.test.ts b/src/services/__tests__/visualReport.test.ts new file mode 100644 index 0000000..27f199b --- /dev/null +++ b/src/services/__tests__/visualReport.test.ts @@ -0,0 +1,190 @@ +import { describe, expect, it } from "vitest"; + +import { generateVisualReport } from "../visualReport"; +import type { ReadinessReport } from "../readiness"; + +function makeReport(overrides: Partial = {}): ReadinessReport { + return { + repoPath: "/tmp/test-repo", + generatedAt: "2026-01-01T00:00:00.000Z", + isMonorepo: false, + apps: [], + pillars: [ + { id: "style-validation", name: "Style & Validation", passed: 2, total: 2, passRate: 1 }, + { id: "build-system", name: "Build System", passed: 1, total: 2, passRate: 0.5 }, + { id: "testing", name: "Testing", passed: 0, total: 1, passRate: 0 }, + { id: "documentation", name: "Documentation", passed: 1, total: 2, passRate: 0.5 }, + { id: "dev-environment", name: "Dev Environment", passed: 1, total: 2, passRate: 0.5 }, + { id: "code-quality", name: "Code Quality", passed: 1, total: 1, passRate: 1 }, + { id: "observability", name: "Observability", passed: 0, total: 1, passRate: 0 }, + { id: "security-governance", name: "Security & Governance", passed: 2, total: 4, passRate: 0.5 }, + { id: "ai-tooling", name: "AI Tooling", passed: 1, total: 4, passRate: 0.25 }, + ], + levels: [ + { level: 1, name: "Functional", passed: 5, total: 6, passRate: 0.83, achieved: true }, + { level: 2, name: "Documented", passed: 3, total: 6, passRate: 0.5, achieved: false }, + { level: 3, name: "Standardized", passed: 1, total: 4, passRate: 0.25, achieved: false }, + { level: 4, name: "Optimized", passed: 0, total: 0, passRate: 0, achieved: false }, + { level: 5, name: "Autonomous", passed: 0, total: 0, passRate: 0, achieved: false }, + ], + achievedLevel: 1, + criteria: [ + { id: "lint-config", title: "Linting configured", pillar: "style-validation", level: 1, scope: "repo", impact: "high", effort: "low", status: "pass" }, + { id: "readme", title: "README present", pillar: "documentation", level: 1, scope: "repo", impact: "high", effort: "low", status: "pass" }, + { id: "custom-instructions", title: "Custom AI instructions", pillar: "ai-tooling", level: 1, scope: "repo", impact: "high", effort: "low", status: "pass" }, + { id: "mcp-config", title: "MCP config present", pillar: "ai-tooling", level: 2, scope: "repo", impact: "high", effort: "low", status: "fail", reason: "Missing MCP config." }, + ], + extras: [], + ...overrides, + }; +} + +describe("generateVisualReport", () => { + it("returns valid HTML", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport() }], + }); + + expect(html).toContain(""); + expect(html).toContain(""); + }); + + it("includes the report title", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport() }], + title: "My Custom Report", + }); + + expect(html).toContain("My Custom Report"); + }); + + it("includes repo name", () => { + const html = generateVisualReport({ + reports: [{ repo: "my-repo", report: makeReport() }], + }); + + expect(html).toContain("my-repo"); + }); + + it("includes pillar names", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport() }], + }); + + expect(html).toContain("Style & Validation"); + expect(html).toContain("Build System"); + expect(html).toContain("AI Tooling"); + }); + + it("includes maturity level badge", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport({ achievedLevel: 2 }) }], + }); + + expect(html).toContain("Maturity 2"); + expect(html).toContain("Documented"); + }); + + it("includes AI Tooling Readiness hero section", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport() }], + }); + + expect(html).toContain("AI Tooling Readiness"); + }); + + it("includes maturity model descriptions", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport() }], + }); + + expect(html).toContain("Functional"); + expect(html).toContain("Documented"); + expect(html).toContain("Standardized"); + expect(html).toContain("Optimized"); + expect(html).toContain("Autonomous"); + }); + + it("includes theme toggle", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport() }], + }); + + expect(html).toContain("toggleTheme"); + expect(html).toContain("data-theme"); + }); + + it("includes light theme CSS variables", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport() }], + }); + + expect(html).toContain('[data-theme="light"]'); + expect(html).toContain('[data-theme="dark"]'); + }); + + it("includes GitHub logo SVG", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport() }], + }); + + expect(html).toContain("header-logo"); + expect(html).toContain(" { + const html = generateVisualReport({ + reports: [ + { repo: "good-repo", report: makeReport() }, + { repo: "bad-repo", report: makeReport(), error: "Clone failed" }, + ], + }); + + expect(html).toContain("bad-repo"); + expect(html).toContain("Clone failed"); + }); + + it("shows summary cards with correct counts", () => { + const html = generateVisualReport({ + reports: [ + { repo: "repo-1", report: makeReport() }, + { repo: "repo-2", report: makeReport() }, + ], + }); + + // Total repos should be 2 + expect(html).toContain(">2<"); + }); + + it("includes top fixes for failing criteria", () => { + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report: makeReport() }], + }); + + expect(html).toContain("Top Fixes"); + expect(html).toContain("MCP config present"); + }); + + it("shows all criteria passing when all pass", () => { + const report = makeReport({ + criteria: [ + { id: "lint-config", title: "Linting configured", pillar: "style-validation", level: 1, scope: "repo", impact: "high", effort: "low", status: "pass" }, + ], + }); + + const html = generateVisualReport({ + reports: [{ repo: "test-repo", report }], + }); + + expect(html).toContain("All criteria passing"); + }); + + it("escapes HTML in repo names", () => { + const html = generateVisualReport({ + reports: [{ repo: '', report: makeReport() }], + }); + + expect(html).not.toContain(''); + expect(html).toContain("<script>"); + }); +}); diff --git a/src/services/instructions.ts b/src/services/instructions.ts index 1d7cf62..8135932 100644 --- a/src/services/instructions.ts +++ b/src/services/instructions.ts @@ -26,7 +26,7 @@ export async function generateCopilotInstructions(options: GenerateInstructionsO try { progress("Creating session..."); // Try requested model, fall back to gpt-4.1 if gpt-5 fails - const preferredModel = options.model ?? "gpt-4.1"; + const preferredModel = options.model ?? "claude-sonnet-4.5"; const session = await client.createSession({ model: preferredModel, streaming: true, diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 1399448..0350a4f 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -12,6 +12,7 @@ import { BatchTuiAzure } from "./BatchTuiAzure"; import { getGitHubToken } from "../services/github"; import { getAzureDevOpsToken } from "../services/azureDevops"; import { safeWriteFile } from "../utils/fs"; +import { analyzeRepo, RepoApp } from "../services/analyzer"; type Props = { repoPath: string; @@ -31,6 +32,9 @@ type Status = | "batch-github" | "batch-azure" | "eval-pick" + | "model-pick" + | "generate-pick" + | "generate-app-pick" | "bootstrapEvalCount" | "bootstrapEvalConfirm"; @@ -86,6 +90,15 @@ function Divider({ label }: { label?: string }): React.JSX.Element { ); } +const PREFERRED_MODELS = ["claude-sonnet-4.5", "claude-sonnet-4", "gpt-4.1", "gpt-5"]; + +function pickBestModel(available: string[], fallback: string): string { + for (const preferred of PREFERRED_MODELS) { + if (available.includes(preferred)) return preferred; + } + return available[0] || fallback; +} + export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX.Element { const app = useApp(); const [status, setStatus] = useState(skipAnimation ? "idle" : "intro"); @@ -98,13 +111,20 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const [evalCaseCountInput, setEvalCaseCountInput] = useState(""); const [evalBootstrapCount, setEvalBootstrapCount] = useState(null); const [availableModels, setAvailableModels] = useState([]); - const [evalModel, setEvalModel] = useState("gpt-4.1"); - const [judgeModel, setJudgeModel] = useState("gpt-4.1"); + const [evalModel, setEvalModel] = useState("claude-sonnet-4.5"); + const [judgeModel, setJudgeModel] = useState("claude-sonnet-4.5"); + const [modelPickTarget, setModelPickTarget] = useState<"eval" | "judge">("eval"); + const [modelCursor, setModelCursor] = useState(0); const [hasEvalConfig, setHasEvalConfig] = useState(null); const [activityLog, setActivityLog] = useState([]); + const [generateTarget, setGenerateTarget] = useState<"copilot-instructions" | "agents-md">("copilot-instructions"); + const [generateSavePath, setGenerateSavePath] = useState(""); + const [repoApps, setRepoApps] = useState([]); + const [isMonorepo, setIsMonorepo] = useState(false); const repoLabel = useMemo(() => path.basename(repoPath), [repoPath]); const repoFull = useMemo(() => repoPath, [repoPath]); const isLoading = status === "generating" || status === "bootstrapping" || status === "evaluating"; + const isMenu = status === "model-pick" || status === "eval-pick" || status === "batch-pick" || status === "generate-pick" || status === "generate-app-pick"; const spinner = useSpinner(isLoading); const addLog = (text: string, type: LogEntry["type"] = "info") => { @@ -115,17 +135,15 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setStatus("idle"); }; - const cycleModel = (current: string): string => { - if (!availableModels.length) return current; - const index = availableModels.indexOf(current); - const nextIndex = index === -1 ? 0 : (index + 1) % availableModels.length; - return availableModels[nextIndex]; - }; - - // Check for eval config on mount + // Check for eval config and repo structure on mount useEffect(() => { const configPath = path.join(repoPath, "primer.eval.json"); fs.access(configPath).then(() => setHasEvalConfig(true)).catch(() => setHasEvalConfig(false)); + analyzeRepo(repoPath).then((analysis) => { + const apps = analysis.apps ?? []; + setRepoApps(apps); + setIsMonorepo(analysis.isMonorepo ?? false); + }).catch(() => {}); }, [repoPath]); useEffect(() => { @@ -135,8 +153,8 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX if (!active) return; setAvailableModels(models); if (models.length === 0) return; - setEvalModel((current) => (models.includes(current) ? current : models[0])); - setJudgeModel((current) => (models.includes(current) ? current : models[0])); + setEvalModel((current) => (models.includes(current) ? current : pickBestModel(models, current))); + setJudgeModel((current) => (models.includes(current) ? current : pickBestModel(models, current))); }) .catch(() => { if (!active) return; @@ -147,6 +165,35 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX }; }, []); + const doGenerate = async (targetRepoPath: string, savePath: string, target: string): Promise => { + setStatus("generating"); + setMessage(`Generating ${target}...`); + addLog(`Generating ${target}...`, "progress"); + try { + const content = await generateCopilotInstructions({ + repoPath: targetRepoPath, + onProgress: (msg) => setMessage(msg) + }); + if (!content.trim()) { + throw new Error("Copilot SDK returned empty content."); + } + setGeneratedContent(content); + setGenerateSavePath(savePath); + setStatus("preview"); + setMessage("Review the generated content below."); + addLog(`${target} generated — review and save.`, "success"); + } catch (error) { + setStatus("error"); + const msg = error instanceof Error ? error.message : "Generation failed."; + if (msg.toLowerCase().includes("auth") || msg.toLowerCase().includes("login")) { + setMessage(`${msg} Run 'copilot' then '/login' in a separate terminal.`); + } else { + setMessage(msg); + } + addLog(msg, "error"); + } + }; + const bootstrapEvalConfig = async (count: number, force: boolean): Promise => { const configPath = path.join(repoPath, "primer.eval.json"); try { @@ -187,11 +234,12 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX if (status === "preview") { if (input.toLowerCase() === "s") { try { - const outputPath = path.join(repoPath, ".github", "copilot-instructions.md"); + const outputPath = generateSavePath || path.join(repoPath, ".github", "copilot-instructions.md"); await fs.mkdir(path.dirname(outputPath), { recursive: true }); await fs.writeFile(outputPath, generatedContent, "utf8"); setStatus("done"); - const msg = "Saved to .github/copilot-instructions.md"; + const relPath = path.relative(repoPath, outputPath); + const msg = `Saved to ${relPath}`; setMessage(msg); addLog(msg, "success"); setGeneratedContent(""); @@ -268,6 +316,130 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return; } + if (status === "generate-pick") { + if (input.toLowerCase() === "c") { + setGenerateTarget("copilot-instructions"); + if (isMonorepo && repoApps.length > 1) { + setStatus("generate-app-pick"); + setMessage("Generate for root or per-app?"); + } else { + const savePath = path.join(repoPath, ".github", "copilot-instructions.md"); + setGenerateSavePath(savePath); + await doGenerate(repoPath, savePath, "copilot-instructions"); + } + return; + } + if (input.toLowerCase() === "a") { + setGenerateTarget("agents-md"); + if (isMonorepo && repoApps.length > 1) { + setStatus("generate-app-pick"); + setMessage("Generate for root or per-app?"); + } else { + const savePath = path.join(repoPath, "AGENTS.md"); + setGenerateSavePath(savePath); + await doGenerate(repoPath, savePath, "agents-md"); + } + return; + } + if (key.escape) { + setStatus("idle"); + setMessage(""); + return; + } + return; + } + + if (status === "generate-app-pick") { + if (input.toLowerCase() === "r") { + // Root only + const savePath = generateTarget === "copilot-instructions" + ? path.join(repoPath, ".github", "copilot-instructions.md") + : path.join(repoPath, "AGENTS.md"); + setGenerateSavePath(savePath); + await doGenerate(repoPath, savePath, generateTarget); + return; + } + if (input.toLowerCase() === "a") { + // All apps sequentially + setStatus("generating"); + addLog(`Generating ${generateTarget} for ${repoApps.length} apps...`, "progress"); + let count = 0; + for (const app of repoApps) { + const savePath = generateTarget === "copilot-instructions" + ? path.join(app.path, ".github", "copilot-instructions.md") + : path.join(app.path, "AGENTS.md"); + setMessage(`Generating for ${app.name} (${count + 1}/${repoApps.length})...`); + try { + const content = await generateCopilotInstructions({ + repoPath: app.path, + onProgress: (msg) => setMessage(`${app.name}: ${msg}`) + }); + if (content.trim()) { + await fs.mkdir(path.dirname(savePath), { recursive: true }); + await fs.writeFile(savePath, content, "utf8"); + count++; + addLog(`${app.name}: saved ${path.basename(savePath)}`, "success"); + } + } catch (error) { + const msg = error instanceof Error ? error.message : "Failed."; + addLog(`${app.name}: ${msg}`, "error"); + } + } + setStatus("done"); + setMessage(`Generated ${generateTarget} for ${count}/${repoApps.length} apps.`); + return; + } + // Number to pick a specific app + const num = Number.parseInt(input, 10); + if (Number.isFinite(num) && num >= 1 && num <= repoApps.length) { + const app = repoApps[num - 1]; + const savePath = generateTarget === "copilot-instructions" + ? path.join(app.path, ".github", "copilot-instructions.md") + : path.join(app.path, "AGENTS.md"); + setGenerateSavePath(savePath); + await doGenerate(app.path, savePath, generateTarget); + return; + } + if (key.escape) { + setStatus("generate-pick"); + setMessage("Select what to generate."); + return; + } + return; + } + + if (status === "model-pick") { + if (key.escape) { + setStatus("idle"); + setMessage(""); + return; + } + if (key.upArrow) { + setModelCursor((prev) => Math.max(0, prev - 1)); + return; + } + if (key.downArrow) { + setModelCursor((prev) => Math.min(availableModels.length - 1, prev + 1)); + return; + } + if (key.return) { + const chosen = availableModels[modelCursor]; + if (chosen) { + if (modelPickTarget === "eval") { + setEvalModel(chosen); + addLog(`Eval model → ${chosen}`, "success"); + } else { + setJudgeModel(chosen); + addLog(`Judge model → ${chosen}`, "success"); + } + setStatus("idle"); + setMessage(`${modelPickTarget === "eval" ? "Eval" : "Judge"} model set to ${chosen}`); + } + return; + } + return; + } + if (status === "eval-pick") { if (input.toLowerCase() === "r") { // Run eval @@ -369,31 +541,9 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX } if (input.toLowerCase() === "g") { - setStatus("generating"); - setMessage("Starting generation..."); - addLog("Generating copilot instructions...", "progress"); - try { - const content = await generateCopilotInstructions({ - repoPath, - onProgress: (msg) => setMessage(msg) - }); - if (!content.trim()) { - throw new Error("Copilot SDK returned empty instructions."); - } - setGeneratedContent(content); - setStatus("preview"); - setMessage("Review the generated instructions below."); - addLog("Instructions generated — review and save.", "success"); - } catch (error) { - setStatus("error"); - const msg = error instanceof Error ? error.message : "Generation failed."; - if (msg.toLowerCase().includes("auth") || msg.toLowerCase().includes("login")) { - setMessage(`${msg} Run 'copilot' then '/login' in a separate terminal.`); - } else { - setMessage(msg); - } - addLog(msg, "error"); - } + setStatus("generate-pick"); + setMessage("Select what to generate."); + return; } if (input.toLowerCase() === "b") { @@ -413,9 +563,12 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setMessage("No Copilot CLI models detected; using defaults."); return; } - const next = cycleModel(evalModel); - setEvalModel(next); - setMessage(`Eval model → ${next}`); + setModelPickTarget("eval"); + setStatus("model-pick"); + setMessage("Pick eval model."); + // Set cursor to current model + const idx = availableModels.indexOf(evalModel); + setModelCursor(idx >= 0 ? idx : 0); return; } @@ -424,16 +577,18 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setMessage("No Copilot CLI models detected; using defaults."); return; } - const next = cycleModel(judgeModel); - setJudgeModel(next); - setMessage(`Judge model → ${next}`); + setModelPickTarget("judge"); + setStatus("model-pick"); + setMessage("Pick judge model."); + const idx = availableModels.indexOf(judgeModel); + setModelCursor(idx >= 0 ? idx : 0); return; } }); const statusIcon = status === "error" ? "✗" : status === "done" ? "✓" : isLoading ? spinner : "●"; - const statusLabel = status === "intro" ? "starting" : status === "idle" ? "ready" : status === "bootstrapEvalCount" ? "input" : status === "bootstrapEvalConfirm" ? "confirm" : status === "eval-pick" ? "eval" : status === "batch-pick" ? "batch" : status; - const statusColor = status === "error" ? "red" : status === "done" ? "green" : isLoading ? "yellow" : "cyanBright"; + const statusLabel = status === "intro" ? "starting" : status === "idle" ? "ready" : status === "bootstrapEvalCount" ? "input" : status === "bootstrapEvalConfirm" ? "confirm" : status === "eval-pick" ? "eval" : status === "batch-pick" ? "batch" : status === "model-pick" ? "models" : status; + const statusColor = status === "error" ? "red" : status === "done" ? "green" : isLoading ? "yellow" : isMenu ? "magentaBright" : "cyanBright"; const formatTokens = (result: EvalResult): string => { const withUsage = result.metrics?.withInstructions?.tokenUsage; @@ -475,6 +630,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX Repo {repoLabel} + {isMonorepo && monorepo · {repoApps.length} apps} {repoFull} @@ -520,6 +676,47 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX )} + {/* Model Picker */} + {status === "model-pick" && availableModels.length > 0 && ( + <> + + + {availableModels.map((model, i) => { + const current = modelPickTarget === "eval" ? evalModel : judgeModel; + const isCurrent = model === current; + const isCursor = i === modelCursor; + return ( + + {isCursor ? "\u276F " : " "} + {model} + {isCurrent && (current)} + + ); + })} + {availableModels.length > 15 && ( + Use {"\u2191\u2193"} to scroll + )} + + + )} + + {/* App picker for monorepo generate */} + {status === "generate-app-pick" && repoApps.length > 0 && ( + <> + + + {repoApps.map((app, i) => ( + + {i + 1} + + {app.name} + {path.relative(repoPath, app.path)} + + ))} + + + )} + {/* Input: eval case count */} {status === "bootstrapEvalCount" && ( @@ -531,7 +728,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {/* Preview */} {status === "preview" && generatedContent && ( - Preview (.github/copilot-instructions.md) + Preview ({path.relative(repoPath, generateSavePath) || generateTarget}) {truncatedPreview} )} @@ -574,6 +771,32 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX + ) : status === "model-pick" ? ( + + Use + {"\u2191\u2193"} + to navigate, + Enter + to select + + + ) : status === "generate-pick" ? ( + + + + + + ) : status === "generate-app-pick" ? ( + + + + or press + 1 + - + {repoApps.length} + + + ) : status === "eval-pick" ? ( diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..9d7c740 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["esm"], + target: "node20", + outDir: "dist", + clean: true, + splitting: false, + sourcemap: true, + dts: false, + banner: { + js: "#!/usr/bin/env node", + }, + // Keep node_modules as external — they'll be installed via npm + external: [/^[^./]/], + esbuildOptions(options) { + options.jsx = "automatic"; + }, +}); From 2cda58dab818c56cb04a1bf72c6e6ed3d3107120 Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Sun, 8 Feb 2026 21:24:46 -0700 Subject: [PATCH 11/84] refactor: update key hints for clarity in TUI --- src/ui/tui.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 0350a4f..d759e51 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -817,8 +817,8 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX - - + + From d1db06827587bc1a8da15b376916c85379c33c2c Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Sun, 8 Feb 2026 21:51:32 -0700 Subject: [PATCH 12/84] feat: update trajectory viewer with new design and metrics display --- src/services/evaluator.ts | 577 ++++++++++++++++++++------------------ 1 file changed, 305 insertions(+), 272 deletions(-) diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index 6e4b797..1a137cd 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -637,281 +637,314 @@ function buildViewerPath(outputPath: string): string { function buildTrajectoryViewerHtml(data: Record): string { const serialized = JSON.stringify(data).replace(/ - - - - - Primer Eval Trajectory - - - -

    Primer Eval Trajectory

    -
    -
    -
    -
    -
    + + + + +Primer Eval Results + + + +
    +
    + +
    +

    Eval Results

    +
    - - + '
    ' + + '
    ' + + '
    '; + }); + document.getElementById('caseDetails').innerHTML = html; +} +renderCaseDetails(); + + `; } From e87dd2f5e461cb3f4801a136c8d01937a325f8e7 Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Wed, 11 Feb 2026 17:14:00 -0700 Subject: [PATCH 13/84] Enhance PrimerTui: Add eval case generation with Copilot SDK and improve error handling --- src/ui/tui.tsx | 101 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 96 insertions(+), 5 deletions(-) diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index d759e51..43cb965 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -25,6 +25,7 @@ type Status = | "generating" | "bootstrapping" | "evaluating" + | "modelPicker" | "preview" | "done" | "error" @@ -44,6 +45,18 @@ type LogEntry = { time: string; }; +type EvalUiConfig = { + modelPicker?: "visible" | "hidden"; +}; + +type EvalConfig = { + instructionFile?: string; + cases: Array<{ id: string; prompt: string; expectation: string }>; + systemMessage?: string; + outputPath?: string; + ui?: EvalUiConfig; +}; + const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]; function useSpinner(active: boolean): string { @@ -113,6 +126,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const [availableModels, setAvailableModels] = useState([]); const [evalModel, setEvalModel] = useState("claude-sonnet-4.5"); const [judgeModel, setJudgeModel] = useState("claude-sonnet-4.5"); + const [hideModelPicker, setHideModelPicker] = useState(false); const [modelPickTarget, setModelPickTarget] = useState<"eval" | "judge">("eval"); const [modelCursor, setModelCursor] = useState(0); const [hasEvalConfig, setHasEvalConfig] = useState(null); @@ -146,6 +160,22 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX }).catch(() => {}); }, [repoPath]); + const indexForModel = (model: string): number => { + const index = availableModels.indexOf(model); + return index === -1 ? 0 : index; + }; + + const openModelPicker = (target: "eval" | "judge"): void => { + if (!availableModels.length) { + setMessage("No Copilot CLI models detected; using defaults."); + return; + } + setModelPickTarget(target); + setModelCursor(indexForModel(target === "eval" ? evalModel : judgeModel)); + setStatus("modelPicker"); + setMessage(`Select ${target} model.`); + }; + useEffect(() => { let active = true; listCopilotModels() @@ -194,6 +224,25 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX } }; + useEffect(() => { + let active = true; + const configPath = path.join(repoPath, "primer.eval.json"); + fs.readFile(configPath, "utf8") + .then((raw) => { + if (!active) return; + const parsed = JSON.parse(raw) as EvalConfig; + const setting = parsed.ui?.modelPicker; + setHideModelPicker(setting === "hidden"); + }) + .catch(() => { + if (!active) return; + setHideModelPicker(false); + }); + return () => { + active = false; + }; + }, [repoPath]); + const bootstrapEvalConfig = async (count: number, force: boolean): Promise => { const configPath = path.join(repoPath, "primer.eval.json"); try { @@ -217,6 +266,9 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const msg = error instanceof Error ? error.message : "Failed to generate eval config."; setMessage(msg); addLog(msg, "error"); + } finally { + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); } }; @@ -226,6 +278,46 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return; } + if (status === "modelPicker") { + if (key.escape) { + setStatus("idle"); + setMessage("Model picker cancelled."); + return; + } + + if (key.upArrow) { + setModelCursor((prev: number) => { + if (!availableModels.length) return 0; + return (prev - 1 + availableModels.length) % availableModels.length; + }); + return; + } + + if (key.downArrow) { + setModelCursor((prev: number) => { + if (!availableModels.length) return 0; + return (prev + 1) % availableModels.length; + }); + return; + } + + if (key.return) { + const selected = availableModels[modelCursor]; + if (!selected) return; + if (modelPickTarget === "eval") { + setEvalModel(selected); + setModelPickTarget("judge"); + setModelCursor(indexForModel(judgeModel)); + setMessage(`Eval model set: ${selected}. Select judge model.`); + return; + } + setJudgeModel(selected); + setStatus("idle"); + setMessage(`Models set: eval ${evalModel} • judge ${selected}.`); + } + return; + } + if (key.escape || input.toLowerCase() === "q") { app.exit(); return; @@ -559,22 +651,21 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX } if (input.toLowerCase() === "m") { - if (!availableModels.length) { - setMessage("No Copilot CLI models detected; using defaults."); + if (hideModelPicker) { + setMessage("Model picker hidden. Set ui.modelPicker to \"visible\" in primer.eval.json."); return; } setModelPickTarget("eval"); setStatus("model-pick"); setMessage("Pick eval model."); - // Set cursor to current model const idx = availableModels.indexOf(evalModel); setModelCursor(idx >= 0 ? idx : 0); return; } if (input.toLowerCase() === "j") { - if (!availableModels.length) { - setMessage("No Copilot CLI models detected; using defaults."); + if (hideModelPicker) { + setMessage("Model picker hidden. Set ui.modelPicker to \"visible\" in primer.eval.json."); return; } setModelPickTarget("judge"); From 2c8843eee26ff368c28ed9815e535e0c9196f097 Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Wed, 11 Feb 2026 17:25:21 -0700 Subject: [PATCH 14/84] feat: add multi-model code review prompt and synthesize findings into a prioritized fix list --- .github/agents/code-review-codex.agent.md | 163 ++++++++++++++++++ .github/agents/code-review-gemini.agent.md | 163 ++++++++++++++++++ .github/agents/code-review-opus.agent.md | 163 ++++++++++++++++++ .github/prompts/deslop.prompt.md | 13 ++ .../prompts/generate-improvements.prompt.md | 87 ++++++++++ .github/prompts/review.prompt.md | 10 ++ 6 files changed, 599 insertions(+) create mode 100644 .github/agents/code-review-codex.agent.md create mode 100644 .github/agents/code-review-gemini.agent.md create mode 100644 .github/agents/code-review-opus.agent.md create mode 100644 .github/prompts/deslop.prompt.md create mode 100644 .github/prompts/generate-improvements.prompt.md create mode 100644 .github/prompts/review.prompt.md diff --git a/.github/agents/code-review-codex.agent.md b/.github/agents/code-review-codex.agent.md new file mode 100644 index 0000000..c4be7e6 --- /dev/null +++ b/.github/agents/code-review-codex.agent.md @@ -0,0 +1,163 @@ +--- +description: Code review following VS Code contribution standards — correctness, lifecycle, naming, layering, accessibility, and security +name: Code Review (Codex) +tools: ['search', 'read/problems', 'read/terminalLastCommand', 'web/githubRepo'] +model: GPT-5.3-Codex (copilot) +handoffs: + - label: Fix Issues + agent: agent + prompt: Fix the issues identified in the code review above. + send: false +--- + +You are a code reviewer for the VS Code codebase. Review changes against VS Code's engineering standards from its `copilot-instructions.md`, ESLint config, and codebase conventions. + +# Review Process + +1. **Understand context** — Read changed files and surrounding code to understand intent +2. **Check correctness** — Logic, edge cases, error handling, off-by-one errors +3. **Check VS Code conventions** — Naming, disposables, layering, localization, style, accessibility +4. **Check security** — OWASP Top 10 where relevant +5. **Check testing** — Disposable leak checks, coverage of new behavior + +# VS Code Conventions Checklist + +## Indentation + +- Use **tabs**, not spaces + +## Naming + +- **Classes, interfaces, enums, type aliases**: `PascalCase` +- **Interfaces**: prefix with `I` (e.g., `IDisposable`, `IEditorService`) +- **Enum values**: `PascalCase` +- **Functions, methods, properties, local variables**: `camelCase` +- **Private/protected members**: prefix with `_` (e.g., `private _myField`) +- **Service decorators**: `createDecorator('serviceName')` +- Use whole words in names when possible + +## Strings + +- Use `"double quotes"` for user-facing strings that need localization +- Use `'single quotes'` for everything else +- All user-visible strings must use `localize()` or `nls.localize()` +- Never concatenate localized strings — use placeholders (`{0}`, `{1}`) + +## UI Labels + +- Title-style capitalization for command labels, buttons, and menu items +- Don't capitalize prepositions of four or fewer letters unless first or last word + +## Types + +- Don't export types or functions unless shared across multiple components +- Don't introduce new types or values to the global namespace +- Don't use `any` or `unknown` unless absolutely necessary — define proper types + +## Comments + +- Use JSDoc style comments for functions, interfaces, enums, and classes + +## Style + +- Prefer arrow functions `=>` over anonymous function expressions +- Only surround arrow function parameters when necessary (`x => x` not `(x) => x`, but `(x, y) => x + y` is fine) +- Always surround loop and conditional bodies with curly braces +- Open curly braces on the same line as the statement +- Prefer top-level `export function x() {}` over `export const x = () => {}` (better stack traces) +- Prefer `async`/`await` over `.then()` chains +- Prefer named regex capture groups over numbered ones + +## Disposable Lifecycle + +- Classes holding resources must extend `Disposable` and use `this._register()` to track child disposables +- Use `DisposableStore`, `MutableDisposable`, or `DisposableMap` — never raw `IDisposable[]` +- Event listeners, file watchers, and providers must be registered via `this._register()` +- Do NOT register a disposable to the containing class if created in a method called repeatedly — return `IDisposable` from the method and let the caller register it +- Disposables must not be leaked: verify `dispose()` is called or ownership is transferred +- Prefer correlated file watchers (via `fileService.createWatcher`) over shared ones + +## Layering & Architecture + +- `/common/` — no DOM, no Node.js, no Electron imports +- `/browser/` — may use DOM APIs, never Node.js +- `/node/` or `/electron-main/` — may use Node.js APIs +- Never import `browser` from `common`, or `node` from `browser`/`common` +- Contributions use `registerWorkbenchContribution2()` with appropriate `WorkbenchPhase` +- Use `npm run valid-layers-check` to verify layering + +## Error Handling + +- Use `onUnexpectedError()` for errors in async flows that shouldn't crash +- Use typed error classes (e.g., `BugIndicatingError`) for programming errors +- Never swallow errors silently — at minimum log via `ILogService` + +## Events + +- Use `Emitter` for event sources, expose as `Event` via getter +- Register event listeners with `this._register()` to prevent leaks + +## File Headers + +- Every file must start with the Microsoft copyright header (MIT license) + +## Accessibility + +- Interactive elements must have ARIA labels +- Keyboard navigation must work for all new UI +- Screen reader announcements for dynamic state changes via `aria.alert()` +- Prefer `IHoverService` for tooltips over custom implementations + +## Code Quality + +- Never duplicate imports — reuse existing imports +- Don't duplicate code — look for existing utilities before writing new ones +- Don't use another component's storage keys directly — use proper API +- Clean up any temporary files or scripts created during development + +## Testing + +- `ensureNoDisposablesAreLeakedInTestSuite()` must be called in every test suite +- Minimize assertions — prefer one snapshot-style `assert.deepStrictEqual` over many small assertions +- Don't add tests to the wrong suite (e.g., appending to end of file instead of inside the relevant `suite`) +- Match existing test patterns (`describe`/`test` or `suite`/`test`) consistently + +# Severity Levels + +- **Critical**: Security vulnerabilities, disposable leaks in hot paths, layering violations. Must fix. +- **Major**: Bugs, missing error handling, naming violations, missing localization, `any` casts. Must fix. +- **Minor**: Style improvements, missing region markers, non-blocking refactors. Recommended. +- **Nit**: Cosmetic preferences. Optional. + +# Review Rules + +- Never approve code with Critical or Major findings +- Explain *why* something is a problem, not just *what* +- Suggest a concrete fix for Critical and Major findings +- Do not flag style preferences as Major issues +- Do not rewrite working code just because you would write it differently +- Limit feedback to actionable items — no praise or filler + +# Security Checklist + +- XSS: user content rendered via `MarkdownString` must set `supportHtml: false` or sanitize +- Trusted Types: use `TrustedTypePolicy` for dynamic script/style injection +- Secrets: no hardcoded credentials, tokens, or API keys in source +- Input validation: untrusted input validated at extension host / IPC boundaries +- Dependencies: no known vulnerable packages introduced + +# Output Format + +```markdown +## Summary +One-sentence summary of the overall change quality. + +## Findings +### [Severity] Title +**File:** `path/to/file.ts:L42` +**Issue:** Description of the problem and why it matters. +**Suggestion:** Concrete fix or approach. + +## Verdict +APPROVE | REQUEST_CHANGES | NEEDS_DISCUSSION +``` diff --git a/.github/agents/code-review-gemini.agent.md b/.github/agents/code-review-gemini.agent.md new file mode 100644 index 0000000..a903bc5 --- /dev/null +++ b/.github/agents/code-review-gemini.agent.md @@ -0,0 +1,163 @@ +--- +description: Code review following VS Code contribution standards — correctness, lifecycle, naming, layering, accessibility, and security +name: Code Review (Gemini) +tools: ['search', 'read/problems', 'read/terminalLastCommand', 'web/githubRepo'] +model: Gemini 3 Pro (Preview) (copilot) +handoffs: + - label: Fix Issues + agent: agent + prompt: Fix the issues identified in the code review above. + send: false +--- + +You are a code reviewer for the VS Code codebase. Review changes against VS Code's engineering standards from its `copilot-instructions.md`, ESLint config, and codebase conventions. + +# Review Process + +1. **Understand context** — Read changed files and surrounding code to understand intent +2. **Check correctness** — Logic, edge cases, error handling, off-by-one errors +3. **Check VS Code conventions** — Naming, disposables, layering, localization, style, accessibility +4. **Check security** — OWASP Top 10 where relevant +5. **Check testing** — Disposable leak checks, coverage of new behavior + +# VS Code Conventions Checklist + +## Indentation + +- Use **tabs**, not spaces + +## Naming + +- **Classes, interfaces, enums, type aliases**: `PascalCase` +- **Interfaces**: prefix with `I` (e.g., `IDisposable`, `IEditorService`) +- **Enum values**: `PascalCase` +- **Functions, methods, properties, local variables**: `camelCase` +- **Private/protected members**: prefix with `_` (e.g., `private _myField`) +- **Service decorators**: `createDecorator('serviceName')` +- Use whole words in names when possible + +## Strings + +- Use `"double quotes"` for user-facing strings that need localization +- Use `'single quotes'` for everything else +- All user-visible strings must use `localize()` or `nls.localize()` +- Never concatenate localized strings — use placeholders (`{0}`, `{1}`) + +## UI Labels + +- Title-style capitalization for command labels, buttons, and menu items +- Don't capitalize prepositions of four or fewer letters unless first or last word + +## Types + +- Don't export types or functions unless shared across multiple components +- Don't introduce new types or values to the global namespace +- Don't use `any` or `unknown` unless absolutely necessary — define proper types + +## Comments + +- Use JSDoc style comments for functions, interfaces, enums, and classes + +## Style + +- Prefer arrow functions `=>` over anonymous function expressions +- Only surround arrow function parameters when necessary (`x => x` not `(x) => x`, but `(x, y) => x + y` is fine) +- Always surround loop and conditional bodies with curly braces +- Open curly braces on the same line as the statement +- Prefer top-level `export function x() {}` over `export const x = () => {}` (better stack traces) +- Prefer `async`/`await` over `.then()` chains +- Prefer named regex capture groups over numbered ones + +## Disposable Lifecycle + +- Classes holding resources must extend `Disposable` and use `this._register()` to track child disposables +- Use `DisposableStore`, `MutableDisposable`, or `DisposableMap` — never raw `IDisposable[]` +- Event listeners, file watchers, and providers must be registered via `this._register()` +- Do NOT register a disposable to the containing class if created in a method called repeatedly — return `IDisposable` from the method and let the caller register it +- Disposables must not be leaked: verify `dispose()` is called or ownership is transferred +- Prefer correlated file watchers (via `fileService.createWatcher`) over shared ones + +## Layering & Architecture + +- `/common/` — no DOM, no Node.js, no Electron imports +- `/browser/` — may use DOM APIs, never Node.js +- `/node/` or `/electron-main/` — may use Node.js APIs +- Never import `browser` from `common`, or `node` from `browser`/`common` +- Contributions use `registerWorkbenchContribution2()` with appropriate `WorkbenchPhase` +- Use `npm run valid-layers-check` to verify layering + +## Error Handling + +- Use `onUnexpectedError()` for errors in async flows that shouldn't crash +- Use typed error classes (e.g., `BugIndicatingError`) for programming errors +- Never swallow errors silently — at minimum log via `ILogService` + +## Events + +- Use `Emitter` for event sources, expose as `Event` via getter +- Register event listeners with `this._register()` to prevent leaks + +## File Headers + +- Every file must start with the Microsoft copyright header (MIT license) + +## Accessibility + +- Interactive elements must have ARIA labels +- Keyboard navigation must work for all new UI +- Screen reader announcements for dynamic state changes via `aria.alert()` +- Prefer `IHoverService` for tooltips over custom implementations + +## Code Quality + +- Never duplicate imports — reuse existing imports +- Don't duplicate code — look for existing utilities before writing new ones +- Don't use another component's storage keys directly — use proper API +- Clean up any temporary files or scripts created during development + +## Testing + +- `ensureNoDisposablesAreLeakedInTestSuite()` must be called in every test suite +- Minimize assertions — prefer one snapshot-style `assert.deepStrictEqual` over many small assertions +- Don't add tests to the wrong suite (e.g., appending to end of file instead of inside the relevant `suite`) +- Match existing test patterns (`describe`/`test` or `suite`/`test`) consistently + +# Severity Levels + +- **Critical**: Security vulnerabilities, disposable leaks in hot paths, layering violations. Must fix. +- **Major**: Bugs, missing error handling, naming violations, missing localization, `any` casts. Must fix. +- **Minor**: Style improvements, missing region markers, non-blocking refactors. Recommended. +- **Nit**: Cosmetic preferences. Optional. + +# Review Rules + +- Never approve code with Critical or Major findings +- Explain *why* something is a problem, not just *what* +- Suggest a concrete fix for Critical and Major findings +- Do not flag style preferences as Major issues +- Do not rewrite working code just because you would write it differently +- Limit feedback to actionable items — no praise or filler + +# Security Checklist + +- XSS: user content rendered via `MarkdownString` must set `supportHtml: false` or sanitize +- Trusted Types: use `TrustedTypePolicy` for dynamic script/style injection +- Secrets: no hardcoded credentials, tokens, or API keys in source +- Input validation: untrusted input validated at extension host / IPC boundaries +- Dependencies: no known vulnerable packages introduced + +# Output Format + +```markdown +## Summary +One-sentence summary of the overall change quality. + +## Findings +### [Severity] Title +**File:** `path/to/file.ts:L42` +**Issue:** Description of the problem and why it matters. +**Suggestion:** Concrete fix or approach. + +## Verdict +APPROVE | REQUEST_CHANGES | NEEDS_DISCUSSION +``` diff --git a/.github/agents/code-review-opus.agent.md b/.github/agents/code-review-opus.agent.md new file mode 100644 index 0000000..264def9 --- /dev/null +++ b/.github/agents/code-review-opus.agent.md @@ -0,0 +1,163 @@ +--- +description: Code review following VS Code contribution standards — correctness, lifecycle, naming, layering, accessibility, and security +name: Code Review (Opus) +tools: ['search', 'read/problems', 'read/terminalLastCommand', 'web/githubRepo'] +model: Claude Opus 4.6 (fast mode) (Preview) (copilot) +handoffs: + - label: Fix Issues + agent: agent + prompt: Fix the issues identified in the code review above. + send: false +--- + +You are a code reviewer for the VS Code codebase. Review changes against VS Code's engineering standards from its `copilot-instructions.md`, ESLint config, and codebase conventions. + +# Review Process + +1. **Understand context** — Read changed files and surrounding code to understand intent +2. **Check correctness** — Logic, edge cases, error handling, off-by-one errors +3. **Check VS Code conventions** — Naming, disposables, layering, localization, style, accessibility +4. **Check security** — OWASP Top 10 where relevant +5. **Check testing** — Disposable leak checks, coverage of new behavior + +# VS Code Conventions Checklist + +## Indentation + +- Use **tabs**, not spaces + +## Naming + +- **Classes, interfaces, enums, type aliases**: `PascalCase` +- **Interfaces**: prefix with `I` (e.g., `IDisposable`, `IEditorService`) +- **Enum values**: `PascalCase` +- **Functions, methods, properties, local variables**: `camelCase` +- **Private/protected members**: prefix with `_` (e.g., `private _myField`) +- **Service decorators**: `createDecorator('serviceName')` +- Use whole words in names when possible + +## Strings + +- Use `"double quotes"` for user-facing strings that need localization +- Use `'single quotes'` for everything else +- All user-visible strings must use `localize()` or `nls.localize()` +- Never concatenate localized strings — use placeholders (`{0}`, `{1}`) + +## UI Labels + +- Title-style capitalization for command labels, buttons, and menu items +- Don't capitalize prepositions of four or fewer letters unless first or last word + +## Types + +- Don't export types or functions unless shared across multiple components +- Don't introduce new types or values to the global namespace +- Don't use `any` or `unknown` unless absolutely necessary — define proper types + +## Comments + +- Use JSDoc style comments for functions, interfaces, enums, and classes + +## Style + +- Prefer arrow functions `=>` over anonymous function expressions +- Only surround arrow function parameters when necessary (`x => x` not `(x) => x`, but `(x, y) => x + y` is fine) +- Always surround loop and conditional bodies with curly braces +- Open curly braces on the same line as the statement +- Prefer top-level `export function x() {}` over `export const x = () => {}` (better stack traces) +- Prefer `async`/`await` over `.then()` chains +- Prefer named regex capture groups over numbered ones + +## Disposable Lifecycle + +- Classes holding resources must extend `Disposable` and use `this._register()` to track child disposables +- Use `DisposableStore`, `MutableDisposable`, or `DisposableMap` — never raw `IDisposable[]` +- Event listeners, file watchers, and providers must be registered via `this._register()` +- Do NOT register a disposable to the containing class if created in a method called repeatedly — return `IDisposable` from the method and let the caller register it +- Disposables must not be leaked: verify `dispose()` is called or ownership is transferred +- Prefer correlated file watchers (via `fileService.createWatcher`) over shared ones + +## Layering & Architecture + +- `/common/` — no DOM, no Node.js, no Electron imports +- `/browser/` — may use DOM APIs, never Node.js +- `/node/` or `/electron-main/` — may use Node.js APIs +- Never import `browser` from `common`, or `node` from `browser`/`common` +- Contributions use `registerWorkbenchContribution2()` with appropriate `WorkbenchPhase` +- Use `npm run valid-layers-check` to verify layering + +## Error Handling + +- Use `onUnexpectedError()` for errors in async flows that shouldn't crash +- Use typed error classes (e.g., `BugIndicatingError`) for programming errors +- Never swallow errors silently — at minimum log via `ILogService` + +## Events + +- Use `Emitter` for event sources, expose as `Event` via getter +- Register event listeners with `this._register()` to prevent leaks + +## File Headers + +- Every file must start with the Microsoft copyright header (MIT license) + +## Accessibility + +- Interactive elements must have ARIA labels +- Keyboard navigation must work for all new UI +- Screen reader announcements for dynamic state changes via `aria.alert()` +- Prefer `IHoverService` for tooltips over custom implementations + +## Code Quality + +- Never duplicate imports — reuse existing imports +- Don't duplicate code — look for existing utilities before writing new ones +- Don't use another component's storage keys directly — use proper API +- Clean up any temporary files or scripts created during development + +## Testing + +- `ensureNoDisposablesAreLeakedInTestSuite()` must be called in every test suite +- Minimize assertions — prefer one snapshot-style `assert.deepStrictEqual` over many small assertions +- Don't add tests to the wrong suite (e.g., appending to end of file instead of inside the relevant `suite`) +- Match existing test patterns (`describe`/`test` or `suite`/`test`) consistently + +# Severity Levels + +- **Critical**: Security vulnerabilities, disposable leaks in hot paths, layering violations. Must fix. +- **Major**: Bugs, missing error handling, naming violations, missing localization, `any` casts. Must fix. +- **Minor**: Style improvements, missing region markers, non-blocking refactors. Recommended. +- **Nit**: Cosmetic preferences. Optional. + +# Review Rules + +- Never approve code with Critical or Major findings +- Explain *why* something is a problem, not just *what* +- Suggest a concrete fix for Critical and Major findings +- Do not flag style preferences as Major issues +- Do not rewrite working code just because you would write it differently +- Limit feedback to actionable items — no praise or filler + +# Security Checklist + +- XSS: user content rendered via `MarkdownString` must set `supportHtml: false` or sanitize +- Trusted Types: use `TrustedTypePolicy` for dynamic script/style injection +- Secrets: no hardcoded credentials, tokens, or API keys in source +- Input validation: untrusted input validated at extension host / IPC boundaries +- Dependencies: no known vulnerable packages introduced + +# Output Format + +```markdown +## Summary +One-sentence summary of the overall change quality. + +## Findings +### [Severity] Title +**File:** `path/to/file.ts:L42` +**Issue:** Description of the problem and why it matters. +**Suggestion:** Concrete fix or approach. + +## Verdict +APPROVE | REQUEST_CHANGES | NEEDS_DISCUSSION +``` diff --git a/.github/prompts/deslop.prompt.md b/.github/prompts/deslop.prompt.md new file mode 100644 index 0000000..3c7d492 --- /dev/null +++ b/.github/prompts/deslop.prompt.md @@ -0,0 +1,13 @@ +--- +name: deslop +description: Remove AI-generated slop from a branch by diffing against main +--- +Get the diff (`git diff main...HEAD`) and remove AI-generated slop from changed files: + +- Comments inconsistent with the rest of the file +- Defensive checks or try/catch blocks abnormal for that codepath +- `any` casts used to work around type issues +- Inline imports (move to top of file) +- Style inconsistencies with the surrounding code + +Preserve legitimate changes. Report a 1-3 sentence summary of what was removed. \ No newline at end of file diff --git a/.github/prompts/generate-improvements.prompt.md b/.github/prompts/generate-improvements.prompt.md new file mode 100644 index 0000000..deecf2c --- /dev/null +++ b/.github/prompts/generate-improvements.prompt.md @@ -0,0 +1,87 @@ +--- +description: Suggest improvements to the Prompt LSP project across features, bug fixes, security, performance, and engineering quality. +--- + +You are a senior software engineer reviewing the **Prompt LSP** project — a VS Code extension with a Language Server Protocol backend that analyzes, validates, and improves AI prompt files (`.prompt.md`, `.agent.md`, `.system.md`, `.instructions.md`). + +## Architecture Context + +The project has two main components: + +- **Language Server** (`src/server.ts`) — LSP server that parses prompt documents, runs analysis, and sends diagnostics. +- **VS Code Client** (`client/src/extension.ts`) — Extension that connects to the server, provides UI integration, and proxies LLM requests via `vscode.lm`. + +Analysis is split into two layers: + +1. **Static Analysis** (`src/analyzers/static.ts`) — Fast, free, runs on every keystroke. Handles variable validation, injection detection, instruction strength, ambiguity, tokenization, frontmatter validation, and composition link checking. +2. **LLM Analysis** (`src/analyzers/llm.ts`) — Semantic analysis via GitHub Copilot's `vscode.lm` API. Handles contradiction detection, persona consistency, safety guardrail analysis, cognitive load, output shape prediction, and semantic coverage. Runs on save with debouncing. + +Results are cached by content hash in `src/cache.ts` with TTL-based expiry. LSP features like CodeLens, hover, go-to-definition, and code actions are in `src/lspFeatures.ts`. + +## Your Task + +Analyze the full codebase and generate a prioritized list of **concrete, actionable improvements**. For each suggestion, provide: + +1. **Title** — short descriptive name +2. **Category** — one of: `feature`, `bug-fix`, `security`, `performance`, `engineering`, `testing`, `dx` (developer experience) +3. **Priority** — `critical`, `high`, `medium`, `low` +4. **Description** — what the problem or opportunity is and why it matters +5. **Suggested implementation** — specific code changes, files to modify, and approach + +## Areas to Evaluate + +### Features & Functionality +- What analyzers from the SPEC (`docs/SPEC.md`) are specified but not yet implemented? +- Are there LSP capabilities (completions, rename, folding ranges, inlay hints, semantic tokens) that would add value? +- Are there missing quick-fix code actions for existing diagnostics? +- Could the extension provide better onboarding or discoverability? + +### Bug Fixes & Correctness +- Are there edge cases in parsing (frontmatter, variables, composition links, sections) that would produce incorrect results? +- Do the LLM response parsers handle malformed JSON gracefully in every path? +- Are there race conditions in the debounce/caching/versioning logic? +- Does the `detectFileType` function correctly classify all supported file patterns? + +### Security +- Are composition link paths validated against path traversal attacks? +- Is user-controlled text from prompt documents safely handled when embedded in LLM analysis prompts (prompt injection risk)? +- Are there any risks from `fs.accessSync` / `fs.readFileSync` on user-supplied paths? +- Is the cache susceptible to poisoning or collision? + +### Performance +- Are there unnecessary re-analyses or redundant file reads? +- Could any analyses be lazily computed or incrementally updated? +- Is tiktoken encoding being efficiently managed (encoder caching, disposal)? +- Are there opportunities for parallelization or early termination? + +### Engineering Quality +- Are there TypeScript strict-mode violations or `any` types that should be eliminated? +- Is error handling consistent and informative? +- Are there dead code paths or unused exports? +- Could modules be better separated for testability? + +### Testing +- What is the current test coverage and where are the gaps? +- Are the LLM analyzer paths tested (even with mocked proxy)? +- Are edge cases in frontmatter parsing, composition links, and variable detection covered? +- Are there integration-level tests for the full diagnostic pipeline? + +### Developer Experience +- Is the build/watch/debug workflow smooth? +- Are there missing npm scripts, lint configs, or CI integrations? +- Is the extension easy to install, configure, and try out? + +## Output Format + +Return the improvements as a numbered list grouped by category. Use this structure: + +``` +## Category Name + +### 1. Title (Priority: critical/high/medium/low) +**Problem:** What's wrong or missing +**Suggestion:** Specific changes to make +**Files:** Which files to modify +``` + +Focus on substance over volume. Prefer 10 high-quality, specific suggestions over 30 vague ones. Always reference actual code, file paths, and function names from the codebase. \ No newline at end of file diff --git a/.github/prompts/review.prompt.md b/.github/prompts/review.prompt.md new file mode 100644 index 0000000..54a8d01 --- /dev/null +++ b/.github/prompts/review.prompt.md @@ -0,0 +1,10 @@ +--- +name: review +description: Run three parallel code reviews (Opus, Gemini, Codex) and synthesize findings into a prioritized fix list +--- +Run a multi-model code review: + +1. Invoke `code-review-opus`, `code-review-gemini`, and `code-review-codex` as three parallel subagents +2. Cross-grade: have each reviewer evaluate the other two reviews for false positives and missed issues +3. Synthesize a deduplicated list of findings ordered by severity (Critical > Major > Minor > Nit) +4. Output one final fix list with file, line, and suggested change for each item \ No newline at end of file From 8b7722c8bc356c256c2d538c8b750289c15d65c4 Mon Sep 17 00:00:00 2001 From: Pierce Boggan Date: Wed, 11 Feb 2026 17:53:16 -0700 Subject: [PATCH 15/84] feat: enhance language and package manager detection in analyzer service - Added support for additional languages (C#, Java, Ruby, PHP) in the analyzeRepo function. - Updated detectPackageManager to recognize new package managers (Maven, Gradle, Bundler, Composer). - Improved handling of pnpm workspace files by skipping comment-only lines and supporting inline arrays. fix: validate Azure DevOps slugs and improve error handling - Introduced validateAdoSlug function to ensure organization, project, and repo names are valid. - Updated API calls in Azure DevOps service to use validated slugs. - Enhanced error handling in checkRepoHasInstructions to throw descriptive errors on request failures. refactor: streamline Copilot CLI path resolution - Cached Copilot CLI path to avoid redundant lookups. - Improved findCopilotCliPath to handle platform-specific paths more effectively. - Added glob pattern matching for VS Code extension paths. chore: update evalScaffold and evaluator services - Refactored generateEvalScaffold to use withCwd for better directory management. - Simplified runEval by using assertCopilotCliReady for CLI path resolution. - Removed redundant EvalCase and EvalConfig type definitions from evaluator. fix: sanitize error messages in git push - Added error handling in pushBranch to sanitize embedded credentials from error messages. feat: enhance instruction generation and PR body creation - Updated generateCopilotInstructions to use withCwd for improved directory handling. - Created utility functions for building PR bodies for configurations and instructions. - Updated BatchTui and BatchTuiAzure to use DEFAULT_MODEL for instruction generation. chore: add utility functions for file system operations - Introduced validateCachePath to prevent path traversal vulnerabilities. - Enhanced safeWriteFile to reject symlinks and ensure safe file writing. --- .../prompts/generate-improvements.prompt.md | 121 ++++++++++------ package.json | 1 + src/cli.ts | 7 +- src/commands/eval.ts | 5 +- src/commands/init.ts | 8 +- src/commands/pr.ts | 62 +-------- src/commands/readiness.ts | 1 + src/config.ts | 2 + src/services/__tests__/analyzer.test.ts | 115 ++++++++++++++- src/services/__tests__/cachePath.test.ts | 41 ++++++ src/services/__tests__/generator.test.ts | 128 +++++++++++++++++ src/services/__tests__/git.test.ts | 47 +++++++ src/services/analyzer.ts | 30 +++- src/services/azureDevops.ts | 37 ++++- src/services/copilot.ts | 70 ++++++++-- src/services/evalScaffold.ts | 131 +++++++++--------- src/services/evaluator.ts | 61 ++------ src/services/git.ts | 6 + src/services/instructions.ts | 101 +++++++------- src/ui/BatchTui.tsx | 53 ++----- src/ui/BatchTuiAzure.tsx | 44 ++---- src/ui/tui.tsx | 30 ++-- src/utils/cwd.ts | 24 ++++ src/utils/fs.ts | 36 ++++- src/utils/pr.ts | 49 +++++++ 25 files changed, 824 insertions(+), 386 deletions(-) create mode 100644 src/config.ts create mode 100644 src/services/__tests__/cachePath.test.ts create mode 100644 src/services/__tests__/generator.test.ts create mode 100644 src/services/__tests__/git.test.ts create mode 100644 src/utils/cwd.ts create mode 100644 src/utils/pr.ts diff --git a/.github/prompts/generate-improvements.prompt.md b/.github/prompts/generate-improvements.prompt.md index deecf2c..774c0e3 100644 --- a/.github/prompts/generate-improvements.prompt.md +++ b/.github/prompts/generate-improvements.prompt.md @@ -1,22 +1,55 @@ --- -description: Suggest improvements to the Prompt LSP project across features, bug fixes, security, performance, and engineering quality. +description: Suggest improvements to the Primer CLI project across features, bug fixes, security, performance, and engineering quality. --- -You are a senior software engineer reviewing the **Prompt LSP** project — a VS Code extension with a Language Server Protocol backend that analyzes, validates, and improves AI prompt files (`.prompt.md`, `.agent.md`, `.system.md`, `.instructions.md`). +You are a senior software engineer reviewing the **Primer** project — a TypeScript CLI tool that primes repositories for AI-assisted development by analyzing codebases, generating Copilot instructions and VS Code configs, running evaluations, and producing AI readiness reports. ## Architecture Context -The project has two main components: - -- **Language Server** (`src/server.ts`) — LSP server that parses prompt documents, runs analysis, and sends diagnostics. -- **VS Code Client** (`client/src/extension.ts`) — Extension that connects to the server, provides UI integration, and proxies LLM requests via `vscode.lm`. - -Analysis is split into two layers: - -1. **Static Analysis** (`src/analyzers/static.ts`) — Fast, free, runs on every keystroke. Handles variable validation, injection detection, instruction strength, ambiguity, tokenization, frontmatter validation, and composition link checking. -2. **LLM Analysis** (`src/analyzers/llm.ts`) — Semantic analysis via GitHub Copilot's `vscode.lm` API. Handles contradiction detection, persona consistency, safety guardrail analysis, cognitive load, output shape prediction, and semantic coverage. Runs on save with debouncing. - -Results are cached by content hash in `src/cache.ts` with TTL-based expiry. LSP features like CodeLens, hover, go-to-definition, and code actions are in `src/lspFeatures.ts`. +- **Tech Stack:** TypeScript (ESM, strict), Node.js, React (Ink for TUI), Commander for CLI +- **Entrypoint:** `src/index.ts` → `runCli` in `src/cli.ts` +- **Dependencies:** `@github/copilot-sdk`, `@octokit/rest`, `simple-git`, `ink`, `commander`, `fast-glob`, `@inquirer/prompts` + +### Key Directories + +- `src/commands/` — CLI subcommands (`init`, `generate`, `pr`, `eval`, `tui`, `instructions`, `readiness`, `batch`, `batch-readiness`) +- `src/services/` — Core logic: + - `analyzer.ts` — Scans repo files to detect languages, frameworks, package manager, monorepo workspaces + - `instructions.ts` — Generates `.github/copilot-instructions.md` using Copilot SDK agent sessions + - `generator.ts` — Writes `.vscode/settings.json` and `.vscode/mcp.json` configs + - `evaluator.ts` — Runs eval cases comparing agent responses with/without instructions, builds trajectory viewer HTML + - `readiness.ts` — Multi-pillar AI readiness assessment (style, build, testing, docs, dev-env, code-quality, observability, security, ai-tooling) + - `visualReport.ts` — Generates beautiful HTML readiness reports with summary cards, pillar charts, level distribution + - `git.ts` — Clone/branch operations via `simple-git` + - `github.ts` / `azureDevops.ts` — GitHub (Octokit) and Azure DevOps API integrations + - `copilot.ts` — Locates and validates the Copilot CLI binary + - `evalScaffold.ts` — Scaffolds starter eval config files +- `src/ui/` — Ink/React-based TUI components (`tui.tsx`, `BatchTui.tsx`, `BatchReadinessTui.tsx`, `BatchTuiAzure.tsx`, `AnimatedBanner.tsx`) +- `src/utils/` — Shared utilities (`fs.ts` for safe file writes, `logger.ts`, `pr.ts`) + +### CLI Commands + +| Command | Description | +|---------|-------------| +| `primer init` | Interactive setup wizard (instructions + configs) | +| `primer generate ` | Generate `instructions`, `agents`, `mcp`, or `vscode` configs | +| `primer instructions` | Generate copilot-instructions.md via Copilot SDK | +| `primer eval` | Run evaluation cases comparing with/without instructions | +| `primer readiness` | AI readiness assessment with optional visual HTML report | +| `primer batch` | Batch process multiple repos across GitHub/Azure orgs | +| `primer batch-readiness` | Batch readiness reports across multiple repos | +| `primer pr` | Automate branch/PR creation for generated configs | +| `primer tui` | Interactive Ink-based terminal UI | + +### Key Patterns + +- ESM everywhere (`"type": "module"` in `package.json`) +- Strict TypeScript (ES2022 target, ESNext modules) +- Safe file writes: only overwrites with `--force` flag (`safeWriteFile` in `src/utils/fs.ts`) +- Copilot SDK integration via `@github/copilot-sdk` with session-based agent conversations +- GitHub token resolution: `GITHUB_TOKEN` → `GH_TOKEN` → `gh auth token` fallback chain +- Readiness uses a leveled criteria system (levels 1-5) across 9 pillars with pass/fail/skip status +- Build with `tsup`, test with `vitest`, lint with `eslint`, format with `prettier` ## Your Task @@ -31,45 +64,53 @@ Analyze the full codebase and generate a prioritized list of **concrete, actiona ## Areas to Evaluate ### Features & Functionality -- What analyzers from the SPEC (`docs/SPEC.md`) are specified but not yet implemented? -- Are there LSP capabilities (completions, rename, folding ranges, inlay hints, semantic tokens) that would add value? -- Are there missing quick-fix code actions for existing diagnostics? -- Could the extension provide better onboarding or discoverability? +- Are there CLI commands or flags referenced in README/help text that aren't fully implemented? +- Could `analyzeRepo` detect more languages, frameworks, or package managers (e.g., Gradle, Maven, .NET, Ruby)? +- Does `primer init --yes` skip useful defaults (currently only selects instructions, not MCP/VS Code configs)? +- Could `primer readiness` support more output formats (e.g., CSV, PDF) or comparison over time? +- Are there opportunities to improve the batch processing UX (progress, retries, parallel execution)? +- Could `primer eval` scaffold richer default eval cases or support custom grading rubrics? ### Bug Fixes & Correctness -- Are there edge cases in parsing (frontmatter, variables, composition links, sections) that would produce incorrect results? -- Do the LLM response parsers handle malformed JSON gracefully in every path? -- Are there race conditions in the debounce/caching/versioning logic? -- Does the `detectFileType` function correctly classify all supported file patterns? +- Does `analyzeRepo` correctly handle edge cases like empty repos, non-git directories, or deeply nested monorepos? +- Does `readPnpmWorkspace` handle all valid YAML edge cases or is the line-by-line parser fragile? +- Does the Copilot SDK session handling (`instructions.ts`) properly clean up on errors (session.destroy, client.stop)? +- Are there race conditions in batch processing when cloning/analyzing multiple repos concurrently? +- Does `process.chdir()` in `generateCopilotInstructions` create issues if called concurrently? ### Security -- Are composition link paths validated against path traversal attacks? -- Is user-controlled text from prompt documents safely handled when embedded in LLM analysis prompts (prompt injection risk)? -- Are there any risks from `fs.accessSync` / `fs.readFileSync` on user-supplied paths? -- Is the cache susceptible to poisoning or collision? +- Is the GitHub token (`getGitHubToken`) handled securely — never logged, never leaked in error messages? +- Are user-supplied repo paths validated against path traversal (e.g., `../../etc/passwd` as a repo path)? +- Does `execFileAsync` usage properly sanitize arguments to prevent command injection? +- Are Azure DevOps PAT tokens handled securely throughout the `azureDevops.ts` service? +- Is the `safeWriteFile` function safe against symlink attacks (writing through a symlink to an unintended location)? ### Performance -- Are there unnecessary re-analyses or redundant file reads? -- Could any analyses be lazily computed or incrementally updated? -- Is tiktoken encoding being efficiently managed (encoder caching, disposal)? -- Are there opportunities for parallelization or early termination? +- Could `analyzeRepo` avoid redundant `readdir`/`readFile` calls when the same repo is analyzed multiple times? +- Is `fast-glob` usage in workspace detection efficient for large monorepos with many packages? +- Could the Copilot CLI path lookup (`findCopilotCliPath` in `copilot.ts`) be cached across invocations? +- Are batch operations (batch, batch-readiness) parallelized effectively, or do they process repos sequentially? +- Does the eval trajectory viewer HTML (`evaluator.ts`) generate excessively large output for many eval cases? ### Engineering Quality -- Are there TypeScript strict-mode violations or `any` types that should be eliminated? -- Is error handling consistent and informative? -- Are there dead code paths or unused exports? -- Could modules be better separated for testability? +- Are there TypeScript strict-mode violations, `any` types, or `as` casts that should be eliminated? +- Is error handling consistent across services — do all commands give clear, actionable error messages? +- Are there dead code paths or unused exports in the services or commands? +- Could the `process.chdir()` pattern in `instructions.ts` be replaced with a safer approach (e.g., passing cwd to child processes)? +- Are service interfaces well-separated for testability, or are there tight couplings (e.g., direct `process.env` reads)? ### Testing -- What is the current test coverage and where are the gaps? -- Are the LLM analyzer paths tested (even with mocked proxy)? -- Are edge cases in frontmatter parsing, composition links, and variable detection covered? -- Are there integration-level tests for the full diagnostic pipeline? +- What is the current test coverage? Only `analyzer.test.ts`, `fs.test.ts`, `readiness.test.ts`, and `visualReport.test.ts` exist — many services and commands are untested. +- Are there tests for the Copilot SDK integration paths (even with mocked SDK)? +- Are edge cases in `readPnpmWorkspace`, `detectWorkspace`, and `resolveWorkspaceApps` covered? +- Are there integration tests for the full `primer init` or `primer generate` flows? +- Is the GitHub/Azure DevOps API integration tested with mocked HTTP responses? ### Developer Experience -- Is the build/watch/debug workflow smooth? -- Are there missing npm scripts, lint configs, or CI integrations? -- Is the extension easy to install, configure, and try out? +- Is the `npx tsx` workflow sufficient, or should there be a `dev` script for faster iteration? +- Are error messages clear when prerequisites are missing (Copilot CLI, GitHub token, `gh` CLI)? +- Is the TUI (`src/ui/tui.tsx`) tested or difficult to test due to Ink rendering? +- Are there missing npm scripts for common workflows (e.g., `npm run dev`, `npm run test:unit`)? ## Output Format diff --git a/package.json b/package.json index 3c6fd55..5c8c40a 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ ], "scripts": { "build": "tsup", + "dev": "tsx src/index.ts", "prepare": "test \"$CI\" = true || tsup", "lint": "eslint .", "format": "prettier --write .", diff --git a/src/cli.ts b/src/cli.ts index 6d8a169..4bfeabf 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -8,6 +8,7 @@ import { instructionsCommand } from "./commands/instructions"; import { batchCommand } from "./commands/batch"; import { readinessCommand } from "./commands/readiness"; import { batchReadinessCommand } from "./commands/batchReadiness"; +import { DEFAULT_MODEL, DEFAULT_JUDGE_MODEL } from "./config"; export function runCli(argv: string[]): void { const program = new Command(); @@ -46,8 +47,8 @@ export function runCli(argv: string[]): void { .command("eval") .argument("[path]", "Path to eval config JSON") .option("--repo ", "Repository path", process.cwd()) - .option("--model ", "Model for responses", "claude-sonnet-4.5") - .option("--judge-model ", "Model for judging", "claude-sonnet-4.5") + .option("--model ", "Model for responses", DEFAULT_MODEL) + .option("--judge-model ", "Model for judging", DEFAULT_JUDGE_MODEL) .option("--list-models", "List Copilot CLI models and exit") .option("--output ", "Write results JSON to file") .option("--init", "Create a starter primer.eval.json file") @@ -64,7 +65,7 @@ export function runCli(argv: string[]): void { .command("instructions") .option("--repo ", "Repository path", process.cwd()) .option("--output ", "Output path for copilot instructions") - .option("--model ", "Model for instructions generation", "claude-sonnet-4.5") + .option("--model ", "Model for instructions generation", DEFAULT_MODEL) .action(instructionsCommand); program diff --git a/src/commands/eval.ts b/src/commands/eval.ts index 104a069..ac9deba 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -3,6 +3,7 @@ import fs from "fs/promises"; import { runEval } from "../services/evaluator"; import { listCopilotModels } from "../services/copilot"; import { generateEvalScaffold } from "../services/evalScaffold"; +import { DEFAULT_MODEL, DEFAULT_JUDGE_MODEL } from "../config"; type EvalOptions = { repo?: string; @@ -55,8 +56,8 @@ export async function evalCommand(configPathArg: string | undefined, options: Ev const { summary, viewerPath } = await runEval({ configPath, repoPath, - model: options.model ?? "gpt-5", - judgeModel: options.judgeModel ?? "gpt-5", + model: options.model ?? DEFAULT_MODEL, + judgeModel: options.judgeModel ?? DEFAULT_JUDGE_MODEL, outputPath: options.output }); diff --git a/src/commands/init.ts b/src/commands/init.ts index 2c6ed94..1242547 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -15,7 +15,7 @@ import { } from "../services/azureDevops"; import { buildAuthedUrl, cloneRepo, isGitRepo } from "../services/git"; import { generateCopilotInstructions } from "../services/instructions"; -import { ensureDir } from "../utils/fs"; +import { ensureDir, validateCachePath } from "../utils/fs"; import { prettyPrintSummary } from "../utils/logger"; type InitOptions = { @@ -59,7 +59,7 @@ export async function initCommand(repoPathArg: string | undefined, options: Init }); const cacheRoot = path.join(process.cwd(), ".primer-cache"); - repoPath = path.join(cacheRoot, selection.owner, selection.name); + repoPath = validateCachePath(cacheRoot, selection.owner, selection.name); await ensureDir(repoPath); const hasGit = await isGitRepo(repoPath); @@ -122,7 +122,7 @@ export async function initCommand(repoPathArg: string | undefined, options: Init }); const cacheRoot = path.join(process.cwd(), ".primer-cache"); - repoPath = path.join(cacheRoot, orgSelection.name, projectSelection.name, repoSelection.name); + repoPath = validateCachePath(cacheRoot, orgSelection.name, projectSelection.name, repoSelection.name); await ensureDir(repoPath); const hasGit = await isGitRepo(repoPath); @@ -135,7 +135,7 @@ export async function initCommand(repoPathArg: string | undefined, options: Init prettyPrintSummary(analysis); const selections = options.yes - ? ["instructions"] + ? ["instructions", "mcp", "vscode"] : await checkbox({ message: "What would you like to generate?", choices: [ diff --git a/src/commands/pr.ts b/src/commands/pr.ts index 7050840..9f4c8ac 100644 --- a/src/commands/pr.ts +++ b/src/commands/pr.ts @@ -10,7 +10,9 @@ import { getRepo as getAzureRepo } from "../services/azureDevops"; import { buildAuthedUrl, checkoutBranch, cloneRepo, commitAll, isGitRepo, pushBranch } from "../services/git"; -import { ensureDir } from "../utils/fs"; +import { ensureDir, validateCachePath } from "../utils/fs"; +import { buildConfigsPrBody, buildInstructionsPrBody } from "../utils/pr"; +import { DEFAULT_MODEL } from "../config"; type PrOptions = { branch?: string; @@ -48,7 +50,7 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P const repoInfo = await getAzureRepo(token, organization, project, name); const cacheRoot = path.join(process.cwd(), ".primer-cache"); - const repoPath = path.join(cacheRoot, organization, project, name); + const repoPath = validateCachePath(cacheRoot, organization, project, name); await ensureDir(repoPath); if (!(await isGitRepo(repoPath))) { @@ -59,7 +61,7 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P const branch = options.branch ?? "primer/add-instructions"; await checkoutBranch(repoPath, branch); - const instructions = await generateCopilotInstructions({ repoPath, model: "gpt-4.1" }); + const instructions = await generateCopilotInstructions({ repoPath, model: DEFAULT_MODEL }); const instructionsPath = path.join(repoPath, ".github", "copilot-instructions.md"); await ensureDir(path.dirname(instructionsPath)); await fs.writeFile(instructionsPath, instructions, "utf8"); @@ -99,7 +101,7 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P const repoInfo = await getRepo(token, owner, name); const cacheRoot = path.join(process.cwd(), ".primer-cache"); - const repoPath = path.join(cacheRoot, owner, name); + const repoPath = validateCachePath(cacheRoot, owner, name); await ensureDir(repoPath); if (!(await isGitRepo(repoPath))) { @@ -125,60 +127,10 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P owner, repo: name, title: "🤖 Prime this repo for AI", - body: buildPrBody(), + body: buildConfigsPrBody(), head: `${owner}:${branch}`, base: repoInfo.defaultBranch }); console.log(`Created PR: ${prUrl}`); } - -function buildPrBody(): string { - return [ - "## 🤖 Primed for AI", - "", - "This PR adds configurations to prime this repository for AI coding assistants.", - "", - "### Added Files", - "", - "| File | Purpose |", - "|------|---------|", - "| `.vscode/settings.json` | VS Code settings for optimal AI assistance |", - "| `.vscode/mcp.json` | Model Context Protocol server configuration |", - "", - "### How to Use", - "", - "1. Merge this PR", - "2. Open the project in VS Code", - "3. Start chatting with Copilot — it now understands your project!", - "", - "---", - "*Generated by Primer*" - ].join("\n"); -} - -function buildInstructionsPrBody(): string { - return [ - "## 🤖 Copilot Instructions Added", - "", - "This PR adds a `.github/copilot-instructions.md` file to help GitHub Copilot understand this codebase better.", - "", - "### What's Included", - "", - "The instructions file contains:", - "- Project overview and architecture", - "- Tech stack and conventions", - "- Build/test commands", - "- Key directories and files", - "", - "### Benefits", - "", - "With these instructions, Copilot will:", - "- Generate more contextually-aware code suggestions", - "- Follow project-specific patterns and conventions", - "- Understand the codebase structure", - "", - "---", - "*Generated by [Primer](https://github.com/pierceboggan/primer) - Prime your repos for AI*" - ].join("\n"); -} diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts index 642e471..5f2e09f 100644 --- a/src/commands/readiness.ts +++ b/src/commands/readiness.ts @@ -41,6 +41,7 @@ export async function readinessCommand(repoPathArg: string | undefined, options: const outputPath = path.resolve(options.output); await fs.writeFile(outputPath, JSON.stringify(report, null, 2), "utf8"); console.log(chalk.green(`✓ JSON report saved: ${outputPath}`)); + return; } if (options.json) { diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..a46583c --- /dev/null +++ b/src/config.ts @@ -0,0 +1,2 @@ +export const DEFAULT_MODEL = "claude-sonnet-4.5"; +export const DEFAULT_JUDGE_MODEL = "claude-sonnet-4.5"; diff --git a/src/services/__tests__/analyzer.test.ts b/src/services/__tests__/analyzer.test.ts index 724678f..9096e8e 100644 --- a/src/services/__tests__/analyzer.test.ts +++ b/src/services/__tests__/analyzer.test.ts @@ -1,13 +1,28 @@ import fs from "fs/promises"; import os from "os"; import path from "path"; -import { describe, expect, it } from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { analyzeRepo } from "../analyzer"; describe("analyzeRepo", () => { + const tmpDirs: string[] = []; + + async function makeTmpDir(): Promise { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), "primer-test-")); + tmpDirs.push(dir); + return dir; + } + + afterEach(async () => { + for (const dir of tmpDirs) { + await fs.rm(dir, { recursive: true, force: true }).catch(() => {}); + } + tmpDirs.length = 0; + }); + it("detects TypeScript and npm workspace", async () => { - const repoPath = await fs.mkdtemp(path.join(os.tmpdir(), "primer-test-")); + const repoPath = await makeTmpDir(); const packageJson = { name: "demo", workspaces: ["packages/*"], @@ -28,4 +43,100 @@ describe("analyzeRepo", () => { expect(result.workspaceType).toBe("npm"); expect(result.apps?.length).toBe(1); }); + + it("detects C# language", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "MyProject.csproj"), "", "utf8"); + + const result = await analyzeRepo(repoPath); + expect(result.languages).toContain("C#"); + }); + + it("detects Java via pom.xml", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "pom.xml"), "", "utf8"); + + const result = await analyzeRepo(repoPath); + expect(result.languages).toContain("Java"); + expect(result.packageManager).toBe("maven"); + }); + + it("detects Java via build.gradle", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "build.gradle"), "plugins {}", "utf8"); + + const result = await analyzeRepo(repoPath); + expect(result.languages).toContain("Java"); + expect(result.packageManager).toBe("gradle"); + }); + + it("detects Ruby", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "Gemfile"), "source 'https://rubygems.org'", "utf8"); + + const result = await analyzeRepo(repoPath); + expect(result.languages).toContain("Ruby"); + expect(result.packageManager).toBe("bundler"); + }); + + it("detects PHP", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "composer.json"), "{}", "utf8"); + + const result = await analyzeRepo(repoPath); + expect(result.languages).toContain("PHP"); + expect(result.packageManager).toBe("composer"); + }); + + it("returns empty analysis for empty directory", async () => { + const repoPath = await makeTmpDir(); + + const result = await analyzeRepo(repoPath); + expect(result.languages).toEqual([]); + expect(result.frameworks).toEqual([]); + expect(result.packageManager).toBeUndefined(); + }); + + it("detects pnpm workspace with comments in YAML", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "package.json"), JSON.stringify({ name: "root" })); + await fs.writeFile(path.join(repoPath, "pnpm-lock.yaml"), "lockfileVersion: 9"); + await fs.writeFile( + path.join(repoPath, "pnpm-workspace.yaml"), + [ + "# workspace config", + "packages:", + " - 'apps/*' # main apps", + " - 'libs/*'", + "# end" + ].join("\n") + ); + await fs.mkdir(path.join(repoPath, "apps", "web"), { recursive: true }); + await fs.writeFile( + path.join(repoPath, "apps", "web", "package.json"), + JSON.stringify({ name: "web", scripts: { build: "tsc" } }) + ); + + const result = await analyzeRepo(repoPath); + expect(result.workspaceType).toBe("pnpm"); + expect(result.workspacePatterns).toContain("apps/*"); + expect(result.workspacePatterns).toContain("libs/*"); + // Should not include comment text in patterns + expect(result.workspacePatterns?.some(p => p.includes("#"))).toBe(false); + }); + + it("detects pnpm inline array workspace", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "package.json"), JSON.stringify({ name: "root" })); + await fs.writeFile(path.join(repoPath, "pnpm-lock.yaml"), "lockfileVersion: 9"); + await fs.writeFile( + path.join(repoPath, "pnpm-workspace.yaml"), + "packages: [\"apps/*\", \"libs/*\"]\n" + ); + + const result = await analyzeRepo(repoPath); + expect(result.workspaceType).toBe("pnpm"); + expect(result.workspacePatterns).toContain("apps/*"); + expect(result.workspacePatterns).toContain("libs/*"); + }); }); diff --git a/src/services/__tests__/cachePath.test.ts b/src/services/__tests__/cachePath.test.ts new file mode 100644 index 0000000..dc86c5d --- /dev/null +++ b/src/services/__tests__/cachePath.test.ts @@ -0,0 +1,41 @@ +import path from "path"; +import { describe, expect, it } from "vitest"; + +import { validateCachePath } from "../../utils/fs"; + +describe("validateCachePath", () => { + it("returns resolved path for normal segments", () => { + const cacheRoot = "/tmp/primer-cache"; + const result = validateCachePath(cacheRoot, "owner", "repo"); + expect(result).toBe(path.resolve(cacheRoot, "owner", "repo")); + }); + + it("throws on path traversal via ..", () => { + const cacheRoot = "/tmp/primer-cache"; + expect(() => validateCachePath(cacheRoot, "..", "..", "etc")).toThrow("escapes cache directory"); + }); + + it("throws on absolute path segment that escapes", () => { + const cacheRoot = "/tmp/primer-cache"; + expect(() => validateCachePath(cacheRoot, "/etc/passwd")).toThrow("escapes cache directory"); + }); + + it("allows the cache root itself", () => { + const cacheRoot = "/tmp/primer-cache"; + const result = validateCachePath(cacheRoot); + expect(result).toBe(path.resolve(cacheRoot)); + }); + + it("allows nested paths within cache root", () => { + const cacheRoot = "/tmp/primer-cache"; + const result = validateCachePath(cacheRoot, "org", "project", "repo"); + expect(result).toBe(path.resolve(cacheRoot, "org", "project", "repo")); + }); + + it("throws when segment contains .. to escape", () => { + const cacheRoot = "/tmp/primer-cache"; + expect(() => validateCachePath(cacheRoot, "owner", "repo", "..", "..", "..", "etc")).toThrow( + "escapes cache directory" + ); + }); +}); diff --git a/src/services/__tests__/generator.test.ts b/src/services/__tests__/generator.test.ts new file mode 100644 index 0000000..a64ec51 --- /dev/null +++ b/src/services/__tests__/generator.test.ts @@ -0,0 +1,128 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; + +import { generateConfigs } from "../generator"; +import type { RepoAnalysis } from "../analyzer"; + +describe("generateConfigs", () => { + let tmpDir: string; + + beforeEach(async () => { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "primer-gen-")); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + function makeAnalysis(overrides?: Partial): RepoAnalysis { + return { + path: tmpDir, + isGitRepo: false, + languages: ["TypeScript"], + frameworks: [], + ...overrides + }; + } + + it("generates valid mcp.json", async () => { + const analysis = makeAnalysis(); + const { summary } = await generateConfigs({ + repoPath: tmpDir, + analysis, + selections: ["mcp"], + force: false + }); + + const content = await fs.readFile(path.join(tmpDir, ".vscode", "mcp.json"), "utf8"); + const parsed = JSON.parse(content); + + expect(parsed.servers).toBeDefined(); + expect(parsed.servers.github).toBeDefined(); + expect(parsed.servers.filesystem).toBeDefined(); + expect(summary).toContain("Wrote"); + }); + + it("generates valid vscode settings with frameworks", async () => { + const analysis = makeAnalysis({ frameworks: ["React", "Next.js"] }); + await generateConfigs({ + repoPath: tmpDir, + analysis, + selections: ["vscode"], + force: false + }); + + const content = await fs.readFile(path.join(tmpDir, ".vscode", "settings.json"), "utf8"); + const parsed = JSON.parse(content); + + expect(parsed["github.copilot.chat.codeGeneration.instructions"]).toBeDefined(); + expect(parsed["chat.mcp.enabled"]).toBe(true); + // Should mention frameworks in review instructions + const reviewText = parsed["github.copilot.chat.reviewSelection.instructions"][0].text; + expect(reviewText).toContain("React"); + expect(reviewText).toContain("Next.js"); + }); + + it("generates fallback review text when no frameworks", async () => { + const analysis = makeAnalysis({ frameworks: [] }); + await generateConfigs({ + repoPath: tmpDir, + analysis, + selections: ["vscode"], + force: false + }); + + const content = await fs.readFile(path.join(tmpDir, ".vscode", "settings.json"), "utf8"); + const parsed = JSON.parse(content); + const reviewText = parsed["github.copilot.chat.reviewSelection.instructions"][0].text; + expect(reviewText).toContain("repo conventions"); + }); + + it("skips existing files without force", async () => { + await fs.mkdir(path.join(tmpDir, ".vscode"), { recursive: true }); + await fs.writeFile(path.join(tmpDir, ".vscode", "mcp.json"), "original", "utf8"); + + const analysis = makeAnalysis(); + const { summary } = await generateConfigs({ + repoPath: tmpDir, + analysis, + selections: ["mcp"], + force: false + }); + + const content = await fs.readFile(path.join(tmpDir, ".vscode", "mcp.json"), "utf8"); + expect(content).toBe("original"); + expect(summary).toContain("Skipped"); + }); + + it("overwrites existing files with force", async () => { + await fs.mkdir(path.join(tmpDir, ".vscode"), { recursive: true }); + await fs.writeFile(path.join(tmpDir, ".vscode", "mcp.json"), "original", "utf8"); + + const analysis = makeAnalysis(); + const { summary } = await generateConfigs({ + repoPath: tmpDir, + analysis, + selections: ["mcp"], + force: true + }); + + const content = await fs.readFile(path.join(tmpDir, ".vscode", "mcp.json"), "utf8"); + expect(content).not.toBe("original"); + expect(summary).toContain("Wrote"); + }); + + it("does nothing with empty selections", async () => { + const analysis = makeAnalysis(); + const { summary } = await generateConfigs({ + repoPath: tmpDir, + analysis, + selections: [], + force: false + }); + + expect(summary).toBe("No changes made."); + }); +}); diff --git a/src/services/__tests__/git.test.ts b/src/services/__tests__/git.test.ts new file mode 100644 index 0000000..99c5a12 --- /dev/null +++ b/src/services/__tests__/git.test.ts @@ -0,0 +1,47 @@ +import { describe, expect, it } from "vitest"; + +import { buildAuthedUrl } from "../git"; + +describe("buildAuthedUrl", () => { + it("adds github x-access-token to https URL", () => { + expect( + buildAuthedUrl("https://github.com/owner/repo", "tok123", "github") + ).toBe("https://x-access-token:tok123@github.com/owner/repo"); + }); + + it("adds azure PAT to https URL", () => { + expect( + buildAuthedUrl("https://dev.azure.com/org/project/_git/repo", "pat123", "azure") + ).toBe("https://pat:pat123@dev.azure.com/org/project/_git/repo"); + }); + + it("strips trailing slashes before adding auth", () => { + expect( + buildAuthedUrl("https://github.com/owner/repo///", "tok", "github") + ).toBe("https://x-access-token:tok@github.com/owner/repo"); + }); + + it("replaces existing x-access-token auth", () => { + expect( + buildAuthedUrl("https://x-access-token:old@github.com/owner/repo", "new-tok", "github") + ).toBe("https://x-access-token:new-tok@github.com/owner/repo"); + }); + + it("replaces existing PAT auth for azure", () => { + expect( + buildAuthedUrl("https://pat:old@dev.azure.com/repo", "new-pat", "azure") + ).toBe("https://pat:new-pat@dev.azure.com/repo"); + }); + + it("returns non-https URLs unchanged", () => { + expect( + buildAuthedUrl("git@github.com:owner/repo.git", "tok", "github") + ).toBe("git@github.com:owner/repo.git"); + }); + + it("handles whitespace in URL", () => { + expect( + buildAuthedUrl(" https://github.com/owner/repo ", "tok", "github") + ).toBe("https://x-access-token:tok@github.com/owner/repo"); + }); +}); diff --git a/src/services/analyzer.ts b/src/services/analyzer.ts index a9e0566..55fac44 100644 --- a/src/services/analyzer.ts +++ b/src/services/analyzer.ts @@ -45,12 +45,21 @@ export async function analyzeRepo(repoPath: string): Promise { const hasRequirements = files.includes("requirements.txt"); const hasGoMod = files.includes("go.mod"); const hasCargo = files.includes("Cargo.toml"); + const hasCsproj = files.some(f => f.endsWith(".csproj") || f.endsWith(".sln")); + const hasPomXml = files.includes("pom.xml"); + const hasBuildGradle = files.includes("build.gradle") || files.includes("build.gradle.kts"); + const hasGemfile = files.includes("Gemfile"); + const hasComposerJson = files.includes("composer.json"); if (hasPackageJson) analysis.languages.push("JavaScript"); if (hasTsConfig) analysis.languages.push("TypeScript"); if (hasPyProject || hasRequirements) analysis.languages.push("Python"); if (hasGoMod) analysis.languages.push("Go"); if (hasCargo) analysis.languages.push("Rust"); + if (hasCsproj) analysis.languages.push("C#"); + if (hasPomXml || hasBuildGradle) analysis.languages.push("Java"); + if (hasGemfile) analysis.languages.push("Ruby"); + if (hasComposerJson) analysis.languages.push("PHP"); analysis.packageManager = await detectPackageManager(repoPath, files); @@ -88,6 +97,10 @@ async function detectPackageManager(repoPath: string, files: string[]): Promise< if (files.includes("package.json")) return "npm"; if (files.includes("pyproject.toml")) return "pip"; + if (files.includes("pom.xml")) return "maven"; + if (files.includes("build.gradle") || files.includes("build.gradle.kts")) return "gradle"; + if (files.includes("Gemfile")) return "bundler"; + if (files.includes("composer.json")) return "composer"; return undefined; } @@ -161,17 +174,30 @@ async function readPnpmWorkspace(filePath: string): Promise { const patterns: string[] = []; let inPackages = false; for (const line of lines) { + // Skip comment-only lines + if (/^\s*#/u.test(line)) continue; if (!inPackages && /^\s*packages\s*:/u.test(line)) { + // Handle inline array: packages: ["apps/*", "libs/*"] + const inline = line.match(/packages\s*:\s*\[([^\]]+)\]/u); + if (inline) { + const items = inline[1].split(",").map(s => + s.trim().replace(/^['"]|['"]$/gu, "") + ); + return items.filter(Boolean); + } inPackages = true; continue; } if (inPackages) { const match = line.match(/^\s*-\s*(.+)$/u); if (match?.[1]) { - patterns.push(match[1].trim().replace(/^['"]|['"]$/gu, "")); + // Strip trailing comments and quotes + const value = match[1].split("#")[0].trim().replace(/^['"]|['"]$/gu, ""); + if (value) patterns.push(value); continue; } - if (/^\S/u.test(line)) break; + // Non-indented, non-empty line means a new top-level key + if (/^\S/u.test(line) && line.trim()) break; } } return patterns; diff --git a/src/services/azureDevops.ts b/src/services/azureDevops.ts index bebe975..0600098 100644 --- a/src/services/azureDevops.ts +++ b/src/services/azureDevops.ts @@ -60,6 +60,15 @@ export type AzureDevOpsRepo = { const PROFILE_URL = "https://app.vssps.visualstudio.com/_apis/profile/profiles/me?api-version=7.1-preview.1"; +const ADO_SLUG_RE = /^[\w][\w.-]*$/u; + +function validateAdoSlug(value: string, label: string): string { + if (!ADO_SLUG_RE.test(value)) { + throw new Error(`Invalid ${label}: ${value}`); + } + return encodeURIComponent(value); +} + function getAuthHeader(token: string): string { const encoded = Buffer.from(`:${token}`).toString("base64"); return `Basic ${encoded}`; @@ -100,7 +109,8 @@ export async function listOrganizations(token: string): Promise { - const url = `https://dev.azure.com/${organization}/_apis/projects?stateFilter=wellFormed&api-version=7.1-preview.1`; + const org = validateAdoSlug(organization, "organization"); + const url = `https://dev.azure.com/${org}/_apis/projects?stateFilter=wellFormed&api-version=7.1-preview.1`; const response = await adoRequest>(url, token); return response.value.map((project) => ({ @@ -112,7 +122,9 @@ export async function listProjects(token: string, organization: string): Promise } export async function listRepos(token: string, organization: string, project: string): Promise { - const url = `https://dev.azure.com/${organization}/${project}/_apis/git/repositories?api-version=7.1-preview.1`; + const org = validateAdoSlug(organization, "organization"); + const proj = validateAdoSlug(project, "project"); + const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories?api-version=7.1-preview.1`; const response = await adoRequest>(url, token); return response.value.map((repo) => ({ @@ -134,7 +146,10 @@ export async function getRepo( project: string, repo: string ): Promise { - const url = `https://dev.azure.com/${organization}/${project}/_apis/git/repositories/${repo}?api-version=7.1-preview.1`; + const org = validateAdoSlug(organization, "organization"); + const proj = validateAdoSlug(project, "project"); + const r = validateAdoSlug(repo, "repo"); + const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories/${r}?api-version=7.1-preview.1`; const response = await adoRequest(url, token); return { @@ -166,7 +181,9 @@ export async function createPullRequest(params: { sourceBranch: string; targetBranch: string; }): Promise { - const url = `https://dev.azure.com/${params.organization}/${params.project}/_apis/git/repositories/${params.repoId}/pullrequests?api-version=7.1-preview.1`; + const org = validateAdoSlug(params.organization, "organization"); + const proj = validateAdoSlug(params.project, "project"); + const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories/${encodeURIComponent(params.repoId)}/pullrequests?api-version=7.1-preview.1`; const payload = { title: params.title, description: params.body, @@ -179,7 +196,7 @@ export async function createPullRequest(params: { body: JSON.stringify(payload) }); - return `https://dev.azure.com/${params.organization}/${params.project}/_git/${encodeURIComponent( + return `https://dev.azure.com/${org}/${proj}/_git/${encodeURIComponent( params.repoName )}/pullrequest/${response.pullRequestId}`; } @@ -190,7 +207,9 @@ export async function checkRepoHasInstructions( project: string, repoId: string ): Promise { - const url = `https://dev.azure.com/${organization}/${project}/_apis/git/repositories/${repoId}/items?path=/.github/copilot-instructions.md&includeContentMetadata=true&api-version=7.1-preview.1`; + const org = validateAdoSlug(organization, "organization"); + const proj = validateAdoSlug(project, "project"); + const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories/${encodeURIComponent(repoId)}/items?path=/.github/copilot-instructions.md&includeContentMetadata=true&api-version=7.1-preview.1`; const response = await fetch(url, { headers: { Authorization: getAuthHeader(token) @@ -201,7 +220,11 @@ export async function checkRepoHasInstructions( return false; } - return response.ok; + if (!response.ok) { + throw new Error(`Azure DevOps request failed (${response.status})`); + } + + return true; } export async function checkReposForInstructions( diff --git a/src/services/copilot.ts b/src/services/copilot.ts index 38af3eb..903c762 100644 --- a/src/services/copilot.ts +++ b/src/services/copilot.ts @@ -1,9 +1,12 @@ import fs from "fs/promises"; +import fg from "fast-glob"; import { execFile } from "node:child_process"; import { promisify } from "node:util"; const execFileAsync = promisify(execFile); +let cachedCliPath: string | null = null; + export async function assertCopilotCliReady(): Promise { const cliPath = await findCopilotCliPath(); @@ -23,31 +26,74 @@ export async function listCopilotModels(): Promise { } async function findCopilotCliPath(): Promise { + if (cachedCliPath) return cachedCliPath; + + // Try PATH lookup first (works on all platforms) + const whichCmd = process.platform === "win32" ? "where" : "which"; try { - const { stdout } = await execFileAsync("which", ["copilot"], { timeout: 5000 }); - return stdout.trim(); + const { stdout } = await execFileAsync(whichCmd, ["copilot"], { timeout: 5000 }); + const found = stdout.trim().split(/\r?\n/)[0]; + if (found) { + cachedCliPath = found; + return found; + } } catch { - // Ignore - will try VS Code location + // Ignore - will try VS Code locations } - const home = process.env.HOME ?? ""; - const vscodeLocations = [ - `${home}/Library/Application Support/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`, - `${home}/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`, - `${home}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot`, - `${home}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot` - ]; + const home = process.env.HOME ?? process.env.USERPROFILE ?? ""; + const staticLocations: string[] = []; + + if (process.platform === "darwin") { + staticLocations.push( + `${home}/Library/Application Support/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`, + `${home}/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot` + ); + } else if (process.platform === "linux") { + staticLocations.push( + `${home}/.config/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`, + `${home}/.config/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot` + ); + } else if (process.platform === "win32") { + const appData = process.env.APPDATA ?? ""; + if (appData) { + staticLocations.push( + `${appData}\\Code - Insiders\\User\\globalStorage\\github.copilot-chat\\copilotCli\\copilot.exe`, + `${appData}\\Code\\User\\globalStorage\\github.copilot-chat\\copilotCli\\copilot.exe` + ); + } + } - for (const location of vscodeLocations) { + for (const location of staticLocations) { try { await fs.access(location); + cachedCliPath = location; return location; } catch { // Try next location } } - throw new Error("Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code."); + const globPatterns = [ + `${home}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot`, + `${home}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot` + ]; + + for (const pattern of globPatterns) { + const matches = await fg(pattern, { onlyFiles: true }); + if (matches.length > 0) { + cachedCliPath = matches[0]; + return matches[0]; + } + } + + const platformHint = process.platform === "win32" + ? " Searched APPDATA and VS Code extension paths." + : process.platform === "linux" + ? " Searched ~/.config/Code and VS Code extension paths." + : " Searched ~/Library/Application Support/Code and VS Code extension paths."; + + throw new Error(`Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code.${platformHint}`); } function extractModelChoices(helpText: string): string[] { diff --git a/src/services/evalScaffold.ts b/src/services/evalScaffold.ts index aa1f9a7..d9fde55 100644 --- a/src/services/evalScaffold.ts +++ b/src/services/evalScaffold.ts @@ -1,9 +1,9 @@ -import process from "node:process"; - import { assertCopilotCliReady } from "./copilot"; +import { DEFAULT_MODEL } from "../config"; +import { withCwd } from "../utils/cwd"; export type EvalCase = { - id: string; + id?: string; prompt: string; expectation: string; }; @@ -13,6 +13,9 @@ export type EvalConfig = { cases: EvalCase[]; systemMessage?: string; outputPath?: string; + ui?: { + modelPicker?: "visible" | "hidden"; + }; }; type EvalScaffoldOptions = { @@ -28,69 +31,67 @@ export async function generateEvalScaffold(options: EvalScaffoldOptions): Promis const count = Math.max(1, options.count); const progress = options.onProgress ?? (() => {}); - const originalCwd = process.cwd(); - process.chdir(repoPath); - - progress("Checking Copilot CLI..."); - const cliPath = await assertCopilotCliReady(); - - progress("Starting Copilot SDK..."); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient({ cliPath }); - - try { - progress("Creating session..."); - const preferredModel = options.model ?? "gpt-4.1"; - const session = await client.createSession({ - model: preferredModel, - streaming: true, - systemMessage: { - content: - "You are an expert codebase analyst. Generate developer-oriented eval cases for this repository. Use tools (glob, view, grep) to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation})." - }, - infiniteSessions: { enabled: false } - }); - - let content = ""; - session.on((event: { type: string; data?: Record }) => { - if (event.type === "assistant.message_delta") { - const delta = event.data?.deltaContent as string | undefined; - if (delta) { - content += delta; - progress("Generating eval cases..."); - } - } else if (event.type === "tool.execution_start") { - const toolName = event.data?.toolName as string | undefined; - progress(`Using tool: ${toolName ?? "..."}`); - } else if (event.type === "session.error") { - const errorMsg = (event.data?.message as string) ?? "Unknown error"; - if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { - throw new Error("Copilot CLI not logged in. Run `copilot` then `/login` to authenticate."); + return withCwd(repoPath, async () => { + progress("Checking Copilot CLI..."); + const cliPath = await assertCopilotCliReady(); + + progress("Starting Copilot SDK..."); + const sdk = await import("@github/copilot-sdk"); + const client = new sdk.CopilotClient({ cliPath }); + + try { + progress("Creating session..."); + const preferredModel = options.model ?? DEFAULT_MODEL; + const session = await client.createSession({ + model: preferredModel, + streaming: true, + systemMessage: { + content: + "You are an expert codebase analyst. Generate developer-oriented eval cases for this repository. Use tools (glob, view, grep) to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation})." + }, + infiniteSessions: { enabled: false } + }); + + let content = ""; + session.on((event: { type: string; data?: Record }) => { + if (event.type === "assistant.message_delta") { + const delta = event.data?.deltaContent as string | undefined; + if (delta) { + content += delta; + progress("Generating eval cases..."); + } + } else if (event.type === "tool.execution_start") { + const toolName = event.data?.toolName as string | undefined; + progress(`Using tool: ${toolName ?? "..."}`); + } else if (event.type === "session.error") { + const errorMsg = (event.data?.message as string) ?? "Unknown error"; + if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { + throw new Error("Copilot CLI not logged in. Run `copilot` then `/login` to authenticate."); + } } - } - }); - - const prompt = [ - `Analyze the repository at ${repoPath} and generate ${count} eval cases.`, - "The cases should mirror realistic developer questions about this repo.", - "Use tools to inspect README, package.json, CLI commands, and key files.", - "Ensure cases cover a range of topics: purpose, entrypoints, build/test, configuration, workflows.", - "Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).", - "Return JSON ONLY (no markdown, no commentary) in this schema:", - "{\n \"instructionFile\": \".github/copilot-instructions.md\",\n \"systemMessage\": \"...\",\n \"cases\": [\n {\"id\": \"case-1\", \"prompt\": \"...\", \"expectation\": \"...\"}\n ]\n}" - ].join("\n"); - - progress("Analyzing codebase..."); - await session.sendAndWait({ prompt }, 180000); - await session.destroy(); - - const parsed = parseEvalConfig(content); - const normalized = normalizeEvalConfig(parsed, count); - return normalized; - } finally { - await client.stop(); - process.chdir(originalCwd); - } + }); + + const prompt = [ + `Analyze the repository at ${repoPath} and generate ${count} eval cases.`, + "The cases should mirror realistic developer questions about this repo.", + "Use tools to inspect README, package.json, CLI commands, and key files.", + "Ensure cases cover a range of topics: purpose, entrypoints, build/test, configuration, workflows.", + "Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).", + "Return JSON ONLY (no markdown, no commentary) in this schema:", + "{\n \"instructionFile\": \".github/copilot-instructions.md\",\n \"systemMessage\": \"...\",\n \"cases\": [\n {\"id\": \"case-1\", \"prompt\": \"...\", \"expectation\": \"...\"}\n ]\n}" + ].join("\n"); + + progress("Analyzing codebase..."); + await session.sendAndWait({ prompt }, 180000); + await session.destroy(); + + const parsed = parseEvalConfig(content); + const normalized = normalizeEvalConfig(parsed, count); + return normalized; + } finally { + await client.stop(); + } + }); } function parseEvalConfig(raw: string): EvalConfig { diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index 1a137cd..a4d5271 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -2,22 +2,12 @@ import fs from "fs/promises"; import path from "path"; import { execFile } from "node:child_process"; import { promisify } from "node:util"; +import { assertCopilotCliReady } from "./copilot"; +import { buildTimestampedName } from "../utils/fs"; +import type { EvalCase, EvalConfig } from "./evalScaffold"; const execFileAsync = promisify(execFile); -type EvalCase = { - prompt: string; - expectation: string; - id?: string; -}; - -type EvalConfig = { - instructionFile?: string; - cases: EvalCase[]; - systemMessage?: string; - outputPath?: string; -}; - const DEFAULT_SYSTEM_MESSAGE = "You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them."; @@ -94,7 +84,7 @@ export async function runEval(options: EvalRunOptions): Promise<{ summary: strin const runStartedAt = Date.now(); progress("Starting Copilot SDK..."); - const cliPath = await findCopilotCliPath(); + const cliPath = await assertCopilotCliReady(); const sdk = await import("@github/copilot-sdk"); const client = new sdk.CopilotClient({ cliPath }); @@ -328,37 +318,11 @@ function parseJudge(content: string): JudgeResult { async function loadConfig(configPath: string): Promise { const raw = await fs.readFile(configPath, "utf8"); - return JSON.parse(raw) as EvalConfig; -} - -async function findCopilotCliPath(): Promise { - // Try standard PATH first - try { - const { stdout } = await execFileAsync("which", ["copilot"], { timeout: 5000 }); - return stdout.trim(); - } catch { - // Ignore - will try VS Code location - } - - // VS Code Copilot Chat extension location - const home = process.env.HOME ?? ""; - const vscodeLocations = [ - `${home}/Library/Application Support/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`, - `${home}/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`, - `${home}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot`, - `${home}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot`, - ]; - - for (const location of vscodeLocations) { - try { - await fs.access(location); - return location; - } catch { - // Try next location - } + const parsed = JSON.parse(raw) as EvalConfig; + if (!parsed || !Array.isArray(parsed.cases)) { + throw new Error("Eval config must have a 'cases' array."); } - - throw new Error("Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code."); + return parsed; } async function readOptionalFile(filePath: string): Promise { @@ -563,6 +527,8 @@ function getNumber(value: unknown): number | null { return null; } +// The SDK reports cumulative token counts per session, so we keep the peak (max) value +// rather than summing incremental deltas. function mergeTokenUsage(existing: TokenUsage, next: TokenUsage): TokenUsage { return { promptTokens: Math.max(existing.promptTokens ?? 0, next.promptTokens ?? 0) || undefined, @@ -622,11 +588,6 @@ function resolveOutputPath(repoPath: string, override?: string, configValue?: st return path.isAbsolute(chosen) ? chosen : path.resolve(repoPath, chosen); } -function buildTimestampedName(baseName: string): string { - const stamp = new Date().toISOString().replace(/[:.]/gu, "-"); - return `${baseName}-${stamp}.json`; -} - function buildViewerPath(outputPath: string): string { if (outputPath.endsWith(".json")) { return outputPath.replace(/\.json$/u, ".html"); @@ -766,7 +727,7 @@ function buildTrajectoryViewerHtml(data: Record): string { - \ No newline at end of file + diff --git a/eval-results.json b/eval-results.json index 48db37a..6184dac 100644 --- a/eval-results.json +++ b/eval-results.json @@ -9183,4 +9183,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/primer.eval.json b/primer.eval.json index 750f8d9..f892d2a 100644 --- a/primer.eval.json +++ b/primer.eval.json @@ -18,4 +18,4 @@ "expectation": "New CLI commands should be placed in src/commands/, and core logic in src/services/. Use ESM syntax everywhere, strict TypeScript targeting ES2022 and module ESNext, and only overwrite config files like .vscode/settings.json and .vscode/mcp.json with --force. All Copilot/VS Code settings reference .github/copilot-instructions.md and enable MCP." } ] -} \ No newline at end of file +} diff --git a/src/cli.ts b/src/cli.ts index ca74020..1c834af 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -28,7 +28,6 @@ export function runCli(argv: string[]): void { .option("--force", "Overwrite existing files") .action(initCommand); - program .command("generate") .argument("", "instructions|agents|mcp|vscode") diff --git a/src/commands/batch.tsx b/src/commands/batch.tsx index 85a81d5..4ced461 100644 --- a/src/commands/batch.tsx +++ b/src/commands/batch.tsx @@ -30,9 +30,7 @@ export async function batchCommand(options: BatchOptions): Promise { return; } - const { waitUntilExit } = render( - - ); + const { waitUntilExit } = render(); await waitUntilExit(); return; } @@ -50,10 +48,7 @@ export async function batchCommand(options: BatchOptions): Promise { return; } - const { waitUntilExit } = render( - - ); - + const { waitUntilExit } = render(); await waitUntilExit(); } diff --git a/src/commands/batchReadiness.tsx b/src/commands/batchReadiness.tsx index fbf2e3e..772d34b 100644 --- a/src/commands/batchReadiness.tsx +++ b/src/commands/batchReadiness.tsx @@ -22,9 +22,7 @@ export async function batchReadinessCommand(options: BatchReadinessOptions): Pro return; } - const { waitUntilExit } = render( - - ); + const { waitUntilExit } = render(); await waitUntilExit(); } diff --git a/src/commands/eval.ts b/src/commands/eval.ts index d9a6d68..1572f0c 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -16,7 +16,10 @@ type EvalOptions = { listModels?: boolean; }; -export async function evalCommand(configPathArg: string | undefined, options: EvalOptions): Promise { +export async function evalCommand( + configPathArg: string | undefined, + options: EvalOptions +): Promise { const repoPath = path.resolve(options.repo ?? process.cwd()); if (options.listModels) { @@ -28,7 +31,7 @@ export async function evalCommand(configPathArg: string | undefined, options: Ev console.log(models.join("\n")); return; } - + // Handle --init flag if (options.init) { const outputPath = path.join(repoPath, "primer.eval.json"); diff --git a/src/commands/generate.ts b/src/commands/generate.ts index f32bba7..0a0b1f0 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -11,7 +11,11 @@ type GenerateOptions = { perApp?: boolean; }; -export async function generateCommand(type: string, repoPathArg: string | undefined, options: GenerateOptions): Promise { +export async function generateCommand( + type: string, + repoPathArg: string | undefined, + options: GenerateOptions +): Promise { const allowed = new Set(["mcp", "vscode", "instructions", "agents"]); if (!allowed.has(type)) { console.error("Invalid type. Use: instructions, agents, mcp, vscode."); @@ -28,15 +32,17 @@ export async function generateCommand(type: string, repoPathArg: string | undefi if (options.perApp && analysis.isMonorepo && apps.length > 1) { for (const app of apps) { - const savePath = type === "instructions" - ? path.join(app.path, ".github", "copilot-instructions.md") - : path.join(app.path, "AGENTS.md"); + const savePath = + type === "instructions" + ? path.join(app.path, ".github", "copilot-instructions.md") + : path.join(app.path, "AGENTS.md"); targets.push({ repoPath: app.path, savePath, label: app.name }); } } else { - const savePath = type === "instructions" - ? path.join(repoPath, ".github", "copilot-instructions.md") - : path.join(repoPath, "AGENTS.md"); + const savePath = + type === "instructions" + ? path.join(repoPath, ".github", "copilot-instructions.md") + : path.join(repoPath, "AGENTS.md"); targets.push({ repoPath, savePath, label: path.basename(repoPath) }); } @@ -44,7 +50,7 @@ export async function generateCommand(type: string, repoPathArg: string | undefi console.log(`Generating ${type} for ${target.label}...`); try { const content = await generateCopilotInstructions({ - repoPath: target.repoPath, + repoPath: target.repoPath }); if (!content.trim()) { console.error(` No content generated for ${target.label}.`); diff --git a/src/commands/init.ts b/src/commands/init.ts index a1b36cf..6de672a 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -3,10 +3,7 @@ import path from "path"; import { checkbox, select } from "@inquirer/prompts"; import { analyzeRepo } from "../services/analyzer"; -import type { - AzureDevOpsOrg, - AzureDevOpsProject, - AzureDevOpsRepo } from "../services/azureDevops"; +import type { AzureDevOpsOrg, AzureDevOpsProject, AzureDevOpsRepo } from "../services/azureDevops"; import { getAzureDevOpsToken, listOrganizations, @@ -15,7 +12,7 @@ import { } from "../services/azureDevops"; import { generateConfigs } from "../services/generator"; import { buildAuthedUrl, cloneRepo, isGitRepo, setRemoteUrl } from "../services/git"; -import type { GitHubRepo} from "../services/github"; +import type { GitHubRepo } from "../services/github"; import { listAccessibleRepos } from "../services/github"; import { generateCopilotInstructions } from "../services/instructions"; import { ensureDir, safeWriteFile, validateCachePath } from "../utils/fs"; @@ -28,7 +25,10 @@ type InitOptions = { force?: boolean; }; -export async function initCommand(repoPathArg: string | undefined, options: InitOptions): Promise { +export async function initCommand( + repoPathArg: string | undefined, + options: InitOptions +): Promise { let repoPath = path.resolve(repoPathArg ?? process.cwd()); const provider = options.provider ?? (options.github ? "github" : undefined); @@ -125,7 +125,12 @@ export async function initCommand(repoPathArg: string | undefined, options: Init }); const cacheRoot = path.join(process.cwd(), ".primer-cache"); - repoPath = validateCachePath(cacheRoot, orgSelection.name, projectSelection.name, repoSelection.name); + repoPath = validateCachePath( + cacheRoot, + orgSelection.name, + projectSelection.name, + repoSelection.name + ); await ensureDir(repoPath); const hasGit = await isGitRepo(repoPath); diff --git a/src/commands/instructions.tsx b/src/commands/instructions.tsx index 3fa0562..b1b607a 100644 --- a/src/commands/instructions.tsx +++ b/src/commands/instructions.tsx @@ -24,7 +24,9 @@ export async function instructionsCommand(options: InstructionsOptions): Promise }); } catch (error) { console.error("Failed to generate instructions with Copilot SDK."); - console.error("Ensure the Copilot CLI is installed (copilot --version) and logged in (run 'copilot' then '/login')." ); + console.error( + "Ensure the Copilot CLI is installed (copilot --version) and logged in (run 'copilot' then '/login')." + ); console.error(error instanceof Error ? error.message : String(error)); process.exitCode = 1; return; @@ -40,4 +42,4 @@ export async function instructionsCommand(options: InstructionsOptions): Promise console.log(`Updated ${path.relative(process.cwd(), outputPath)}`); console.log("Please review and share feedback on any unclear or incomplete sections."); -} \ No newline at end of file +} diff --git a/src/commands/pr.ts b/src/commands/pr.ts index d04c509..c1a8a8a 100644 --- a/src/commands/pr.ts +++ b/src/commands/pr.ts @@ -9,7 +9,15 @@ import { getRepo as getAzureRepo } from "../services/azureDevops"; import { generateConfigs } from "../services/generator"; -import { buildAuthedUrl, checkoutBranch, cloneRepo, commitAll, isGitRepo, pushBranch, setRemoteUrl } from "../services/git"; +import { + buildAuthedUrl, + checkoutBranch, + cloneRepo, + commitAll, + isGitRepo, + pushBranch, + setRemoteUrl +} from "../services/git"; import { createPullRequest, getRepo } from "../services/github"; import { generateCopilotInstructions } from "../services/instructions"; import { ensureDir, validateCachePath } from "../utils/fs"; diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts index 16b1422..d0d73a0 100644 --- a/src/commands/readiness.ts +++ b/src/commands/readiness.ts @@ -3,12 +3,8 @@ import path from "path"; import chalk from "chalk"; -import type { - ReadinessReport, - ReadinessCriterionResult} from "../services/readiness"; -import { - runReadinessReport -} from "../services/readiness"; +import type { ReadinessReport, ReadinessCriterionResult } from "../services/readiness"; +import { runReadinessReport } from "../services/readiness"; import { generateVisualReport } from "../services/visualReport"; type ReadinessOptions = { @@ -17,13 +13,16 @@ type ReadinessOptions = { visual?: boolean; }; -export async function readinessCommand(repoPathArg: string | undefined, options: ReadinessOptions): Promise { +export async function readinessCommand( + repoPathArg: string | undefined, + options: ReadinessOptions +): Promise { const repoPath = path.resolve(repoPathArg ?? process.cwd()); const report = await runReadinessReport({ repoPath }); const repoName = path.basename(repoPath); // Generate visual HTML report - if (options.visual || (options.output && options.output.endsWith('.html'))) { + if (options.visual || (options.output && options.output.endsWith(".html"))) { const html = generateVisualReport({ reports: [{ repo: repoName, report }], title: `AI Readiness Report: ${repoName}`, @@ -32,7 +31,7 @@ export async function readinessCommand(repoPathArg: string | undefined, options: const outputPath = options.output ? path.resolve(options.output) - : path.join(repoPath, 'readiness-report.html'); + : path.join(repoPath, "readiness-report.html"); await fs.writeFile(outputPath, html, "utf8"); console.log(chalk.green(`✓ Visual report generated: ${outputPath}`)); @@ -40,7 +39,7 @@ export async function readinessCommand(repoPathArg: string | undefined, options: } // Output JSON - if (options.output && options.output.endsWith('.json')) { + if (options.output && options.output.endsWith(".json")) { const outputPath = path.resolve(options.output); await fs.writeFile(outputPath, JSON.stringify(report, null, 2), "utf8"); console.log(chalk.green(`✓ JSON report saved: ${outputPath}`)); @@ -58,7 +57,9 @@ export async function readinessCommand(repoPathArg: string | undefined, options: function printReadinessChecklist(report: ReadinessReport): void { console.log(chalk.bold("Readiness report")); console.log(`- Repo: ${report.repoPath}`); - console.log(`- Monorepo: ${report.isMonorepo ? "yes" : "no"}${report.apps.length ? ` (${report.apps.length} apps)` : ""}`); + console.log( + `- Monorepo: ${report.isMonorepo ? "yes" : "no"}${report.apps.length ? ` (${report.apps.length} apps)` : ""}` + ); console.log(`- Level: ${report.achievedLevel || 1} (${levelName(report.achievedLevel || 1)})`); console.log(chalk.bold("\nPillars")); @@ -143,4 +144,4 @@ function levelName(level: number): string { if (level === 4) return "Optimized"; if (level === 5) return "Autonomous"; return "Functional"; -} \ No newline at end of file +} diff --git a/src/index.ts b/src/index.ts index ce2fa64..7c9a934 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,7 @@ import { runCli } from "./cli"; const [, , ...args] = process.argv; if (args.length === 0) { - runCli([process.argv[0], process.argv[1], "tui"]); + runCli([process.argv[0], process.argv[1], "tui"]); } else { - runCli(process.argv); + runCli(process.argv); } diff --git a/src/services/__tests__/analyzer.test.ts b/src/services/__tests__/analyzer.test.ts index a5e231c..748d7ba 100644 --- a/src/services/__tests__/analyzer.test.ts +++ b/src/services/__tests__/analyzer.test.ts @@ -104,13 +104,9 @@ describe("analyzeRepo", () => { await fs.writeFile(path.join(repoPath, "pnpm-lock.yaml"), "lockfileVersion: 9"); await fs.writeFile( path.join(repoPath, "pnpm-workspace.yaml"), - [ - "# workspace config", - "packages:", - " - 'apps/*' # main apps", - " - 'libs/*'", - "# end" - ].join("\n") + ["# workspace config", "packages:", " - 'apps/*' # main apps", " - 'libs/*'", "# end"].join( + "\n" + ) ); await fs.mkdir(path.join(repoPath, "apps", "web"), { recursive: true }); await fs.writeFile( @@ -123,7 +119,7 @@ describe("analyzeRepo", () => { expect(result.workspacePatterns).toContain("apps/*"); expect(result.workspacePatterns).toContain("libs/*"); // Should not include comment text in patterns - expect(result.workspacePatterns?.some(p => p.includes("#"))).toBe(false); + expect(result.workspacePatterns?.some((p) => p.includes("#"))).toBe(false); }); it("detects pnpm inline array workspace", async () => { @@ -132,7 +128,7 @@ describe("analyzeRepo", () => { await fs.writeFile(path.join(repoPath, "pnpm-lock.yaml"), "lockfileVersion: 9"); await fs.writeFile( path.join(repoPath, "pnpm-workspace.yaml"), - "packages: [\"apps/*\", \"libs/*\"]\n" + 'packages: ["apps/*", "libs/*"]\n' ); const result = await analyzeRepo(repoPath); @@ -169,7 +165,7 @@ describe("analyzeRepo", () => { expect(result.isMonorepo).toBe(true); expect(result.workspaceType).toBe("cargo"); expect(result.apps?.length).toBe(2); - expect(result.apps?.map(a => a.name).sort()).toEqual(["my-cli", "my-core"]); + expect(result.apps?.map((a) => a.name).sort()).toEqual(["my-cli", "my-core"]); expect(result.apps?.[0].ecosystem).toBe("rust"); }); @@ -177,14 +173,7 @@ describe("analyzeRepo", () => { const repoPath = await makeTmpDir(); await fs.writeFile( path.join(repoPath, "go.work"), - [ - "go 1.21", - "", - "use (", - " ./cmd/server", - " ./pkg/lib", - ")" - ].join("\n") + ["go 1.21", "", "use (", " ./cmd/server", " ./pkg/lib", ")"].join("\n") ); await fs.mkdir(path.join(repoPath, "cmd", "server"), { recursive: true }); await fs.writeFile( @@ -201,7 +190,7 @@ describe("analyzeRepo", () => { expect(result.isMonorepo).toBe(true); expect(result.workspaceType).toBe("go"); expect(result.apps?.length).toBe(2); - expect(result.apps?.map(a => a.name).sort()).toEqual(["lib", "server"]); + expect(result.apps?.map((a) => a.name).sort()).toEqual(["lib", "server"]); expect(result.apps?.[0].ecosystem).toBe("go"); }); @@ -209,7 +198,7 @@ describe("analyzeRepo", () => { const repoPath = await makeTmpDir(); const slnContent = [ "Microsoft Visual Studio Solution File, Format Version 12.00", - '# Visual Studio Version 17', + "# Visual Studio Version 17", 'Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApp", "src\\WebApp\\WebApp.csproj", "{GUID1}"', "EndProject", 'Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoreLib", "src\\CoreLib\\CoreLib.csproj", "{GUID2}"', @@ -226,7 +215,7 @@ describe("analyzeRepo", () => { expect(result.isMonorepo).toBe(true); expect(result.workspaceType).toBe("dotnet"); expect(result.apps?.length).toBe(2); - expect(result.apps?.map(a => a.name).sort()).toEqual(["CoreLib", "WebApp"]); + expect(result.apps?.map((a) => a.name).sort()).toEqual(["CoreLib", "WebApp"]); expect(result.apps?.[0].ecosystem).toBe("dotnet"); }); @@ -247,7 +236,7 @@ describe("analyzeRepo", () => { expect(result.isMonorepo).toBe(true); expect(result.workspaceType).toBe("gradle"); expect(result.apps?.length).toBe(2); - expect(result.apps?.map(a => a.name).sort()).toEqual(["app", "lib"]); + expect(result.apps?.map((a) => a.name).sort()).toEqual(["app", "lib"]); expect(result.apps?.[0].ecosystem).toBe("java"); }); @@ -267,7 +256,7 @@ describe("analyzeRepo", () => { expect(result.isMonorepo).toBe(true); expect(result.workspaceType).toBe("gradle"); expect(result.apps?.length).toBe(2); - expect(result.apps?.map(a => a.name).sort()).toEqual(["app", "server"]); + expect(result.apps?.map((a) => a.name).sort()).toEqual(["app", "server"]); }); it("detects Maven multi-module", async () => { @@ -293,7 +282,7 @@ describe("analyzeRepo", () => { expect(result.isMonorepo).toBe(true); expect(result.workspaceType).toBe("maven"); expect(result.apps?.length).toBe(2); - expect(result.apps?.map(a => a.name).sort()).toEqual(["api", "web"]); + expect(result.apps?.map((a) => a.name).sort()).toEqual(["api", "web"]); }); it("sets ecosystem to node for JS workspace apps", async () => { diff --git a/src/services/__tests__/cachePath.test.ts b/src/services/__tests__/cachePath.test.ts index 4c188f2..063419e 100644 --- a/src/services/__tests__/cachePath.test.ts +++ b/src/services/__tests__/cachePath.test.ts @@ -14,7 +14,9 @@ describe("validateCachePath", () => { }); it("throws on path traversal via ..", () => { - expect(() => validateCachePath(cacheRoot, "..", "..", "etc")).toThrow("escapes cache directory"); + expect(() => validateCachePath(cacheRoot, "..", "..", "etc")).toThrow( + "escapes cache directory" + ); }); it("throws on absolute path segment that escapes", () => { diff --git a/src/services/__tests__/git.test.ts b/src/services/__tests__/git.test.ts index 99c5a12..51adfdc 100644 --- a/src/services/__tests__/git.test.ts +++ b/src/services/__tests__/git.test.ts @@ -4,21 +4,21 @@ import { buildAuthedUrl } from "../git"; describe("buildAuthedUrl", () => { it("adds github x-access-token to https URL", () => { - expect( - buildAuthedUrl("https://github.com/owner/repo", "tok123", "github") - ).toBe("https://x-access-token:tok123@github.com/owner/repo"); + expect(buildAuthedUrl("https://github.com/owner/repo", "tok123", "github")).toBe( + "https://x-access-token:tok123@github.com/owner/repo" + ); }); it("adds azure PAT to https URL", () => { - expect( - buildAuthedUrl("https://dev.azure.com/org/project/_git/repo", "pat123", "azure") - ).toBe("https://pat:pat123@dev.azure.com/org/project/_git/repo"); + expect(buildAuthedUrl("https://dev.azure.com/org/project/_git/repo", "pat123", "azure")).toBe( + "https://pat:pat123@dev.azure.com/org/project/_git/repo" + ); }); it("strips trailing slashes before adding auth", () => { - expect( - buildAuthedUrl("https://github.com/owner/repo///", "tok", "github") - ).toBe("https://x-access-token:tok@github.com/owner/repo"); + expect(buildAuthedUrl("https://github.com/owner/repo///", "tok", "github")).toBe( + "https://x-access-token:tok@github.com/owner/repo" + ); }); it("replaces existing x-access-token auth", () => { @@ -28,20 +28,20 @@ describe("buildAuthedUrl", () => { }); it("replaces existing PAT auth for azure", () => { - expect( - buildAuthedUrl("https://pat:old@dev.azure.com/repo", "new-pat", "azure") - ).toBe("https://pat:new-pat@dev.azure.com/repo"); + expect(buildAuthedUrl("https://pat:old@dev.azure.com/repo", "new-pat", "azure")).toBe( + "https://pat:new-pat@dev.azure.com/repo" + ); }); it("returns non-https URLs unchanged", () => { - expect( - buildAuthedUrl("git@github.com:owner/repo.git", "tok", "github") - ).toBe("git@github.com:owner/repo.git"); + expect(buildAuthedUrl("git@github.com:owner/repo.git", "tok", "github")).toBe( + "git@github.com:owner/repo.git" + ); }); it("handles whitespace in URL", () => { - expect( - buildAuthedUrl(" https://github.com/owner/repo ", "tok", "github") - ).toBe("https://x-access-token:tok@github.com/owner/repo"); + expect(buildAuthedUrl(" https://github.com/owner/repo ", "tok", "github")).toBe( + "https://x-access-token:tok@github.com/owner/repo" + ); }); }); diff --git a/src/services/__tests__/visualReport.test.ts b/src/services/__tests__/visualReport.test.ts index 5910b23..b2fd645 100644 --- a/src/services/__tests__/visualReport.test.ts +++ b/src/services/__tests__/visualReport.test.ts @@ -17,32 +17,75 @@ function makeReport(overrides: Partial = {}): ReadinessReport { { id: "dev-environment", name: "Dev Environment", passed: 1, total: 2, passRate: 0.5 }, { id: "code-quality", name: "Code Quality", passed: 1, total: 1, passRate: 1 }, { id: "observability", name: "Observability", passed: 0, total: 1, passRate: 0 }, - { id: "security-governance", name: "Security & Governance", passed: 2, total: 4, passRate: 0.5 }, - { id: "ai-tooling", name: "AI Tooling", passed: 1, total: 4, passRate: 0.25 }, + { + id: "security-governance", + name: "Security & Governance", + passed: 2, + total: 4, + passRate: 0.5 + }, + { id: "ai-tooling", name: "AI Tooling", passed: 1, total: 4, passRate: 0.25 } ], levels: [ { level: 1, name: "Functional", passed: 5, total: 6, passRate: 0.83, achieved: true }, { level: 2, name: "Documented", passed: 3, total: 6, passRate: 0.5, achieved: false }, { level: 3, name: "Standardized", passed: 1, total: 4, passRate: 0.25, achieved: false }, { level: 4, name: "Optimized", passed: 0, total: 0, passRate: 0, achieved: false }, - { level: 5, name: "Autonomous", passed: 0, total: 0, passRate: 0, achieved: false }, + { level: 5, name: "Autonomous", passed: 0, total: 0, passRate: 0, achieved: false } ], achievedLevel: 1, criteria: [ - { id: "lint-config", title: "Linting configured", pillar: "style-validation", level: 1, scope: "repo", impact: "high", effort: "low", status: "pass" }, - { id: "readme", title: "README present", pillar: "documentation", level: 1, scope: "repo", impact: "high", effort: "low", status: "pass" }, - { id: "custom-instructions", title: "Custom AI instructions", pillar: "ai-tooling", level: 1, scope: "repo", impact: "high", effort: "low", status: "pass" }, - { id: "mcp-config", title: "MCP config present", pillar: "ai-tooling", level: 2, scope: "repo", impact: "high", effort: "low", status: "fail", reason: "Missing MCP config." }, + { + id: "lint-config", + title: "Linting configured", + pillar: "style-validation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + status: "pass" + }, + { + id: "readme", + title: "README present", + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + status: "pass" + }, + { + id: "custom-instructions", + title: "Custom AI instructions", + pillar: "ai-tooling", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + status: "pass" + }, + { + id: "mcp-config", + title: "MCP config present", + pillar: "ai-tooling", + level: 2, + scope: "repo", + impact: "high", + effort: "low", + status: "fail", + reason: "Missing MCP config." + } ], extras: [], - ...overrides, + ...overrides }; } describe("generateVisualReport", () => { it("returns valid HTML", () => { const html = generateVisualReport({ - reports: [{ repo: "test-repo", report: makeReport() }], + reports: [{ repo: "test-repo", report: makeReport() }] }); expect(html).toContain(""); @@ -52,7 +95,7 @@ describe("generateVisualReport", () => { it("includes the report title", () => { const html = generateVisualReport({ reports: [{ repo: "test-repo", report: makeReport() }], - title: "My Custom Report", + title: "My Custom Report" }); expect(html).toContain("My Custom Report"); @@ -60,7 +103,7 @@ describe("generateVisualReport", () => { it("includes repo name", () => { const html = generateVisualReport({ - reports: [{ repo: "my-repo", report: makeReport() }], + reports: [{ repo: "my-repo", report: makeReport() }] }); expect(html).toContain("my-repo"); @@ -68,7 +111,7 @@ describe("generateVisualReport", () => { it("includes pillar names", () => { const html = generateVisualReport({ - reports: [{ repo: "test-repo", report: makeReport() }], + reports: [{ repo: "test-repo", report: makeReport() }] }); expect(html).toContain("Style & Validation"); @@ -78,7 +121,7 @@ describe("generateVisualReport", () => { it("includes maturity level badge", () => { const html = generateVisualReport({ - reports: [{ repo: "test-repo", report: makeReport({ achievedLevel: 2 }) }], + reports: [{ repo: "test-repo", report: makeReport({ achievedLevel: 2 }) }] }); expect(html).toContain("Maturity 2"); @@ -87,7 +130,7 @@ describe("generateVisualReport", () => { it("includes AI Tooling Readiness hero section", () => { const html = generateVisualReport({ - reports: [{ repo: "test-repo", report: makeReport() }], + reports: [{ repo: "test-repo", report: makeReport() }] }); expect(html).toContain("AI Tooling Readiness"); @@ -95,7 +138,7 @@ describe("generateVisualReport", () => { it("includes maturity model descriptions", () => { const html = generateVisualReport({ - reports: [{ repo: "test-repo", report: makeReport() }], + reports: [{ repo: "test-repo", report: makeReport() }] }); expect(html).toContain("Functional"); @@ -107,7 +150,7 @@ describe("generateVisualReport", () => { it("includes theme toggle", () => { const html = generateVisualReport({ - reports: [{ repo: "test-repo", report: makeReport() }], + reports: [{ repo: "test-repo", report: makeReport() }] }); expect(html).toContain("toggleTheme"); @@ -116,7 +159,7 @@ describe("generateVisualReport", () => { it("includes light theme CSS variables", () => { const html = generateVisualReport({ - reports: [{ repo: "test-repo", report: makeReport() }], + reports: [{ repo: "test-repo", report: makeReport() }] }); expect(html).toContain('[data-theme="light"]'); @@ -125,7 +168,7 @@ describe("generateVisualReport", () => { it("includes GitHub logo SVG", () => { const html = generateVisualReport({ - reports: [{ repo: "test-repo", report: makeReport() }], + reports: [{ repo: "test-repo", report: makeReport() }] }); expect(html).toContain("header-logo"); @@ -136,8 +179,8 @@ describe("generateVisualReport", () => { const html = generateVisualReport({ reports: [ { repo: "good-repo", report: makeReport() }, - { repo: "bad-repo", report: makeReport(), error: "Clone failed" }, - ], + { repo: "bad-repo", report: makeReport(), error: "Clone failed" } + ] }); expect(html).toContain("bad-repo"); @@ -148,8 +191,8 @@ describe("generateVisualReport", () => { const html = generateVisualReport({ reports: [ { repo: "repo-1", report: makeReport() }, - { repo: "repo-2", report: makeReport() }, - ], + { repo: "repo-2", report: makeReport() } + ] }); // Total repos should be 2 @@ -158,7 +201,7 @@ describe("generateVisualReport", () => { it("includes top fixes for failing criteria", () => { const html = generateVisualReport({ - reports: [{ repo: "test-repo", report: makeReport() }], + reports: [{ repo: "test-repo", report: makeReport() }] }); expect(html).toContain("Top Fixes"); @@ -168,12 +211,21 @@ describe("generateVisualReport", () => { it("shows all criteria passing when all pass", () => { const report = makeReport({ criteria: [ - { id: "lint-config", title: "Linting configured", pillar: "style-validation", level: 1, scope: "repo", impact: "high", effort: "low", status: "pass" }, - ], + { + id: "lint-config", + title: "Linting configured", + pillar: "style-validation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + status: "pass" + } + ] }); const html = generateVisualReport({ - reports: [{ repo: "test-repo", report }], + reports: [{ repo: "test-repo", report }] }); expect(html).toContain("All criteria passing"); @@ -181,7 +233,7 @@ describe("generateVisualReport", () => { it("escapes HTML in repo names", () => { const html = generateVisualReport({ - reports: [{ repo: '', report: makeReport() }], + reports: [{ repo: '', report: makeReport() }] }); expect(html).not.toContain(''); diff --git a/src/services/analyzer.ts b/src/services/analyzer.ts index 8e4eede..9c0ed12 100644 --- a/src/services/analyzer.ts +++ b/src/services/analyzer.ts @@ -51,7 +51,7 @@ export async function analyzeRepo(repoPath: string): Promise { const hasRequirements = files.includes("requirements.txt"); const hasGoMod = files.includes("go.mod"); const hasCargo = files.includes("Cargo.toml"); - const hasCsproj = files.some(f => f.endsWith(".csproj") || f.endsWith(".sln")); + const hasCsproj = files.some((f) => f.endsWith(".csproj") || f.endsWith(".sln")); const hasPomXml = files.includes("pom.xml"); const hasBuildGradle = files.includes("build.gradle") || files.includes("build.gradle.kts"); const hasGemfile = files.includes("Gemfile"); @@ -107,7 +107,10 @@ export async function analyzeRepo(repoPath: string): Promise { return analysis; } -async function detectPackageManager(_repoPath: string, files: string[]): Promise { +async function detectPackageManager( + _repoPath: string, + files: string[] +): Promise { for (const manager of PACKAGE_MANAGERS) { if (files.includes(manager.file)) return manager.name; } @@ -125,7 +128,8 @@ function detectFrameworks(deps: string[], files: string[]): string[] { const frameworks: string[] = []; const hasFile = (file: string): boolean => files.includes(file); - if (deps.includes("next") || hasFile("next.config.js") || hasFile("next.config.mjs")) frameworks.push("Next.js"); + if (deps.includes("next") || hasFile("next.config.js") || hasFile("next.config.mjs")) + frameworks.push("Next.js"); if (deps.includes("react") || deps.includes("react-dom")) frameworks.push("React"); if (deps.includes("vue") || hasFile("vue.config.js")) frameworks.push("Vue"); if (deps.includes("@angular/core") || hasFile("angular.json")) frameworks.push("Angular"); @@ -188,9 +192,7 @@ async function readPnpmWorkspace(filePath: string): Promise { // Handle inline array: packages: ["apps/*", "libs/*"] const inline = line.match(/packages\s*:\s*\[([^\]]+)\]/u); if (inline) { - const items = inline[1].split(",").map(s => - s.trim().replace(/^['"]|['"]$/gu, "") - ); + const items = inline[1].split(",").map((s) => s.trim().replace(/^['"]|['"]$/gu, "")); return items.filter(Boolean); } inPackages = true; @@ -200,7 +202,10 @@ async function readPnpmWorkspace(filePath: string): Promise { const match = line.match(/^\s*-\s*(.+)$/u); if (match?.[1]) { // Strip trailing comments and quotes - const value = match[1].split("#")[0].trim().replace(/^['"]|['"]$/gu, ""); + const value = match[1] + .split("#")[0] + .trim() + .replace(/^['"]|['"]$/gu, ""); if (value) patterns.push(value); continue; } @@ -221,10 +226,14 @@ async function resolveWorkspaceApps( ): Promise { const workspacePatterns = patterns .map((pattern) => pattern.replace(/\\/gu, "/")) - .map((pattern) => (pattern.endsWith("package.json") ? pattern : path.posix.join(pattern, "package.json"))); + .map((pattern) => + pattern.endsWith("package.json") ? pattern : path.posix.join(pattern, "package.json") + ); const packageJsonPaths = workspacePatterns.length - ? (await fg(workspacePatterns, { cwd: repoPath, absolute: true, onlyFiles: true, dot: false })).map(p => path.normalize(p)) + ? ( + await fg(workspacePatterns, { cwd: repoPath, absolute: true, onlyFiles: true, dot: false }) + ).map((p) => path.normalize(p)) : []; if (!packageJsonPaths.length && rootPackageJson) { @@ -287,7 +296,10 @@ type NonJsMonorepoResult = { apps: RepoApp[]; }; -async function detectNonJsMonorepo(repoPath: string, files: string[]): Promise { +async function detectNonJsMonorepo( + repoPath: string, + files: string[] +): Promise { const cargoApps = await detectCargoWorkspace(repoPath); if (cargoApps.length > 1) return { type: "cargo", apps: cargoApps }; @@ -317,25 +329,24 @@ async function detectCargoWorkspace(repoPath: string): Promise { const membersMatch = workspaceSection[1].match(/members\s*=\s*\[([\s\S]*?)\]/u); if (!membersMatch) return []; - const patterns = [...membersMatch[1].matchAll(/"([^"]+)"/gu)].map(m => m[1]); + const patterns = [...membersMatch[1].matchAll(/"([^"]+)"/gu)].map((m) => m[1]); if (!patterns.length) return []; - const tomlPaths = (await fg( - patterns.map(p => path.posix.join(p, "Cargo.toml")), - { cwd: repoPath, absolute: true, onlyFiles: true } - )).map(p => path.normalize(p)); - - return Promise.all(tomlPaths.map(async (tomlPath) => { - const dir = path.dirname(tomlPath); - const toml = await safeReadFile(tomlPath); - const nameMatch = toml?.match(/^\s*name\s*=\s*"([^"]+)"/mu); - return buildNonJsApp( - nameMatch?.[1] ?? path.basename(dir), - dir, - "rust", - tomlPath - ); - })); + const tomlPaths = ( + await fg( + patterns.map((p) => path.posix.join(p, "Cargo.toml")), + { cwd: repoPath, absolute: true, onlyFiles: true } + ) + ).map((p) => path.normalize(p)); + + return Promise.all( + tomlPaths.map(async (tomlPath) => { + const dir = path.dirname(tomlPath); + const toml = await safeReadFile(tomlPath); + const nameMatch = toml?.match(/^\s*name\s*=\s*"([^"]+)"/mu); + return buildNonJsApp(nameMatch?.[1] ?? path.basename(dir), dir, "rust", tomlPath); + }) + ); } async function detectGoWorkspace(repoPath: string): Promise { @@ -362,7 +373,7 @@ async function detectGoWorkspace(repoPath: string): Promise { for (const mod of modules) { const modPath = path.resolve(repoPath, mod); const goModPath = path.join(modPath, "go.mod"); - if (!await fileExists(goModPath)) continue; + if (!(await fileExists(goModPath))) continue; const goMod = await safeReadFile(goModPath); const nameMatch = goMod?.match(/^module\s+(\S+)/mu); @@ -374,7 +385,7 @@ async function detectGoWorkspace(repoPath: string): Promise { } async function detectDotnetSolution(repoPath: string, files: string[]): Promise { - const slnFile = files.find(f => f.endsWith(".sln")); + const slnFile = files.find((f) => f.endsWith(".sln")); if (!slnFile) return []; const content = await safeReadFile(path.join(repoPath, slnFile)); @@ -399,9 +410,11 @@ async function detectDotnetSolution(repoPath: string, files: string[]): Promise< } async function detectGradleMultiProject(repoPath: string, files: string[]): Promise { - const settingsFile = files.includes("settings.gradle.kts") ? "settings.gradle.kts" - : files.includes("settings.gradle") ? "settings.gradle" - : null; + const settingsFile = files.includes("settings.gradle.kts") + ? "settings.gradle.kts" + : files.includes("settings.gradle") + ? "settings.gradle" + : null; if (!settingsFile) return []; const content = await safeReadFile(path.join(repoPath, settingsFile)); @@ -421,9 +434,11 @@ async function detectGradleMultiProject(repoPath: string, files: string[]): Prom const ktsPath = path.join(projectDir, "build.gradle.kts"); const groovyPath = path.join(projectDir, "build.gradle"); - const buildFile = await fileExists(ktsPath) ? ktsPath - : await fileExists(groovyPath) ? groovyPath - : null; + const buildFile = (await fileExists(ktsPath)) + ? ktsPath + : (await fileExists(groovyPath)) + ? groovyPath + : null; if (buildFile) { apps.push(buildNonJsApp(path.basename(project), projectDir, "java", buildFile)); diff --git a/src/services/azureDevops.ts b/src/services/azureDevops.ts index f5aebb7..65d3ab3 100644 --- a/src/services/azureDevops.ts +++ b/src/services/azureDevops.ts @@ -58,7 +58,8 @@ export type AzureDevOpsRepo = { hasInstructions?: boolean; }; -const PROFILE_URL = "https://app.vssps.visualstudio.com/_apis/profile/profiles/me?api-version=7.1-preview.1"; +const PROFILE_URL = + "https://app.vssps.visualstudio.com/_apis/profile/profiles/me?api-version=7.1-preview.1"; const ADO_SLUG_RE = /^[\w][\w.-]*$/u; @@ -99,7 +100,10 @@ export function getAzureDevOpsToken(): string | null { export async function listOrganizations(token: string): Promise { const profile = await adoRequest(PROFILE_URL, token); const accountsUrl = `https://app.vssps.visualstudio.com/_apis/accounts?memberId=${encodeURIComponent(profile.id)}&api-version=7.1-preview.1`; - const accounts = await adoRequest>(accountsUrl, token); + const accounts = await adoRequest>( + accountsUrl, + token + ); return accounts.value.map((account) => ({ id: account.accountId, @@ -108,10 +112,16 @@ export async function listOrganizations(token: string): Promise { +export async function listProjects( + token: string, + organization: string +): Promise { const org = validateAdoSlug(organization, "organization"); const url = `https://dev.azure.com/${org}/_apis/projects?stateFilter=wellFormed&api-version=7.1-preview.1`; - const response = await adoRequest>(url, token); + const response = await adoRequest>( + url, + token + ); return response.value.map((project) => ({ id: project.id, @@ -121,7 +131,11 @@ export async function listProjects(token: string, organization: string): Promise })); } -export async function listRepos(token: string, organization: string, project: string): Promise { +export async function listRepos( + token: string, + organization: string, + project: string +): Promise { const org = validateAdoSlug(organization, "organization"); const proj = validateAdoSlug(project, "project"); const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories?api-version=7.1-preview.1`; @@ -255,4 +269,4 @@ export async function checkReposForInstructions( } return results; -} \ No newline at end of file +} diff --git a/src/services/copilot.ts b/src/services/copilot.ts index 5a4d863..3ec951e 100644 --- a/src/services/copilot.ts +++ b/src/services/copilot.ts @@ -30,7 +30,7 @@ export async function listCopilotModels(): Promise { } async function findCopilotCliPath(): Promise { - if (cachedCliPath && (Date.now() - cachedCliPathTimestamp) < CLI_CACHE_TTL_MS) { + if (cachedCliPath && Date.now() - cachedCliPathTimestamp < CLI_CACHE_TTL_MS) { return cachedCliPath; } @@ -99,13 +99,16 @@ async function findCopilotCliPath(): Promise { } } - const platformHint = process.platform === "win32" - ? " Searched APPDATA and VS Code extension paths." - : process.platform === "linux" - ? " Searched ~/.config/Code and VS Code extension paths." - : " Searched ~/Library/Application Support/Code and VS Code extension paths."; + const platformHint = + process.platform === "win32" + ? " Searched APPDATA and VS Code extension paths." + : process.platform === "linux" + ? " Searched ~/.config/Code and VS Code extension paths." + : " Searched ~/Library/Application Support/Code and VS Code extension paths."; - throw new Error(`Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code.${platformHint}`); + throw new Error( + `Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code.${platformHint}` + ); } function extractModelChoices(helpText: string): string[] { diff --git a/src/services/evalScaffold.ts b/src/services/evalScaffold.ts index a32e5bc..9836ea4 100644 --- a/src/services/evalScaffold.ts +++ b/src/services/evalScaffold.ts @@ -69,7 +69,9 @@ export async function generateEvalScaffold(options: EvalScaffoldOptions): Promis } else if (event.type === "session.error") { const errorMsg = (event.data?.message as string) ?? "Unknown error"; if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { - throw new Error("Copilot CLI not logged in. Run `copilot` then `/login` to authenticate."); + throw new Error( + "Copilot CLI not logged in. Run `copilot` then `/login` to authenticate." + ); } } }); @@ -100,7 +102,7 @@ export async function generateEvalScaffold(options: EvalScaffoldOptions): Promis "Ensure cases cover cross-cutting concerns: data flow, error propagation, configuration impact, implicit coupling, architectural invariants.", "Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).", "Return JSON ONLY (no markdown, no commentary) in this schema:", - "{\n \"instructionFile\": \".github/copilot-instructions.md\",\n \"systemMessage\": \"...\",\n \"cases\": [\n {\"id\": \"case-1\", \"prompt\": \"...\", \"expectation\": \"...\"}\n ]\n}" + '{\n "instructionFile": ".github/copilot-instructions.md",\n "systemMessage": "...",\n "cases": [\n {"id": "case-1", "prompt": "...", "expectation": "..."}\n ]\n}' ].join("\n"); progress("Analyzing codebase..."); diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index dee4e06..db3f195 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -76,7 +76,9 @@ export type EvalResult = { trajectory?: TrajectoryEvent[]; }; -export async function runEval(options: EvalRunOptions): Promise<{ summary: string; results: EvalResult[]; viewerPath?: string }> { +export async function runEval( + options: EvalRunOptions +): Promise<{ summary: string; results: EvalResult[]; viewerPath?: string }> { const config = await loadConfig(options.configPath); const instructionFile = config.instructionFile ?? ".github/copilot-instructions.md"; const instructionPath = path.resolve(options.repoPath, instructionFile); @@ -89,7 +91,8 @@ export async function runEval(options: EvalRunOptions): Promise<{ summary: strin "evals", buildTimestampedName("eval-results") ); - const outputPath = resolveOutputPath(options.repoPath, options.outputPath, config.outputPath) ?? defaultOutputPath; + const outputPath = + resolveOutputPath(options.repoPath, options.outputPath, config.outputPath) ?? defaultOutputPath; const runStartedAt = Date.now(); progress("Starting Copilot SDK..."); @@ -157,7 +160,9 @@ export async function runEval(options: EvalRunOptions): Promise<{ summary: strin trajectory }); - progress(`Eval ${index + 1}/${total}: ${id} → ${judgment.result.verdict} (score: ${judgment.result.score})`); + progress( + `Eval ${index + 1}/${total}: ${id} → ${judgment.result.verdict} (score: ${judgment.result.score})` + ); } const runFinishedAt = Date.now(); @@ -200,17 +205,12 @@ type AskResult = { trajectory: TrajectoryEvent[]; }; -async function askOnce( - client: CopilotClient, - options: AskOptions -): Promise { +async function askOnce(client: CopilotClient, options: AskOptions): Promise { const session = await client.createSession({ model: options.model, streaming: true, infiniteSessions: { enabled: false }, - systemMessage: options.systemMessage - ? { content: options.systemMessage } - : undefined + systemMessage: options.systemMessage ? { content: options.systemMessage } : undefined }); let content = ""; @@ -261,7 +261,8 @@ async function judge( streaming: true, infiniteSessions: { enabled: false }, systemMessage: { - content: "You are a strict evaluator. Return JSON with keys: verdict (pass|fail|unknown), score (0-100), rationale. Do not include any other text." + content: + "You are a strict evaluator. Return JSON with keys: verdict (pass|fail|unknown), score (0-100), rationale. Do not include any other text." } }); @@ -358,7 +359,9 @@ function formatSummary(results: EvalResult[], runDurationMs: number): string { const failed = results.filter((r) => r.verdict === "fail").length; const unknown = results.filter((r) => r.verdict === "unknown").length; const totalUsage = aggregateTokenUsage(results); - const hasUsage = Boolean(totalUsage.promptTokens || totalUsage.completionTokens || totalUsage.totalTokens); + const hasUsage = Boolean( + totalUsage.promptTokens || totalUsage.completionTokens || totalUsage.totalTokens + ); const lines = [ `Eval results: ${passed}/${total} pass, ${failed} fail, ${unknown} unknown.`, @@ -367,9 +370,7 @@ function formatSummary(results: EvalResult[], runDurationMs: number): string { ]; for (const result of results) { - lines.push( - `- ${result.id}: ${result.verdict ?? "unknown"} (score: ${result.score ?? 0})` - ); + lines.push(`- ${result.id}: ${result.verdict ?? "unknown"} (score: ${result.score ?? 0})`); } return `\n${lines.join("\n")}`; @@ -414,7 +415,8 @@ function captureTelemetryEvent( } else if (event.type === "tool.execution_finish" || event.type === "tool.execution_error") { const toolName = (event.data?.toolName as string | undefined) ?? "unknown"; const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size); - const entry = telemetry.toolCallMap.get(toolId) ?? findLatestToolByName(telemetry.toolCallMap, toolName); + const entry = + telemetry.toolCallMap.get(toolId) ?? findLatestToolByName(telemetry.toolCallMap, toolName); if (entry) { const durationMs = timestampMs - entry.startMs; telemetry.toolCalls.totalDurationMs += durationMs; @@ -455,7 +457,10 @@ function extractTokenUsage(data: Record | undefined): TokenUsag usage?.prompt_tokens ?? usage?.promptTokens ?? data.promptTokens ?? data.inputTokens ); const completionTokens = getNumber( - usage?.completion_tokens ?? usage?.completionTokens ?? data.completionTokens ?? data.outputTokens + usage?.completion_tokens ?? + usage?.completionTokens ?? + data.completionTokens ?? + data.outputTokens ); const totalTokens = getNumber(usage?.total_tokens ?? usage?.totalTokens ?? data.totalTokens); @@ -471,20 +476,18 @@ function extractTokenUsage(data: Record | undefined): TokenUsag } function findUsageObject(data: Record): Record | undefined { - const direct = (data.usage ?? data.tokenUsage ?? data.tokens) as Record | undefined; + const direct = (data.usage ?? data.tokenUsage ?? data.tokens) as + | Record + | undefined; if (direct) return direct; - const candidates = [ - data.response, - data.result, - data.message, - data.metrics, - data.output - ]; + const candidates = [data.response, data.result, data.message, data.metrics, data.output]; for (const candidate of candidates) { if (candidate && typeof candidate === "object") { - const nested = (candidate as Record).usage ?? (candidate as Record).tokenUsage; + const nested = + (candidate as Record).usage ?? + (candidate as Record).tokenUsage; if (nested && typeof nested === "object") return nested as Record; } } @@ -541,7 +544,8 @@ function getNumber(value: unknown): number | null { function mergeTokenUsage(existing: TokenUsage, next: TokenUsage): TokenUsage { return { promptTokens: Math.max(existing.promptTokens ?? 0, next.promptTokens ?? 0) || undefined, - completionTokens: Math.max(existing.completionTokens ?? 0, next.completionTokens ?? 0) || undefined, + completionTokens: + Math.max(existing.completionTokens ?? 0, next.completionTokens ?? 0) || undefined, totalTokens: Math.max(existing.totalTokens ?? 0, next.totalTokens ?? 0) || undefined }; } @@ -565,7 +569,11 @@ function aggregateTokenUsage(results: EvalResult[]): TokenUsage { for (const result of results) { const metrics = result.metrics; if (!metrics) continue; - const usages = [metrics.withoutInstructions.tokenUsage, metrics.withInstructions.tokenUsage, metrics.judge.tokenUsage]; + const usages = [ + metrics.withoutInstructions.tokenUsage, + metrics.withInstructions.tokenUsage, + metrics.judge.tokenUsage + ]; for (const usage of usages) { if (!usage) continue; total.promptTokens = (total.promptTokens ?? 0) + (usage.promptTokens ?? 0); @@ -591,7 +599,11 @@ function formatTokenUsage(usage: TokenUsage): string { return `prompt ${prompt}, completion ${completion}, total ${total}`; } -function resolveOutputPath(repoPath: string, override?: string, configValue?: string): string | undefined { +function resolveOutputPath( + repoPath: string, + override?: string, + configValue?: string +): string | undefined { const chosen = override ?? configValue; if (!chosen) return undefined; return path.isAbsolute(chosen) ? chosen : path.resolve(repoPath, chosen); @@ -918,7 +930,9 @@ renderCaseDetails(); `; } -function sanitizeEventData(data: Record | undefined): Record | undefined { +function sanitizeEventData( + data: Record | undefined +): Record | undefined { if (!data) return undefined; const sanitized: Record = {}; for (const [key, value] of Object.entries(data)) { diff --git a/src/services/generator.ts b/src/services/generator.ts index c018239..8e6c9d5 100644 --- a/src/services/generator.ts +++ b/src/services/generator.ts @@ -11,8 +11,7 @@ export type GenerateOptions = { force: boolean; }; -export async function generateConfigs(options: GenerateOptions): Promise<{ summary: string }> -{ +export async function generateConfigs(options: GenerateOptions): Promise<{ summary: string }> { const { repoPath, analysis, selections, force } = options; const actions: string[] = []; @@ -32,7 +31,6 @@ export async function generateConfigs(options: GenerateOptions): Promise<{ summa actions.push(result); } - const summary = actions.length ? `\n${actions.join("\n")}` : "No changes made."; return { summary }; } @@ -76,9 +74,7 @@ function renderVscodeSettings(analysis: RepoAnalysis): string { "github.copilot.chat.codeGeneration.instructions": [ { file: ".github/copilot-instructions.md" } ], - "github.copilot.chat.reviewSelection.instructions": [ - { text: reviewFocus } - ], + "github.copilot.chat.reviewSelection.instructions": [{ text: reviewFocus }], "chat.promptFiles": true, "chat.mcp.enabled": true }, diff --git a/src/services/git.ts b/src/services/git.ts index 8db0bbb..6333143 100644 --- a/src/services/git.ts +++ b/src/services/git.ts @@ -26,16 +26,18 @@ export type CloneOptions = { }; export async function cloneRepo( - repoUrl: string, + repoUrl: string, destination: string, options: CloneOptions = {} ): Promise { const { shallow = true, timeoutMs = 60000, onProgress } = options; - + const git = simpleGit({ - progress: onProgress ? ({ stage, progress }: SimpleGitProgressEvent) => { - onProgress(stage, progress); - } : undefined, + progress: onProgress + ? ({ stage, progress }: SimpleGitProgressEvent) => { + onProgress(stage, progress); + } + : undefined, timeout: { block: timeoutMs } @@ -108,7 +110,7 @@ export async function pushBranch( provider: AuthProvider = "github" ): Promise { const git = simpleGit(repoPath); - + if (token) { // Set up credentials for this push const remoteUrl = (await git.remote(["get-url", "origin"])) ?? ""; @@ -120,9 +122,10 @@ export async function pushBranch( await git.push(["-u", "origin", branch]); } catch (err) { // Strip embedded credentials from error messages to avoid leaking tokens - const sanitized = err instanceof Error - ? new Error(err.message.replace(/https:\/\/[^@]+@/g, "https://***@")) - : err; + const sanitized = + err instanceof Error + ? new Error(err.message.replace(/https:\/\/[^@]+@/g, "https://***@")) + : err; throw sanitized; } finally { // Restore original URL to avoid leaking token @@ -131,6 +134,6 @@ export async function pushBranch( return; } } - + await git.push(["-u", "origin", branch]); } diff --git a/src/services/github.ts b/src/services/github.ts index 771f55f..ffc7a6b 100644 --- a/src/services/github.ts +++ b/src/services/github.ts @@ -46,7 +46,7 @@ export function createGitHubClient(token: string): Octokit { export async function listAccessibleRepos(token: string, limit = 100): Promise { const client = createGitHubClient(token); - + // Fetch only first page - avoids timeout for users with many repos const repos = await client.rest.repos.listForAuthenticatedUser({ visibility: "all", @@ -120,7 +120,7 @@ export async function listUserOrgs(token: string): Promise { export async function listOrgRepos(token: string, org: string, limit = 100): Promise { const client = createGitHubClient(token); - + // Fetch only the first page(s) up to limit - avoids timeout on huge orgs const repos = await client.rest.repos.listForOrg({ org, @@ -142,7 +142,11 @@ export async function listOrgRepos(token: string, org: string, limit = 100): Pro /** * Check if a repo has .github/copilot-instructions.md */ -export async function checkRepoHasInstructions(token: string, owner: string, repo: string): Promise { +export async function checkRepoHasInstructions( + token: string, + owner: string, + repo: string +): Promise { const client = createGitHubClient(token); try { await client.rest.repos.getContent({ @@ -152,7 +156,12 @@ export async function checkRepoHasInstructions(token: string, owner: string, rep }); return true; } catch (error: unknown) { - if (error && typeof error === "object" && "status" in error && (error as { status: number }).status === 404) { + if ( + error && + typeof error === "object" && + "status" in error && + (error as { status: number }).status === 404 + ) { return false; } throw error; @@ -163,8 +172,8 @@ export async function checkRepoHasInstructions(token: string, owner: string, rep * Check multiple repos for instructions in parallel (with concurrency limit) */ export async function checkReposForInstructions( - token: string, - repos: GitHubRepo[], + token: string, + repos: GitHubRepo[], onProgress?: (checked: number, total: number) => void ): Promise { const concurrency = 10; diff --git a/src/services/instructions.ts b/src/services/instructions.ts index 748b9a1..78735ef 100644 --- a/src/services/instructions.ts +++ b/src/services/instructions.ts @@ -10,7 +10,9 @@ type GenerateInstructionsOptions = { onProgress?: (message: string) => void; }; -export async function generateCopilotInstructions(options: GenerateInstructionsOptions): Promise { +export async function generateCopilotInstructions( + options: GenerateInstructionsOptions +): Promise { const repoPath = options.repoPath; const progress = options.onProgress ?? (() => {}); @@ -21,7 +23,7 @@ export async function generateCopilotInstructions(options: GenerateInstructionsO progress("Starting Copilot SDK..."); const sdk = await import("@github/copilot-sdk"); const client = new sdk.CopilotClient({ - cliPath, + cliPath }); try { @@ -31,13 +33,14 @@ export async function generateCopilotInstructions(options: GenerateInstructionsO model: preferredModel, streaming: true, systemMessage: { - content: "You are an expert codebase analyst. Your task is to generate a concise .github/copilot-instructions.md file. Use the available tools (glob, view, grep) to explore the codebase. Output ONLY the final markdown content, no explanations.", + content: + "You are an expert codebase analyst. Your task is to generate a concise .github/copilot-instructions.md file. Use the available tools (glob, view, grep) to explore the codebase. Output ONLY the final markdown content, no explanations." }, - infiniteSessions: { enabled: false }, + infiniteSessions: { enabled: false } }); let content = ""; - + // Subscribe to events for progress and to capture content session.on((event) => { const e = event as { type: string; data?: Record }; @@ -53,7 +56,9 @@ export async function generateCopilotInstructions(options: GenerateInstructionsO } else if (e.type === "session.error") { const errorMsg = (e.data?.message as string) ?? "Unknown error"; if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { - throw new Error("Copilot CLI not logged in. Run `copilot` then `/login` to authenticate."); + throw new Error( + "Copilot CLI not logged in. Run `copilot` then `/login` to authenticate." + ); } } }); diff --git a/src/services/readiness.ts b/src/services/readiness.ts index 04e45ba..e0e0a08 100644 --- a/src/services/readiness.ts +++ b/src/services/readiness.ts @@ -187,7 +187,9 @@ export async function runReadinessReport(options: ReadinessOptions): Promise level.achieved).reduce((acc, level) => Math.max(acc, level.level), 0); + const achievedLevel = levels + .filter((level) => level.achieved) + .reduce((acc, level) => Math.max(acc, level.level), 0); const extras = options.includeExtras === false ? [] : await runExtras(context); @@ -331,7 +333,12 @@ function buildCriteria(): ReadinessCriterion[] { impact: "high", effort: "low", check: async (context) => { - const found = hasAnyFile(context.rootFiles, ["pnpm-lock.yaml", "yarn.lock", "package-lock.json", "bun.lockb"]); + const found = hasAnyFile(context.rootFiles, [ + "pnpm-lock.yaml", + "yarn.lock", + "package-lock.json", + "bun.lockb" + ]); return { status: found ? "pass" : "fail", reason: found ? undefined : "Missing package manager lockfile." @@ -444,7 +451,9 @@ function buildCriteria(): ReadinessCriterion[] { effort: "medium", check: async (context) => { const deps = await readAllDependencies(context); - const has = deps.some((dep) => ["@opentelemetry/api", "@opentelemetry/sdk", "pino", "winston", "bunyan"].includes(dep)); + const has = deps.some((dep) => + ["@opentelemetry/api", "@opentelemetry/sdk", "pino", "winston", "bunyan"].includes(dep) + ); return { status: has ? "pass" : "fail", reason: "No observability dependencies detected (OpenTelemetry/logging)." @@ -464,8 +473,15 @@ function buildCriteria(): ReadinessCriterion[] { if (rootFound.length === 0) { return { status: "fail", - reason: "Missing custom AI instructions (e.g. copilot-instructions.md, CLAUDE.md, AGENTS.md, .cursorrules).", - evidence: ["copilot-instructions.md", "CLAUDE.md", "AGENTS.md", ".cursorrules", ".github/copilot-instructions.md"] + reason: + "Missing custom AI instructions (e.g. copilot-instructions.md, CLAUDE.md, AGENTS.md, .cursorrules).", + evidence: [ + "copilot-instructions.md", + "CLAUDE.md", + "AGENTS.md", + ".cursorrules", + ".github/copilot-instructions.md" + ] }; } @@ -482,7 +498,10 @@ function buildCriteria(): ReadinessCriterion[] { return { status: "pass", reason: `Root instructions found, but ${appsMissing.length}/${context.apps.length} apps missing their own: ${appsMissing.join(", ")}`, - evidence: [...rootFound, ...appsMissing.map(name => `${name}: missing app-level instructions`)] + evidence: [ + ...rootFound, + ...appsMissing.map((name) => `${name}: missing app-level instructions`) + ] }; } } @@ -506,7 +525,10 @@ function buildCriteria(): ReadinessCriterion[] { return { status: found.length > 0 ? "pass" : "fail", reason: "Missing MCP (Model Context Protocol) configuration (e.g. .vscode/mcp.json).", - evidence: found.length > 0 ? found : [".vscode/mcp.json", ".vscode/settings.json (mcp section)", "mcp.json"] + evidence: + found.length > 0 + ? found + : [".vscode/mcp.json", ".vscode/settings.json (mcp section)", "mcp.json"] }; } }, @@ -523,7 +545,10 @@ function buildCriteria(): ReadinessCriterion[] { return { status: found.length > 0 ? "pass" : "fail", reason: "No custom AI agents configured (e.g. .github/agents/, .copilot/agents/).", - evidence: found.length > 0 ? found : [".github/agents/", ".copilot/agents/", ".github/copilot/agents/"] + evidence: + found.length > 0 + ? found + : [".github/agents/", ".copilot/agents/", ".github/copilot/agents/"] }; } }, @@ -540,7 +565,8 @@ function buildCriteria(): ReadinessCriterion[] { return { status: found.length > 0 ? "pass" : "fail", reason: "No Copilot or Claude skills found (e.g. .copilot/skills/, .github/skills/).", - evidence: found.length > 0 ? found : [".copilot/skills/", ".github/skills/", ".claude/skills/"] + evidence: + found.length > 0 ? found : [".copilot/skills/", ".github/skills/", ".claude/skills/"] }; } } @@ -633,7 +659,9 @@ function summarizeLevels(criteria: ReadinessCriterionResult[]): ReadinessLevelSu for (const summary of summaries) { const allPrior = summaries.filter((candidate) => candidate.level <= summary.level); - const achieved = allPrior.every((candidate) => candidate.total > 0 && candidate.passRate >= 0.8); + const achieved = allPrior.every( + (candidate) => candidate.total > 0 && candidate.passRate >= 0.8 + ); summary.achieved = achieved; } @@ -652,7 +680,9 @@ function hasAnyFile(files: string[], candidates: string[]): boolean { async function hasReadme(repoPath: string): Promise { const files = await safeReadDir(repoPath); - return files.some((file) => file.toLowerCase() === "readme.md" || file.toLowerCase() === "readme"); + return files.some( + (file) => file.toLowerCase() === "readme.md" || file.toLowerCase() === "readme" + ); } async function hasLintConfig(repoPath: string): Promise { @@ -783,21 +813,14 @@ async function hasMcpConfig(repoPath: string): Promise { async function hasCustomAgents(repoPath: string): Promise { const found: string[] = []; - const agentDirs = [ - ".github/agents", - ".copilot/agents", - ".github/copilot/agents" - ]; + const agentDirs = [".github/agents", ".copilot/agents", ".github/copilot/agents"]; for (const dir of agentDirs) { if (await fileExists(path.join(repoPath, dir))) { found.push(dir); } } // Check for agent config files - const agentFiles = [ - ".github/copilot-agents.yml", - ".github/copilot-agents.yaml" - ]; + const agentFiles = [".github/copilot-agents.yml", ".github/copilot-agents.yaml"]; for (const agentFile of agentFiles) { if (await fileExists(path.join(repoPath, agentFile))) { found.push(agentFile); @@ -830,20 +853,24 @@ async function readAllDependencies(context: ReadinessContext): Promise const pkg = await readJson(app.packageJsonPath); const deps = (pkg?.dependencies ?? {}) as Record; const devDeps = (pkg?.devDependencies ?? {}) as Record; - dependencies.push(...Object.keys({ - ...deps, - ...devDeps - })); + dependencies.push( + ...Object.keys({ + ...deps, + ...devDeps + }) + ); } if (!apps.length && context.rootPackageJson) { const rootDeps = (context.rootPackageJson.dependencies ?? {}) as Record; const rootDevDeps = (context.rootPackageJson.devDependencies ?? {}) as Record; - dependencies.push(...Object.keys({ - ...rootDeps, - ...rootDevDeps - })); + dependencies.push( + ...Object.keys({ + ...rootDeps, + ...rootDevDeps + }) + ); } return Array.from(new Set(dependencies)); -} \ No newline at end of file +} diff --git a/src/services/visualReport.ts b/src/services/visualReport.ts index b1dd0a8..620562a 100644 --- a/src/services/visualReport.ts +++ b/src/services/visualReport.ts @@ -7,16 +7,22 @@ type VisualReportOptions = { }; export function generateVisualReport(options: VisualReportOptions): string { - const { reports, title = "AI Readiness Report", generatedAt = new Date().toISOString() } = options; + const { + reports, + title = "AI Readiness Report", + generatedAt = new Date().toISOString() + } = options; - const successfulReports = reports.filter(r => !r.error); - const failedReports = reports.filter(r => r.error); + const successfulReports = reports.filter((r) => !r.error); + const failedReports = reports.filter((r) => r.error); const totalRepos = reports.length; const successfulRepos = successfulReports.length; - const avgLevel = successfulReports.length > 0 - ? successfulReports.reduce((sum, r) => sum + r.report.achievedLevel, 0) / successfulReports.length - : 0; + const avgLevel = + successfulReports.length > 0 + ? successfulReports.reduce((sum, r) => sum + r.report.achievedLevel, 0) / + successfulReports.length + : 0; const pillarStats = calculatePillarStats(successfulReports); const aiToolingData = calculateAiToolingData(successfulReports); @@ -395,17 +401,21 @@ export function generateVisualReport(options: VisualReportOptions): string {
    Success Rate
    ${totalRepos > 0 ? Math.round((successfulRepos / totalRepos) * 100) : 0}%
    -
    ${failedReports.length > 0 ? failedReports.length + ' failed' : 'All succeeded'}
    +
    ${failedReports.length > 0 ? failedReports.length + " failed" : "All succeeded"}
    - ${successfulReports.length > 0 ? ` + ${ + successfulReports.length > 0 + ? ` ${buildAiToolingHeroHtml(aiToolingData, successfulReports)}

    Pillar Performance

    - ${pillarStats.map(pillar => ` + ${pillarStats + .map( + (pillar) => `
    ${escapeHtml(pillar.name)}
    @@ -415,52 +425,62 @@ export function generateVisualReport(options: VisualReportOptions): string { ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%)
    - `).join('')} + ` + ) + .join("")}

    Maturity Model

    - ${[1, 2, 3, 4, 5].map(level => { - const count = successfulReports.filter(r => r.report.achievedLevel === level).length; - return ` -
    + ${[1, 2, 3, 4, 5] + .map((level) => { + const count = successfulReports.filter((r) => r.report.achievedLevel === level).length; + return ` +
    ${level} ${getLevelName(level)} - ${count} repo${count !== 1 ? 's' : ''} + ${count} repo${count !== 1 ? "s" : ""}
    ${getLevelDescription(level)}
    `; - }).join('')} + }) + .join("")}

    Distribution

    - ${[1, 2, 3, 4, 5].map(level => { - const count = successfulReports.filter(r => r.report.achievedLevel === level).length; - const percent = successfulReports.length > 0 ? (count / successfulReports.length) * 100 : 0; - const barHeight = count > 0 ? Math.max(40, percent * 2) : 0; - return ` + ${[1, 2, 3, 4, 5] + .map((level) => { + const count = successfulReports.filter((r) => r.report.achievedLevel === level).length; + const percent = + successfulReports.length > 0 ? (count / successfulReports.length) * 100 : 0; + const barHeight = count > 0 ? Math.max(40, percent * 2) : 0; + return `
    ${count}
    -
    +
    ${level}
    ${getLevelName(level)}
    `; - }).join('')} + }) + .join("")}
    - ` : ''} + ` + : "" + }

    Repository Details

    - ${reports.map(({ repo, report, error }) => { - if (error) { - return ` + ${reports + .map(({ repo, report, error }) => { + if (error) { + return `
    ${escapeHtml(repo)}
    @@ -469,9 +489,9 @@ export function generateVisualReport(options: VisualReportOptions): string {
    ${escapeHtml(error)}
    `; - } + } - return ` + return `
    ${escapeHtml(repo)}
    @@ -479,11 +499,12 @@ export function generateVisualReport(options: VisualReportOptions): string { Maturity ${report.achievedLevel}: ${getLevelName(report.achievedLevel)}
    - ${report.isMonorepo ? `
    Monorepo · ${report.apps.length} apps
    ` : ''} + ${report.isMonorepo ? `
    Monorepo · ${report.apps.length} apps
    ` : ""}
    - ${report.pillars.map(pillar => { - const pillarCriteria = report.criteria.filter(c => c.pillar === pillar.id); - return ` + ${report.pillars + .map((pillar) => { + const pillarCriteria = report.criteria.filter((c) => c.pillar === pillar.id); + return `
    @@ -491,39 +512,53 @@ export function generateVisualReport(options: VisualReportOptions): string { ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%)
    - ${pillarCriteria.map(c => ` + ${pillarCriteria + .map( + (c) => `
    ${escapeHtml(c.title)} - ${c.status === 'pass' ? 'Pass' : c.status === 'fail' ? 'Fail' : 'Skip'} + ${c.status === "pass" ? "Pass" : c.status === "fail" ? "Fail" : "Skip"}
    - `).join('')} - ${pillarCriteria.length === 0 ? '
    No criteria
    ' : ''} + ` + ) + .join("")} + ${pillarCriteria.length === 0 ? '
    No criteria
    ' : ""}
    `; - }).join('')} + }) + .join("")}
    ${getTopFixesHtml(report)}
    `; - }).join('')} + }) + .join("")}
    - ${failedReports.length > 0 ? ` + ${ + failedReports.length > 0 + ? `

    Failed Repositories

    - ${failedReports.map(({ repo, error }) => ` + ${failedReports + .map( + ({ repo, error }) => `
    ${escapeHtml(repo)}
    -
    ${escapeHtml(error || 'Unknown error')}
    +
    ${escapeHtml(error || "Unknown error")}
    - `).join('')} + ` + ) + .join("")}
    - ` : ''} + ` + : "" + } `; }) @@ -858,3 +859,52 @@ function escapeHtml(text: string): string { }; return text.replace(/[&<>"']/g, (m) => map[m]); } + +function buildAreaReportsHtml(areaReports?: AreaReadinessReport[]): string { + if (!areaReports?.length) return ""; + + return ` +
    +
    Per-Area Breakdown
    +
    + ${areaReports + .map((ar) => { + const relevant = ar.criteria.filter((c) => c.status !== "skip"); + const passed = relevant.filter((c) => c.status === "pass").length; + const total = relevant.length; + const pct = total ? Math.round((passed / total) * 100) : 0; + const sourceLabel = ar.area.source === "config" ? "config" : "auto"; + const applyTo = Array.isArray(ar.area.applyTo) ? ar.area.applyTo.join(", ") : ar.area.applyTo; + + return ` +
    +
    + + ${escapeHtml(ar.area.name)} + + ${sourceLabel} + = 50 ? "var(--color-attention-fg)" : "var(--color-danger-fg)"};">${passed}/${total} (${pct}%) + + +
    +
    ${escapeHtml(applyTo)}
    + ${ar.criteria + .map( + (c) => ` +
    + ${escapeHtml(c.title)} + ${c.status === "pass" ? "Pass" : c.status === "fail" ? "Fail" : "Skip"} +
    + ` + ) + .join("")} +
    +
    +
    + `; + }) + .join("")} +
    +
    + `; +} diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 3542c52..6a5c282 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -5,7 +5,7 @@ import type { Key } from "ink"; import { Box, Text, useApp, useInput } from "ink"; import React, { useEffect, useMemo, useState } from "react"; -import type { RepoApp } from "../services/analyzer"; +import type { RepoApp, Area } from "../services/analyzer"; import { analyzeRepo } from "../services/analyzer"; import { getAzureDevOpsToken } from "../services/azureDevops"; import { listCopilotModels } from "../services/copilot"; @@ -13,7 +13,13 @@ import { generateEvalScaffold } from "../services/evalScaffold"; import type { EvalConfig } from "../services/evalScaffold"; import { runEval, type EvalResult } from "../services/evaluator"; import { getGitHubToken } from "../services/github"; -import { generateCopilotInstructions } from "../services/instructions"; +import { + generateCopilotInstructions, + generateAreaInstructions, + buildAreaInstructionContent, + areaInstructionPath, + writeAreaInstruction +} from "../services/instructions"; import { safeWriteFile, buildTimestampedName } from "../utils/fs"; import { AnimatedBanner, StaticBanner } from "./AnimatedBanner"; @@ -42,6 +48,8 @@ type Status = | "model-pick" | "generate-pick" | "generate-app-pick" + | "generate-area-pick" + | "generating-areas" | "bootstrapEvalCount" | "bootstrapEvalConfirm"; @@ -150,16 +158,19 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const [generateSavePath, setGenerateSavePath] = useState(""); const [repoApps, setRepoApps] = useState([]); const [isMonorepo, setIsMonorepo] = useState(false); + const [repoAreas, setRepoAreas] = useState([]); + const [areaCursor, setAreaCursor] = useState(0); const repoLabel = useMemo(() => path.basename(repoPath), [repoPath]); const repoFull = useMemo(() => repoPath, [repoPath]); const isLoading = - status === "generating" || status === "bootstrapping" || status === "evaluating"; + status === "generating" || status === "bootstrapping" || status === "evaluating" || status === "generating-areas"; const isMenu = status === "model-pick" || status === "eval-pick" || status === "batch-pick" || status === "generate-pick" || - status === "generate-app-pick"; + status === "generate-app-pick" || + status === "generate-area-pick"; const spinner = useSpinner(isLoading); const addLog = (text: string, type: LogEntry["type"] = "info") => { @@ -181,6 +192,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const apps = analysis.apps ?? []; setRepoApps(apps); setIsMonorepo(analysis.isMonorepo ?? false); + setRepoAreas(analysis.areas ?? []); }) .catch((err) => { addLog(`Repo analysis failed: ${err instanceof Error ? err.message : "unknown"}`, "error"); @@ -463,6 +475,16 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX } return; } + if (input.toLowerCase() === "f") { + if (repoAreas.length === 0) { + setMessage("No areas detected. Add primer.config.json to define areas."); + return; + } + setAreaCursor(0); + setStatus("generate-area-pick"); + setMessage("Generate file-based instructions for areas."); + return; + } if (key.escape) { setStatus("idle"); setMessage(""); @@ -533,6 +555,83 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return; } + if (status === "generate-area-pick") { + if (input.toLowerCase() === "a") { + // All areas + setStatus("generating-areas"); + addLog(`Generating file-based instructions for ${repoAreas.length} areas...`, "progress"); + let written = 0; + for (const [i, area] of repoAreas.entries()) { + setMessage(`Generating for "${area.name}" (${i + 1}/${repoAreas.length})...`); + try { + const body = await generateAreaInstructions({ + repoPath, + area, + onProgress: (msg) => setMessage(`${area.name}: ${msg}`) + }); + const result = await writeAreaInstruction(repoPath, area, body); + if (result.status === "written") { + written++; + addLog(`${area.name}: saved ${path.basename(result.filePath)}`, "success"); + } else if (result.status === "skipped") { + addLog(`${area.name}: skipped (file exists)`, "info"); + } + } catch (error) { + const msg = error instanceof Error ? error.message : "Failed."; + addLog(`${area.name}: ${msg}`, "error"); + } + } + setStatus("done"); + setMessage(`Generated file-based instructions for ${written}/${repoAreas.length} areas.`); + return; + } + if (key.upArrow) { + setAreaCursor((prev) => Math.max(0, prev - 1)); + return; + } + if (key.downArrow) { + setAreaCursor((prev) => Math.min(repoAreas.length - 1, prev + 1)); + return; + } + if (key.return) { + const area = repoAreas[areaCursor]; + if (!area) return; + setStatus("generating-areas"); + setMessage(`Generating for "${area.name}"...`); + addLog(`Generating file-based instructions for "${area.name}"...`, "progress"); + try { + const body = await generateAreaInstructions({ + repoPath, + area, + onProgress: (msg) => setMessage(`${area.name}: ${msg}`) + }); + if (body.trim()) { + const filePath = areaInstructionPath(repoPath, area); + setGeneratedContent(buildAreaInstructionContent(area, body)); + setGenerateSavePath(filePath); + setStatus("preview"); + setMessage("Review the generated area instructions."); + addLog(`"${area.name}" generated — review and save.`, "success"); + } else { + setStatus("done"); + setMessage(`No content generated for "${area.name}".`); + } + } catch (error) { + const msg = error instanceof Error ? error.message : "Failed."; + setStatus("error"); + setMessage(msg); + addLog(`${area.name}: ${msg}`, "error"); + } + return; + } + if (key.escape) { + setStatus("generate-pick"); + setMessage("Select what to generate."); + return; + } + return; + } + if (status === "model-pick") { if (key.escape) { setStatus("idle"); @@ -802,6 +901,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {repoLabel} {isMonorepo && monorepo · {repoApps.length} apps} + {repoAreas.length > 0 && · {repoAreas.length} areas} {" "} {repoFull} @@ -933,6 +1033,34 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX )} + {/* Area picker for file-based instructions */} + {status === "generate-area-pick" && repoAreas.length > 0 && ( + <> + + + {repoAreas.map((area, i) => ( + + + {i === areaCursor ? "▶" : " "} + + + {area.name} + + {" "} + {Array.isArray(area.applyTo) ? area.applyTo.join(", ") : area.applyTo} + + {area.source === "config" && ( + + {" "} + (config) + + )} + + ))} + + + )} + {/* Input: eval case count */} {status === "bootstrapEvalCount" && ( @@ -1021,6 +1149,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX + {repoAreas.length > 0 && } ) : status === "generate-app-pick" ? ( @@ -1045,6 +1174,13 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX + ) : status === "generate-area-pick" ? ( + + + + + + ) : status === "eval-pick" ? ( From d6a89aa8e647026c477d424d41676703647d2af8 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 12:03:58 -0800 Subject: [PATCH 33/84] docs: document per-area readiness and file-based area instructions --- README.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bf604fa..3d9e959 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ npx github:pierceboggan/primer readiness --visual ## Features -- **AI Readiness Reports** — Score repos across 9 pillars with a maturity model (Functional → Autonomous), including an AI tooling pillar that checks for MCP, custom agents, Copilot skills, and custom instructions +- **AI Readiness Reports** — Score repos across 9 pillars with a maturity model (Functional → Autonomous), including an AI tooling pillar that checks for MCP, custom agents, Copilot skills, and custom instructions. Supports per-area breakdowns for monorepos and multi-domain projects - **Visual Reports** — GitHub-themed HTML reports with light/dark toggle, expandable pillar details, and maturity model descriptions -- **Instruction Generation** — Generate `copilot-instructions.md` or `AGENTS.md` using the Copilot SDK, with per-app support for monorepos +- **Instruction Generation** — Generate `copilot-instructions.md` or `AGENTS.md` using the Copilot SDK, with per-app support for monorepos. Generate file-based `.instructions.md` files for detected areas (frontend, backend, infra, etc.) - **Batch Processing** — Process multiple repos across GitHub or Azure DevOps organizations - **Evaluation Framework** — Measure how instructions improve AI responses with a judge model - **Interactive TUI** — Ink-based terminal UI with submenus, model picker, activity log, and animated banner @@ -89,6 +89,7 @@ Score a repo's AI readiness across 9 pillars: primer readiness # terminal summary primer readiness --visual # GitHub-themed HTML report primer readiness --json # machine-readable JSON +primer readiness --per-area # include per-area breakdown primer readiness /path/to/repo --output report.html ``` @@ -131,6 +132,17 @@ Standalone shortcut for instructions: primer instructions --repo /path/to/repo --model claude-sonnet-4.5 ``` +#### File-based area instructions + +Generate `.instructions.md` files scoped to detected areas (e.g., frontend, backend, infra). These use `applyTo` glob patterns so Copilot applies the right context per file: + +```bash +primer instructions --areas # root + all detected areas +primer instructions --areas-only # area files only (skip root) +primer instructions --area frontend # single area +primer instructions --areas --force # overwrite existing area files +``` + ### `primer eval` Measure how instructions improve AI responses: @@ -225,7 +237,7 @@ src/ ├── services/ # Core logic │ ├── analyzer.ts # Repo scanning (languages, frameworks, monorepos) │ ├── batch.ts # Shared batch processing (GitHub + Azure DevOps) -│ ├── readiness.ts # 9-pillar scoring engine +│ ├── readiness.ts # 9-pillar scoring engine (with per-area support) │ ├── visualReport.ts # HTML report generator │ ├── instructions.ts # Copilot SDK integration │ ├── evaluator.ts # Eval runner + trajectory viewer From 8cfcfb7be99baec95572e0369e6b38828b991bcb Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 12:12:52 -0800 Subject: [PATCH 34/84] style: fix prettier formatting in 10 files --- src/commands/instructions.ts | 14 ++++++-- src/commands/readiness.ts | 6 +++- src/services/__tests__/analyzer.test.ts | 39 ++++++++++++++++----- src/services/__tests__/readiness.test.ts | 25 ++++++++++--- src/services/__tests__/visualReport.test.ts | 7 +++- src/services/analyzer.ts | 20 ++++++----- src/services/instructions.ts | 14 ++++---- src/services/readiness.ts | 19 +++++----- src/services/visualReport.ts | 4 ++- src/ui/tui.tsx | 18 +++++++--- 10 files changed, 119 insertions(+), 47 deletions(-) diff --git a/src/commands/instructions.ts b/src/commands/instructions.ts index 8ce9fd6..f798260 100644 --- a/src/commands/instructions.ts +++ b/src/commands/instructions.ts @@ -1,7 +1,11 @@ import fs from "fs/promises"; import path from "path"; -import { generateCopilotInstructions, generateAreaInstructions, writeAreaInstruction } from "../services/instructions"; +import { + generateCopilotInstructions, + generateAreaInstructions, + writeAreaInstruction +} from "../services/instructions"; import { analyzeRepo } from "../services/analyzer"; import { ensureDir } from "../utils/fs"; import type { CommandResult } from "../utils/output"; @@ -109,7 +113,9 @@ export async function instructionsCommand(options: InstructionsOptions): Promise for (const area of targetAreas) { try { if (shouldLog(options)) { - progress.update(`Generating for "${area.name}" (${Array.isArray(area.applyTo) ? area.applyTo.join(", ") : area.applyTo})...`); + progress.update( + `Generating for "${area.name}" (${Array.isArray(area.applyTo) ? area.applyTo.join(", ") : area.applyTo})...` + ); } const body = await generateAreaInstructions({ repoPath, @@ -137,7 +143,9 @@ export async function instructionsCommand(options: InstructionsOptions): Promise } } catch (error) { if (shouldLog(options)) { - progress.update(`Failed for "${area.name}": ${error instanceof Error ? error.message : String(error)}`); + progress.update( + `Failed for "${area.name}": ${error instanceof Error ? error.message : String(error)}` + ); } } } diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts index 65a36a1..65dc593 100644 --- a/src/commands/readiness.ts +++ b/src/commands/readiness.ts @@ -3,7 +3,11 @@ import path from "path"; import chalk from "chalk"; -import type { ReadinessReport, ReadinessCriterionResult, AreaReadinessReport } from "../services/readiness"; +import type { + ReadinessReport, + ReadinessCriterionResult, + AreaReadinessReport +} from "../services/readiness"; import { runReadinessReport } from "../services/readiness"; import { generateVisualReport } from "../services/visualReport"; import type { CommandResult } from "../utils/output"; diff --git a/src/services/__tests__/analyzer.test.ts b/src/services/__tests__/analyzer.test.ts index aa56dd4..9c4f0ec 100644 --- a/src/services/__tests__/analyzer.test.ts +++ b/src/services/__tests__/analyzer.test.ts @@ -385,9 +385,7 @@ describe("analyzeRepo", () => { expect(frontendArea?.applyTo).toBe("src/frontend/**"); expect(frontendArea?.description).toBe("UI layer"); // Should not have duplicate "frontend" (auto) + "Frontend" (config) - const frontendAreas = (result.areas ?? []).filter( - (a) => a.name.toLowerCase() === "frontend" - ); + const frontendAreas = (result.areas ?? []).filter((a) => a.name.toLowerCase() === "frontend"); expect(frontendAreas.length).toBe(1); }); @@ -616,13 +614,23 @@ describe("buildAreaFrontmatter", () => { }); it("includes description when provided", () => { - const area: Area = { name: "ui", applyTo: "ui/**", description: "React components", source: "config" }; + const area: Area = { + name: "ui", + applyTo: "ui/**", + description: "React components", + source: "config" + }; const fm = buildAreaFrontmatter(area); expect(fm).toContain("Use when working on ui. React components"); }); it("escapes quotes in description", () => { - const area: Area = { name: "api", applyTo: "api/**", description: 'uses "REST" style', source: "config" }; + const area: Area = { + name: "api", + applyTo: "api/**", + description: 'uses "REST" style', + source: "config" + }; const fm = buildAreaFrontmatter(area); expect(fm).toContain('uses \\"REST\\" style'); expect(fm).not.toMatch(/[^\\]"REST"/u); @@ -635,20 +643,35 @@ describe("buildAreaFrontmatter", () => { }); it("escapes backslashes in description", () => { - const area: Area = { name: "api", applyTo: "api/**", description: "path is C:\\Users", source: "config" }; + const area: Area = { + name: "api", + applyTo: "api/**", + description: "path is C:\\Users", + source: "config" + }; const fm = buildAreaFrontmatter(area); expect(fm).toContain("C:\\\\Users"); }); it("escapes newlines and tabs in description", () => { - const area: Area = { name: "api", applyTo: "api/**", description: "line1\nline2\ttab", source: "config" }; + const area: Area = { + name: "api", + applyTo: "api/**", + description: "line1\nline2\ttab", + source: "config" + }; const fm = buildAreaFrontmatter(area); expect(fm).toContain("line1\\nline2\\ttab"); expect(fm).not.toContain("\n" + "line2"); }); it("strips null bytes from description", () => { - const area: Area = { name: "api", applyTo: "api/**", description: "clean\0value", source: "config" }; + const area: Area = { + name: "api", + applyTo: "api/**", + description: "clean\0value", + source: "config" + }; const fm = buildAreaFrontmatter(area); expect(fm).toContain("cleanvalue"); expect(fm).not.toContain("\0"); diff --git a/src/services/__tests__/readiness.test.ts b/src/services/__tests__/readiness.test.ts index f04e85a..8fd5333 100644 --- a/src/services/__tests__/readiness.test.ts +++ b/src/services/__tests__/readiness.test.ts @@ -253,7 +253,10 @@ describe("runReadinessReport", () => { // Create a heuristic area directory await writeFile("frontend/index.ts", "export {};"); // Create a file-based instruction - await writeFile(".github/instructions/frontend.instructions.md", "---\napplyTo: frontend/**\n---\n# Frontend"); + await writeFile( + ".github/instructions/frontend.instructions.md", + "---\napplyTo: frontend/**\n---\n# Frontend" + ); const report = await runReadinessReport({ repoPath }); const criterion = report.criteria.find((c) => c.id === "custom-instructions"); @@ -398,7 +401,10 @@ describe("runReadinessReport", () => { await writePackageJson({ name: "test-repo" }); // Create two heuristic areas with meaningful content await writeFile("frontend/index.ts", "export {};"); - await writeFile("backend/package.json", JSON.stringify({ name: "backend", scripts: { build: "tsc", test: "vitest" } })); + await writeFile( + "backend/package.json", + JSON.stringify({ name: "backend", scripts: { build: "tsc", test: "vitest" } }) + ); const report = await runReadinessReport({ repoPath, perArea: true }); @@ -451,7 +457,10 @@ describe("runReadinessReport", () => { it("passes area-build-script when area has build script", async () => { await writePackageJson({ name: "test-repo" }); - await writeFile("backend/package.json", JSON.stringify({ name: "backend", scripts: { build: "tsc" } })); + await writeFile( + "backend/package.json", + JSON.stringify({ name: "backend", scripts: { build: "tsc" } }) + ); const report = await runReadinessReport({ repoPath, perArea: true }); @@ -473,7 +482,10 @@ describe("runReadinessReport", () => { it("passes area-test-script when area has test script", async () => { await writePackageJson({ name: "test-repo" }); - await writeFile("backend/package.json", JSON.stringify({ name: "backend", scripts: { test: "vitest" } })); + await writeFile( + "backend/package.json", + JSON.stringify({ name: "backend", scripts: { test: "vitest" } }) + ); const report = await runReadinessReport({ repoPath, perArea: true }); @@ -485,7 +497,10 @@ describe("runReadinessReport", () => { it("passes area-instructions when matching instruction file exists", async () => { await writePackageJson({ name: "test-repo" }); await writeFile("frontend/index.ts", "export {};"); - await writeFile(".github/instructions/frontend.instructions.md", "---\napplyTo: frontend/**\n---\n# Frontend"); + await writeFile( + ".github/instructions/frontend.instructions.md", + "---\napplyTo: frontend/**\n---\n# Frontend" + ); const report = await runReadinessReport({ repoPath, perArea: true }); diff --git a/src/services/__tests__/visualReport.test.ts b/src/services/__tests__/visualReport.test.ts index 54ceb31..6637704 100644 --- a/src/services/__tests__/visualReport.test.ts +++ b/src/services/__tests__/visualReport.test.ts @@ -271,7 +271,12 @@ describe("generateVisualReport", () => { pillars: [] }, { - area: { name: "backend", applyTo: "backend/**", source: "config", description: "API layer" }, + area: { + name: "backend", + applyTo: "backend/**", + source: "config", + description: "API layer" + }, criteria: [ { id: "area-readme", diff --git a/src/services/analyzer.ts b/src/services/analyzer.ts index 3d24a0f..e051acb 100644 --- a/src/services/analyzer.ts +++ b/src/services/analyzer.ts @@ -634,9 +634,10 @@ async function detectAreas(repoPath: string, analysis: RepoAnalysis): Promise).name === "string" && - ((entry as Record).applyTo !== undefined) + (entry as Record).applyTo !== undefined ) { const e = entry as Record; if (!(e.name as string).trim()) continue; @@ -720,15 +721,16 @@ export async function loadPrimerConfig(repoPath: string): Promise typeof v === "string") - ) { + } else if (Array.isArray(rawApplyTo) && rawApplyTo.every((v) => typeof v === "string")) { applyTo = rawApplyTo as string[]; } else { continue; } - if ((typeof applyTo === "string" && !applyTo.trim()) || (Array.isArray(applyTo) && applyTo.length === 0)) continue; + if ( + (typeof applyTo === "string" && !applyTo.trim()) || + (Array.isArray(applyTo) && applyTo.length === 0) + ) + continue; // Reject patterns with path traversal segments const allPatterns = Array.isArray(applyTo) ? applyTo : [applyTo]; if (allPatterns.some((p) => p.split("/").includes(".."))) continue; diff --git a/src/services/instructions.ts b/src/services/instructions.ts index 3e0d829..6a4310f 100644 --- a/src/services/instructions.ts +++ b/src/services/instructions.ts @@ -149,10 +149,7 @@ export async function generateAreaInstructions( progress(`${area.name}: using tool ${toolName ?? "..."}`); } else if (e.type === "session.error") { const errorMsg = (e.data?.message as string) ?? "Unknown error"; - if ( - errorMsg.toLowerCase().includes("auth") || - errorMsg.toLowerCase().includes("login") - ) { + if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { throw new Error( "Copilot CLI not logged in. Run `copilot` then `/login` to authenticate." ); @@ -225,7 +222,12 @@ export function buildAreaInstructionContent(area: Area, body: string): string { } export function areaInstructionPath(repoPath: string, area: Area): string { - return path.join(repoPath, ".github", "instructions", `${sanitizeAreaName(area.name)}.instructions.md`); + return path.join( + repoPath, + ".github", + "instructions", + `${sanitizeAreaName(area.name)}.instructions.md` + ); } export type WriteAreaResult = { status: "written" | "skipped" | "empty"; filePath: string }; @@ -238,7 +240,7 @@ export async function writeAreaInstruction( ): Promise { const filePath = areaInstructionPath(repoPath, area); if (!body.trim()) return { status: "empty", filePath }; - if (!force && await fileExists(filePath)) return { status: "skipped", filePath }; + if (!force && (await fileExists(filePath))) return { status: "skipped", filePath }; await ensureDir(path.dirname(filePath)); await fs.writeFile(filePath, buildAreaInstructionContent(area, body), "utf8"); return { status: "written", filePath }; diff --git a/src/services/readiness.ts b/src/services/readiness.ts index 56eaf09..02ae8de 100644 --- a/src/services/readiness.ts +++ b/src/services/readiness.ts @@ -257,16 +257,17 @@ export async function runReadinessReport(options: ReadinessOptions): Promise - ar.criteria.find((c) => c.id === criterion.id) - ).filter(Boolean) as ReadinessCriterionResult[]; + const perAreaResults = areaReports + .map((ar) => ar.criteria.find((c) => c.id === criterion.id)) + .filter(Boolean) as ReadinessCriterionResult[]; if (!perAreaResults.length) continue; const passed = perAreaResults.filter((r) => r.status === "pass").length; const total = perAreaResults.length; const passRate = total ? passed / total : 0; criterion.status = passRate >= 0.8 ? "pass" : "fail"; - criterion.reason = criterion.status === "pass" ? undefined : `Only ${passed}/${total} areas pass this check.`; + criterion.reason = + criterion.status === "pass" ? undefined : `Only ${passed}/${total} areas pass this check.`; criterion.passRate = passRate; criterion.areaSummary = { passed, total }; criterion.areaFailures = areaReports @@ -587,10 +588,7 @@ function buildCriteria(): ReadinessCriterion[] { return { status: "pass", reason: `Root instructions found, but no file-based instructions for ${areas.length} detected areas. Run \`primer instructions --areas\` to generate.`, - evidence: [ - ...rootFound, - ...areas.map((a) => `${a.name}: missing .instructions.md`) - ] + evidence: [...rootFound, ...areas.map((a) => `${a.name}: missing .instructions.md`)] }; } return { @@ -773,7 +771,10 @@ function buildCriteria(): ReadinessCriterion[] { } const sanitized = sanitizeAreaName(area.name); const instructionPath = path.join( - context.repoPath, ".github", "instructions", `${sanitized}.instructions.md` + context.repoPath, + ".github", + "instructions", + `${sanitized}.instructions.md` ); const found = await fileExists(instructionPath); return { diff --git a/src/services/visualReport.ts b/src/services/visualReport.ts index 612d5c2..7c987ba 100644 --- a/src/services/visualReport.ts +++ b/src/services/visualReport.ts @@ -874,7 +874,9 @@ function buildAreaReportsHtml(areaReports?: AreaReadinessReport[]): string { const total = relevant.length; const pct = total ? Math.round((passed / total) * 100) : 0; const sourceLabel = ar.area.source === "config" ? "config" : "auto"; - const applyTo = Array.isArray(ar.area.applyTo) ? ar.area.applyTo.join(", ") : ar.area.applyTo; + const applyTo = Array.isArray(ar.area.applyTo) + ? ar.area.applyTo.join(", ") + : ar.area.applyTo; return `
    diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 6a5c282..904fbb6 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -163,7 +163,10 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const repoLabel = useMemo(() => path.basename(repoPath), [repoPath]); const repoFull = useMemo(() => repoPath, [repoPath]); const isLoading = - status === "generating" || status === "bootstrapping" || status === "evaluating" || status === "generating-areas"; + status === "generating" || + status === "bootstrapping" || + status === "evaluating" || + status === "generating-areas"; const isMenu = status === "model-pick" || status === "eval-pick" || @@ -559,7 +562,10 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX if (input.toLowerCase() === "a") { // All areas setStatus("generating-areas"); - addLog(`Generating file-based instructions for ${repoAreas.length} areas...`, "progress"); + addLog( + `Generating file-based instructions for ${repoAreas.length} areas...`, + "progress" + ); let written = 0; for (const [i, area] of repoAreas.entries()) { setMessage(`Generating for "${area.name}" (${i + 1}/${repoAreas.length})...`); @@ -582,7 +588,9 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX } } setStatus("done"); - setMessage(`Generated file-based instructions for ${written}/${repoAreas.length} areas.`); + setMessage( + `Generated file-based instructions for ${written}/${repoAreas.length} areas.` + ); return; } if (key.upArrow) { @@ -1044,7 +1052,9 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {i === areaCursor ? "▶" : " "} - {area.name} + + {area.name} + {" "} {Array.isArray(area.applyTo) ? area.applyTo.join(", ") : area.applyTo} From da0de0fd90ce34dd70dc1cf70a1267c3b3d0c7f0 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 12:15:15 -0800 Subject: [PATCH 35/84] chore: add husky + lint-staged pre-commit hook for prettier --- .husky/pre-commit | 1 + package-lock.json | 216 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 7 +- 3 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..2312dc5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/package-lock.json b/package-lock.json index 504496d..7b39573 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,8 @@ "eslint-plugin-n": "^17.10.2", "eslint-plugin-promise": "^7.1.0", "globals": "^17.3.0", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", "prettier": "^3.3.3", "tsup": "^8.5.1", "tsx": "^4.21.0", @@ -2830,6 +2832,13 @@ "dev": true, "license": "MIT" }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, "node_modules/commander": { "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", @@ -3788,6 +3797,13 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", @@ -4306,6 +4322,22 @@ "dev": true, "license": "MIT" }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", @@ -5021,6 +5053,49 @@ "dev": true, "license": "MIT" }, + "node_modules/lint-staged": { + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.2", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/load-tsconfig": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", @@ -5054,6 +5129,75 @@ "dev": true, "license": "MIT" }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -5133,6 +5277,19 @@ "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -5199,6 +5356,19 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -5501,6 +5671,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", @@ -5816,6 +5999,13 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rollup": { "version": "4.57.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", @@ -6231,6 +6421,16 @@ "node": ">= 0.4" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz", @@ -7303,6 +7503,22 @@ } } }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index ea742af..e2aa336 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "scripts": { "build": "tsup", "dev": "tsx src/index.ts", - "prepare": "test \"$CI\" = true || tsup", + "prepare": "test \"$CI\" = true || husky", "lint": "eslint .", "format": "prettier --write .", "format:check": "prettier --check .", @@ -36,6 +36,9 @@ "react": "^19.2.4", "simple-git": "^3.30.0" }, + "lint-staged": { + "*.{ts,tsx,js,json,md}": "prettier --write" + }, "devDependencies": { "@types/node": "^25.1.0", "@types/react": "^19.2.10", @@ -48,6 +51,8 @@ "eslint-plugin-n": "^17.10.2", "eslint-plugin-promise": "^7.1.0", "globals": "^17.3.0", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", "prettier": "^3.3.3", "tsup": "^8.5.1", "tsx": "^4.21.0", From 0baf939442ef6efb0b9dd5703b14df9d5ce31b29 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 13:38:53 -0800 Subject: [PATCH 36/84] fix: wire up progress reporting for eval --init --- src/commands/eval.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/commands/eval.ts b/src/commands/eval.ts index 659a529..fa1209b 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -6,7 +6,7 @@ import { listCopilotModels } from "../services/copilot"; import { generateEvalScaffold } from "../services/evalScaffold"; import { runEval } from "../services/evaluator"; import type { CommandResult } from "../utils/output"; -import { outputResult, outputError, shouldLog } from "../utils/output"; +import { outputResult, outputError, createProgressReporter, shouldLog } from "../utils/output"; type EvalOptions = { repo?: string; @@ -73,10 +73,12 @@ export async function evalCommand( // File doesn't exist, create it } try { + const progress = createProgressReporter(!shouldLog(options)); const scaffold = await generateEvalScaffold({ repoPath, count: desiredCount, - model: options.model + model: options.model, + onProgress: (msg) => progress.update(msg) }); await fs.writeFile(outputPath, JSON.stringify(scaffold, null, 2), "utf8"); From a5456ce89b1ec7490e1a274b147ba09674ba2674 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 13:40:54 -0800 Subject: [PATCH 37/84] fix: wire up progress reporting for eval run and generate instructions --- src/commands/eval.ts | 4 +++- src/commands/generate.ts | 12 ++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/commands/eval.ts b/src/commands/eval.ts index fa1209b..abd4cdb 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -107,12 +107,14 @@ export async function evalCommand( const configPath = path.resolve(configPathArg ?? path.join(repoPath, "primer.eval.json")); try { + const progress = createProgressReporter(!shouldLog(options)); const { summary, viewerPath } = await runEval({ configPath, repoPath, model: options.model ?? DEFAULT_MODEL, judgeModel: options.judgeModel ?? DEFAULT_JUDGE_MODEL, - outputPath: options.output + outputPath: options.output, + onProgress: (msg) => progress.update(msg) }); if (options.json) { diff --git a/src/commands/generate.ts b/src/commands/generate.ts index 8058d57..b845f2c 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -7,7 +7,13 @@ import { generateConfigs } from "../services/generator"; import { generateCopilotInstructions } from "../services/instructions"; import { ensureDir } from "../utils/fs"; import type { CommandResult } from "../utils/output"; -import { outputResult, outputError, deriveFileStatus, shouldLog } from "../utils/output"; +import { + outputResult, + outputError, + deriveFileStatus, + createProgressReporter, + shouldLog +} from "../utils/output"; type GenerateOptions = { force?: boolean; @@ -65,8 +71,10 @@ export async function generateCommand( process.stderr.write(`Generating ${type} for ${target.label}...\n`); } try { + const progress = createProgressReporter(!shouldLog(options)); const content = await generateCopilotInstructions({ - repoPath: target.repoPath + repoPath: target.repoPath, + onProgress: (msg) => progress.update(msg) }); if (!content.trim()) { if (shouldLog(options)) { From 503b870c79dd81d5bb95a86d66a534747eeaf06b Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 13:49:14 -0800 Subject: [PATCH 38/84] fix: audit command-service wiring gaps - readiness: use process.stderr instead of console.log in printAreaBreakdown (fixes --json corruption) - generate: add --model option and pass through to generateCopilotInstructions - batchReadiness: fix hardcoded false in outputError, add json/quiet to type - tui: add json/quiet to TuiOptions type for withGlobalOpts compatibility - batch: add --model/--branch CLI options and forward to headless service runners - batch service: accept and forward model/branch options in runBatchHeadlessGitHub/Azure --- src/cli.ts | 3 +++ src/commands/batch.tsx | 12 ++++++++++-- src/commands/batchReadiness.tsx | 4 +++- src/commands/generate.ts | 2 ++ src/commands/readiness.ts | 7 ++++--- src/commands/tui.tsx | 2 ++ src/services/batch.ts | 22 ++++++++++++++++++---- 7 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 0ef3afd..d989d46 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -60,6 +60,7 @@ export function runCli(argv: string[]): void { .argument("[path]", "Path to a local repository") .option("--force", "Overwrite existing files") .option("--per-app", "Generate per-app in monorepos") + .option("--model ", "Model for instructions generation", DEFAULT_MODEL) .action(withGlobalOpts(generateCommand)); program @@ -112,6 +113,8 @@ export function runCli(argv: string[]): void { .argument("[repos...]", "Repos in owner/name form (GitHub) or org/project/repo (Azure)") .option("--output ", "Write results JSON to file") .option("--provider ", "Repo provider (github|azure)", "github") + .option("--model ", "Model for instructions generation", DEFAULT_MODEL) + .option("--branch ", "Branch name for PRs") .action(withGlobalOpts(batchCommand)); program diff --git a/src/commands/batch.tsx b/src/commands/batch.tsx index 15b275a..fea36c3 100644 --- a/src/commands/batch.tsx +++ b/src/commands/batch.tsx @@ -19,6 +19,8 @@ import { GITHUB_REPO_RE, AZURE_REPO_RE } from "../utils/repo"; type BatchOptions = { output?: string; provider?: string; + model?: string; + branch?: string; json?: boolean; quiet?: boolean; }; @@ -127,7 +129,10 @@ async function runHeadless( } } - const results = await runBatchHeadlessAzure(repos, token, progress); + const results = await runBatchHeadlessAzure(repos, token, progress, { + model: options.model, + branch: options.branch + }); await emitResults(results, options); return; } @@ -163,7 +168,10 @@ async function runHeadless( } } - const results = await runBatchHeadlessGitHub(repos, token, progress); + const results = await runBatchHeadlessGitHub(repos, token, progress, { + model: options.model, + branch: options.branch + }); await emitResults(results, options); } diff --git a/src/commands/batchReadiness.tsx b/src/commands/batchReadiness.tsx index 5690f1d..29ad209 100644 --- a/src/commands/batchReadiness.tsx +++ b/src/commands/batchReadiness.tsx @@ -7,6 +7,8 @@ import { BatchReadinessTui } from "../ui/BatchReadinessTui"; type BatchReadinessOptions = { output?: string; + json?: boolean; + quiet?: boolean; }; export async function batchReadinessCommand(options: BatchReadinessOptions): Promise { @@ -14,7 +16,7 @@ export async function batchReadinessCommand(options: BatchReadinessOptions): Pro if (!token) { outputError( "GitHub authentication required. Install and authenticate GitHub CLI (gh auth login) or set GITHUB_TOKEN.", - false + Boolean(options.json) ); return; } diff --git a/src/commands/generate.ts b/src/commands/generate.ts index b845f2c..d00e15e 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -18,6 +18,7 @@ import { type GenerateOptions = { force?: boolean; perApp?: boolean; + model?: string; json?: boolean; quiet?: boolean; }; @@ -74,6 +75,7 @@ export async function generateCommand( const progress = createProgressReporter(!shouldLog(options)); const content = await generateCopilotInstructions({ repoPath: target.repoPath, + model: options.model, onProgress: (msg) => progress.update(msg) }); if (!content.trim()) { diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts index 65dc593..52a32bc 100644 --- a/src/commands/readiness.ts +++ b/src/commands/readiness.ts @@ -181,7 +181,8 @@ function levelName(level: number): string { } function printAreaBreakdown(areaReports: AreaReadinessReport[]): void { - console.log(chalk.bold("\nPer-area breakdown")); + const log = (msg: string) => process.stderr.write(msg + "\n"); + log(chalk.bold("\nPer-area breakdown")); for (const ar of areaReports) { // Sum across all pillar summaries for this area const passed = ar.pillars.reduce((sum, p) => sum + p.passed, 0); @@ -189,11 +190,11 @@ function printAreaBreakdown(areaReports: AreaReadinessReport[]): void { const pct = total ? Math.round((passed / total) * 100) : 0; const icon = total > 0 && passed / total >= 0.8 ? chalk.green("●") : chalk.yellow("●"); const source = ar.area.source === "config" ? chalk.dim(" (config)") : ""; - console.log(`${icon} ${ar.area.name}${source}: ${passed}/${total} (${pct}%)`); + log(`${icon} ${ar.area.name}${source}: ${passed}/${total} (${pct}%)`); const failures = ar.criteria.filter((c) => c.status === "fail"); for (const f of failures) { - console.log(` ${chalk.red("✖")} ${f.title}${f.reason ? ` — ${chalk.dim(f.reason)}` : ""}`); + log(` ${chalk.red("✖")} ${f.title}${f.reason ? ` — ${chalk.dim(f.reason)}` : ""}`); } } } diff --git a/src/commands/tui.tsx b/src/commands/tui.tsx index 4a2704d..9f517e2 100644 --- a/src/commands/tui.tsx +++ b/src/commands/tui.tsx @@ -8,6 +8,8 @@ import { PrimerTui } from "../ui/tui"; type TuiOptions = { repo?: string; animation?: boolean; + json?: boolean; + quiet?: boolean; }; export async function tuiCommand(options: TuiOptions): Promise { diff --git a/src/services/batch.ts b/src/services/batch.ts index 55e5716..5b51180 100644 --- a/src/services/batch.ts +++ b/src/services/batch.ts @@ -220,12 +220,19 @@ export async function processAzureRepo(options: ProcessAzureRepoOptions): Promis export async function runBatchHeadlessGitHub( repos: GitHubRepo[], token: string, - progress?: ProgressReporter + progress?: ProgressReporter, + options?: { model?: string; branch?: string } ): Promise { const results: ProcessResult[] = []; for (let i = 0; i < repos.length; i++) { progress?.update(`[${i + 1}/${repos.length}] Processing ${repos[i].fullName}...`); - const result = await processGitHubRepo({ repo: repos[i], token, progress }); + const result = await processGitHubRepo({ + repo: repos[i], + token, + progress, + model: options?.model, + branch: options?.branch + }); results.push(result); } progress?.done(); @@ -235,13 +242,20 @@ export async function runBatchHeadlessGitHub( export async function runBatchHeadlessAzure( repos: AzureDevOpsRepo[], token: string, - progress?: ProgressReporter + progress?: ProgressReporter, + options?: { model?: string; branch?: string } ): Promise { const results: ProcessResult[] = []; for (let i = 0; i < repos.length; i++) { const label = `${repos[i].organization}/${repos[i].project}/${repos[i].name}`; progress?.update(`[${i + 1}/${repos.length}] Processing ${label}...`); - const result = await processAzureRepo({ repo: repos[i], token, progress }); + const result = await processAzureRepo({ + repo: repos[i], + token, + progress, + model: options?.model, + branch: options?.branch + }); results.push(result); } progress?.done(); From 7c93a5369711cdf3ef17807f644d27bd296a60a8 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 13:56:34 -0800 Subject: [PATCH 39/84] fix: wire --model to init/pr commands, add try/catch for generateConfigs --- .github/copilot-instructions.md | 1 + src/cli.ts | 2 ++ src/commands/generate.ts | 21 +++++++++++++++------ src/commands/init.ts | 24 +++++++++++++++++------- src/commands/pr.ts | 4 ++-- 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 57743fb..b5a0c00 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -10,6 +10,7 @@ - Place new CLI commands in src/commands/, core logic in src/services/, and TUI in src/ui/. - Do not add new build/lint/test tools unless necessary; use existing npm scripts. - Ensure Windows/macOS/Linux compatibility +- All CLI commands should support --json and --quiet for scripting, and break ## Overview diff --git a/src/cli.ts b/src/cli.ts index d989d46..3d5b41e 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -47,6 +47,7 @@ export function runCli(argv: string[]): void { .option("--provider ", "Repo provider (github|azure)") .option("--yes", "Accept defaults (generates instructions, MCP, and VS Code configs)") .option("--force", "Overwrite existing files") + .option("--model ", "Model for instructions generation", DEFAULT_MODEL) .action(withGlobalOpts(initCommand)); program @@ -68,6 +69,7 @@ export function runCli(argv: string[]): void { .argument("[repo]", "Repo identifier (github: owner/name, azure: org/project/repo)") .option("--branch ", "Branch name") .option("--provider ", "Repo provider (github|azure)") + .option("--model ", "Model for instructions generation", DEFAULT_MODEL) .action(withGlobalOpts(prCommand)); program diff --git a/src/commands/generate.ts b/src/commands/generate.ts index d00e15e..eecafff 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -114,12 +114,21 @@ export async function generateCommand( } const selections = [type]; - const genResult = await generateConfigs({ - repoPath, - analysis, - selections, - force: Boolean(options.force) - }); + let genResult; + try { + genResult = await generateConfigs({ + repoPath, + analysis, + selections, + force: Boolean(options.force) + }); + } catch (error) { + outputError( + `Failed to generate configs: ${error instanceof Error ? error.message : String(error)}`, + Boolean(options.json) + ); + return; + } if (options.json) { const { ok, status } = deriveFileStatus(genResult.files); diff --git a/src/commands/init.ts b/src/commands/init.ts index 6e598b7..45e1234 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -26,6 +26,7 @@ type InitOptions = { provider?: string; yes?: boolean; force?: boolean; + model?: string; json?: boolean; quiet?: boolean; }; @@ -189,7 +190,7 @@ export async function initCommand( const outputPath = path.join(repoPath, ".github", "copilot-instructions.md"); await ensureDir(path.dirname(outputPath)); try { - const content = await generateCopilotInstructions({ repoPath }); + const content = await generateCopilotInstructions({ repoPath, model: options.model }); const { wrote } = await safeWriteFile(outputPath, content, Boolean(options.force)); allFiles.push({ path: path.relative(process.cwd(), outputPath), @@ -208,12 +209,21 @@ export async function initCommand( } } - const genResult = await generateConfigs({ - repoPath, - analysis, - selections: selections.filter((item) => item !== "instructions"), - force: Boolean(options.force) - }); + let genResult; + try { + genResult = await generateConfigs({ + repoPath, + analysis, + selections: selections.filter((item) => item !== "instructions"), + force: Boolean(options.force) + }); + } catch (error) { + outputError( + `Failed to generate configs: ${error instanceof Error ? error.message : String(error)}`, + Boolean(options.json) + ); + return; + } allFiles.push(...genResult.files); if (options.json) { diff --git a/src/commands/pr.ts b/src/commands/pr.ts index 1b72038..ac48961 100644 --- a/src/commands/pr.ts +++ b/src/commands/pr.ts @@ -1,6 +1,5 @@ import path from "path"; -import { DEFAULT_MODEL } from "../config"; import { analyzeRepo } from "../services/analyzer"; import { createPullRequest as createAzurePullRequest, @@ -29,6 +28,7 @@ import { GITHUB_REPO_RE, AZURE_REPO_RE } from "../utils/repo"; type PrOptions = { branch?: string; provider?: string; + model?: string; json?: boolean; quiet?: boolean; }; @@ -86,7 +86,7 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P await checkoutBranch(repoPath, branch); progress.update("Generating instructions..."); - const instructions = await generateCopilotInstructions({ repoPath, model: DEFAULT_MODEL }); + const instructions = await generateCopilotInstructions({ repoPath, model: options.model }); const instructionsPath = path.join(repoPath, ".github", "copilot-instructions.md"); await ensureDir(path.dirname(instructionsPath)); const { wrote } = await safeWriteFile(instructionsPath, instructions, true); From bb1e19dd01ed3b7bc12261bfe5a19cf9f8c165ef Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 14:03:21 -0800 Subject: [PATCH 40/84] fix: guard Ink render() calls with try/catch, improve area filter type safety --- .github/copilot-instructions.md | 2 +- src/commands/batch.tsx | 22 ++++++++++++++++++---- src/commands/batchReadiness.tsx | 14 +++++++++++--- src/commands/instructions.ts | 5 +++-- src/commands/tui.tsx | 11 +++++++++-- 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index b5a0c00..02381f4 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -8,9 +8,9 @@ - Only overwrite config files (e.g., .vscode/settings.json, .vscode/mcp.json) with --force. - All Copilot/VS Code settings reference this file and enable MCP. - Place new CLI commands in src/commands/, core logic in src/services/, and TUI in src/ui/. +- All CLI commands MUST support --json, --quiet and arguments for automation-friendly output. - Do not add new build/lint/test tools unless necessary; use existing npm scripts. - Ensure Windows/macOS/Linux compatibility -- All CLI commands should support --json and --quiet for scripting, and break ## Overview diff --git a/src/commands/batch.tsx b/src/commands/batch.tsx index fea36c3..a8fe593 100644 --- a/src/commands/batch.tsx +++ b/src/commands/batch.tsx @@ -68,8 +68,15 @@ export async function batchCommand(repos: string[], options: BatchOptions): Prom return; } - const { waitUntilExit } = render(); - await waitUntilExit(); + try { + const { waitUntilExit } = render(); + await waitUntilExit(); + } catch (error) { + outputError( + `TUI failed: ${error instanceof Error ? error.message : String(error)}`, + Boolean(options.json) + ); + } return; } @@ -82,8 +89,15 @@ export async function batchCommand(repos: string[], options: BatchOptions): Prom return; } - const { waitUntilExit } = render(); - await waitUntilExit(); + try { + const { waitUntilExit } = render(); + await waitUntilExit(); + } catch (error) { + outputError( + `TUI failed: ${error instanceof Error ? error.message : String(error)}`, + Boolean(options.json) + ); + } } // ── Headless implementation ── diff --git a/src/commands/batchReadiness.tsx b/src/commands/batchReadiness.tsx index 29ad209..fc1f4df 100644 --- a/src/commands/batchReadiness.tsx +++ b/src/commands/batchReadiness.tsx @@ -21,7 +21,15 @@ export async function batchReadinessCommand(options: BatchReadinessOptions): Pro return; } - const { waitUntilExit } = render(); - - await waitUntilExit(); + try { + const { waitUntilExit } = render( + + ); + await waitUntilExit(); + } catch (error) { + outputError( + `TUI failed: ${error instanceof Error ? error.message : String(error)}`, + Boolean(options.json) + ); + } } diff --git a/src/commands/instructions.ts b/src/commands/instructions.ts index f798260..c54c3a7 100644 --- a/src/commands/instructions.ts +++ b/src/commands/instructions.ts @@ -94,8 +94,9 @@ export async function instructionsCommand(options: InstructionsOptions): Promise return; } - const targetAreas = options.area - ? areas.filter((a) => a.name.toLowerCase() === options.area!.toLowerCase()) + const areaFilter = options.area?.toLowerCase(); + const targetAreas = areaFilter + ? areas.filter((a) => a.name.toLowerCase() === areaFilter) : areas; if (options.area && targetAreas.length === 0) { diff --git a/src/commands/tui.tsx b/src/commands/tui.tsx index 9f517e2..df451cd 100644 --- a/src/commands/tui.tsx +++ b/src/commands/tui.tsx @@ -3,6 +3,7 @@ import path from "path"; import { render } from "ink"; import React from "react"; +import { outputError } from "../utils/output"; import { PrimerTui } from "../ui/tui"; type TuiOptions = { @@ -15,6 +16,12 @@ type TuiOptions = { export async function tuiCommand(options: TuiOptions): Promise { const repoPath = path.resolve(options.repo ?? process.cwd()); const skipAnimation = options.animation === false; - const { waitUntilExit } = render(); - await waitUntilExit(); + try { + const { waitUntilExit } = render( + + ); + await waitUntilExit(); + } catch (error) { + outputError(`TUI failed: ${error instanceof Error ? error.message : String(error)}`, false); + } } From b061e024f7614b29aae5fb014057e9c8d47ca3b6 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 14:07:29 -0800 Subject: [PATCH 41/84] fix: replace console.log with process.stderr.write in prettyPrintSummary --- .github/copilot-instructions.md | 2 +- src/utils/logger.ts | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 02381f4..b5af7b8 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -10,7 +10,7 @@ - Place new CLI commands in src/commands/, core logic in src/services/, and TUI in src/ui/. - All CLI commands MUST support --json, --quiet and arguments for automation-friendly output. - Do not add new build/lint/test tools unless necessary; use existing npm scripts. -- Ensure Windows/macOS/Linux compatibility +- Windows/macOS/Linux compatibility is required; consider path handling and shell commands carefully. ## Overview diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 01225f0..3bc7357 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -3,10 +3,11 @@ import chalk from "chalk"; import type { RepoAnalysis } from "../services/analyzer"; export function prettyPrintSummary(analysis: RepoAnalysis): void { - console.log(chalk.bold("Repository analysis")); - console.log(`- Path: ${analysis.path}`); - console.log(`- Git: ${analysis.isGitRepo ? "yes" : "no"}`); - console.log(`- Languages: ${analysis.languages.join(", ") || "unknown"}`); - console.log(`- Frameworks: ${analysis.frameworks.join(", ") || "none"}`); - console.log(`- Package manager: ${analysis.packageManager ?? "unknown"}`); + const log = (msg: string) => process.stderr.write(msg + "\n"); + log(chalk.bold("Repository analysis")); + log(`- Path: ${analysis.path}`); + log(`- Git: ${analysis.isGitRepo ? "yes" : "no"}`); + log(`- Languages: ${analysis.languages.join(", ") || "unknown"}`); + log(`- Frameworks: ${analysis.frameworks.join(", ") || "none"}`); + log(`- Package manager: ${analysis.packageManager ?? "unknown"}`); } From f1592e40ebd6793504d86c4383547b153cdcf8d0 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 14:57:54 -0800 Subject: [PATCH 42/84] feat: add Windows Copilot CLI support with cliArgs and .bat/.cmd handling --- src/services/copilot.ts | 128 +++++++++++++++++++++++------------ src/services/evalScaffold.ts | 4 +- src/services/evaluator.ts | 4 +- src/services/instructions.ts | 10 ++- 4 files changed, 91 insertions(+), 55 deletions(-) diff --git a/src/services/copilot.ts b/src/services/copilot.ts index 3ec951e..2816803 100644 --- a/src/services/copilot.ts +++ b/src/services/copilot.ts @@ -7,48 +7,95 @@ import fg from "fast-glob"; const execFileAsync = promisify(execFile); -let cachedCliPath: string | null = null; -let cachedCliPathTimestamp = 0; +export type CopilotCliConfig = { + cliPath: string; + cliArgs?: string[]; +}; + +let cachedCliConfig: CopilotCliConfig | null = null; +let cachedCliConfigTimestamp = 0; const CLI_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes -export async function assertCopilotCliReady(): Promise { - const cliPath = await findCopilotCliPath(); +function cacheConfig(config: CopilotCliConfig): CopilotCliConfig { + cachedCliConfig = config; + cachedCliConfigTimestamp = Date.now(); + return config; +} + +export async function assertCopilotCliReady(): Promise { + const config = await findCopilotCliConfig(); try { - await execFileAsync(cliPath, ["--version"], { timeout: 5000 }); + const [cmd, args] = buildExecArgs(config, ["--version"]); + await execFileAsync(cmd, args, { timeout: 5000 }); } catch { - throw new Error(`Copilot CLI at ${cliPath} is not working.`); + const desc = config.cliArgs ? `${config.cliPath} ${config.cliArgs.join(" ")}` : config.cliPath; + throw new Error(`Copilot CLI at ${desc} is not working.`); } - return cliPath; + return config; } export async function listCopilotModels(): Promise { - const cliPath = await assertCopilotCliReady(); - const { stdout } = await execFileAsync(cliPath, ["--help"], { timeout: 5000 }); + const config = await assertCopilotCliReady(); + const [cmd, args] = buildExecArgs(config, ["--help"]); + const { stdout } = await execFileAsync(cmd, args, { timeout: 5000 }); return extractModelChoices(stdout); } -async function findCopilotCliPath(): Promise { - if (cachedCliPath && Date.now() - cachedCliPathTimestamp < CLI_CACHE_TTL_MS) { - return cachedCliPath; +function buildExecArgs(config: CopilotCliConfig, extraArgs: string[]): [string, string[]] { + if (config.cliArgs && config.cliArgs.length > 0) { + return [config.cliPath, [...config.cliArgs, ...extraArgs]]; + } + if ( + process.platform === "win32" && + (config.cliPath.endsWith(".bat") || config.cliPath.endsWith(".cmd")) + ) { + return ["cmd", ["/c", config.cliPath, ...extraArgs]]; + } + return [config.cliPath, extraArgs]; +} + +async function findCopilotCliConfig(): Promise { + if (cachedCliConfig && Date.now() - cachedCliConfigTimestamp < CLI_CACHE_TTL_MS) { + return cachedCliConfig; + } + + const isWindows = process.platform === "win32"; + const home = process.env.HOME ?? process.env.USERPROFILE ?? ""; + const appData = process.env.APPDATA ?? ""; + + // On Windows, prefer npm-installed binary and use node + cliArgs approach. + // This bypasses .cmd/.bat wrapper issues that prevent direct spawning. + // See: https://github.com/microsoft/vscode/issues/291990 + if (isWindows && appData) { + const npmLoaderPath = path.join( + appData, + "npm", + "node_modules", + "@github", + "copilot", + "npm-loader.js" + ); + try { + await fs.access(npmLoaderPath); + return cacheConfig({ cliPath: process.execPath, cliArgs: [npmLoaderPath] }); + } catch { + // npm binary not found, will try PATH and VS Code locations + } } - // Try PATH lookup first (works on all platforms) - const whichCmd = process.platform === "win32" ? "where" : "which"; + const whichCmd = isWindows ? "where" : "which"; try { const { stdout } = await execFileAsync(whichCmd, ["copilot"], { timeout: 5000 }); const found = stdout.trim().split(/\r?\n/)[0]; if (found) { - cachedCliPath = found; - cachedCliPathTimestamp = Date.now(); - return found; + return cacheConfig({ cliPath: found }); } } catch { - // Ignore - will try VS Code locations + // Not on PATH, will try VS Code locations } - const home = process.env.HOME ?? process.env.USERPROFILE ?? ""; const staticLocations: string[] = []; if (process.platform === "darwin") { @@ -61,53 +108,44 @@ async function findCopilotCliPath(): Promise { `${home}/.config/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`, `${home}/.config/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot` ); - } else if (process.platform === "win32") { - const appData = process.env.APPDATA ?? ""; - if (appData) { - staticLocations.push( - `${appData}\\Code - Insiders\\User\\globalStorage\\github.copilot-chat\\copilotCli\\copilot.exe`, - `${appData}\\Code\\User\\globalStorage\\github.copilot-chat\\copilotCli\\copilot.exe` - ); - } + } else if (isWindows && appData) { + staticLocations.push( + `${appData}\\Code - Insiders\\User\\globalStorage\\github.copilot-chat\\copilotCli\\copilot.bat`, + `${appData}\\Code\\User\\globalStorage\\github.copilot-chat\\copilotCli\\copilot.bat` + ); } for (const location of staticLocations) { try { await fs.access(location); - cachedCliPath = location; - cachedCliPathTimestamp = Date.now(); - return location; + return cacheConfig({ cliPath: location }); } catch { - // Try next location + // Try next } } - const ext = process.platform === "win32" ? ".exe" : ""; + const exts = isWindows ? "{.exe,.bat,.cmd}" : ""; const normalizedHome = home.replace(/\\/g, "/"); const globPatterns = [ - `${normalizedHome}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot${ext}`, - `${normalizedHome}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot${ext}` + `${normalizedHome}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot${exts}`, + `${normalizedHome}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot${exts}` ]; for (const pattern of globPatterns) { const matches = await fg(pattern, { onlyFiles: true }); if (matches.length > 0) { - const normalized = path.normalize(matches[0]); - cachedCliPath = normalized; - cachedCliPathTimestamp = Date.now(); - return normalized; + return cacheConfig({ cliPath: path.normalize(matches[0]) }); } } - const platformHint = - process.platform === "win32" - ? " Searched APPDATA and VS Code extension paths." - : process.platform === "linux" - ? " Searched ~/.config/Code and VS Code extension paths." - : " Searched ~/Library/Application Support/Code and VS Code extension paths."; + const platformHint = isWindows + ? " Searched APPDATA and VS Code extension paths." + : process.platform === "linux" + ? " Searched ~/.config/Code and VS Code extension paths." + : " Searched ~/Library/Application Support/Code and VS Code extension paths."; throw new Error( - `Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code.${platformHint}` + `Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code or run: npm install -g @github/copilot.${platformHint}` ); } diff --git a/src/services/evalScaffold.ts b/src/services/evalScaffold.ts index 8da2e18..2890ba9 100644 --- a/src/services/evalScaffold.ts +++ b/src/services/evalScaffold.ts @@ -39,11 +39,11 @@ export async function generateEvalScaffold(options: EvalScaffoldOptions): Promis return withCwd(repoPath, async () => { progress("Checking Copilot CLI..."); - const cliPath = await assertCopilotCliReady(); + const cliConfig = await assertCopilotCliReady(); progress("Starting Copilot SDK..."); const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient({ cliPath }); + const client = new sdk.CopilotClient(cliConfig); try { progress("Creating session..."); diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index db3f195..5ba873d 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -96,9 +96,9 @@ export async function runEval( const runStartedAt = Date.now(); progress("Starting Copilot SDK..."); - const cliPath = await assertCopilotCliReady(); + const cliConfig = await assertCopilotCliReady(); const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient({ cliPath }); + const client = new sdk.CopilotClient(cliConfig); try { const results: EvalResult[] = []; diff --git a/src/services/instructions.ts b/src/services/instructions.ts index 6a4310f..7742ef9 100644 --- a/src/services/instructions.ts +++ b/src/services/instructions.ts @@ -24,13 +24,11 @@ export async function generateCopilotInstructions( return withCwd(repoPath, async () => { progress("Checking Copilot CLI..."); - const cliPath = await assertCopilotCliReady(); + const cliConfig = await assertCopilotCliReady(); progress("Starting Copilot SDK..."); const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient({ - cliPath - }); + const client = new sdk.CopilotClient(cliConfig); try { progress("Creating session..."); @@ -113,11 +111,11 @@ export async function generateAreaInstructions( return withCwd(repoPath, async () => { progress(`Checking Copilot CLI for area "${area.name}"...`); - const cliPath = await assertCopilotCliReady(); + const cliConfig = await assertCopilotCliReady(); progress(`Starting Copilot SDK for area "${area.name}"...`); const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient({ cliPath }); + const client = new sdk.CopilotClient(cliConfig); try { const applyToPatterns = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo]; From 08f893d893a34f13368868c083fd62433aae321a Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 15:33:04 -0800 Subject: [PATCH 43/84] Add GitHub Actions eval workflow with --fail-threshold and rich reporting --- .github/workflows/eval.yml | 190 +++++++++++++++++++++++++++++++++++++ src/cli.ts | 1 + src/commands/eval.ts | 16 +++- 3 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/eval.yml diff --git a/.github/workflows/eval.yml b/.github/workflows/eval.yml new file mode 100644 index 0000000..7b2b48f --- /dev/null +++ b/.github/workflows/eval.yml @@ -0,0 +1,190 @@ +name: Eval + +on: + workflow_dispatch: + inputs: + model: + description: "Model for responses (default: repo config)" + required: false + judge-model: + description: "Model for judging (default: repo config)" + required: false + fail-threshold: + description: "Fail if pass rate (%) is below this value" + required: false + default: "50" + push: + branches: [main] + paths: + - ".github/copilot-instructions.md" + - ".github/**/*.instructions.md" + - "primer.eval.json" + pull_request: + types: [opened, synchronize, reopened, labeled] + paths: + - ".github/copilot-instructions.md" + - ".github/**/*.instructions.md" + - "primer.eval.json" + +concurrency: + group: eval-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + pull-requests: write + +jobs: + eval: + name: Run Evals + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - run: npm ci + + - run: npm run build + + - name: Install Copilot CLI + run: npm install -g @github/copilot + env: + GH_TOKEN: ${{ secrets.COPILOT_TOKEN }} + + - name: Verify Copilot CLI + run: copilot --version + env: + GH_TOKEN: ${{ secrets.COPILOT_TOKEN }} + + - name: Run evals + id: eval + continue-on-error: true + run: | + mkdir -p .primer/evals + + ARGS="--json --output .primer/evals/results.json" + + if [ -n "${{ inputs.model }}" ]; then + ARGS="$ARGS --model ${{ inputs.model }}" + fi + if [ -n "${{ inputs.judge-model }}" ]; then + ARGS="$ARGS --judge-model ${{ inputs.judge-model }}" + fi + + THRESHOLD="${{ inputs.fail-threshold || '50' }}" + ARGS="$ARGS --fail-threshold $THRESHOLD" + + node dist/index.js eval $ARGS 2>&1 | tee .primer/evals/eval.log + env: + GH_TOKEN: ${{ secrets.COPILOT_TOKEN }} + + - name: Upload eval results + if: always() + uses: actions/upload-artifact@v4 + with: + name: eval-results + path: .primer/evals/ + if-no-files-found: warn + + - name: Report eval results + if: always() + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + + let summary = ''; + let isPR = context.eventName === 'pull_request'; + + try { + const raw = fs.readFileSync('.primer/evals/results.json', 'utf8'); + const data = JSON.parse(raw); + const results = data.results || []; + const total = results.length; + const passed = results.filter(r => r.verdict === 'pass').length; + const failed = results.filter(r => r.verdict === 'fail').length; + const unknown = results.filter(r => r.verdict === 'unknown').length; + const passRate = total > 0 ? Math.round((passed / total) * 100) : 0; + const duration = data.runMetrics?.durationMs + ? `${(data.runMetrics.durationMs / 1000).toFixed(1)}s` + : 'N/A'; + + const icon = passed === total ? '✅' : failed > 0 ? '❌' : '⚠️'; + summary += `## ${icon} Primer Eval: ${passed}/${total} pass (${passRate}%)\n\n`; + summary += `> **${duration}** · model \`${data.model}\` · judge \`${data.judgeModel}\`\n\n`; + + summary += `| Case | Verdict | Score | Rationale |\n`; + summary += `|------|---------|-------|-----------|\n`; + for (const r of results) { + const vIcon = r.verdict === 'pass' ? '✅' : r.verdict === 'fail' ? '❌' : '⚠️'; + const rationale = (r.rationale || '').replace(/\|/g, '\\|').replace(/\n/g, ' ').slice(0, 200); + summary += `| \`${r.id}\` | ${vIcon} ${r.verdict || 'unknown'} | ${r.score ?? '-'} | ${rationale} |\n`; + } + + // Per-case response details in collapsed sections + summary += '\n### Details\n\n'; + for (const r of results) { + const m = r.metrics || {}; + const wi = m.withInstructions || {}; + const wo = m.withoutInstructions || {}; + const fmtMs = ms => ms < 1000 ? `${ms}ms` : `${(ms/1000).toFixed(1)}s`; + const fmtTok = n => n >= 1000 ? `${(n/1000).toFixed(1)}k` : String(n || 0); + + summary += `
    ${r.id} · ${r.verdict === 'pass' ? '✅' : '❌'} ${r.score ?? 0}/100\n\n`; + summary += `**Prompt:** ${r.prompt}\n\n`; + summary += `**Expected:** ${r.expectation}\n\n`; + if (r.rationale) summary += `**Judge:** ${r.rationale}\n\n`; + + summary += `| Metric | Without instructions | With instructions |\n`; + summary += `|--------|---------------------|-------------------|\n`; + summary += `| Time | ${fmtMs(wo.durationMs || 0)} | ${fmtMs(wi.durationMs || 0)} |\n`; + summary += `| Tokens | ${fmtTok(wo.tokenUsage?.totalTokens)} | ${fmtTok(wi.tokenUsage?.totalTokens)} |\n`; + summary += `| Tool calls | ${wo.toolCalls?.count || 0} | ${wi.toolCalls?.count || 0} |\n`; + summary += `\n
    \n\n`; + } + } catch (err) { + summary += `## ⚠️ Primer Eval\n\nCould not read eval results: ${err.message}\n`; + } + + // Write to Actions job summary (visible in run UI and PR checks tab) + await core.summary.addRaw(summary).write(); + + // Also post/update as PR comment + if (isPR) { + const marker = ''; + const body = marker + '\n' + summary; + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const existing = comments.find(c => c.body?.includes(marker)); + if (existing) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + body, + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body, + }); + } + } + + - name: Fail on threshold + if: steps.eval.outcome == 'failure' + run: | + echo "::error::Eval pass rate fell below threshold" + exit 1 diff --git a/src/cli.ts b/src/cli.ts index 3d5b41e..a2d2ede 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -82,6 +82,7 @@ export function runCli(argv: string[]): void { .option("--output ", "Write results JSON to file") .option("--init", "Create a starter primer.eval.json file") .option("--count ", "Number of eval cases to generate (with --init)") + .option("--fail-threshold ", "Exit with error if pass rate (%) falls below threshold") .action(withGlobalOpts(evalCommand)); program diff --git a/src/commands/eval.ts b/src/commands/eval.ts index abd4cdb..44a411f 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -16,6 +16,7 @@ type EvalOptions = { init?: boolean; count?: string; listModels?: boolean; + failThreshold?: string; json?: boolean; quiet?: boolean; }; @@ -108,7 +109,7 @@ export async function evalCommand( try { const progress = createProgressReporter(!shouldLog(options)); - const { summary, viewerPath } = await runEval({ + const { summary, results, viewerPath } = await runEval({ configPath, repoPath, model: options.model ?? DEFAULT_MODEL, @@ -130,6 +131,19 @@ export async function evalCommand( process.stderr.write(`Trajectory viewer: ${viewerPath}\n`); } } + + const threshold = Number.parseInt(options.failThreshold ?? "", 10); + if (Number.isFinite(threshold)) { + const total = results.length; + const passed = results.filter((r) => r.verdict === "pass").length; + const passRate = total > 0 ? Math.round((passed / total) * 100) : 0; + if (passRate < threshold) { + outputError( + `Pass rate ${passRate}% (${passed}/${total}) is below threshold ${threshold}%`, + Boolean(options.json) + ); + } + } } catch (error) { outputError( `Eval failed: ${error instanceof Error ? error.message : String(error)}`, From e48d78397485506275227f41b73e62b505f89efd Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 15:37:35 -0800 Subject: [PATCH 44/84] update copilot instructions for clarity --- .github/copilot-instructions.md | 137 ++++++++++++++++++++------------ 1 file changed, 87 insertions(+), 50 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index b5af7b8..bc8e894 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -2,66 +2,103 @@ ## Development Checklist -- Use ESM syntax everywhere (see "type": "module" in package.json). -- TypeScript is strict; target ES2022, module ESNext (see tsconfig.json). -- Use Commander for CLI, Ink/React for TUI, and simple-git/Octokit for GitHub automation. -- Only overwrite config files (e.g., .vscode/settings.json, .vscode/mcp.json) with --force. -- All Copilot/VS Code settings reference this file and enable MCP. -- Place new CLI commands in src/commands/, core logic in src/services/, and TUI in src/ui/. -- All CLI commands MUST support --json, --quiet and arguments for automation-friendly output. -- Do not add new build/lint/test tools unless necessary; use existing npm scripts. -- Windows/macOS/Linux compatibility is required; consider path handling and shell commands carefully. +- Use ESM syntax everywhere (`"type": "module"` in package.json). +- TypeScript strict mode; target ES2022, module ESNext (see tsconfig.json). +- Use Commander for CLI, Ink/React for TUI, simple-git/Octokit for GitHub, Azure DevOps REST for Azure. +- Place CLI commands in `src/commands/`, business logic in `src/services/`, TUI components in `src/ui/`. +- All CLI commands MUST support `--json` and `--quiet` flags for automation-friendly output. +- Only overwrite config files with `--force`; use `safeWriteFile()` from `src/utils/fs.ts`. +- Windows/macOS/Linux compatibility required — use `path.join()`, avoid shell-specific syntax. +- Do not add new build/lint/test tools; use existing npm scripts. ## Overview -**Primer** is a TypeScript CLI tool for priming repositories for AI-assisted development and evaluation. +**Primer** is a TypeScript CLI for priming repositories for AI-assisted development — generating Copilot instructions, VS Code configs, MCP configs, and evaluating AI agent effectiveness. -- **Tech Stack:** TypeScript (ESM, strict), Node.js, React (Ink for TUI) -- **Entrypoint:** `src/index.ts` (calls `runCli` in `src/cli.ts`) -- **Key Directories:** - - `src/commands/` — CLI subcommands - - `src/services/` — core logic (analyzer, instructions, generator, git, github, evaluator) - - `src/ui/` — Ink/React-based terminal UI - - `.github/` — Copilot instructions - - `.vscode/` — Editor settings +- **Entrypoint:** `src/index.ts` → `runCli()` in `src/cli.ts` +- **Tech:** TypeScript (ESM, strict), Node.js, React 19 (Ink 6 for TUI), Copilot SDK + +## Build & Test + +```sh +npm run build # tsup → dist/ +npm run dev # tsx watch for development +npm run typecheck # tsc --noEmit +npm run lint # eslint (flat config) +npm run format # prettier --write +npm run test # vitest +npm run test:coverage # vitest with v8 coverage → ./coverage/ +``` + +Run locally without building: `npx tsx src/index.ts [options]` ## Architecture -- **CLI:** Uses `commander` to wire subcommands to service functions. -- **Analyzer:** Scans repo files to infer languages, frameworks, and package manager. -- **Instructions:** Generates `.github/copilot-instructions.md` from convention files. -- **Config Generation:** Writes `.vscode/settings.json` and `.vscode/mcp.json` (safe overwrite). -- **Git/GitHub:** Automates clone/branch/PR via `simple-git` and Octokit. -- **Evaluation:** Compares agent responses with/without instructions using Copilot sessions. -- **TUI:** `src/ui/tui.tsx` (Ink/React) for interactive terminal usage. - -## Usage - -- **Run locally (no build step):** - - `npx tsx src/index.ts --help` - - `npx tsx src/index.ts analyze [path] --json` - - `npx tsx src/index.ts generate mcp|vscode [path] [--force]` - - `npx tsx src/index.ts instructions [--repo ] [--output ] [--model gpt-5]` - - `npx tsx src/index.ts tui [--repo ]` - - `npx tsx src/index.ts pr [--branch primer/add-configs]` - - `npx tsx src/index.ts eval [configPath] --repo [--model gpt-5] [--judge-model gpt-5] [--output results.json]` +### Commands (`src/commands/`) -## Conventions +Commands are thin orchestrators — they parse options, call services, and format output. -- **ESM everywhere** (`"type": "module"` in `package.json`) -- **Strict TypeScript** (`tsconfig.json` targets ES2022, module ESNext, strict mode) -- **Single glob pass** for convention sources (see `src/services/instructions.ts`) -- **Safe file writes:** Overwrites only with `--force` -- **VS Code Copilot settings** reference this file and enable MCP +| Command | File | Purpose | +| ----------------- | -------------------- | ---------------------------------------------------------------------- | +| `init` | `init.ts` | Interactive/headless repo setup (local, GitHub, Azure) | +| `analyze` | `analyze.ts` | Detect languages, frameworks, monorepo structure, areas | +| `generate` | `generate.ts` | Generate instructions, agents, mcp, vscode configs | +| `instructions` | `instructions.ts` | Generate root + per-area `.instructions.md` files | +| `pr` | `pr.ts` | Create PR with configs on GitHub or Azure DevOps | +| `eval` | `eval.ts` | Compare responses with/without instructions; `--init` scaffolds config | +| `readiness` | `readiness.ts` | AI readiness assessment across 9 pillars | +| `tui` | `tui.tsx` | Full interactive TUI (model picker, areas, eval) | +| `batch` | `batch.tsx` | Bulk-process repos (GitHub or Azure); TUI or headless | +| `batch-readiness` | `batchReadiness.tsx` | Batch readiness HTML report generation | -## Prerequisites +### Services (`src/services/`) + +Services contain all business logic. Commands never access APIs or filesystem directly. + +| Service | Key Exports | Purpose | +| ----------------- | ---------------------------------------------------------------------- | --------------------------------------------------------------- | +| `analyzer.ts` | `analyzeRepo()`, `loadPrimerConfig()` | Repo analysis: languages, frameworks, monorepo detection, areas | +| `instructions.ts` | `generateCopilotInstructions()`, `generateAreaInstructions()` | Copilot SDK sessions for instruction generation | +| `generator.ts` | `generateConfigs()` | Write `.vscode/mcp.json` and `.vscode/settings.json` | +| `evaluator.ts` | `runEval()` | Run evals comparing with/without instructions | +| `evalScaffold.ts` | `generateEvalScaffold()` | Auto-generate `primer.eval.json` test cases | +| `readiness.ts` | `runReadinessReport()` | 9-pillar readiness assessment | +| `git.ts` | `cloneRepo()`, `checkoutBranch()`, `commitAll()`, `pushBranch()` | Git operations with sanitized auth URLs | +| `github.ts` | `createGitHubClient()`, `createPullRequest()`, `listAccessibleRepos()` | GitHub API via Octokit | +| `azureDevops.ts` | `listOrganizations()`, `listRepos()`, `createPullRequest()` | Azure DevOps REST API; PAT auth | +| `batch.ts` | `processGitHubRepo()`, `processAzureRepo()` | Batch clone → generate → PR pipeline | +| `copilot.ts` | `assertCopilotCliReady()`, `listCopilotModels()` | Validate Copilot CLI availability; discover models | +| `visualReport.ts` | `generateVisualReport()` | HTML readiness report with dark/light themes | + +### UI (`src/ui/`) -- **Copilot CLI** must be installed and authenticated for SDK calls. -- **GitHub automation** requires `GITHUB_TOKEN` or `GH_TOKEN` in the environment. +Ink/React components for interactive terminal workflows: -## Key Files +- `tui.tsx` — Main TUI state machine (intro → idle → generating → …) +- `BatchTui.tsx` / `BatchTuiAzure.tsx` — GitHub/Azure batch processing UIs +- `BatchReadinessTui.tsx` — Batch readiness report UI +- `AnimatedBanner.tsx` — Intro animation (skip with `--no-animation`) + +### Utils (`src/utils/`) + +- `output.ts` — `CommandResult` type (`{ ok, status, data?, errors? }`), `ProgressReporter` interface +- `fs.ts` — `safeWriteFile()` (rejects symlinks, requires `--force`), `validateCachePath()` (prevents path traversal) +- `cwd.ts` — `withCwd()` serialized lock for Copilot SDK process directory +- `logger.ts` — Structured logging +- `repo.ts` / `pr.ts` — Shared repo/PR helpers + +## Conventions + +- **Output discipline:** `stdout` is for JSON only (with `--json`); human-readable output goes to `stderr` +- **CommandResult pattern:** All commands return `CommandResult` with `{ ok, status, data?, errors? }` +- **Safe writes:** `safeWriteFile()` rejects symlinks and skips existing files unless `--force` +- **Path safety:** `validateCachePath()` prevents traversal in `.primer-cache/` +- **Copilot SDK:** Sessions require `withCwd()` for process working directory serialization +- **Monorepo-aware:** Analyzer detects npm/pnpm/yarn/cargo/go/dotnet/gradle/maven workspaces; `Area` type scopes instructions via `applyTo` globs +- **Single glob pass** for convention source discovery (see `src/services/instructions.ts`) + +## Prerequisites -- `.github/copilot-instructions.md` — This file -- `src/index.ts` — CLI entrypoint -- `src/services/` — Core logic -- `.vscode/settings.json` — Copilot/VS Code integration +- **Copilot CLI** must be installed and authenticated for SDK calls (`copilot.ts` validates this) +- **GitHub:** `GITHUB_TOKEN` or `GH_TOKEN` env var, or `gh` CLI for token extraction +- **Azure DevOps:** `AZURE_DEVOPS_PAT` env var for Azure operations From 19a19488f39ab43378aadd7116255c15139f1d40 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 17:33:59 -0800 Subject: [PATCH 45/84] Policy System for Readiness Reports --- src/cli.ts | 2 + src/commands/batchReadiness.tsx | 5 +- src/commands/readiness.ts | 5 +- src/services/__tests__/analyzer.test.ts | 36 ++ src/services/__tests__/policy.test.ts | 517 +++++++++++++++++++++++ src/services/__tests__/readiness.test.ts | 67 +++ src/services/analyzer.ts | 10 +- src/services/policy.ts | 303 +++++++++++++ src/services/readiness.ts | 151 +++++-- src/ui/BatchReadinessTui.tsx | 5 +- 10 files changed, 1051 insertions(+), 50 deletions(-) create mode 100644 src/services/__tests__/policy.test.ts create mode 100644 src/services/policy.ts diff --git a/src/cli.ts b/src/cli.ts index a2d2ede..efddc7a 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -108,6 +108,7 @@ export function runCli(argv: string[]): void { .option("--output ", "Write report to file (.json or .html)") .option("--visual", "Generate visual HTML report") .option("--per-area", "Show per-area readiness breakdown") + .option("--policy ", "Policy sources (comma-separated: paths, npm packages)") .action(withGlobalOpts(readinessCommand)); program @@ -124,6 +125,7 @@ export function runCli(argv: string[]): void { .command("batch-readiness") .description("Generate batch AI readiness report for multiple repos") .option("--output ", "Write HTML report to file") + .option("--policy ", "Policy sources (comma-separated: paths, npm packages)") .action(withGlobalOpts(batchReadinessCommand)); program.parse(argv); diff --git a/src/commands/batchReadiness.tsx b/src/commands/batchReadiness.tsx index fc1f4df..eaddd06 100644 --- a/src/commands/batchReadiness.tsx +++ b/src/commands/batchReadiness.tsx @@ -2,11 +2,13 @@ import { render } from "ink"; import React from "react"; import { getGitHubToken } from "../services/github"; +import { parsePolicySources } from "../services/policy"; import { outputError } from "../utils/output"; import { BatchReadinessTui } from "../ui/BatchReadinessTui"; type BatchReadinessOptions = { output?: string; + policy?: string; json?: boolean; quiet?: boolean; }; @@ -22,8 +24,9 @@ export async function batchReadinessCommand(options: BatchReadinessOptions): Pro } try { + const policies = parsePolicySources(options.policy); const { waitUntilExit } = render( - + ); await waitUntilExit(); } catch (error) { diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts index 52a32bc..b1afd9d 100644 --- a/src/commands/readiness.ts +++ b/src/commands/readiness.ts @@ -9,6 +9,7 @@ import type { AreaReadinessReport } from "../services/readiness"; import { runReadinessReport } from "../services/readiness"; +import { parsePolicySources } from "../services/policy"; import { generateVisualReport } from "../services/visualReport"; import type { CommandResult } from "../utils/output"; import { outputResult, outputError, shouldLog } from "../utils/output"; @@ -19,6 +20,7 @@ type ReadinessOptions = { output?: string; visual?: boolean; perArea?: boolean; + policy?: string; }; export async function readinessCommand( @@ -30,7 +32,8 @@ export async function readinessCommand( let report: ReadinessReport; try { - report = await runReadinessReport({ repoPath, perArea: options.perArea }); + const policies = parsePolicySources(options.policy); + report = await runReadinessReport({ repoPath, perArea: options.perArea, policies }); } catch (error) { outputError( `Failed to generate readiness report: ${error instanceof Error ? error.message : String(error)}`, diff --git a/src/services/__tests__/analyzer.test.ts b/src/services/__tests__/analyzer.test.ts index 9c4f0ec..435b3f4 100644 --- a/src/services/__tests__/analyzer.test.ts +++ b/src/services/__tests__/analyzer.test.ts @@ -573,6 +573,42 @@ describe("loadPrimerConfig", () => { const config = await loadPrimerConfig(repoPath); expect(config).toBeUndefined(); }); + + it("parses policies array from config", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile( + path.join(repoPath, "primer.config.json"), + JSON.stringify({ + areas: [{ name: "api", applyTo: "src/api/**" }], + policies: ["./custom-policy.json", "@org/policy-pkg"] + }) + ); + const config = await loadPrimerConfig(repoPath); + expect(config?.policies).toEqual(["./custom-policy.json", "@org/policy-pkg"]); + expect(config?.areas).toHaveLength(1); + }); + + it("filters out non-string and empty policy entries", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile( + path.join(repoPath, "primer.config.json"), + JSON.stringify({ + policies: ["valid", 42, "", " ", null, "also-valid"] + }) + ); + const config = await loadPrimerConfig(repoPath); + expect(config?.policies).toEqual(["valid", "also-valid"]); + }); + + it("returns undefined policies when field is absent", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile( + path.join(repoPath, "primer.config.json"), + JSON.stringify({ areas: [{ name: "web", applyTo: "web/**" }] }) + ); + const config = await loadPrimerConfig(repoPath); + expect(config?.policies).toBeUndefined(); + }); }); describe("sanitizeAreaName", () => { diff --git a/src/services/__tests__/policy.test.ts b/src/services/__tests__/policy.test.ts new file mode 100644 index 0000000..41dca70 --- /dev/null +++ b/src/services/__tests__/policy.test.ts @@ -0,0 +1,517 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; + +import { afterEach, beforeEach, describe, expect, it } from "vitest"; + +import type { ReadinessCriterion } from "../readiness"; +import type { ExtraDefinition, PolicyConfig } from "../policy"; +import { loadPolicy, resolveChain, parsePolicySources } from "../policy"; + +// ─── Helpers ─── + +function makeCriterion( + overrides: Partial & { id: string } +): ReadinessCriterion { + return { + title: overrides.id, + pillar: "build-system", + level: 1, + scope: "repo", + impact: "medium", + effort: "low", + check: async () => ({ status: "pass" }), + ...overrides + }; +} + +function makeExtra(overrides: Partial & { id: string }): ExtraDefinition { + return { + title: overrides.id, + check: async () => ({ status: "pass" }), + ...overrides + }; +} + +// ─── resolveChain ─── + +describe("resolveChain", () => { + it("returns base criteria and extras unchanged when policies is empty", () => { + const criteria = [makeCriterion({ id: "a" }), makeCriterion({ id: "b" })]; + const extras = [makeExtra({ id: "x" })]; + const result = resolveChain(criteria, extras, []); + + expect(result.chain).toEqual([]); + expect(result.criteria).toHaveLength(2); + expect(result.extras).toHaveLength(1); + expect(result.thresholds.passRate).toBe(0.8); + }); + + it("does not mutate the original baseCriteria objects", () => { + const original = makeCriterion({ id: "a", impact: "low" }); + const criteria = [original]; + const policy: PolicyConfig = { + name: "test", + criteria: { override: { a: { impact: "high" } } } + }; + + const result = resolveChain(criteria, [], [policy]); + expect(result.criteria[0].impact).toBe("high"); + expect(original.impact).toBe("low"); // original untouched + }); + + it("disables criteria by id", () => { + const criteria = [ + makeCriterion({ id: "a" }), + makeCriterion({ id: "b" }), + makeCriterion({ id: "c" }) + ]; + const policy: PolicyConfig = { + name: "test", + criteria: { disable: ["a", "c"] } + }; + + const result = resolveChain(criteria, [], [policy]); + expect(result.criteria.map((c) => c.id)).toEqual(["b"]); + }); + + it("overrides criterion metadata by id", () => { + const criteria = [makeCriterion({ id: "a", level: 1, impact: "low" })]; + const policy: PolicyConfig = { + name: "test", + criteria: { override: { a: { level: 3, impact: "high" } } } + }; + + const result = resolveChain(criteria, [], [policy]); + expect(result.criteria[0].level).toBe(3); + expect(result.criteria[0].impact).toBe("high"); + expect(result.criteria[0].id).toBe("a"); // id preserved + }); + + it("ignores override for non-existent criterion id", () => { + const criteria = [makeCriterion({ id: "a" })]; + const policy: PolicyConfig = { + name: "test", + criteria: { override: { nonexistent: { level: 5 } } } + }; + + const result = resolveChain(criteria, [], [policy]); + expect(result.criteria).toHaveLength(1); + expect(result.criteria[0].id).toBe("a"); + }); + + it("adds new criteria", () => { + const criteria = [makeCriterion({ id: "a" })]; + const newCriterion = makeCriterion({ id: "b", title: "New check" }); + const policy: PolicyConfig = { + name: "test", + criteria: { add: [newCriterion] } + }; + + const result = resolveChain(criteria, [], [policy]); + expect(result.criteria).toHaveLength(2); + expect(result.criteria[1].id).toBe("b"); + expect(result.criteria[1].title).toBe("New check"); + }); + + it("replaces existing criterion when adding with same id", () => { + const criteria = [makeCriterion({ id: "a", title: "Original" })]; + const replacement = makeCriterion({ id: "a", title: "Replaced" }); + const policy: PolicyConfig = { + name: "test", + criteria: { add: [replacement] } + }; + + const result = resolveChain(criteria, [], [policy]); + expect(result.criteria).toHaveLength(1); + expect(result.criteria[0].title).toBe("Replaced"); + }); + + it("disables extras by id", () => { + const extras = [makeExtra({ id: "x" }), makeExtra({ id: "y" })]; + const policy: PolicyConfig = { + name: "test", + extras: { disable: ["x"] } + }; + + const result = resolveChain([], extras, [policy]); + expect(result.extras.map((e) => e.id)).toEqual(["y"]); + }); + + it("adds new extras", () => { + const extras = [makeExtra({ id: "x" })]; + const newExtra = makeExtra({ id: "y", title: "New extra" }); + const policy: PolicyConfig = { + name: "test", + extras: { add: [newExtra] } + }; + + const result = resolveChain([], extras, [policy]); + expect(result.extras).toHaveLength(2); + expect(result.extras[1].title).toBe("New extra"); + }); + + it("replaces existing extra when adding with same id", () => { + const extras = [makeExtra({ id: "x", title: "Original" })]; + const replacement = makeExtra({ id: "x", title: "Replaced" }); + const policy: PolicyConfig = { + name: "test", + extras: { add: [replacement] } + }; + + const result = resolveChain([], extras, [policy]); + expect(result.extras).toHaveLength(1); + expect(result.extras[0].title).toBe("Replaced"); + }); + + it("overrides passRate threshold", () => { + const policy: PolicyConfig = { + name: "strict", + thresholds: { passRate: 0.95 } + }; + + const result = resolveChain([], [], [policy]); + expect(result.thresholds.passRate).toBe(0.95); + }); + + it("stacks multiple policies in order (last wins)", () => { + const criteria = [ + makeCriterion({ id: "a" }), + makeCriterion({ id: "b" }), + makeCriterion({ id: "c" }) + ]; + const policy1: PolicyConfig = { + name: "base", + criteria: { disable: ["c"] }, + thresholds: { passRate: 0.9 } + }; + const policy2: PolicyConfig = { + name: "override", + criteria: { override: { a: { impact: "high" } } }, + thresholds: { passRate: 0.7 } + }; + + const result = resolveChain(criteria, [], [policy1, policy2]); + expect(result.chain).toEqual(["base", "override"]); + expect(result.criteria.map((c) => c.id)).toEqual(["a", "b"]); // c disabled by policy1 + expect(result.criteria[0].impact).toBe("high"); // overridden by policy2 + expect(result.thresholds.passRate).toBe(0.7); // last wins + }); + + it("applies disable, override, add in correct order within a policy", () => { + const criteria = [makeCriterion({ id: "a", level: 1 }), makeCriterion({ id: "b" })]; + const policy: PolicyConfig = { + name: "combo", + criteria: { + disable: ["b"], + override: { a: { level: 3 } }, + add: [makeCriterion({ id: "c", title: "Added" })] + } + }; + + const result = resolveChain(criteria, [], [policy]); + expect(result.criteria.map((c) => c.id)).toEqual(["a", "c"]); + expect(result.criteria[0].level).toBe(3); + expect(result.criteria[1].title).toBe("Added"); + }); +}); + +// ─── loadPolicy (JSON files) ─── + +describe("loadPolicy", () => { + let tmpDir: string; + + beforeEach(async () => { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "primer-policy-")); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + async function writePolicy(filename: string, content: unknown): Promise { + const filePath = path.join(tmpDir, filename); + await fs.writeFile(filePath, JSON.stringify(content), "utf8"); + return filePath; + } + + it("loads a valid JSON policy", async () => { + const filePath = await writePolicy("policy.json", { + name: "my-policy", + thresholds: { passRate: 0.9 } + }); + + const config = await loadPolicy(filePath); + expect(config.name).toBe("my-policy"); + expect(config.thresholds?.passRate).toBe(0.9); + }); + + it("loads a minimal JSON policy (name only)", async () => { + const filePath = await writePolicy("minimal.json", { name: "minimal" }); + const config = await loadPolicy(filePath); + expect(config.name).toBe("minimal"); + }); + + it("loads a policy with criteria.disable", async () => { + const filePath = await writePolicy("disable.json", { + name: "strict", + criteria: { disable: ["lint-config", "readme"] } + }); + + const config = await loadPolicy(filePath); + expect(config.criteria?.disable).toEqual(["lint-config", "readme"]); + }); + + it("throws for missing JSON file", async () => { + const badPath = path.join(tmpDir, "nonexistent.json"); + await expect(loadPolicy(badPath)).rejects.toThrow("not found at:"); + }); + + it("throws for missing name field", async () => { + const filePath = await writePolicy("no-name.json", { thresholds: { passRate: 0.5 } }); + await expect(loadPolicy(filePath)).rejects.toThrow('missing required field "name"'); + }); + + it("throws for non-object input", async () => { + const filePath = path.join(tmpDir, "bad.json"); + await fs.writeFile(filePath, '"just a string"', "utf8"); + await expect(loadPolicy(filePath)).rejects.toThrow("expected an object"); + }); + + it("throws for passRate outside 0-1 range", async () => { + const filePath = await writePolicy("bad-rate.json", { + name: "bad", + thresholds: { passRate: 1.5 } + }); + await expect(loadPolicy(filePath)).rejects.toThrow("must be between 0 and 1"); + }); + + it("throws for non-number passRate", async () => { + const filePath = await writePolicy("string-rate.json", { + name: "bad", + thresholds: { passRate: "high" } + }); + await expect(loadPolicy(filePath)).rejects.toThrow("must be a number"); + }); + + it("throws for criteria.disable with non-strings", async () => { + const filePath = await writePolicy("bad-disable.json", { + name: "bad", + criteria: { disable: [1, 2, 3] } + }); + await expect(loadPolicy(filePath)).rejects.toThrow("must be an array of strings"); + }); + + it("rejects criteria.add in JSON policies", async () => { + const filePath = await writePolicy("add-in-json.json", { + name: "bad", + criteria: { add: [{ id: "custom" }] } + }); + await expect(loadPolicy(filePath)).rejects.toThrow("not supported in JSON policies"); + }); + + it("rejects extras.add in JSON policies", async () => { + const filePath = await writePolicy("extras-add-json.json", { + name: "bad", + extras: { add: [{ id: "custom" }] } + }); + await expect(loadPolicy(filePath)).rejects.toThrow("not supported in JSON policies"); + }); + + it("throws for non-existent npm package", async () => { + await expect(loadPolicy("@primer/nonexistent-policy-pkg-12345")).rejects.toThrow("npm install"); + }); + + it("throws for non-object criteria", async () => { + const filePath = await writePolicy("bad-criteria.json", { + name: "bad", + criteria: "not-an-object" + }); + await expect(loadPolicy(filePath)).rejects.toThrow('"criteria" must be an object'); + }); + + it("throws for non-object extras", async () => { + const filePath = await writePolicy("bad-extras.json", { + name: "bad", + extras: 42 + }); + await expect(loadPolicy(filePath)).rejects.toThrow('"extras" must be an object'); + }); + + it("throws for null extras", async () => { + const filePath = await writePolicy("null-extras.json", { + name: "bad", + extras: null + }); + await expect(loadPolicy(filePath)).rejects.toThrow('"extras" must be an object'); + }); + + it("throws for extras.disable with non-strings", async () => { + const filePath = await writePolicy("bad-extras-disable.json", { + name: "bad", + extras: { disable: [1, 2] } + }); + await expect(loadPolicy(filePath)).rejects.toThrow( + '"extras.disable" must be an array of strings' + ); + }); + + it("throws for non-object thresholds", async () => { + const filePath = await writePolicy("bad-thresholds.json", { + name: "bad", + thresholds: "high" + }); + await expect(loadPolicy(filePath)).rejects.toThrow('"thresholds" must be an object'); + }); + + it("throws for non-object criteria.override", async () => { + const filePath = await writePolicy("bad-override.json", { + name: "bad", + criteria: { override: "not-an-object" } + }); + await expect(loadPolicy(filePath)).rejects.toThrow('"criteria.override" must be an object'); + }); + + it("throws for whitespace-only name", async () => { + const filePath = await writePolicy("whitespace-name.json", { + name: " " + }); + await expect(loadPolicy(filePath)).rejects.toThrow('missing required field "name"'); + }); + + it("loads JSON policy via absolute path", async () => { + const filePath = path.join(tmpDir, "abs-policy.json"); + await fs.writeFile(filePath, JSON.stringify({ name: "absolute" }), "utf8"); + const config = await loadPolicy(filePath); + expect(config.name).toBe("absolute"); + }); + + it("rejects override with disallowed key 'id'", async () => { + const filePath = await writePolicy("bad-override-key.json", { + name: "bad", + criteria: { override: { a: { id: "hijacked" } } } + }); + await expect(loadPolicy(filePath)).rejects.toThrow('disallowed key "id"'); + }); + + it("rejects override with disallowed key 'check'", async () => { + const filePath = await writePolicy("bad-override-check.json", { + name: "bad", + criteria: { override: { a: { check: "payload" } } } + }); + await expect(loadPolicy(filePath)).rejects.toThrow('disallowed key "check"'); + }); + + it("allows override with all valid metadata keys", async () => { + const filePath = await writePolicy("good-override.json", { + name: "good", + criteria: { + override: { + a: { + title: "New", + pillar: "testing", + level: 2, + scope: "app", + impact: "high", + effort: "medium" + } + } + } + }); + const config = await loadPolicy(filePath); + expect(config.criteria?.override?.a).toEqual({ + title: "New", + pillar: "testing", + level: 2, + scope: "app", + impact: "high", + effort: "medium" + }); + }); + + it("loads a .mjs module policy", async () => { + const filePath = path.join(tmpDir, "mod-policy.mjs"); + await fs.writeFile(filePath, `export default { name: "mjs-policy", criteria: {} };\n`, "utf8"); + const config = await loadPolicy(filePath); + expect(config.name).toBe("mjs-policy"); + }); +}); + +// ─── loadPolicy jsonOnly mode ─── + +describe("loadPolicy jsonOnly", () => { + let tmpDir: string; + + beforeEach(async () => { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "primer-policy-jsononly-")); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + it("allows JSON policies when jsonOnly is true", async () => { + const filePath = path.join(tmpDir, "ok.json"); + await fs.writeFile(filePath, JSON.stringify({ name: "ok" }), "utf8"); + const config = await loadPolicy(filePath, { jsonOnly: true }); + expect(config.name).toBe("ok"); + }); + + it("rejects .ts module policies when jsonOnly is true", async () => { + await expect(loadPolicy("./my-policy.ts", { jsonOnly: true })).rejects.toThrow( + "only JSON policies are allowed from primer.config.json" + ); + }); + + it("rejects .js module policies when jsonOnly is true", async () => { + await expect(loadPolicy("./my-policy.js", { jsonOnly: true })).rejects.toThrow( + "only JSON policies are allowed from primer.config.json" + ); + }); + + it("rejects npm package policies when jsonOnly is true", async () => { + await expect(loadPolicy("@org/policy-pkg", { jsonOnly: true })).rejects.toThrow( + "only JSON file policies are allowed from primer.config.json" + ); + }); + + it("rejects .mjs module policies when jsonOnly is true", async () => { + await expect(loadPolicy("./my-policy.mjs", { jsonOnly: true })).rejects.toThrow( + "only JSON policies are allowed from primer.config.json" + ); + }); + + it("rejects .cjs module policies when jsonOnly is true", async () => { + await expect(loadPolicy("./my-policy.cjs", { jsonOnly: true })).rejects.toThrow( + "only JSON policies are allowed from primer.config.json" + ); + }); +}); + +// ─── parsePolicySources ─── + +describe("parsePolicySources", () => { + it("returns undefined for undefined input", () => { + expect(parsePolicySources(undefined)).toBeUndefined(); + }); + + it("returns undefined for empty string", () => { + expect(parsePolicySources("")).toBeUndefined(); + }); + + it("splits comma-separated sources and trims whitespace", () => { + expect(parsePolicySources("./a.json, ./b.json , @org/pkg")).toEqual([ + "./a.json", + "./b.json", + "@org/pkg" + ]); + }); + + it("filters out empty segments", () => { + expect(parsePolicySources("./a.json,,./b.json")).toEqual(["./a.json", "./b.json"]); + }); + + it("handles a single source without commas", () => { + expect(parsePolicySources("./a.json")).toEqual(["./a.json"]); + }); +}); diff --git a/src/services/__tests__/readiness.test.ts b/src/services/__tests__/readiness.test.ts index 8fd5333..d13eb94 100644 --- a/src/services/__tests__/readiness.test.ts +++ b/src/services/__tests__/readiness.test.ts @@ -610,4 +610,71 @@ describe("runReadinessReport", () => { expect(docPillar!.passed).toBeGreaterThanOrEqual(1); }); }); + + describe("policy integration", () => { + it("disables a criterion via JSON policy", async () => { + await writePackageJson({ name: "test-repo" }); + // Write a JSON policy that disables lint-config + const policyPath = path.join(repoPath, "test-policy.json"); + await fs.writeFile( + policyPath, + JSON.stringify({ + name: "test-policy", + criteria: { disable: ["lint-config"] } + }), + "utf8" + ); + + const report = await runReadinessReport({ repoPath, policies: [policyPath] }); + + expect(report.criteria.find((c) => c.id === "lint-config")).toBeUndefined(); + expect(report.policies).toBeDefined(); + expect(report.policies!.chain).toEqual(["test-policy"]); + expect(report.policies!.criteriaCount).toBeGreaterThan(0); + }); + + it("overrides passRate threshold via policy", async () => { + await writePackageJson({ name: "test-repo" }); + const policyPath = path.join(repoPath, "threshold-policy.json"); + await fs.writeFile( + policyPath, + JSON.stringify({ + name: "strict", + thresholds: { passRate: 1.0 } + }), + "utf8" + ); + + const report = await runReadinessReport({ repoPath, policies: [policyPath] }); + + expect(report.policies!.chain).toEqual(["strict"]); + }); + + it("falls back to primer.config.json policies", async () => { + await writePackageJson({ name: "test-repo" }); + // Write a policy file using absolute path + const policyPath = path.join(repoPath, "config-policy.json"); + await fs.writeFile( + policyPath, + JSON.stringify({ name: "from-config", criteria: { disable: ["readme"] } }), + "utf8" + ); + // Reference it from primer.config.json with absolute path + await writeFile("primer.config.json", JSON.stringify({ policies: [policyPath] })); + + const report = await runReadinessReport({ repoPath }); + + expect(report.policies!.chain).toEqual(["from-config"]); + expect(report.criteria.find((c) => c.id === "readme")).toBeUndefined(); + }); + + it("rejects module policies from primer.config.json", async () => { + await writePackageJson({ name: "test-repo" }); + await writeFile("primer.config.json", JSON.stringify({ policies: ["./my-policy.ts"] })); + + await expect(runReadinessReport({ repoPath })).rejects.toThrow( + "only JSON policies are allowed from primer.config.json" + ); + }); + }); }); diff --git a/src/services/analyzer.ts b/src/services/analyzer.ts index e051acb..c17c242 100644 --- a/src/services/analyzer.ts +++ b/src/services/analyzer.ts @@ -688,6 +688,7 @@ export type PrimerConfigArea = { export type PrimerConfig = { areas?: PrimerConfigArea[]; + policies?: string[]; }; export async function loadPrimerConfig(repoPath: string): Promise { @@ -742,7 +743,14 @@ export async function loadPrimerConfig(repoPath: string): Promise typeof p === "string" && p.trim() !== ""); + } + + return { areas, policies: policies?.length ? policies : undefined }; } return undefined; diff --git a/src/services/policy.ts b/src/services/policy.ts new file mode 100644 index 0000000..29f4aae --- /dev/null +++ b/src/services/policy.ts @@ -0,0 +1,303 @@ +import fs from "fs/promises"; +import path from "path"; + +import { readJson } from "../utils/fs"; + +import type { ReadinessCriterion, ReadinessContext } from "./readiness"; + +// ─── Policy configuration types ─── + +type CriterionMetadata = Pick< + ReadinessCriterion, + "title" | "pillar" | "level" | "scope" | "impact" | "effort" +>; + +export type ExtraDefinition = { + id: string; + title: string; + check: (context: ReadinessContext) => Promise<{ status: "pass" | "fail"; reason?: string }>; +}; + +export type PolicyConfig = { + name: string; + version?: string; + criteria?: { + disable?: string[]; + add?: ReadinessCriterion[]; + override?: Record>; + }; + extras?: { + disable?: string[]; + add?: ExtraDefinition[]; + }; + thresholds?: { + passRate?: number; + }; +}; + +export type ResolvedPolicy = { + chain: string[]; + criteria: ReadinessCriterion[]; + extras: ExtraDefinition[]; + thresholds: { passRate: number }; +}; + +// ─── Default thresholds ─── + +const DEFAULT_PASS_RATE = 0.8; + +// ─── Validation ─── + +function validatePolicyConfig( + obj: unknown, + source: string, + format: "json" | "module" = "module" +): PolicyConfig { + if (typeof obj !== "object" || obj === null) { + throw new Error(`Policy "${source}" is invalid: expected an object, got ${typeof obj}`); + } + const record = obj as Record; + if (typeof record.name !== "string" || !record.name.trim()) { + throw new Error(`Policy "${source}" is invalid: missing required field "name" at root`); + } + if (record.criteria !== undefined) { + if (typeof record.criteria !== "object") { + throw new Error(`Policy "${source}" is invalid: "criteria" must be an object`); + } + const criteria = record.criteria as Record; + if (criteria.disable !== undefined && !isStringArray(criteria.disable)) { + throw new Error( + `Policy "${source}" is invalid: "criteria.disable" must be an array of strings` + ); + } + if (criteria.override !== undefined) { + if ( + typeof criteria.override !== "object" || + criteria.override === null || + Array.isArray(criteria.override) + ) { + throw new Error(`Policy "${source}" is invalid: "criteria.override" must be an object`); + } + const ALLOWED_OVERRIDE_KEYS = new Set([ + "title", + "pillar", + "level", + "scope", + "impact", + "effort" + ]); + for (const [id, value] of Object.entries( + criteria.override as Record> + )) { + if (typeof value !== "object" || value === null) continue; + for (const key of Object.keys(value)) { + if (!ALLOWED_OVERRIDE_KEYS.has(key)) { + throw new Error( + `Policy "${source}" is invalid: "criteria.override.${id}" contains disallowed key "${key}". Allowed keys: ${[...ALLOWED_OVERRIDE_KEYS].join(", ")}` + ); + } + } + } + } + if (format === "json" && criteria.add !== undefined) { + throw new Error( + `Policy "${source}" is invalid: "criteria.add" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.` + ); + } + } + if (record.extras !== undefined) { + if (typeof record.extras !== "object" || record.extras === null) { + throw new Error(`Policy "${source}" is invalid: "extras" must be an object`); + } + const extras = record.extras as Record; + if (extras.disable !== undefined && !isStringArray(extras.disable)) { + throw new Error( + `Policy "${source}" is invalid: "extras.disable" must be an array of strings` + ); + } + if (format === "json" && extras.add !== undefined) { + throw new Error( + `Policy "${source}" is invalid: "extras.add" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.` + ); + } + } + if (record.thresholds !== undefined) { + if (typeof record.thresholds !== "object" || record.thresholds === null) { + throw new Error(`Policy "${source}" is invalid: "thresholds" must be an object`); + } + const thresholds = record.thresholds as Record; + if (thresholds.passRate !== undefined && typeof thresholds.passRate !== "number") { + throw new Error(`Policy "${source}" is invalid: "thresholds.passRate" must be a number`); + } + if ( + typeof thresholds.passRate === "number" && + (thresholds.passRate < 0 || thresholds.passRate > 1) + ) { + throw new Error( + `Policy "${source}" is invalid: "thresholds.passRate" must be between 0 and 1` + ); + } + } + return record as unknown as PolicyConfig; +} + +function isStringArray(value: unknown): value is string[] { + return Array.isArray(value) && value.every((item) => typeof item === "string"); +} + +// ─── Helpers ─── + +export function parsePolicySources(raw: string | undefined): string[] | undefined { + if (!raw) return undefined; + const sources = raw + .split(",") + .map((s) => s.trim()) + .filter(Boolean); + return sources.length ? sources : undefined; +} + +// ─── Loading ─── + +export async function loadPolicy( + source: string, + options?: { jsonOnly?: boolean } +): Promise { + const jsonOnly = options?.jsonOnly ?? false; + + // Local file path (relative or absolute) + if (source.startsWith(".") || source.startsWith("/")) { + const resolved = path.resolve(source); + if (resolved.endsWith(".json")) { + const data = await readJson(resolved); + if (!data) { + throw new Error(`Policy "${source}" not found at: ${resolved}`); + } + return validatePolicyConfig(data, source, "json"); + } + // TS/JS module — blocked when jsonOnly + if (/\.[mc]?[jt]s$/u.test(resolved)) { + if (jsonOnly) { + throw new Error( + `Policy "${source}" rejected: only JSON policies are allowed from primer.config.json. Module policies (.ts/.js) must be passed via --policy.` + ); + } + try { + const mod = (await import(resolved)) as Record; + const config = (mod.default ?? mod) as unknown; + return validatePolicyConfig(config, source); + } catch (err) { + if ( + err instanceof Error && + (err.message.includes("Cannot find module") || err.message.includes("MODULE_NOT_FOUND")) + ) { + throw new Error(`Policy "${source}" not found at: ${resolved}`); + } + throw err; + } + } + // Unsupported extension — try as JSON + try { + const raw = await fs.readFile(resolved, "utf8"); + const data = JSON.parse(raw) as unknown; + return validatePolicyConfig(data, source, "json"); + } catch { + throw new Error( + `Policy "${source}" could not be loaded from: ${resolved}. Supported formats: .json, .js, .ts, .mjs` + ); + } + } + + // npm package (bare specifier or scoped) — blocked when jsonOnly + if (jsonOnly) { + throw new Error( + `Policy "${source}" rejected: only JSON file policies are allowed from primer.config.json. npm policies must be passed via --policy.` + ); + } + try { + const mod = (await import(source)) as Record; + const config = (mod.default ?? mod) as unknown; + return validatePolicyConfig(config, source); + } catch (err) { + if ( + err instanceof Error && + (err.message.includes("Cannot find module") || + err.message.includes("Cannot find package") || + err.message.includes("MODULE_NOT_FOUND") || + err.message.includes("ERR_MODULE_NOT_FOUND")) + ) { + throw new Error(`Policy "${source}" not found. Install it with: npm install ${source}`); + } + throw err; + } +} + +// ─── Chain resolution ─── + +export function resolveChain( + baseCriteria: ReadinessCriterion[], + baseExtras: ExtraDefinition[], + policies: PolicyConfig[] +): ResolvedPolicy { + const chain: string[] = []; + let criteria = [...baseCriteria]; + let extras = [...baseExtras]; + let passRate = DEFAULT_PASS_RATE; + + for (const policy of policies) { + chain.push(policy.name); + + if (policy.criteria) { + // Disable criteria by id + if (policy.criteria.disable?.length) { + const disableSet = new Set(policy.criteria.disable); + criteria = criteria.filter((c) => !disableSet.has(c.id)); + } + + // Override metadata by id + if (policy.criteria.override) { + for (const [id, overrides] of Object.entries(policy.criteria.override)) { + const idx = criteria.findIndex((c) => c.id === id); + if (idx >= 0) { + criteria[idx] = { ...criteria[idx], ...overrides }; + } + } + } + + // Add new criteria + if (policy.criteria.add?.length) { + for (const newCriterion of policy.criteria.add) { + // Replace if same id exists, otherwise append + const existingIdx = criteria.findIndex((c) => c.id === newCriterion.id); + if (existingIdx >= 0) { + criteria[existingIdx] = newCriterion; + } else { + criteria.push(newCriterion); + } + } + } + } + + if (policy.extras) { + if (policy.extras.disable?.length) { + const disableSet = new Set(policy.extras.disable); + extras = extras.filter((e) => !disableSet.has(e.id)); + } + if (policy.extras.add?.length) { + for (const newExtra of policy.extras.add) { + const existingIdx = extras.findIndex((e) => e.id === newExtra.id); + if (existingIdx >= 0) { + extras[existingIdx] = newExtra; + } else { + extras.push(newExtra); + } + } + } + } + + if (policy.thresholds?.passRate !== undefined) { + passRate = policy.thresholds.passRate; + } + } + + return { chain, criteria, extras, thresholds: { passRate } }; +} diff --git a/src/services/readiness.ts b/src/services/readiness.ts index 02ae8de..ff788ec 100644 --- a/src/services/readiness.ts +++ b/src/services/readiness.ts @@ -4,7 +4,9 @@ import path from "path"; import { fileExists, safeReadDir, readJson } from "../utils/fs"; import type { RepoApp, RepoAnalysis, Area } from "./analyzer"; -import { analyzeRepo, sanitizeAreaName } from "./analyzer"; +import { analyzeRepo, sanitizeAreaName, loadPrimerConfig } from "./analyzer"; +import type { ExtraDefinition, PolicyConfig } from "./policy"; +import { loadPolicy, resolveChain } from "./policy"; export type ReadinessPillar = | "style-validation" @@ -80,15 +82,17 @@ export type ReadinessReport = { criteria: ReadinessCriterionResult[]; extras: ReadinessExtraResult[]; areaReports?: AreaReadinessReport[]; + policies?: { chain: string[]; criteriaCount: number }; }; type ReadinessOptions = { repoPath: string; includeExtras?: boolean; perArea?: boolean; + policies?: string[]; }; -type ReadinessContext = { +export type ReadinessContext = { repoPath: string; analysis: RepoAnalysis; apps: RepoApp[]; @@ -98,7 +102,7 @@ type ReadinessContext = { areaFiles?: string[]; }; -type ReadinessCriterion = { +export type ReadinessCriterion = { id: string; title: string; pillar: ReadinessPillar; @@ -109,7 +113,7 @@ type ReadinessCriterion = { check: (context: ReadinessContext, app?: RepoApp, area?: Area) => Promise; }; -type CheckResult = { +export type CheckResult = { status: ReadinessStatus; reason?: string; evidence?: string[]; @@ -130,10 +134,43 @@ export async function runReadinessReport(options: ReadinessOptions): Promise entry.result.status === "pass").length; const total = appResults.length; const passRate = total ? passed / total : 0; - const status: ReadinessStatus = passRate >= 0.8 ? "pass" : "fail"; + const status: ReadinessStatus = passRate >= passRateThreshold ? "pass" : "fail"; const failures = appResults .filter((entry) => entry.result.status !== "pass") .map((entry) => entry.app.name); @@ -221,7 +258,7 @@ export async function runReadinessReport(options: ReadinessOptions): Promise 0) { - const areaCriteria = criteria.filter((c) => c.scope === "area"); + const areaCriteria = resolvedCriteria.filter((c) => c.scope === "area"); areaReports = []; for (const area of areas) { @@ -265,7 +302,7 @@ export async function runReadinessReport(options: ReadinessOptions): Promise r.status === "pass").length; const total = perAreaResults.length; const passRate = total ? passed / total : 0; - criterion.status = passRate >= 0.8 ? "pass" : "fail"; + criterion.status = passRate >= passRateThreshold ? "pass" : "fail"; criterion.reason = criterion.status === "pass" ? undefined : `Only ${passed}/${total} areas pass this check.`; criterion.passRate = passRate; @@ -278,12 +315,12 @@ export async function runReadinessReport(options: ReadinessOptions): Promise level.achieved) .reduce((acc, level) => Math.max(acc, level.level), 0); - const extras = options.includeExtras === false ? [] : await runExtras(context); + const extras = options.includeExtras === false ? [] : await runExtras(context, resolvedExtras); return { repoPath, @@ -295,11 +332,12 @@ export async function runReadinessReport(options: ReadinessOptions): Promise { - const results: ReadinessExtraResult[] = []; - - results.push({ - id: "agents-doc", - title: "AGENTS.md present", - status: (await fileExists(path.join(context.repoPath, "AGENTS.md"))) ? "pass" : "fail", - reason: "Missing AGENTS.md to guide coding agents." - }); - - results.push({ - id: "pr-template", - title: "Pull request template present", - status: (await hasPullRequestTemplate(context.repoPath)) ? "pass" : "fail", - reason: "Missing PR template for consistent reviews." - }); - - results.push({ - id: "pre-commit", - title: "Pre-commit hooks configured", - status: (await hasPrecommitConfig(context.repoPath)) ? "pass" : "fail", - reason: "Missing pre-commit or Husky configuration for fast feedback." - }); - - results.push({ - id: "architecture-doc", - title: "Architecture guide present", - status: (await hasArchitectureDoc(context.repoPath)) ? "pass" : "fail", - reason: "Missing architecture documentation." - }); +export function buildExtras(): ExtraDefinition[] { + return [ + { + id: "agents-doc", + title: "AGENTS.md present", + check: async (context) => ({ + status: (await fileExists(path.join(context.repoPath, "AGENTS.md"))) ? "pass" : "fail", + reason: "Missing AGENTS.md to guide coding agents." + }) + }, + { + id: "pr-template", + title: "Pull request template present", + check: async (context) => ({ + status: (await hasPullRequestTemplate(context.repoPath)) ? "pass" : "fail", + reason: "Missing PR template for consistent reviews." + }) + }, + { + id: "pre-commit", + title: "Pre-commit hooks configured", + check: async (context) => ({ + status: (await hasPrecommitConfig(context.repoPath)) ? "pass" : "fail", + reason: "Missing pre-commit or Husky configuration for fast feedback." + }) + }, + { + id: "architecture-doc", + title: "Architecture guide present", + check: async (context) => ({ + status: (await hasArchitectureDoc(context.repoPath)) ? "pass" : "fail", + reason: "Missing architecture documentation." + }) + } + ]; +} +async function runExtras( + context: ReadinessContext, + extraDefs: ExtraDefinition[] +): Promise { + const results: ReadinessExtraResult[] = []; + for (const def of extraDefs) { + const result = await def.check(context); + results.push({ + id: def.id, + title: def.title, + status: result.status, + reason: result.reason + }); + } return results; } @@ -846,7 +904,10 @@ function summarizePillars(criteria: ReadinessCriterionResult[]): ReadinessPillar }); } -function summarizeLevels(criteria: ReadinessCriterionResult[]): ReadinessLevelSummary[] { +function summarizeLevels( + criteria: ReadinessCriterionResult[], + passRateThreshold = 0.8 +): ReadinessLevelSummary[] { const levelNames: Record = { 1: "Functional", 2: "Documented", @@ -873,7 +934,7 @@ function summarizeLevels(criteria: ReadinessCriterionResult[]): ReadinessLevelSu for (const summary of summaries) { const allPrior = summaries.filter((candidate) => candidate.level <= summary.level); const achieved = allPrior.every( - (candidate) => candidate.total > 0 && candidate.passRate >= 0.8 + (candidate) => candidate.total > 0 && candidate.passRate >= passRateThreshold ); summary.achieved = achieved; } diff --git a/src/ui/BatchReadinessTui.tsx b/src/ui/BatchReadinessTui.tsx index d0742fd..3a6e5e9 100644 --- a/src/ui/BatchReadinessTui.tsx +++ b/src/ui/BatchReadinessTui.tsx @@ -19,6 +19,7 @@ import { StaticBanner } from "./AnimatedBanner"; type Props = { token: string; outputPath?: string; + policies?: string[]; }; type Status = @@ -37,7 +38,7 @@ type ProcessResult = { error?: string; }; -export function BatchReadinessTui({ token, outputPath }: Props): React.JSX.Element { +export function BatchReadinessTui({ token, outputPath, policies }: Props): React.JSX.Element { const app = useApp(); const [status, setStatus] = useState("loading-orgs"); const [message, setMessage] = useState("Fetching organizations..."); @@ -138,7 +139,7 @@ export function BatchReadinessTui({ token, outputPath }: Props): React.JSX.Eleme // Run readiness report setProcessingMessage(`Running readiness report for ${repo.fullName}...`); - const report = await runReadinessReport({ repoPath: repoDir }); + const report = await runReadinessReport({ repoPath: repoDir, policies }); results.push({ repo: repo.fullName, From c6cf73305888e37c295d71cb2c4fc704b51f3f0f Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 17:43:21 -0800 Subject: [PATCH 46/84] refactor: update evaluation cases and prompts --- primer.eval.json | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/primer.eval.json b/primer.eval.json index f892d2a..0544a38 100644 --- a/primer.eval.json +++ b/primer.eval.json @@ -4,18 +4,33 @@ "cases": [ { "id": "case-1", - "prompt": "What is the main purpose of the Primer project and what are its key entrypoints?", - "expectation": "Primer is a TypeScript CLI tool for priming repositories for AI-assisted development and evaluation. The main entrypoint is src/index.ts, which calls runCli in src/cli.ts. Key directories include src/commands/ for CLI subcommands, src/services/ for core logic, and src/ui/ for the Ink/React-based terminal UI." + "prompt": "What is Primer's architecture and how are its layers organized?", + "expectation": "Primer is a TypeScript CLI tool for priming repositories for AI-assisted development. It follows a layered architecture: src/index.ts is the entrypoint which defaults to the interactive TUI when no command is given, otherwise delegates to runCli in src/cli.ts. Commander wires subcommands (in src/commands/) to service functions (in src/services/), with shared utilities in src/utils/ and Ink/React TUI components in src/ui/. The CLI layer handles option parsing and output formatting, services contain all core logic (analyzer, instructions, readiness, evaluator, batch, git, github, azureDevops, etc.), and utils provide cross-cutting concerns like safe file I/O, structured output, and working directory management." }, { "id": "case-2", - "prompt": "How do I build, lint, and test the Primer project locally?", - "expectation": "Install dependencies with npm install. Build with npm run build, lint with npm run lint, and test with npm run test. Type checking is done with npx tsc -p tsconfig.json --noEmit, and coverage with npm run test:coverage." + "prompt": "What is the local development workflow and how does building for distribution differ?", + "expectation": "For local development, run commands directly with npx tsx src/index.ts (or npm run dev) — tsx executes TypeScript without a build step. Linting uses eslint (npm run lint), formatting uses prettier (npm run format / format:check), type checking uses tsc --noEmit (npm run typecheck), and tests run with vitest using v8 coverage (npm run test / test:coverage). Husky and lint-staged enforce linting on pre-commit. For distribution, tsup bundles src/index.ts into ESM-only output targeting Node 20+, with a shebang banner, sourcemaps, and external dependencies not bundled." }, { "id": "case-3", - "prompt": "Where should new CLI commands and core logic be placed, and what conventions should be followed for configuration files?", - "expectation": "New CLI commands should be placed in src/commands/, and core logic in src/services/. Use ESM syntax everywhere, strict TypeScript targeting ES2022 and module ESNext, and only overwrite config files like .vscode/settings.json and .vscode/mcp.json with --force. All Copilot/VS Code settings reference .github/copilot-instructions.md and enable MCP." + "prompt": "What patterns and conventions should I follow when adding new functionality to this codebase?", + "expectation": "Place new CLI commands in src/commands/, core logic in src/services/, and TUI components in src/ui/. All commands must support --json and --quiet flags via the withGlobalOpts wrapper in cli.ts, and return structured results using the CommandResult type from utils/output.ts. Use outputResult() for dual JSON/human output and shouldLog() to gate stderr progress. File writes must use safeWriteFile() which prevents accidental overwrites unless --force is passed. ESM syntax is required everywhere, TypeScript is strict (ES2022 target, ESNext module). Area-specific instructions go in .github/instructions/{name}.instructions.md with YAML frontmatter. The default model for Copilot SDK operations is claude-sonnet-4.5." + }, + { + "id": "case-4", + "prompt": "How does the AI readiness assessment work, and how can it be customized with policies?", + "expectation": "The readiness service in src/services/readiness.ts evaluates repositories across 9 pillars (style-validation, build-system, testing, documentation, dev-environment, code-quality, observability, security, ai-tooling) and assigns a maturity level from 1 (Functional) to 5 (Autonomous). Each criterion has a scope — repo, app, or area — determining whether it runs once, per monorepo app, or per detected area. buildCriteria() returns 20+ built-in checks and buildExtras() adds optional ones. Policies loaded via src/services/policy.ts can customize the assessment: loadPolicy() reads JSON/TS/JS configs, and resolveChain() merges a chain of policies that can disable, override, or add criteria and set pass-rate thresholds. Results can be rendered as an interactive HTML report by src/services/visualReport.ts with dark/light theme toggle and expandable per-pillar details." + }, + { + "id": "case-5", + "prompt": "How does Primer generate Copilot instructions, including for monorepos with multiple areas?", + "expectation": "The instruction generation pipeline starts with the analyzer (src/services/analyzer.ts) which scans the repo to detect languages, frameworks, monorepo apps, and logical areas (frontend, backend, etc.) with glob patterns. For root-level instructions, generateCopilotInstructions() in src/services/instructions.ts creates a Copilot SDK session that explores the codebase using tools (glob, view, grep) and produces .github/copilot-instructions.md. For area-specific instructions, generateAreaInstructions() generates focused content per area, and buildAreaFrontmatter() creates YAML frontmatter with applyTo glob patterns so VS Code scopes them to the right files. These are written to .github/instructions/{sanitized-name}.instructions.md via writeAreaInstruction(). The instructions command supports --areas to generate all area instructions, --areas-only to skip the root file, and --area for a single area." + }, + { + "id": "case-6", + "prompt": "What safety and security patterns does the codebase use for file operations and CLI output?", + "expectation": "For file safety, src/utils/fs.ts provides safeWriteFile() which checks for existing files and only overwrites with an explicit force flag, validateCachePath() which rejects paths containing .. or symlinks to prevent path traversal, and fileExists() with symlink rejection. The repo.ts validators use regexes (GITHUB_REPO_RE, AZURE_REPO_RE) that reject traversal patterns in repo identifiers. For credential safety, git.ts and batch.ts use sanitizeError() to strip tokens from error messages before surfacing them. For structured output, utils/output.ts defines the CommandResult type with ok/status/data fields, outputResult() writes JSON to stdout or human text to stderr based on --json/--quiet flags, and shouldLog() gates progress output. This dual-mode pattern ensures all commands work both interactively and in headless automation pipelines." } ] } From 97ce317afd13b8b1f8b6e88bf89c9e766a1ba89b Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 17:44:47 -0800 Subject: [PATCH 47/84] fix: improve path validation logic --- src/services/policy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/policy.ts b/src/services/policy.ts index 29f4aae..5621c02 100644 --- a/src/services/policy.ts +++ b/src/services/policy.ts @@ -165,7 +165,7 @@ export async function loadPolicy( const jsonOnly = options?.jsonOnly ?? false; // Local file path (relative or absolute) - if (source.startsWith(".") || source.startsWith("/")) { + if (source.startsWith(".") || path.isAbsolute(source)) { const resolved = path.resolve(source); if (resolved.endsWith(".json")) { const data = await readJson(resolved); From efd88f05003b6e923aa566a274a3dd295b9e14b4 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 17:50:27 -0800 Subject: [PATCH 48/84] feat: add custom policy support --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/README.md b/README.md index 3d9e959..8527760 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ primer readiness # terminal summary primer readiness --visual # GitHub-themed HTML report primer readiness --json # machine-readable JSON primer readiness --per-area # include per-area breakdown +primer readiness --policy ./strict.json # apply a custom policy primer readiness /path/to/repo --output report.html ``` @@ -105,6 +106,49 @@ primer readiness /path/to/repo --output report.html **AI Tooling checks** include `copilot-instructions.md`, `CLAUDE.md`, `AGENTS.md`, `.cursorrules`, MCP configs, custom agents, and Copilot/Claude skills. +#### Policies + +Policies let you customize which readiness criteria are evaluated, override their metadata, and tune pass-rate thresholds. Multiple policies chain together (last wins). + +```bash +# Apply a local JSON policy +primer readiness --policy ./my-policy.json + +# Chain multiple policies (comma-separated) +primer readiness --policy ./base.json,./strict.json + +# Also works with batch-readiness +primer batch-readiness --policy ./org-policy.json +``` + +A policy file looks like: + +```json +{ + "name": "my-org-policy", + "criteria": { + "disable": ["lint-config"], + "override": { "readme": { "impact": "high", "level": 2 } } + }, + "extras": { + "disable": ["pre-commit"] + }, + "thresholds": { + "passRate": 0.9 + } +} +``` + +Policies can also be set in `primer.config.json` so they apply automatically: + +```json +{ + "policies": ["./my-policy.json"] +} +``` + +> **Security:** Config-sourced policies are restricted to JSON files only — JS/TS module and npm package policies must be passed via `--policy` to prevent untrusted code execution. + ### `primer batch-readiness` Consolidated visual readiness report across multiple repositories: From 6bef46621ee03735c6731adb2a600cd931236715 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 21:38:32 -0800 Subject: [PATCH 49/84] feat: add VS Code extension wrapping CLI for key workflows --- .github/copilot-instructions.md | 3 +- .github/workflows/ci.yml | 26 +- .github/workflows/release-please.yml | 34 + src/services/evalScaffold.ts | 254 +- src/services/evaluator.ts | 1 + src/services/instructions.ts | 211 +- src/services/visualReport.ts | 1 + src/utils/cwd.ts | 31 - vscode-extension/.vscodeignore | 7 + vscode-extension/README.md | 61 + vscode-extension/esbuild.mjs | 40 + vscode-extension/out/extension.js | 23966 ++++++++++++++++ vscode-extension/out/extension.js.map | 7 + vscode-extension/package-lock.json | 944 + vscode-extension/package.json | 219 + vscode-extension/resources/primer.svg | 8 + vscode-extension/src/auth.ts | 12 + vscode-extension/src/commands/analyze.ts | 42 + vscode-extension/src/commands/eval.ts | 109 + vscode-extension/src/commands/generate.ts | 90 + vscode-extension/src/commands/init.ts | 67 + vscode-extension/src/commands/instructions.ts | 74 + vscode-extension/src/commands/pr.ts | 101 + vscode-extension/src/commands/readiness.ts | 49 + vscode-extension/src/extension.ts | 101 + vscode-extension/src/progress.ts | 27 + vscode-extension/src/services.ts | 12 + vscode-extension/src/types.ts | 10 + .../src/views/AnalysisTreeProvider.ts | 104 + .../src/views/ReadinessTreeProvider.ts | 120 + vscode-extension/src/views/providers.ts | 5 + vscode-extension/src/webview.ts | 25 + vscode-extension/tsconfig.json | 19 + 33 files changed, 26511 insertions(+), 269 deletions(-) delete mode 100644 src/utils/cwd.ts create mode 100644 vscode-extension/.vscodeignore create mode 100644 vscode-extension/README.md create mode 100644 vscode-extension/esbuild.mjs create mode 100644 vscode-extension/out/extension.js create mode 100644 vscode-extension/out/extension.js.map create mode 100644 vscode-extension/package-lock.json create mode 100644 vscode-extension/package.json create mode 100644 vscode-extension/resources/primer.svg create mode 100644 vscode-extension/src/auth.ts create mode 100644 vscode-extension/src/commands/analyze.ts create mode 100644 vscode-extension/src/commands/eval.ts create mode 100644 vscode-extension/src/commands/generate.ts create mode 100644 vscode-extension/src/commands/init.ts create mode 100644 vscode-extension/src/commands/instructions.ts create mode 100644 vscode-extension/src/commands/pr.ts create mode 100644 vscode-extension/src/commands/readiness.ts create mode 100644 vscode-extension/src/extension.ts create mode 100644 vscode-extension/src/progress.ts create mode 100644 vscode-extension/src/services.ts create mode 100644 vscode-extension/src/types.ts create mode 100644 vscode-extension/src/views/AnalysisTreeProvider.ts create mode 100644 vscode-extension/src/views/ReadinessTreeProvider.ts create mode 100644 vscode-extension/src/views/providers.ts create mode 100644 vscode-extension/src/webview.ts create mode 100644 vscode-extension/tsconfig.json diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index bc8e894..941c886 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -83,7 +83,6 @@ Ink/React components for interactive terminal workflows: - `output.ts` — `CommandResult` type (`{ ok, status, data?, errors? }`), `ProgressReporter` interface - `fs.ts` — `safeWriteFile()` (rejects symlinks, requires `--force`), `validateCachePath()` (prevents path traversal) -- `cwd.ts` — `withCwd()` serialized lock for Copilot SDK process directory - `logger.ts` — Structured logging - `repo.ts` / `pr.ts` — Shared repo/PR helpers @@ -93,7 +92,7 @@ Ink/React components for interactive terminal workflows: - **CommandResult pattern:** All commands return `CommandResult` with `{ ok, status, data?, errors? }` - **Safe writes:** `safeWriteFile()` rejects symlinks and skips existing files unless `--force` - **Path safety:** `validateCachePath()` prevents traversal in `.primer-cache/` -- **Copilot SDK:** Sessions require `withCwd()` for process working directory serialization +- **Copilot SDK:** Sessions use `workingDirectory` in `SessionConfig` for scoping tool operations - **Monorepo-aware:** Analyzer detects npm/pnpm/yarn/cargo/go/dotnet/gradle/maven workspaces; `Area` type scopes instructions via `applyTo` globs - **Single glob pass** for convention source discovery (see `src/services/instructions.ts`) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c8a778..1ca4b0b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,6 +40,24 @@ jobs: - run: npm ci - run: npm run typecheck + typecheck-extension: + name: Typecheck Extension + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: | + package-lock.json + vscode-extension/package-lock.json + - run: npm ci + - run: npm ci + working-directory: vscode-extension + - run: npx tsc --noEmit + working-directory: vscode-extension + test: name: Test (Node ${{ matrix.node }}, ${{ matrix.os }}) runs-on: ${{ matrix.os }} @@ -73,14 +91,20 @@ jobs: build: name: Build & Verify runs-on: ubuntu-latest - needs: [lint, typecheck, test] + needs: [lint, typecheck, typecheck-extension, test] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm + cache-dependency-path: | + package-lock.json + vscode-extension/package-lock.json - run: npm ci - run: npm run build - name: Verify CLI run: node dist/index.js --version + - name: Build extension + run: npm ci && node esbuild.mjs + working-directory: vscode-extension diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 3547bac..13753bd 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -11,9 +11,43 @@ permissions: jobs: release-please: runs-on: ubuntu-latest + outputs: + release_created: ${{ steps.release.outputs.release_created }} + tag_name: ${{ steps.release.outputs.tag_name }} steps: - name: Release + id: release uses: google-github-actions/release-please-action@v4 with: config-file: release-please-config.json manifest-file: release-please-manifest.json + + package-extension: + name: Package Extension + runs-on: ubuntu-latest + needs: release-please + if: ${{ needs.release-please.outputs.release_created }} + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: | + package-lock.json + vscode-extension/package-lock.json + - run: npm ci + - run: npm ci + working-directory: vscode-extension + - name: Build extension + run: node esbuild.mjs --production + working-directory: vscode-extension + - name: Package VSIX + run: npx @vscode/vsce package --no-dependencies + working-directory: vscode-extension + - name: Upload VSIX to release + env: + GH_TOKEN: ${{ github.token }} + run: gh release upload ${{ needs.release-please.outputs.tag_name }} vscode-extension/*.vsix diff --git a/src/services/evalScaffold.ts b/src/services/evalScaffold.ts index 2890ba9..ef6a7d4 100644 --- a/src/services/evalScaffold.ts +++ b/src/services/evalScaffold.ts @@ -1,5 +1,4 @@ import { DEFAULT_MODEL } from "../config"; -import { withCwd } from "../utils/cwd"; import type { Area } from "./analyzer"; import { assertCopilotCliReady } from "./copilot"; @@ -37,143 +36,142 @@ export async function generateEvalScaffold(options: EvalScaffoldOptions): Promis const count = Math.max(1, options.count); const progress = options.onProgress ?? (() => {}); - return withCwd(repoPath, async () => { - progress("Checking Copilot CLI..."); - const cliConfig = await assertCopilotCliReady(); - - progress("Starting Copilot SDK..."); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient(cliConfig); - - try { - progress("Creating session..."); - const preferredModel = options.model ?? DEFAULT_MODEL; - const session = await client.createSession({ - model: preferredModel, - streaming: true, - systemMessage: { - content: - "You are an expert codebase analyst specializing in deep architectural analysis. Generate challenging, cross-cutting eval cases for this repository that require synthesizing information from multiple files and tracing logic across layers. Avoid trivial questions answerable from a single file read or grep. Use tools (glob, view, grep) extensively to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation})." - }, - infiniteSessions: { enabled: false } - }); - - let content = ""; - session.on((event: { type: string; data?: Record }) => { - if (event.type === "assistant.message_delta") { - const delta = event.data?.deltaContent as string | undefined; - if (delta) { - content += delta; - progress("Generating eval cases..."); - } - } else if (event.type === "tool.execution_start") { - const toolName = event.data?.toolName as string | undefined; - progress(`Using tool: ${toolName ?? "..."}`); - } else if (event.type === "session.error") { - const errorMsg = (event.data?.message as string) ?? "Unknown error"; - if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { - throw new Error( - "Copilot CLI not logged in. Run `copilot` then `/login` to authenticate." - ); - } + progress("Checking Copilot CLI..."); + const cliConfig = await assertCopilotCliReady(); + + progress("Starting Copilot SDK..."); + const sdk = await import("@github/copilot-sdk"); + const client = new sdk.CopilotClient(cliConfig); + + try { + progress("Creating session..."); + const preferredModel = options.model ?? DEFAULT_MODEL; + const session = await client.createSession({ + model: preferredModel, + streaming: true, + workingDirectory: repoPath, + systemMessage: { + content: + "You are an expert codebase analyst specializing in deep architectural analysis. Generate challenging, cross-cutting eval cases for this repository that require synthesizing information from multiple files and tracing logic across layers. Avoid trivial questions answerable from a single file read or grep. Use tools (glob, view, grep) extensively to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation})." + }, + infiniteSessions: { enabled: false } + }); + + let content = ""; + session.on((event: { type: string; data?: Record }) => { + if (event.type === "assistant.message_delta") { + const delta = event.data?.deltaContent as string | undefined; + if (delta) { + content += delta; + progress("Generating eval cases..."); } - }); - - const areaContext = options.areas?.length - ? [ - "", - "AREA CONTEXT:", - "This repo has the following areas:", - ...options.areas.map((a) => { - const patterns = Array.isArray(a.applyTo) ? a.applyTo.join(", ") : a.applyTo; - return `- ${a.name} (${patterns})`; - }), - "", - "Generate a mix of:", - "- Single-area cases that go deep into one area's internals", - "- Cross-area cases that test interactions between areas", - 'Include an optional "area" field in each case to tag which area(s) it targets.' - ].join("\n") - : ""; - - const prompt = [ - `Analyze this repository and generate ${count} eval cases.`, - "", - "IMPORTANT: Generate HARD eval cases that require deep, cross-cutting understanding of the codebase.", - "Each case should require synthesizing information from MULTIPLE files or tracing logic across several layers.", - "Do NOT generate simple questions that can be answered by reading a single file or running a single grep.", - "", - "Good eval case examples (adapt to this repo):", - "- Questions about how data flows end-to-end through multiple modules (e.g., 'Trace what happens when X is called — which services, transforms, and side effects are involved?')", - "- Questions about implicit conventions or patterns that span many files (e.g., 'What error-handling pattern is used across the service layer, and where does it deviate?')", - "- Questions requiring understanding of runtime behavior not obvious from static code (e.g., 'What is the order of initialization and what would break if module X loaded before Y?')", - "- Questions about non-obvious interactions between components (e.g., 'How does changing config option X affect the behavior of feature Y?')", - "- Questions about edge cases or failure modes that require reading implementation details across files", - "- Questions that require understanding the type system, generics, or shared interfaces across module boundaries", - "", - "Bad eval case examples (avoid these):", - "- 'What does this project do?' (answered by README alone)", - "- 'How do I build/test?' (answered by package.json alone)", - "- 'What is the entrypoint?' (answered by a single file)", - "- Any question answerable by reading one file or searching for one keyword", - "", - "Use tools extensively to inspect the codebase — read multiple files, trace imports, follow call chains.", - "If this is a monorepo (npm/pnpm/yarn workspaces, Cargo workspace, Go workspace, .NET solution, Gradle/Maven multi-module), generate cases that involve cross-app dependencies, shared libraries, and how changes in one app affect others.", - "Ensure cases cover cross-cutting concerns: data flow, error propagation, configuration impact, implicit coupling, architectural invariants.", - "Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).", - "Return JSON ONLY (no markdown, no commentary) in this schema:", - '{\n "instructionFile": ".github/copilot-instructions.md",\n "systemMessage": "...",\n "cases": [\n {"id": "case-1", "prompt": "...", "expectation": "...", "area": "optional-area-name"}\n ]\n}', - areaContext - ].join("\n"); - - progress("Analyzing codebase..."); - let timedOutWaitingForIdle = false; - try { - await session.sendAndWait({ prompt }, EVAL_SCAFFOLD_TIMEOUT_MS); - } catch (error) { - if (!isSessionIdleTimeoutError(error)) { - throw error; - } - - timedOutWaitingForIdle = true; - progress("Generation took longer than expected; requesting final JSON output..."); - - try { - await session.sendAndWait( - { - prompt: - "Stop analysis and return only the final JSON scaffold now. Do not include markdown or commentary." - }, - EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS + } else if (event.type === "tool.execution_start") { + const toolName = event.data?.toolName as string | undefined; + progress(`Using tool: ${toolName ?? "..."}`); + } else if (event.type === "session.error") { + const errorMsg = (event.data?.message as string) ?? "Unknown error"; + if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { + throw new Error( + "Copilot CLI not logged in. Run `copilot` then `/login` to authenticate." ); - } catch (recoveryError) { - if (!isSessionIdleTimeoutError(recoveryError)) { - throw recoveryError; - } - progress("Still waiting on idle; attempting to parse partial output..."); } - } finally { - await session.destroy(); } + }); + + const areaContext = options.areas?.length + ? [ + "", + "AREA CONTEXT:", + "This repo has the following areas:", + ...options.areas.map((a) => { + const patterns = Array.isArray(a.applyTo) ? a.applyTo.join(", ") : a.applyTo; + return `- ${a.name} (${patterns})`; + }), + "", + "Generate a mix of:", + "- Single-area cases that go deep into one area's internals", + "- Cross-area cases that test interactions between areas", + 'Include an optional "area" field in each case to tag which area(s) it targets.' + ].join("\n") + : ""; + + const prompt = [ + `Analyze this repository and generate ${count} eval cases.`, + "", + "IMPORTANT: Generate HARD eval cases that require deep, cross-cutting understanding of the codebase.", + "Each case should require synthesizing information from MULTIPLE files or tracing logic across several layers.", + "Do NOT generate simple questions that can be answered by reading a single file or running a single grep.", + "", + "Good eval case examples (adapt to this repo):", + "- Questions about how data flows end-to-end through multiple modules (e.g., 'Trace what happens when X is called — which services, transforms, and side effects are involved?')", + "- Questions about implicit conventions or patterns that span many files (e.g., 'What error-handling pattern is used across the service layer, and where does it deviate?')", + "- Questions requiring understanding of runtime behavior not obvious from static code (e.g., 'What is the order of initialization and what would break if module X loaded before Y?')", + "- Questions about non-obvious interactions between components (e.g., 'How does changing config option X affect the behavior of feature Y?')", + "- Questions about edge cases or failure modes that require reading implementation details across files", + "- Questions that require understanding the type system, generics, or shared interfaces across module boundaries", + "", + "Bad eval case examples (avoid these):", + "- 'What does this project do?' (answered by README alone)", + "- 'How do I build/test?' (answered by package.json alone)", + "- 'What is the entrypoint?' (answered by a single file)", + "- Any question answerable by reading one file or searching for one keyword", + "", + "Use tools extensively to inspect the codebase — read multiple files, trace imports, follow call chains.", + "If this is a monorepo (npm/pnpm/yarn workspaces, Cargo workspace, Go workspace, .NET solution, Gradle/Maven multi-module), generate cases that involve cross-app dependencies, shared libraries, and how changes in one app affect others.", + "Ensure cases cover cross-cutting concerns: data flow, error propagation, configuration impact, implicit coupling, architectural invariants.", + "Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).", + "Return JSON ONLY (no markdown, no commentary) in this schema:", + '{\n "instructionFile": ".github/copilot-instructions.md",\n "systemMessage": "...",\n "cases": [\n {"id": "case-1", "prompt": "...", "expectation": "...", "area": "optional-area-name"}\n ]\n}', + areaContext + ].join("\n"); + + progress("Analyzing codebase..."); + let timedOutWaitingForIdle = false; + try { + await session.sendAndWait({ prompt }, EVAL_SCAFFOLD_TIMEOUT_MS); + } catch (error) { + if (!isSessionIdleTimeoutError(error)) { + throw error; + } + + timedOutWaitingForIdle = true; + progress("Generation took longer than expected; requesting final JSON output..."); - let parsed: EvalConfig; try { - parsed = parseEvalConfig(content); - } catch (error) { - if (timedOutWaitingForIdle) { - throw new Error( - "Timed out waiting for scaffold generation to become idle before a complete JSON payload was returned. Try again or lower `--count`." - ); + await session.sendAndWait( + { + prompt: + "Stop analysis and return only the final JSON scaffold now. Do not include markdown or commentary." + }, + EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS + ); + } catch (recoveryError) { + if (!isSessionIdleTimeoutError(recoveryError)) { + throw recoveryError; } - throw error; + progress("Still waiting on idle; attempting to parse partial output..."); } - - const normalized = normalizeEvalConfig(parsed, count); - return normalized; } finally { - await client.stop(); + await session.destroy(); } - }); + + let parsed: EvalConfig; + try { + parsed = parseEvalConfig(content); + } catch (error) { + if (timedOutWaitingForIdle) { + throw new Error( + "Timed out waiting for scaffold generation to become idle before a complete JSON payload was returned. Try again or lower `--count`." + ); + } + throw error; + } + + const normalized = normalizeEvalConfig(parsed, count); + return normalized; + } finally { + await client.stop(); + } } function isSessionIdleTimeoutError(error: unknown): boolean { diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index 5ba873d..85647ec 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -622,6 +622,7 @@ function buildTrajectoryViewerHtml(data: Record): string { + Primer Eval Results + + +
    +
    + +
    +

    Eval Results

    +
    +
    +
    + +
    + +
    + +
    +
    Impact of Instructions
    +
    +
    + +
    +
    Results by Case
    +
    +
    + +
    +
    Case Details
    +
    +
    + + + +`; +} +function sanitizeEventData(data) { + if (!data) return void 0; + const sanitized = {}; + for (const [key, value] of Object.entries(data)) { + if (key === "deltaContent" && typeof value === "string") { + sanitized.deltaChars = value.length; + sanitized.deltaPreview = value.slice(0, 120); + continue; + } + sanitized[key] = sanitizeValue(value, 0); + } + return sanitized; +} +function sanitizeValue(value, depth) { + if (depth > 4) return "[depth-limit]"; + if (typeof value === "string") { + return value.length > 2e3 ? `${value.slice(0, 2e3)}\u2026` : value; + } + if (Array.isArray(value)) { + return value.slice(0, 50).map((entry) => sanitizeValue(entry, depth + 1)); + } + if (value && typeof value === "object") { + const obj = {}; + for (const [key, entry] of Object.entries(value)) { + obj[key] = sanitizeValue(entry, depth + 1); + } + return obj; + } + return value; +} + +// ../src/services/evalScaffold.ts +var EVAL_SCAFFOLD_TIMEOUT_MS = 6e5; +var EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS = 9e4; +async function generateEvalScaffold(options) { + const repoPath = options.repoPath; + const count = Math.max(1, options.count); + const progress = options.onProgress ?? (() => {}); + progress("Checking Copilot CLI..."); + const cliConfig = await assertCopilotCliReady(); + progress("Starting Copilot SDK..."); + const sdk = await import("@github/copilot-sdk"); + const client = new sdk.CopilotClient(cliConfig); + try { + progress("Creating session..."); + const preferredModel = options.model ?? DEFAULT_MODEL; + const session = await client.createSession({ + model: preferredModel, + streaming: true, + workingDirectory: repoPath, + systemMessage: { + content: + "You are an expert codebase analyst specializing in deep architectural analysis. Generate challenging, cross-cutting eval cases for this repository that require synthesizing information from multiple files and tracing logic across layers. Avoid trivial questions answerable from a single file read or grep. Use tools (glob, view, grep) extensively to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation})." + }, + infiniteSessions: { enabled: false } + }); + let content = ""; + session.on((event) => { + if (event.type === "assistant.message_delta") { + const delta = event.data?.deltaContent; + if (delta) { + content += delta; + progress("Generating eval cases..."); + } + } else if (event.type === "tool.execution_start") { + const toolName = event.data?.toolName; + progress(`Using tool: ${toolName ?? "..."}`); + } else if (event.type === "session.error") { + const errorMsg = event.data?.message ?? "Unknown error"; + if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { + throw new Error( + "Copilot CLI not logged in. Run `copilot` then `/login` to authenticate." + ); + } + } + }); + const areaContext = options.areas?.length + ? [ + "", + "AREA CONTEXT:", + "This repo has the following areas:", + ...options.areas.map((a) => { + const patterns = Array.isArray(a.applyTo) ? a.applyTo.join(", ") : a.applyTo; + return `- ${a.name} (${patterns})`; + }), + "", + "Generate a mix of:", + "- Single-area cases that go deep into one area's internals", + "- Cross-area cases that test interactions between areas", + 'Include an optional "area" field in each case to tag which area(s) it targets.' + ].join("\n") + : ""; + const prompt = [ + `Analyze this repository and generate ${count} eval cases.`, + "", + "IMPORTANT: Generate HARD eval cases that require deep, cross-cutting understanding of the codebase.", + "Each case should require synthesizing information from MULTIPLE files or tracing logic across several layers.", + "Do NOT generate simple questions that can be answered by reading a single file or running a single grep.", + "", + "Good eval case examples (adapt to this repo):", + "- Questions about how data flows end-to-end through multiple modules (e.g., 'Trace what happens when X is called \u2014 which services, transforms, and side effects are involved?')", + "- Questions about implicit conventions or patterns that span many files (e.g., 'What error-handling pattern is used across the service layer, and where does it deviate?')", + "- Questions requiring understanding of runtime behavior not obvious from static code (e.g., 'What is the order of initialization and what would break if module X loaded before Y?')", + "- Questions about non-obvious interactions between components (e.g., 'How does changing config option X affect the behavior of feature Y?')", + "- Questions about edge cases or failure modes that require reading implementation details across files", + "- Questions that require understanding the type system, generics, or shared interfaces across module boundaries", + "", + "Bad eval case examples (avoid these):", + "- 'What does this project do?' (answered by README alone)", + "- 'How do I build/test?' (answered by package.json alone)", + "- 'What is the entrypoint?' (answered by a single file)", + "- Any question answerable by reading one file or searching for one keyword", + "", + "Use tools extensively to inspect the codebase \u2014 read multiple files, trace imports, follow call chains.", + "If this is a monorepo (npm/pnpm/yarn workspaces, Cargo workspace, Go workspace, .NET solution, Gradle/Maven multi-module), generate cases that involve cross-app dependencies, shared libraries, and how changes in one app affect others.", + "Ensure cases cover cross-cutting concerns: data flow, error propagation, configuration impact, implicit coupling, architectural invariants.", + "Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).", + "Return JSON ONLY (no markdown, no commentary) in this schema:", + '{\n "instructionFile": ".github/copilot-instructions.md",\n "systemMessage": "...",\n "cases": [\n {"id": "case-1", "prompt": "...", "expectation": "...", "area": "optional-area-name"}\n ]\n}', + areaContext + ].join("\n"); + progress("Analyzing codebase..."); + let timedOutWaitingForIdle = false; + try { + await session.sendAndWait({ prompt }, EVAL_SCAFFOLD_TIMEOUT_MS); + } catch (error) { + if (!isSessionIdleTimeoutError(error)) { + throw error; + } + timedOutWaitingForIdle = true; + progress("Generation took longer than expected; requesting final JSON output..."); + try { + await session.sendAndWait( + { + prompt: + "Stop analysis and return only the final JSON scaffold now. Do not include markdown or commentary." + }, + EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS + ); + } catch (recoveryError) { + if (!isSessionIdleTimeoutError(recoveryError)) { + throw recoveryError; + } + progress("Still waiting on idle; attempting to parse partial output..."); + } + } finally { + await session.destroy(); + } + let parsed; + try { + parsed = parseEvalConfig(content); + } catch (error) { + if (timedOutWaitingForIdle) { + throw new Error( + "Timed out waiting for scaffold generation to become idle before a complete JSON payload was returned. Try again or lower `--count`." + ); + } + throw error; + } + const normalized = normalizeEvalConfig(parsed, count); + return normalized; + } finally { + await client.stop(); + } +} +function isSessionIdleTimeoutError(error) { + if (!(error instanceof Error)) { + return false; + } + const message = error.message.toLowerCase(); + return message.includes("timeout") && message.includes("session.idle"); +} +function parseEvalConfig(raw) { + const match = raw.match(/\{[\s\S]*\}/u); + if (!match) { + throw new Error("Failed to parse eval scaffold JSON."); + } + const parsed = JSON.parse(match[0]); + if (!parsed || !Array.isArray(parsed.cases)) { + throw new Error("Eval scaffold JSON is missing cases."); + } + return parsed; +} +function normalizeEvalConfig(parsed, count) { + const cases = (parsed.cases ?? []).slice(0, count).map((entry, index) => { + const id = typeof entry.id === "string" && entry.id.trim() ? entry.id : `case-${index + 1}`; + return { + id, + prompt: String(entry.prompt ?? "").trim(), + expectation: String(entry.expectation ?? "").trim(), + area: typeof entry.area === "string" && entry.area.trim() ? entry.area.trim() : void 0 + }; + }); + if (!cases.length) { + throw new Error("Eval scaffold JSON did not include any usable cases."); + } + const defaultSystemMessage = + "You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them."; + return { + instructionFile: parsed.instructionFile ?? ".github/copilot-instructions.md", + systemMessage: parsed.systemMessage ?? defaultSystemMessage, + cases + }; +} + +// ../src/services/readiness.ts +var import_promises7 = __toESM(require("fs/promises"), 1); +var import_path8 = __toESM(require("path"), 1); + +// ../src/services/policy.ts +var import_promises6 = __toESM(require("fs/promises"), 1); +var import_path7 = __toESM(require("path"), 1); +var DEFAULT_PASS_RATE = 0.8; +function validatePolicyConfig(obj, source, format = "module") { + if (typeof obj !== "object" || obj === null) { + throw new Error(`Policy "${source}" is invalid: expected an object, got ${typeof obj}`); + } + const record = obj; + if (typeof record.name !== "string" || !record.name.trim()) { + throw new Error(`Policy "${source}" is invalid: missing required field "name" at root`); + } + if (record.criteria !== void 0) { + if (typeof record.criteria !== "object") { + throw new Error(`Policy "${source}" is invalid: "criteria" must be an object`); + } + const criteria = record.criteria; + if (criteria.disable !== void 0 && !isStringArray(criteria.disable)) { + throw new Error( + `Policy "${source}" is invalid: "criteria.disable" must be an array of strings` + ); + } + if (criteria.override !== void 0) { + if ( + typeof criteria.override !== "object" || + criteria.override === null || + Array.isArray(criteria.override) + ) { + throw new Error(`Policy "${source}" is invalid: "criteria.override" must be an object`); + } + const ALLOWED_OVERRIDE_KEYS = /* @__PURE__ */ new Set([ + "title", + "pillar", + "level", + "scope", + "impact", + "effort" + ]); + for (const [id, value] of Object.entries(criteria.override)) { + if (typeof value !== "object" || value === null) continue; + for (const key of Object.keys(value)) { + if (!ALLOWED_OVERRIDE_KEYS.has(key)) { + throw new Error( + `Policy "${source}" is invalid: "criteria.override.${id}" contains disallowed key "${key}". Allowed keys: ${[...ALLOWED_OVERRIDE_KEYS].join(", ")}` + ); + } + } + } + } + if (format === "json" && criteria.add !== void 0) { + throw new Error( + `Policy "${source}" is invalid: "criteria.add" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.` + ); + } + } + if (record.extras !== void 0) { + if (typeof record.extras !== "object" || record.extras === null) { + throw new Error(`Policy "${source}" is invalid: "extras" must be an object`); + } + const extras = record.extras; + if (extras.disable !== void 0 && !isStringArray(extras.disable)) { + throw new Error( + `Policy "${source}" is invalid: "extras.disable" must be an array of strings` + ); + } + if (format === "json" && extras.add !== void 0) { + throw new Error( + `Policy "${source}" is invalid: "extras.add" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.` + ); + } + } + if (record.thresholds !== void 0) { + if (typeof record.thresholds !== "object" || record.thresholds === null) { + throw new Error(`Policy "${source}" is invalid: "thresholds" must be an object`); + } + const thresholds = record.thresholds; + if (thresholds.passRate !== void 0 && typeof thresholds.passRate !== "number") { + throw new Error(`Policy "${source}" is invalid: "thresholds.passRate" must be a number`); + } + if ( + typeof thresholds.passRate === "number" && + (thresholds.passRate < 0 || thresholds.passRate > 1) + ) { + throw new Error( + `Policy "${source}" is invalid: "thresholds.passRate" must be between 0 and 1` + ); + } + } + return record; +} +function isStringArray(value) { + return Array.isArray(value) && value.every((item) => typeof item === "string"); +} +async function loadPolicy(source, options) { + const jsonOnly = options?.jsonOnly ?? false; + if (source.startsWith(".") || import_path7.default.isAbsolute(source)) { + const resolved = import_path7.default.resolve(source); + if (resolved.endsWith(".json")) { + const data = await readJson(resolved); + if (!data) { + throw new Error(`Policy "${source}" not found at: ${resolved}`); + } + return validatePolicyConfig(data, source, "json"); + } + if (/\.[mc]?[jt]s$/u.test(resolved)) { + if (jsonOnly) { + throw new Error( + `Policy "${source}" rejected: only JSON policies are allowed from primer.config.json. Module policies (.ts/.js) must be passed via --policy.` + ); + } + try { + const mod = await import(resolved); + const config = mod.default ?? mod; + return validatePolicyConfig(config, source); + } catch (err) { + if ( + err instanceof Error && + (err.message.includes("Cannot find module") || err.message.includes("MODULE_NOT_FOUND")) + ) { + throw new Error(`Policy "${source}" not found at: ${resolved}`); + } + throw err; + } + } + try { + const raw = await import_promises6.default.readFile(resolved, "utf8"); + const data = JSON.parse(raw); + return validatePolicyConfig(data, source, "json"); + } catch { + throw new Error( + `Policy "${source}" could not be loaded from: ${resolved}. Supported formats: .json, .js, .ts, .mjs` + ); + } + } + if (jsonOnly) { + throw new Error( + `Policy "${source}" rejected: only JSON file policies are allowed from primer.config.json. npm policies must be passed via --policy.` + ); + } + try { + const mod = await import(source); + const config = mod.default ?? mod; + return validatePolicyConfig(config, source); + } catch (err) { + if ( + err instanceof Error && + (err.message.includes("Cannot find module") || + err.message.includes("Cannot find package") || + err.message.includes("MODULE_NOT_FOUND") || + err.message.includes("ERR_MODULE_NOT_FOUND")) + ) { + throw new Error(`Policy "${source}" not found. Install it with: npm install ${source}`); + } + throw err; + } +} +function resolveChain(baseCriteria, baseExtras, policies) { + const chain = []; + let criteria = [...baseCriteria]; + let extras = [...baseExtras]; + let passRate = DEFAULT_PASS_RATE; + for (const policy of policies) { + chain.push(policy.name); + if (policy.criteria) { + if (policy.criteria.disable?.length) { + const disableSet = new Set(policy.criteria.disable); + criteria = criteria.filter((c) => !disableSet.has(c.id)); + } + if (policy.criteria.override) { + for (const [id, overrides] of Object.entries(policy.criteria.override)) { + const idx = criteria.findIndex((c) => c.id === id); + if (idx >= 0) { + criteria[idx] = { ...criteria[idx], ...overrides }; + } + } + } + if (policy.criteria.add?.length) { + for (const newCriterion of policy.criteria.add) { + const existingIdx = criteria.findIndex((c) => c.id === newCriterion.id); + if (existingIdx >= 0) { + criteria[existingIdx] = newCriterion; + } else { + criteria.push(newCriterion); + } + } + } + } + if (policy.extras) { + if (policy.extras.disable?.length) { + const disableSet = new Set(policy.extras.disable); + extras = extras.filter((e) => !disableSet.has(e.id)); + } + if (policy.extras.add?.length) { + for (const newExtra of policy.extras.add) { + const existingIdx = extras.findIndex((e) => e.id === newExtra.id); + if (existingIdx >= 0) { + extras[existingIdx] = newExtra; + } else { + extras.push(newExtra); + } + } + } + } + if (policy.thresholds?.passRate !== void 0) { + passRate = policy.thresholds.passRate; + } + } + return { chain, criteria, extras, thresholds: { passRate } }; +} + +// ../src/services/readiness.ts +async function runReadinessReport(options) { + const repoPath = options.repoPath; + const analysis = await analyzeRepo(repoPath); + const rootFiles = await safeReadDir(repoPath); + const rootPackageJson = await readJson(import_path8.default.join(repoPath, "package.json")); + const apps = analysis.apps?.length ? analysis.apps : []; + const context = { + repoPath, + analysis, + apps, + rootFiles, + rootPackageJson + }; + let policySources = options.policies; + if (!policySources?.length) { + const primerConfig = await loadPrimerConfig(repoPath); + if (primerConfig?.policies?.length) { + policySources = primerConfig.policies; + } + } + const baseCriteria = buildCriteria(); + const baseExtras = buildExtras(); + let resolvedCriteria; + let resolvedExtras; + let passRateThreshold = 0.8; + let policyInfo; + if (policySources?.length) { + const policyConfigs = []; + const isConfigSourced = policySources !== options.policies; + for (const source of policySources) { + policyConfigs.push(await loadPolicy(source, { jsonOnly: isConfigSourced })); + } + const resolved = resolveChain(baseCriteria, baseExtras, policyConfigs); + resolvedCriteria = resolved.criteria; + resolvedExtras = resolved.extras; + passRateThreshold = resolved.thresholds.passRate; + policyInfo = { chain: resolved.chain, criteriaCount: resolved.criteria.length }; + } else { + resolvedCriteria = baseCriteria; + resolvedExtras = baseExtras; + } + const criteriaResults = []; + for (const criterion of resolvedCriteria) { + if (criterion.scope === "repo") { + const result = await criterion.check(context); + criteriaResults.push({ + id: criterion.id, + title: criterion.title, + pillar: criterion.pillar, + level: criterion.level, + scope: criterion.scope, + impact: criterion.impact, + effort: criterion.effort, + status: result.status, + reason: result.reason, + evidence: result.evidence + }); + continue; + } + if (criterion.scope === "area") { + if (!options.perArea) continue; + const areas2 = analysis.areas ?? []; + if (areas2.length === 0) continue; + criteriaResults.push({ + id: criterion.id, + title: criterion.title, + pillar: criterion.pillar, + level: criterion.level, + scope: criterion.scope, + impact: criterion.impact, + effort: criterion.effort, + status: "skip", + reason: "Run with --per-area for area breakdown." + }); + continue; + } + const appResults = await Promise.all( + apps.map(async (app) => ({ + app, + result: await criterion.check(context, app) + })) + ); + if (!appResults.length) { + criteriaResults.push({ + id: criterion.id, + title: criterion.title, + pillar: criterion.pillar, + level: criterion.level, + scope: criterion.scope, + impact: criterion.impact, + effort: criterion.effort, + status: "skip", + reason: "No application packages detected." + }); + continue; + } + const passed = appResults.filter((entry) => entry.result.status === "pass").length; + const total = appResults.length; + const passRate = total ? passed / total : 0; + const status = passRate >= passRateThreshold ? "pass" : "fail"; + const failures = appResults + .filter((entry) => entry.result.status !== "pass") + .map((entry) => entry.app.name); + criteriaResults.push({ + id: criterion.id, + title: criterion.title, + pillar: criterion.pillar, + level: criterion.level, + scope: criterion.scope, + impact: criterion.impact, + effort: criterion.effort, + status, + reason: status === "pass" ? void 0 : `Only ${passed}/${total} apps pass this check.`, + passRate, + appSummary: { passed, total }, + appFailures: failures + }); + } + let areaReports; + const areas = analysis.areas ?? []; + if (options.perArea && areas.length > 0) { + const areaCriteria = resolvedCriteria.filter((c) => c.scope === "area"); + areaReports = []; + for (const area of areas) { + if (!area.path) continue; + const areaFiles = await safeReadDir(area.path); + const areaContext = { + ...context, + areaPath: area.path, + areaFiles + }; + const areaResults = []; + for (const criterion of areaCriteria) { + const result = await criterion.check(areaContext, void 0, area); + areaResults.push({ + id: criterion.id, + title: criterion.title, + pillar: criterion.pillar, + level: criterion.level, + scope: criterion.scope, + impact: criterion.impact, + effort: criterion.effort, + status: result.status, + reason: result.reason, + evidence: result.evidence + }); + } + const areaPillars = summarizePillars(areaResults); + areaReports.push({ area, criteria: areaResults, pillars: areaPillars }); + } + for (const criterion of criteriaResults) { + if (criterion.scope !== "area") continue; + const perAreaResults = areaReports + .map((ar) => ar.criteria.find((c) => c.id === criterion.id)) + .filter(Boolean); + if (!perAreaResults.length) continue; + const passed = perAreaResults.filter((r) => r.status === "pass").length; + const total = perAreaResults.length; + const passRate = total ? passed / total : 0; + criterion.status = passRate >= passRateThreshold ? "pass" : "fail"; + criterion.reason = + criterion.status === "pass" ? void 0 : `Only ${passed}/${total} areas pass this check.`; + criterion.passRate = passRate; + criterion.areaSummary = { passed, total }; + criterion.areaFailures = areaReports + .filter((ar) => ar.criteria.find((c) => c.id === criterion.id)?.status !== "pass") + .map((ar) => ar.area.name); + } + } + const pillars = summarizePillars(criteriaResults); + const levels = summarizeLevels(criteriaResults, passRateThreshold); + const achievedLevel = levels + .filter((level) => level.achieved) + .reduce((acc, level) => Math.max(acc, level.level), 0); + const extras = options.includeExtras === false ? [] : await runExtras(context, resolvedExtras); + return { + repoPath, + generatedAt: /* @__PURE__ */ new Date().toISOString(), + isMonorepo: analysis.isMonorepo ?? false, + apps: apps.map((app) => ({ name: app.name, path: app.path })), + pillars, + levels, + achievedLevel, + criteria: criteriaResults, + extras, + areaReports, + policies: policyInfo + }; +} +function buildCriteria() { + return [ + { + id: "lint-config", + title: "Linting configured", + pillar: "style-validation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => { + const found = await hasLintConfig(context.repoPath); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing ESLint/Biome/Prettier configuration.", + evidence: ["eslint.config.js", ".eslintrc", "biome.json", ".prettierrc"] + }; + } + }, + { + id: "typecheck-config", + title: "Type checking configured", + pillar: "style-validation", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => { + const found = await hasTypecheckConfig(context.repoPath); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing type checking config (tsconfig or equivalent).", + evidence: ["tsconfig.json", "pyproject.toml", "mypy.ini"] + }; + } + }, + { + id: "build-script", + title: "Build script present", + pillar: "build-system", + level: 1, + scope: "app", + impact: "high", + effort: "low", + check: async (_context, app) => { + const found = Boolean(app?.scripts?.build); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing build script in package.json." + }; + } + }, + { + id: "ci-config", + title: "CI workflow configured", + pillar: "build-system", + level: 2, + scope: "repo", + impact: "high", + effort: "medium", + check: async (context) => { + const found = await hasGithubWorkflows(context.repoPath); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing .github/workflows CI configuration.", + evidence: [".github/workflows"] + }; + } + }, + { + id: "test-script", + title: "Test script present", + pillar: "testing", + level: 1, + scope: "app", + impact: "high", + effort: "low", + check: async (_context, app) => { + const found = Boolean(app?.scripts?.test); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing test script in package.json." + }; + } + }, + { + id: "readme", + title: "README present", + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => { + const found = await hasReadme(context.repoPath); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing README documentation.", + evidence: ["README.md"] + }; + } + }, + { + id: "contributing", + title: "CONTRIBUTING guide present", + pillar: "documentation", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => { + const found = await fileExists( + import_path8.default.join(context.repoPath, "CONTRIBUTING.md") + ); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing CONTRIBUTING.md for contributor workflows." + }; + } + }, + { + id: "lockfile", + title: "Lockfile present", + pillar: "dev-environment", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => { + const found = hasAnyFile(context.rootFiles, [ + "pnpm-lock.yaml", + "yarn.lock", + "package-lock.json", + "bun.lockb" + ]); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing package manager lockfile." + }; + } + }, + { + id: "env-example", + title: "Environment example present", + pillar: "dev-environment", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => { + const found = hasAnyFile(context.rootFiles, [".env.example", ".env.sample"]); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing .env.example or .env.sample for setup guidance." + }; + } + }, + { + id: "format-config", + title: "Formatter configured", + pillar: "code-quality", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => { + const found = await hasFormatterConfig(context.repoPath); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing Prettier/Biome formatting config." + }; + } + }, + { + id: "codeowners", + title: "CODEOWNERS present", + pillar: "security-governance", + level: 2, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => { + const found = await hasCodeowners(context.repoPath); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing CODEOWNERS file." + }; + } + }, + { + id: "license", + title: "LICENSE present", + pillar: "security-governance", + level: 1, + scope: "repo", + impact: "medium", + effort: "low", + check: async (context) => { + const found = await hasLicense(context.repoPath); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing LICENSE file." + }; + } + }, + { + id: "security-policy", + title: "Security policy present", + pillar: "security-governance", + level: 3, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => { + const found = await fileExists(import_path8.default.join(context.repoPath, "SECURITY.md")); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing SECURITY.md policy." + }; + } + }, + { + id: "dependabot", + title: "Dependabot configured", + pillar: "security-governance", + level: 3, + scope: "repo", + impact: "medium", + effort: "medium", + check: async (context) => { + const found = await fileExists( + import_path8.default.join(context.repoPath, ".github", "dependabot.yml") + ); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing .github/dependabot.yml configuration." + }; + } + }, + { + id: "observability", + title: "Observability tooling present", + pillar: "observability", + level: 3, + scope: "repo", + impact: "medium", + effort: "medium", + check: async (context) => { + const deps = await readAllDependencies(context); + const has = deps.some((dep) => + ["@opentelemetry/api", "@opentelemetry/sdk", "pino", "winston", "bunyan"].includes(dep) + ); + return { + status: has ? "pass" : "fail", + reason: "No observability dependencies detected (OpenTelemetry/logging)." + }; + } + }, + { + id: "custom-instructions", + title: "Custom AI instructions or agent guidance", + pillar: "ai-tooling", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => { + const rootFound = await hasCustomInstructions(context.repoPath); + if (rootFound.length === 0) { + return { + status: "fail", + reason: + "Missing custom AI instructions (e.g. copilot-instructions.md, CLAUDE.md, AGENTS.md, .cursorrules).", + evidence: [ + "copilot-instructions.md", + "CLAUDE.md", + "AGENTS.md", + ".cursorrules", + ".github/copilot-instructions.md" + ] + }; + } + const fileBasedInstructions = await hasFileBasedInstructions(context.repoPath); + const areas = context.analysis.areas ?? []; + if (areas.length > 0) { + if (fileBasedInstructions.length === 0) { + return { + status: "pass", + reason: `Root instructions found, but no file-based instructions for ${areas.length} detected areas. Run \`primer instructions --areas\` to generate.`, + evidence: [...rootFound, ...areas.map((a) => `${a.name}: missing .instructions.md`)] + }; + } + return { + status: "pass", + reason: `Root + ${fileBasedInstructions.length} file-based instruction(s) found.`, + evidence: [...rootFound, ...fileBasedInstructions] + }; + } + if (context.analysis.isMonorepo && context.apps.length > 1) { + const appsMissing = []; + for (const app of context.apps) { + const appFound = await hasCustomInstructions(app.path); + if (appFound.length === 0) { + appsMissing.push(app.name); + } + } + if (appsMissing.length > 0) { + return { + status: "pass", + reason: `Root instructions found, but ${appsMissing.length}/${context.apps.length} apps missing their own: ${appsMissing.join(", ")}`, + evidence: [ + ...rootFound, + ...appsMissing.map((name) => `${name}: missing app-level instructions`) + ] + }; + } + } + return { + status: "pass", + evidence: rootFound + }; + } + }, + { + id: "mcp-config", + title: "MCP configuration present", + pillar: "ai-tooling", + level: 2, + scope: "repo", + impact: "high", + effort: "low", + check: async (context) => { + const found = await hasMcpConfig(context.repoPath); + return { + status: found.length > 0 ? "pass" : "fail", + reason: "Missing MCP (Model Context Protocol) configuration (e.g. .vscode/mcp.json).", + evidence: + found.length > 0 + ? found + : [".vscode/mcp.json", ".vscode/settings.json (mcp section)", "mcp.json"] + }; + } + }, + { + id: "custom-agents", + title: "Custom AI agents configured", + pillar: "ai-tooling", + level: 3, + scope: "repo", + impact: "medium", + effort: "medium", + check: async (context) => { + const found = await hasCustomAgents(context.repoPath); + return { + status: found.length > 0 ? "pass" : "fail", + reason: "No custom AI agents configured (e.g. .github/agents/, .copilot/agents/).", + evidence: + found.length > 0 + ? found + : [".github/agents/", ".copilot/agents/", ".github/copilot/agents/"] + }; + } + }, + { + id: "copilot-skills", + title: "Copilot/Claude skills present", + pillar: "ai-tooling", + level: 3, + scope: "repo", + impact: "medium", + effort: "medium", + check: async (context) => { + const found = await hasCopilotSkills(context.repoPath); + return { + status: found.length > 0 ? "pass" : "fail", + reason: "No Copilot or Claude skills found (e.g. .copilot/skills/, .github/skills/).", + evidence: + found.length > 0 ? found : [".copilot/skills/", ".github/skills/", ".claude/skills/"] + }; + } + }, + // ── Area-scoped criteria (only run when areaPath is set) ── + { + id: "area-readme", + title: "Area README present", + pillar: "documentation", + level: 1, + scope: "area", + impact: "medium", + effort: "low", + check: async (context) => { + if (!context.areaPath || !context.areaFiles) { + return { status: "skip", reason: "No area context." }; + } + const found = context.areaFiles.some( + (f) => f.toLowerCase() === "readme.md" || f.toLowerCase() === "readme" + ); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing README in area directory." + }; + } + }, + { + id: "area-build-script", + title: "Area build script present", + pillar: "build-system", + level: 1, + scope: "area", + impact: "high", + effort: "low", + check: async (context, _app, area) => { + if (!context.areaPath || !context.areaFiles) { + return { status: "skip", reason: "No area context." }; + } + if (area?.scripts?.build) { + return { status: "pass" }; + } + const pkgPath = import_path8.default.join(context.areaPath, "package.json"); + const pkg = await readJson(pkgPath); + const scripts = pkg?.scripts ?? {}; + const found = Boolean(scripts.build); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing build script in area." + }; + } + }, + { + id: "area-test-script", + title: "Area test script present", + pillar: "testing", + level: 1, + scope: "area", + impact: "high", + effort: "low", + check: async (context, _app, area) => { + if (!context.areaPath || !context.areaFiles) { + return { status: "skip", reason: "No area context." }; + } + if (area?.scripts?.test) { + return { status: "pass" }; + } + const pkgPath = import_path8.default.join(context.areaPath, "package.json"); + const pkg = await readJson(pkgPath); + const scripts = pkg?.scripts ?? {}; + const found = Boolean(scripts.test); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : "Missing test script in area." + }; + } + }, + { + id: "area-instructions", + title: "Area-specific instructions present", + pillar: "ai-tooling", + level: 2, + scope: "area", + impact: "high", + effort: "low", + check: async (context, _app, area) => { + if (!area) { + return { status: "skip", reason: "No area context." }; + } + const sanitized = sanitizeAreaName(area.name); + const instructionPath = import_path8.default.join( + context.repoPath, + ".github", + "instructions", + `${sanitized}.instructions.md` + ); + const found = await fileExists(instructionPath); + return { + status: found ? "pass" : "fail", + reason: found ? void 0 : `Missing .github/instructions/${sanitized}.instructions.md` + }; + } + } + ]; +} +function buildExtras() { + return [ + { + id: "agents-doc", + title: "AGENTS.md present", + check: async (context) => ({ + status: (await fileExists(import_path8.default.join(context.repoPath, "AGENTS.md"))) + ? "pass" + : "fail", + reason: "Missing AGENTS.md to guide coding agents." + }) + }, + { + id: "pr-template", + title: "Pull request template present", + check: async (context) => ({ + status: (await hasPullRequestTemplate(context.repoPath)) ? "pass" : "fail", + reason: "Missing PR template for consistent reviews." + }) + }, + { + id: "pre-commit", + title: "Pre-commit hooks configured", + check: async (context) => ({ + status: (await hasPrecommitConfig(context.repoPath)) ? "pass" : "fail", + reason: "Missing pre-commit or Husky configuration for fast feedback." + }) + }, + { + id: "architecture-doc", + title: "Architecture guide present", + check: async (context) => ({ + status: (await hasArchitectureDoc(context.repoPath)) ? "pass" : "fail", + reason: "Missing architecture documentation." + }) + } + ]; +} +async function runExtras(context, extraDefs) { + const results = []; + for (const def of extraDefs) { + const result = await def.check(context); + results.push({ + id: def.id, + title: def.title, + status: result.status, + reason: result.reason + }); + } + return results; +} +function summarizePillars(criteria) { + const pillarNames = { + "style-validation": "Style & Validation", + "build-system": "Build System", + testing: "Testing", + documentation: "Documentation", + "dev-environment": "Dev Environment", + "code-quality": "Code Quality", + observability: "Observability", + "security-governance": "Security & Governance", + "ai-tooling": "AI Tooling" + }; + return Object.keys(pillarNames).map((pillar) => { + const items = criteria.filter((criterion) => criterion.pillar === pillar); + const { passed, total } = countStatus(items); + return { + id: pillar, + name: pillarNames[pillar], + passed, + total, + passRate: total ? passed / total : 0 + }; + }); +} +function summarizeLevels(criteria, passRateThreshold = 0.8) { + const levelNames = { + 1: "Functional", + 2: "Documented", + 3: "Standardized", + 4: "Optimized", + 5: "Autonomous" + }; + const summaries = []; + for (let level = 1; level <= 5; level += 1) { + const items = criteria.filter((criterion) => criterion.level === level); + const { passed, total } = countStatus(items); + const passRate = total ? passed / total : 0; + summaries.push({ + level, + name: levelNames[level], + passed, + total, + passRate, + achieved: false + }); + } + for (const summary of summaries) { + const allPrior = summaries.filter((candidate) => candidate.level <= summary.level); + const achieved = allPrior.every( + (candidate) => candidate.total > 0 && candidate.passRate >= passRateThreshold + ); + summary.achieved = achieved; + } + return summaries; +} +function countStatus(items) { + const relevant = items.filter((item) => item.status !== "skip"); + const passed = relevant.filter((item) => item.status === "pass").length; + return { passed, total: relevant.length }; +} +function hasAnyFile(files, candidates) { + return candidates.some((candidate) => files.includes(candidate)); +} +async function hasReadme(repoPath) { + const files = await safeReadDir(repoPath); + return files.some( + (file) => file.toLowerCase() === "readme.md" || file.toLowerCase() === "readme" + ); +} +async function hasLintConfig(repoPath) { + return hasAnyFile(await safeReadDir(repoPath), [ + "eslint.config.js", + "eslint.config.mjs", + ".eslintrc", + ".eslintrc.js", + ".eslintrc.cjs", + ".eslintrc.json", + ".eslintrc.yml", + ".eslintrc.yaml", + "biome.json", + "biome.jsonc", + ".prettierrc", + ".prettierrc.json", + ".prettierrc.js", + ".prettierrc.cjs", + "prettier.config.js", + "prettier.config.cjs" + ]); +} +async function hasFormatterConfig(repoPath) { + return hasAnyFile(await safeReadDir(repoPath), [ + "biome.json", + "biome.jsonc", + ".prettierrc", + ".prettierrc.json", + ".prettierrc.js", + ".prettierrc.cjs", + "prettier.config.js", + "prettier.config.cjs" + ]); +} +async function hasTypecheckConfig(repoPath) { + return hasAnyFile(await safeReadDir(repoPath), [ + "tsconfig.json", + "tsconfig.base.json", + "pyproject.toml", + "mypy.ini" + ]); +} +async function hasGithubWorkflows(repoPath) { + return fileExists(import_path8.default.join(repoPath, ".github", "workflows")); +} +async function hasCodeowners(repoPath) { + const root = await fileExists(import_path8.default.join(repoPath, "CODEOWNERS")); + const github = await fileExists(import_path8.default.join(repoPath, ".github", "CODEOWNERS")); + return root || github; +} +async function hasLicense(repoPath) { + const files = await safeReadDir(repoPath); + return files.some((file) => file.toLowerCase().startsWith("license")); +} +async function hasPullRequestTemplate(repoPath) { + const direct = await fileExists( + import_path8.default.join(repoPath, ".github", "PULL_REQUEST_TEMPLATE.md") + ); + if (direct) return true; + const dir = import_path8.default.join(repoPath, ".github", "PULL_REQUEST_TEMPLATE"); + try { + const entries = await import_promises7.default.readdir(dir); + return entries.some((entry) => entry.toLowerCase().endsWith(".md")); + } catch { + return false; + } +} +async function hasPrecommitConfig(repoPath) { + const precommit = await fileExists( + import_path8.default.join(repoPath, ".pre-commit-config.yaml") + ); + if (precommit) return true; + return fileExists(import_path8.default.join(repoPath, ".husky")); +} +async function hasArchitectureDoc(repoPath) { + const files = await safeReadDir(repoPath); + if (files.some((file) => file.toLowerCase() === "architecture.md")) return true; + return fileExists(import_path8.default.join(repoPath, "docs", "architecture.md")); +} +async function hasCustomInstructions(repoPath) { + const found = []; + const candidates = [ + ".github/copilot-instructions.md", + "CLAUDE.md", + ".claude/CLAUDE.md", + "AGENTS.md", + ".github/AGENTS.md", + ".cursorrules", + ".cursorignore", + ".windsurfrules", + ".github/instructions.md", + "copilot-instructions.md" + ]; + for (const candidate of candidates) { + if (await fileExists(import_path8.default.join(repoPath, candidate))) { + found.push(candidate); + } + } + return found; +} +async function hasFileBasedInstructions(repoPath) { + const instructionsDir = import_path8.default.join(repoPath, ".github", "instructions"); + try { + const entries = await import_promises7.default.readdir(instructionsDir); + return entries + .filter((e) => e.endsWith(".instructions.md")) + .map((e) => `.github/instructions/${e}`); + } catch { + return []; + } +} +async function hasMcpConfig(repoPath) { + const found = []; + if (await fileExists(import_path8.default.join(repoPath, ".vscode", "mcp.json"))) { + found.push(".vscode/mcp.json"); + } + if (await fileExists(import_path8.default.join(repoPath, "mcp.json"))) { + found.push("mcp.json"); + } + const settings = await readJson(import_path8.default.join(repoPath, ".vscode", "settings.json")); + if (settings && (settings["mcp"] || settings["github.copilot.chat.mcp.enabled"])) { + found.push(".vscode/settings.json (mcp section)"); + } + if (await fileExists(import_path8.default.join(repoPath, ".claude", "mcp.json"))) { + found.push(".claude/mcp.json"); + } + return found; +} +async function hasCustomAgents(repoPath) { + const found = []; + const agentDirs = [".github/agents", ".copilot/agents", ".github/copilot/agents"]; + for (const dir of agentDirs) { + if (await fileExists(import_path8.default.join(repoPath, dir))) { + found.push(dir); + } + } + const agentFiles = [".github/copilot-agents.yml", ".github/copilot-agents.yaml"]; + for (const agentFile of agentFiles) { + if (await fileExists(import_path8.default.join(repoPath, agentFile))) { + found.push(agentFile); + } + } + return found; +} +async function hasCopilotSkills(repoPath) { + const found = []; + const skillDirs = [ + ".copilot/skills", + ".github/skills", + ".claude/skills", + ".github/copilot/skills" + ]; + for (const dir of skillDirs) { + if (await fileExists(import_path8.default.join(repoPath, dir))) { + found.push(dir); + } + } + return found; +} +async function readAllDependencies(context) { + const dependencies = []; + const apps = context.apps.length ? context.apps : []; + for (const app of apps) { + if (!app.packageJsonPath) continue; + const pkg = await readJson(app.packageJsonPath); + const deps = pkg?.dependencies ?? {}; + const devDeps = pkg?.devDependencies ?? {}; + dependencies.push( + ...Object.keys({ + ...deps, + ...devDeps + }) + ); + } + if (!apps.length && context.rootPackageJson) { + const rootDeps = context.rootPackageJson.dependencies ?? {}; + const rootDevDeps = context.rootPackageJson.devDependencies ?? {}; + dependencies.push( + ...Object.keys({ + ...rootDeps, + ...rootDevDeps + }) + ); + } + return Array.from(new Set(dependencies)); +} + +// ../src/services/visualReport.ts +function generateVisualReport(options) { + const { + reports, + title = "AI Readiness Report", + generatedAt = /* @__PURE__ */ new Date().toISOString() + } = options; + const successfulReports = reports.filter((r) => !r.error); + const failedReports = reports.filter((r) => r.error); + const totalRepos = reports.length; + const successfulRepos = successfulReports.length; + const avgLevel = + successfulReports.length > 0 + ? successfulReports.reduce((sum, r) => sum + r.report.achievedLevel, 0) / + successfulReports.length + : 0; + const pillarStats = calculatePillarStats(successfulReports); + const aiToolingData = calculateAiToolingData(successfulReports); + return ` + + + + + + ${escapeHtml(title)} + + + +
    +
    + +
    +

    ${escapeHtml(title)}

    +

    Generated ${new Date(generatedAt).toLocaleString()}

    +
    + +
    + +
    +
    +
    Repositories
    +
    ${totalRepos}
    +
    ${successfulRepos} analyzed successfully
    +
    +
    +
    Avg Maturity
    +
    ${avgLevel.toFixed(1)}
    +
    ${getLevelName(Math.round(avgLevel))}
    +
    +
    +
    Success Rate
    +
    ${totalRepos > 0 ? Math.round((successfulRepos / totalRepos) * 100) : 0}%
    +
    ${failedReports.length > 0 ? failedReports.length + " failed" : "All succeeded"}
    +
    +
    + + ${ + successfulReports.length > 0 + ? ` + ${buildAiToolingHeroHtml(aiToolingData, successfulReports)} + +
    +

    Pillar Performance

    +
    + ${pillarStats + .map( + (pillar) => ` +
    +
    ${escapeHtml(pillar.name)}
    +
    +
    +
    +
    + ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%) +
    +
    + ` + ) + .join("")} +
    +
    + +
    +

    Maturity Model

    +
    + ${[1, 2, 3, 4, 5] + .map((level) => { + const count = successfulReports.filter((r) => r.report.achievedLevel === level).length; + return ` +
    +
    + ${level} + ${getLevelName(level)} + ${count} repo${count !== 1 ? "s" : ""} +
    +
    ${getLevelDescription(level)}
    +
    + `; + }) + .join("")} +
    + +

    Distribution

    +
    + ${[1, 2, 3, 4, 5] + .map((level) => { + const count = successfulReports.filter((r) => r.report.achievedLevel === level).length; + const percent = + successfulReports.length > 0 ? (count / successfulReports.length) * 100 : 0; + const barHeight = count > 0 ? Math.max(40, percent * 2) : 0; + return ` +
    +
    ${count}
    +
    +
    ${level}
    ${getLevelName(level)}
    +
    + `; + }) + .join("")} +
    +
    + ` + : "" + } + +
    +

    Repository Details

    +
    + ${reports + .map(({ repo, report, error }) => { + if (error) { + return ` +
    +
    +
    ${escapeHtml(repo)}
    + Error +
    +
    ${escapeHtml(error)}
    +
    + `; + } + return ` +
    +
    +
    ${escapeHtml(repo)}
    +
    + Maturity ${report.achievedLevel}: ${getLevelName(report.achievedLevel)} +
    +
    + ${report.isMonorepo ? `
    Monorepo · ${report.apps.length} apps
    ` : ""} +
    + ${report.pillars + .map((pillar) => { + const pillarCriteria = report.criteria.filter((c) => c.pillar === pillar.id); + return ` +
    +
    + + ${escapeHtml(pillar.name)} + ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%) + +
    + ${pillarCriteria + .map( + (c) => ` +
    + ${escapeHtml(c.title)} + ${c.status === "pass" ? "Pass" : c.status === "fail" ? "Fail" : "Skip"} +
    + ` + ) + .join("")} + ${pillarCriteria.length === 0 ? '
    No criteria
    ' : ""} +
    +
    +
    + `; + }) + .join("")} +
    + ${getTopFixesHtml(report)} + ${buildAreaReportsHtml(report.areaReports)} +
    + `; + }) + .join("")} +
    +
    + + ${ + failedReports.length > 0 + ? ` +
    +

    Failed Repositories

    +
    + ${failedReports + .map( + ({ repo, error }) => ` +
    +
    ${escapeHtml(repo)}
    +
    ${escapeHtml(error || "Unknown error")}
    +
    + ` + ) + .join("")} +
    +
    + ` + : "" + } + + +
    + + +`; +} +function calculatePillarStats(reports) { + const pillarMap = /* @__PURE__ */ new Map(); + for (const { report } of reports) { + for (const pillar of report.pillars) { + const existing = pillarMap.get(pillar.id); + if (existing) { + existing.passed += pillar.passed; + existing.total += pillar.total; + } else { + pillarMap.set(pillar.id, { + name: pillar.name, + passed: pillar.passed, + total: pillar.total + }); + } + } + } + return Array.from(pillarMap.entries()).map(([id, stats]) => ({ + id, + name: stats.name, + passed: stats.passed, + total: stats.total, + passRate: stats.total > 0 ? stats.passed / stats.total : 0 + })); +} +function getTopFixesHtml(report) { + const failedCriteria = report.criteria + .filter((c) => c.status === "fail") + .sort((a, b) => { + const impactWeight = { high: 3, medium: 2, low: 1 }; + const effortWeight = { low: 1, medium: 2, high: 3 }; + const impactDelta = impactWeight[b.impact] - impactWeight[a.impact]; + if (impactDelta !== 0) return impactDelta; + return effortWeight[a.effort] - effortWeight[b.effort]; + }) + .slice(0, 3); + if (failedCriteria.length === 0) { + return '
    All criteria passing
    '; + } + return ` +
    +
    Top Fixes Needed
    +
      + ${failedCriteria + .map( + (c) => ` +
    • + + ${escapeHtml(c.title)} + ${c.impact} impact, ${c.effort} effort +
    • + ` + ) + .join("")} +
    +
    + `; +} +function getLevelName(level) { + const names = { + 1: "Functional", + 2: "Documented", + 3: "Standardized", + 4: "Optimized", + 5: "Autonomous" + }; + return names[level] || "Unknown"; +} +function getLevelDescription(level) { + const descriptions = { + 1: "Repo builds, tests run, and basic tooling (linter, lockfile) is in place. AI agents can clone and get started.", + 2: "README, CONTRIBUTING guide, and custom AI instructions exist. Agents understand project context and conventions.", + 3: "CI/CD, security policies, CODEOWNERS, and observability are configured. Agents operate within well-defined guardrails.", + 4: "MCP servers, custom agents, and AI skills are set up. Agents have deep integration with project-specific tools and workflows.", + 5: "Full AI-native development: agents can independently plan, implement, test, and ship changes with minimal human oversight." + }; + return descriptions[level] || ""; +} +function getProgressClass(passRate) { + if (passRate >= 0.8) return "high"; + if (passRate >= 0.5) return "medium"; + return "low"; +} +function calculateAiToolingData(reports) { + const criterionMap = /* @__PURE__ */ new Map(); + for (const { report } of reports) { + const aiCriteria = report.criteria.filter((c) => c.pillar === "ai-tooling"); + for (const c of aiCriteria) { + const existing = criterionMap.get(c.id); + if (existing) { + existing.totalRepos += 1; + if (c.status === "pass") existing.passCount += 1; + if (c.evidence) existing.evidence.push(...c.evidence); + } else { + criterionMap.set(c.id, { + id: c.id, + title: c.title, + passCount: c.status === "pass" ? 1 : 0, + totalRepos: 1, + status: c.status === "pass" ? "pass" : "fail", + evidence: c.evidence ? [...c.evidence] : [], + reason: c.reason || "" + }); + } + } + } + const criteria = Array.from(criterionMap.values()).map((c) => ({ + ...c, + status: c.passCount / c.totalRepos >= 0.5 ? "pass" : "fail", + evidence: [...new Set(c.evidence)] + })); + const passed = criteria.filter((c) => c.status === "pass").length; + return { + criteria, + passed, + total: criteria.length, + passRate: criteria.length > 0 ? passed / criteria.length : 0 + }; +} +function getAiScoreClass(passRate) { + if (passRate >= 0.6) return "score-high"; + if (passRate >= 0.3) return "score-medium"; + return "score-low"; +} +function getAiScoreLabel(passRate) { + if (passRate >= 0.8) return "Excellent"; + if (passRate >= 0.6) return "Good"; + if (passRate >= 0.4) return "Fair"; + if (passRate >= 0.2) return "Getting Started"; + return "Not Started"; +} +function getAiCriterionIcon(id) { + const icons = { + "custom-instructions": "📝", + "mcp-config": "🔌", + "custom-agents": "🤖", + "copilot-skills": "⚡" + }; + return icons[id] || "🔧"; +} +function buildAiToolingHeroHtml(data, reports) { + if (data.criteria.length === 0) return ""; + const pct = Math.round(data.passRate * 100); + const scoreClass = getAiScoreClass(data.passRate); + const scoreLabel = getAiScoreLabel(data.passRate); + const multiRepo = reports.length > 1; + const perRepoHtml = multiRepo + ? ` +
    +
    Per Repository
    +
    + ${reports + .map(({ repo, report }) => { + const aiPillar = report.pillars.find((p) => p.id === "ai-tooling"); + const repoPct = aiPillar ? Math.round(aiPillar.passRate * 100) : 0; + const repoPass = aiPillar?.passed ?? 0; + const repoTotal = aiPillar?.total ?? 0; + return `
    + ${escapeHtml(repo)} + = 30 ? "var(--color-attention-fg)" : "var(--color-danger-fg)"};">${repoPass}/${repoTotal} (${repoPct}%) +
    `; + }) + .join("")} +
    +
    + ` + : ""; + return ` +
    +

    AI Tooling Readiness

    +

    How well prepared ${multiRepo ? "your repositories are" : "this repository is"} for AI-assisted development

    + +
    +
    ${pct}%
    +
    +
    ${scoreLabel}
    +
    ${data.passed} of ${data.total} AI tooling checks passing${multiRepo ? ` across ${reports.length} repositories` : ""}
    +
    +
    + +
    + ${data.criteria + .map( + (c) => ` +
    +
    + ${c.status === "pass" ? "✓" : "✗"} +
    +
    +
    ${getAiCriterionIcon(c.id)} ${escapeHtml(c.title)}
    +
    ${c.status === "pass" ? (multiRepo ? `${c.passCount}/${c.totalRepos} repos` : "Detected") : escapeHtml(c.reason)}
    +
    +
    + ` + ) + .join("")} +
    + ${perRepoHtml} +
    + `; +} +function escapeHtml(text) { + const map = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'" + }; + return text.replace(/[&<>"']/g, (m) => map[m]); +} +function buildAreaReportsHtml(areaReports) { + if (!areaReports?.length) return ""; + return ` +
    +
    Per-Area Breakdown
    +
    + ${areaReports + .map((ar) => { + const relevant = ar.criteria.filter((c) => c.status !== "skip"); + const passed = relevant.filter((c) => c.status === "pass").length; + const total = relevant.length; + const pct = total ? Math.round((passed / total) * 100) : 0; + const sourceLabel = ar.area.source === "config" ? "config" : "auto"; + const applyTo = Array.isArray(ar.area.applyTo) + ? ar.area.applyTo.join(", ") + : ar.area.applyTo; + return ` +
    +
    + + ${escapeHtml(ar.area.name)} + + ${sourceLabel} + = 50 ? "var(--color-attention-fg)" : "var(--color-danger-fg)"};">${passed}/${total} (${pct}%) + + +
    +
    ${escapeHtml(applyTo)}
    + ${ar.criteria + .map( + (c) => ` +
    + ${escapeHtml(c.title)} + ${c.status === "pass" ? "Pass" : c.status === "fail" ? "Fail" : "Skip"} +
    + ` + ) + .join("")} +
    +
    +
    + `; + }) + .join("")} +
    +
    + `; +} + +// ../src/services/github.ts +var import_node_child_process2 = require("node:child_process"); +var import_node_util2 = require("node:util"); + +// ../node_modules/universal-user-agent/index.js +function getUserAgent() { + if (typeof navigator === "object" && "userAgent" in navigator) { + return navigator.userAgent; + } + if (typeof process === "object" && process.version !== void 0) { + return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; + } + return ""; +} + +// ../node_modules/before-after-hook/lib/register.js +function register(state, name, method, options) { + if (typeof method !== "function") { + throw new Error("method for before hook must be a function"); + } + if (!options) { + options = {}; + } + if (Array.isArray(name)) { + return name.reverse().reduce((callback, name2) => { + return register.bind(null, state, name2, callback, options); + }, method)(); + } + return Promise.resolve().then(() => { + if (!state.registry[name]) { + return method(options); + } + return state.registry[name].reduce((method2, registered) => { + return registered.hook.bind(null, method2, options); + }, method)(); + }); +} + +// ../node_modules/before-after-hook/lib/add.js +function addHook(state, kind, name, hook2) { + const orig = hook2; + if (!state.registry[name]) { + state.registry[name] = []; + } + if (kind === "before") { + hook2 = (method, options) => { + return Promise.resolve().then(orig.bind(null, options)).then(method.bind(null, options)); + }; + } + if (kind === "after") { + hook2 = (method, options) => { + let result; + return Promise.resolve() + .then(method.bind(null, options)) + .then((result_) => { + result = result_; + return orig(result, options); + }) + .then(() => { + return result; + }); + }; + } + if (kind === "error") { + hook2 = (method, options) => { + return Promise.resolve() + .then(method.bind(null, options)) + .catch((error) => { + return orig(error, options); + }); + }; + } + state.registry[name].push({ + hook: hook2, + orig + }); +} + +// ../node_modules/before-after-hook/lib/remove.js +function removeHook(state, name, method) { + if (!state.registry[name]) { + return; + } + const index = state.registry[name] + .map((registered) => { + return registered.orig; + }) + .indexOf(method); + if (index === -1) { + return; + } + state.registry[name].splice(index, 1); +} + +// ../node_modules/before-after-hook/index.js +var bind = Function.bind; +var bindable = bind.bind(bind); +function bindApi(hook2, state, name) { + const removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]); + hook2.api = { remove: removeHookRef }; + hook2.remove = removeHookRef; + ["before", "error", "after", "wrap"].forEach((kind) => { + const args = name ? [state, kind, name] : [state, kind]; + hook2[kind] = hook2.api[kind] = bindable(addHook, null).apply(null, args); + }); +} +function Singular() { + const singularHookName = Symbol("Singular"); + const singularHookState = { + registry: {} + }; + const singularHook = register.bind(null, singularHookState, singularHookName); + bindApi(singularHook, singularHookState, singularHookName); + return singularHook; +} +function Collection() { + const state = { + registry: {} + }; + const hook2 = register.bind(null, state); + bindApi(hook2, state); + return hook2; +} +var before_after_hook_default = { Singular, Collection }; + +// ../node_modules/@octokit/endpoint/dist-bundle/index.js +var VERSION = "0.0.0-development"; +var userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`; +var DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent + }, + mediaType: { + format: "" + } +}; +function lowercaseKeys(object) { + if (!object) { + return {}; + } + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); +} +function isPlainObject(value) { + if (typeof value !== "object" || value === null) return false; + if (Object.prototype.toString.call(value) !== "[object Object]") return false; + const proto = Object.getPrototypeOf(value); + if (proto === null) return true; + const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor; + return ( + typeof Ctor === "function" && + Ctor instanceof Ctor && + Function.prototype.call(Ctor) === Function.prototype.call(value) + ); +} +function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach((key) => { + if (isPlainObject(options[key])) { + if (!(key in defaults)) Object.assign(result, { [key]: options[key] }); + else result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { [key]: options[key] }); + } + }); + return result; +} +function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === void 0) { + delete obj[key]; + } + } + return obj; +} +function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { method, url } : { url: method }, options); + } else { + options = Object.assign({}, route); + } + options.headers = lowercaseKeys(options.headers); + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); + if (options.url === "/graphql") { + if (defaults && defaults.mediaType.previews?.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews + .filter((preview) => !mergedOptions.mediaType.previews.includes(preview)) + .concat(mergedOptions.mediaType.previews); + } + mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => + preview.replace(/-preview/, "") + ); + } + return mergedOptions; +} +function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + if (names.length === 0) { + return url; + } + return ( + url + + separator + + names + .map((name) => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); + } + return `${name}=${encodeURIComponent(parameters[name])}`; + }) + .join("&") + ); +} +var urlVariableRegex = /\{[^{}}]+\}/g; +function removeNonChars(variableName) { + return variableName.replace(/(?:^\W+)|(?:(? a.concat(b), []); +} +function omit(object, keysToOmit) { + const result = { __proto__: null }; + for (const key of Object.keys(object)) { + if (keysToOmit.indexOf(key) === -1) { + result[key] = object[key]; + } + } + return result; +} +function encodeReserved(str) { + return str + .split(/(%[0-9A-Fa-f]{2})/g) + .map(function (part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } + return part; + }) + .join(""); +} +function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} +function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } +} +function isDefined(value) { + return value !== void 0 && value !== null; +} +function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; +} +function getValues(context, operator, key, modifier) { + var value = context[key], + result = []; + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value2) { + result.push(encodeValue(operator, value2, isKeyOperator(operator) ? key : "")); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); + } + } else { + const tmp = []; + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value2) { + tmp.push(encodeValue(operator, value2)); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); + } + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); + } + } + } + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); + } + } + return result; +} +function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; +} +function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + template = template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { + if (expression) { + let operator = ""; + const values = []; + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); + } + expression.split(/,/g).forEach(function (variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); + if (operator && operator !== "+") { + var separator = ","; + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); + } + } else { + return encodeReserved(literal); + } + }); + if (template === "/") { + return template; + } else { + return template.replace(/\/$/, ""); + } +} +function parse(options) { + let method = options.method.toUpperCase(); + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); + if (!/^http/.test(url)) { + url = options.baseUrl + url; + } + const omittedParameters = Object.keys(options) + .filter((option) => urlVariableNames.includes(option)) + .concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); + if (!isBinaryRequest) { + if (options.mediaType.format) { + headers.accept = headers.accept + .split(/,/) + .map((format) => + format.replace( + /application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, + `application/vnd$1$2.${options.mediaType.format}` + ) + ) + .join(","); + } + if (url.endsWith("/graphql")) { + if (options.mediaType.previews?.length) { + const previewsFromAcceptHeader = + headers.accept.match(/(? { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }) + .join(","); + } + } + } + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } + } + } + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } + return Object.assign( + { method, url, headers }, + typeof body !== "undefined" ? { body } : null, + options.request ? { request: options.request } : null + ); +} +function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); +} +function withDefaults(oldDefaults, newDefaults) { + const DEFAULTS2 = merge(oldDefaults, newDefaults); + const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2); + return Object.assign(endpoint2, { + DEFAULTS: DEFAULTS2, + defaults: withDefaults.bind(null, DEFAULTS2), + merge: merge.bind(null, DEFAULTS2), + parse + }); +} +var endpoint = withDefaults(null, DEFAULTS); + +// ../node_modules/@octokit/request/dist-bundle/index.js +var import_fast_content_type_parse = __toESM(require_fast_content_type_parse(), 1); + +// ../node_modules/@octokit/request-error/dist-src/index.js +var RequestError = class extends Error { + name; + /** + * http status code + */ + status; + /** + * Request options that lead to the error. + */ + request; + /** + * Response object if a response was received + */ + response; + constructor(message, statusCode, options) { + super(message, { cause: options.cause }); + this.name = "HttpError"; + this.status = Number.parseInt(statusCode); + if (Number.isNaN(this.status)) { + this.status = 0; + } + if ("response" in options) { + this.response = options.response; + } + const requestCopy = Object.assign({}, options.request); + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace(/(? ""; +async function fetchWrapper(requestOptions) { + const fetch = requestOptions.request?.fetch || globalThis.fetch; + if (!fetch) { + throw new Error( + "fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing" + ); + } + const log = requestOptions.request?.log || console; + const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false; + const body = + isPlainObject2(requestOptions.body) || Array.isArray(requestOptions.body) + ? JSON.stringify(requestOptions.body) + : requestOptions.body; + const requestHeaders = Object.fromEntries( + Object.entries(requestOptions.headers).map(([name, value]) => [name, String(value)]) + ); + let fetchResponse; + try { + fetchResponse = await fetch(requestOptions.url, { + method: requestOptions.method, + body, + redirect: requestOptions.request?.redirect, + headers: requestHeaders, + signal: requestOptions.request?.signal, + // duplex must be set if request.body is ReadableStream or Async Iterables. + // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex. + ...(requestOptions.body && { duplex: "half" }) + }); + } catch (error) { + let message = "Unknown Error"; + if (error instanceof Error) { + if (error.name === "AbortError") { + error.status = 500; + throw error; + } + message = error.message; + if (error.name === "TypeError" && "cause" in error) { + if (error.cause instanceof Error) { + message = error.cause.message; + } else if (typeof error.cause === "string") { + message = error.cause; + } + } + } + const requestError = new RequestError(message, 500, { + request: requestOptions + }); + requestError.cause = error; + throw requestError; + } + const status = fetchResponse.status; + const url = fetchResponse.url; + const responseHeaders = {}; + for (const [key, value] of fetchResponse.headers) { + responseHeaders[key] = value; + } + const octokitResponse = { + url, + status, + headers: responseHeaders, + data: "" + }; + if ("deprecation" in responseHeaders) { + const matches = + responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel="deprecation"/); + const deprecationLink = matches && matches.pop(); + log.warn( + `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` + ); + } + if (status === 204 || status === 205) { + return octokitResponse; + } + if (requestOptions.method === "HEAD") { + if (status < 400) { + return octokitResponse; + } + throw new RequestError(fetchResponse.statusText, status, { + response: octokitResponse, + request: requestOptions + }); + } + if (status === 304) { + octokitResponse.data = await getResponseData(fetchResponse); + throw new RequestError("Not modified", status, { + response: octokitResponse, + request: requestOptions + }); + } + if (status >= 400) { + octokitResponse.data = await getResponseData(fetchResponse); + throw new RequestError(toErrorMessage(octokitResponse.data), status, { + response: octokitResponse, + request: requestOptions + }); + } + octokitResponse.data = parseSuccessResponseBody + ? await getResponseData(fetchResponse) + : fetchResponse.body; + return octokitResponse; +} +async function getResponseData(response) { + const contentType = response.headers.get("content-type"); + if (!contentType) { + return response.text().catch(noop); + } + const mimetype = (0, import_fast_content_type_parse.safeParse)(contentType); + if (isJSONResponse(mimetype)) { + let text = ""; + try { + text = await response.text(); + return JSON.parse(text); + } catch (err) { + return text; + } + } else if ( + mimetype.type.startsWith("text/") || + mimetype.parameters.charset?.toLowerCase() === "utf-8" + ) { + return response.text().catch(noop); + } else { + return response.arrayBuffer().catch( + /* v8 ignore next -- @preserve */ + () => new ArrayBuffer(0) + ); + } +} +function isJSONResponse(mimetype) { + return mimetype.type === "application/json" || mimetype.type === "application/scim+json"; +} +function toErrorMessage(data) { + if (typeof data === "string") { + return data; + } + if (data instanceof ArrayBuffer) { + return "Unknown error"; + } + if ("message" in data) { + const suffix = "documentation_url" in data ? ` - ${data.documentation_url}` : ""; + return Array.isArray(data.errors) + ? `${data.message}: ${data.errors.map((v) => JSON.stringify(v)).join(", ")}${suffix}` + : `${data.message}${suffix}`; + } + return `Unknown error: ${JSON.stringify(data)}`; +} +function withDefaults2(oldEndpoint, newDefaults) { + const endpoint2 = oldEndpoint.defaults(newDefaults); + const newApi = function (route, parameters) { + const endpointOptions = endpoint2.merge(route, parameters); + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint2.parse(endpointOptions)); + } + const request2 = (route2, parameters2) => { + return fetchWrapper(endpoint2.parse(endpoint2.merge(route2, parameters2))); + }; + Object.assign(request2, { + endpoint: endpoint2, + defaults: withDefaults2.bind(null, endpoint2) + }); + return endpointOptions.request.hook(request2, endpointOptions); + }; + return Object.assign(newApi, { + endpoint: endpoint2, + defaults: withDefaults2.bind(null, endpoint2) + }); +} +var request = withDefaults2(endpoint, defaults_default); + +// ../node_modules/@octokit/graphql/dist-bundle/index.js +var VERSION3 = "0.0.0-development"; +function _buildMessageForResponseErrors(data) { + return ( + `Request failed due to following response errors: +` + data.errors.map((e) => ` - ${e.message}`).join("\n") + ); +} +var GraphqlResponseError = class extends Error { + constructor(request2, headers, response) { + super(_buildMessageForResponseErrors(response)); + this.request = request2; + this.headers = headers; + this.response = response; + this.errors = response.errors; + this.data = response.data; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } + name = "GraphqlResponseError"; + errors; + data; +}; +var NON_VARIABLE_OPTIONS = [ + "method", + "baseUrl", + "url", + "headers", + "request", + "query", + "mediaType", + "operationName" +]; +var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; +var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; +function graphql(request2, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject( + new Error(`[@octokit/graphql] "query" cannot be used as variable name`) + ); + } + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; + return Promise.reject( + new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`) + ); + } + } + const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; + const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; + } + if (!result.variables) { + result.variables = {}; + } + result.variables[key] = parsedOptions[key]; + return result; + }, {}); + const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl; + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); + } + return request2(requestOptions).then((response) => { + if (response.data.errors) { + const headers = {}; + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; + } + throw new GraphqlResponseError(requestOptions, headers, response.data); + } + return response.data.data; + }); +} +function withDefaults3(request2, newDefaults) { + const newRequest = request2.defaults(newDefaults); + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + return Object.assign(newApi, { + defaults: withDefaults3.bind(null, newRequest), + endpoint: newRequest.endpoint + }); +} +var graphql2 = withDefaults3(request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION3} ${getUserAgent()}` + }, + method: "POST", + url: "/graphql" +}); +function withCustomRequest(customRequest) { + return withDefaults3(customRequest, { + method: "POST", + url: "/graphql" + }); +} + +// ../node_modules/@octokit/auth-token/dist-bundle/index.js +var b64url = "(?:[a-zA-Z0-9_-]+)"; +var sep = "\\."; +var jwtRE = new RegExp(`^${b64url}${sep}${b64url}${sep}${b64url}$`); +var isJWT = jwtRE.test.bind(jwtRE); +async function auth(token) { + const isApp = isJWT(token); + const isInstallation = token.startsWith("v1.") || token.startsWith("ghs_"); + const isUserToServer = token.startsWith("ghu_"); + const tokenType = isApp + ? "app" + : isInstallation + ? "installation" + : isUserToServer + ? "user-to-server" + : "oauth"; + return { + type: "token", + token, + tokenType + }; +} +function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } + return `token ${token}`; +} +async function hook(token, request2, route, parameters) { + const endpoint2 = request2.endpoint.merge(route, parameters); + endpoint2.headers.authorization = withAuthorizationPrefix(token); + return request2(endpoint2); +} +var createTokenAuth = function createTokenAuth2(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } + if (typeof token !== "string") { + throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); + } + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); +}; + +// ../node_modules/@octokit/core/dist-src/version.js +var VERSION4 = "7.0.6"; + +// ../node_modules/@octokit/core/dist-src/index.js +var noop2 = () => {}; +var consoleWarn = console.warn.bind(console); +var consoleError = console.error.bind(console); +function createLogger2(logger = {}) { + if (typeof logger.debug !== "function") { + logger.debug = noop2; + } + if (typeof logger.info !== "function") { + logger.info = noop2; + } + if (typeof logger.warn !== "function") { + logger.warn = consoleWarn; + } + if (typeof logger.error !== "function") { + logger.error = consoleError; + } + return logger; +} +var userAgentTrail = `octokit-core.js/${VERSION4} ${getUserAgent()}`; +var Octokit = class { + static VERSION = VERSION4; + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; + if (typeof defaults === "function") { + super(defaults(options)); + return; + } + super( + Object.assign( + {}, + defaults, + options, + options.userAgent && defaults.userAgent + ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } + : null + ) + ); + } + }; + return OctokitWithDefaults; + } + static plugins = []; + /** + * Attach a plugin (or many) to your Octokit instance. + * + * @example + * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) + */ + static plugin(...newPlugins) { + const currentPlugins = this.plugins; + const NewOctokit = class extends this { + static plugins = currentPlugins.concat( + newPlugins.filter((plugin) => !currentPlugins.includes(plugin)) + ); + }; + return NewOctokit; + } + constructor(options = {}) { + const hook2 = new before_after_hook_default.Collection(); + const requestDefaults = { + baseUrl: request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + // @ts-ignore internal usage only, no need to type + hook: hook2.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" + } + }; + requestDefaults.headers["user-agent"] = options.userAgent + ? `${options.userAgent} ${userAgentTrail}` + : userAgentTrail; + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; + } + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } + this.request = request.defaults(requestDefaults); + this.graphql = withCustomRequest(this.request).defaults(requestDefaults); + this.log = createLogger2(options.log); + this.hook = hook2; + if (!options.authStrategy) { + if (!options.auth) { + this.auth = async () => ({ + type: "unauthenticated" + }); + } else { + const auth2 = createTokenAuth(options.auth); + hook2.wrap("request", auth2.hook); + this.auth = auth2; + } + } else { + const { authStrategy, ...otherOptions } = options; + const auth2 = authStrategy( + Object.assign( + { + request: this.request, + log: this.log, + // we pass the current octokit instance as well as its constructor options + // to allow for authentication strategies that return a new octokit instance + // that shares the same internal state as the current one. The original + // requirement for this was the "event-octokit" authentication strategy + // of https://github.com/probot/octokit-auth-probot. + octokit: this, + octokitOptions: otherOptions + }, + options.auth + ) + ); + hook2.wrap("request", auth2.hook); + this.auth = auth2; + } + const classConstructor = this.constructor; + for (let i = 0; i < classConstructor.plugins.length; ++i) { + Object.assign(this, classConstructor.plugins[i](this, options)); + } + } + // assigned during constructor + request; + graphql; + log; + hook; + // TODO: type `octokit.auth` based on passed options.authStrategy + auth; +}; + +// ../node_modules/@octokit/plugin-request-log/dist-src/version.js +var VERSION5 = "6.0.0"; + +// ../node_modules/@octokit/plugin-request-log/dist-src/index.js +function requestLog(octokit) { + octokit.hook.wrap("request", (request2, options) => { + octokit.log.debug("request", options); + const start = Date.now(); + const requestOptions = octokit.request.endpoint.parse(options); + const path11 = requestOptions.url.replace(options.baseUrl, ""); + return request2(options) + .then((response) => { + const requestId = response.headers["x-github-request-id"]; + octokit.log.info( + `${requestOptions.method} ${path11} - ${response.status} with id ${requestId} in ${Date.now() - start}ms` + ); + return response; + }) + .catch((error) => { + const requestId = error.response?.headers["x-github-request-id"] || "UNKNOWN"; + octokit.log.error( + `${requestOptions.method} ${path11} - ${error.status} with id ${requestId} in ${Date.now() - start}ms` + ); + throw error; + }); + }); +} +requestLog.VERSION = VERSION5; + +// ../node_modules/@octokit/plugin-paginate-rest/dist-bundle/index.js +var VERSION6 = "0.0.0-development"; +function normalizePaginatedListResponse(response) { + if (!response.data) { + return { + ...response, + data: [] + }; + } + const responseNeedsNormalization = + ("total_count" in response.data || "total_commits" in response.data) && + !("url" in response.data); + if (!responseNeedsNormalization) return response; + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + const totalCommits = response.data.total_commits; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + delete response.data.total_commits; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; + } + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; + } + response.data.total_count = totalCount; + response.data.total_commits = totalCommits; + return response; +} +function iterator(octokit, route, parameters) { + const options = + typeof route === "function" + ? route.endpoint(parameters) + : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) return { done: true }; + try { + const response = await requestMethod({ method, url, headers }); + const normalizedResponse = normalizePaginatedListResponse(response); + url = ((normalizedResponse.headers.link || "").match(/<([^<>]+)>;\s*rel="next"/) || + [])[1]; + if (!url && "total_commits" in normalizedResponse.data) { + const parsedUrl = new URL(normalizedResponse.url); + const params = parsedUrl.searchParams; + const page = parseInt(params.get("page") || "1", 10); + const per_page = parseInt(params.get("per_page") || "250", 10); + if (page * per_page < normalizedResponse.data.total_commits) { + params.set("page", String(page + 1)); + url = parsedUrl.toString(); + } + } + return { value: normalizedResponse }; + } catch (error) { + if (error.status !== 409) throw error; + url = ""; + return { + value: { + status: 200, + headers: {}, + data: [] + } + }; + } + } + }) + }; +} +function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = void 0; + } + return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); +} +function gather(octokit, results, iterator2, mapFn) { + return iterator2.next().then((result) => { + if (result.done) { + return results; + } + let earlyExit = false; + function done() { + earlyExit = true; + } + results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); + if (earlyExit) { + return results; + } + return gather(octokit, results, iterator2, mapFn); + }); +} +var composePaginateRest = Object.assign(paginate, { + iterator +}); +function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; +} +paginateRest.VERSION = VERSION6; + +// ../node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/version.js +var VERSION7 = "17.0.0"; + +// ../node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/generated/endpoints.js +var Endpoints = { + actions: { + addCustomLabelsToSelfHostedRunnerForOrg: [ + "POST /orgs/{org}/actions/runners/{runner_id}/labels" + ], + addCustomLabelsToSelfHostedRunnerForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + addRepoAccessToSelfHostedRunnerGroupInOrg: [ + "PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}" + ], + addSelectedRepoToOrgSecret: [ + "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" + ], + addSelectedRepoToOrgVariable: [ + "PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" + ], + approveWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"], + cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], + createEnvironmentVariable: [ + "POST /repos/{owner}/{repo}/environments/{environment_name}/variables" + ], + createHostedRunnerForOrg: ["POST /orgs/{org}/actions/hosted-runners"], + createOrUpdateEnvironmentSecret: [ + "PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" + ], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + createOrgVariable: ["POST /orgs/{org}/actions/variables"], + createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], + createRegistrationTokenForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/registration-token" + ], + createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], + createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], + createRepoVariable: ["POST /repos/{owner}/{repo}/actions/variables"], + createWorkflowDispatch: [ + "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches" + ], + deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"], + deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"], + deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + deleteCustomImageFromOrg: [ + "DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}" + ], + deleteCustomImageVersionFromOrg: [ + "DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}" + ], + deleteEnvironmentSecret: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" + ], + deleteEnvironmentVariable: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" + ], + deleteHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"], + deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], + deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + deleteRepoVariable: ["DELETE /repos/{owner}/{repo}/actions/variables/{name}"], + deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], + deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], + deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], + deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + disableSelectedRepositoryGithubActionsOrganization: [ + "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}" + ], + disableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"], + downloadArtifact: [ + "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}" + ], + downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], + downloadWorkflowRunAttemptLogs: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs" + ], + downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + enableSelectedRepositoryGithubActionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}" + ], + enableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"], + forceCancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel"], + generateRunnerJitconfigForOrg: ["POST /orgs/{org}/actions/runners/generate-jitconfig"], + generateRunnerJitconfigForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig" + ], + getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], + getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], + getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"], + getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], + getAllowedActionsOrganization: ["GET /orgs/{org}/actions/permissions/selected-actions"], + getAllowedActionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"], + getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getCustomImageForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}" + ], + getCustomImageVersionForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}" + ], + getCustomOidcSubClaimForRepo: ["GET /repos/{owner}/{repo}/actions/oidc/customization/sub"], + getEnvironmentPublicKey: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key" + ], + getEnvironmentSecret: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" + ], + getEnvironmentVariable: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" + ], + getGithubActionsDefaultWorkflowPermissionsOrganization: [ + "GET /orgs/{org}/actions/permissions/workflow" + ], + getGithubActionsDefaultWorkflowPermissionsRepository: [ + "GET /repos/{owner}/{repo}/actions/permissions/workflow" + ], + getGithubActionsPermissionsOrganization: ["GET /orgs/{org}/actions/permissions"], + getGithubActionsPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions"], + getHostedRunnerForOrg: ["GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"], + getHostedRunnersGithubOwnedImagesForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/github-owned" + ], + getHostedRunnersLimitsForOrg: ["GET /orgs/{org}/actions/hosted-runners/limits"], + getHostedRunnersMachineSpecsForOrg: ["GET /orgs/{org}/actions/hosted-runners/machine-sizes"], + getHostedRunnersPartnerImagesForOrg: ["GET /orgs/{org}/actions/hosted-runners/images/partner"], + getHostedRunnersPlatformsForOrg: ["GET /orgs/{org}/actions/hosted-runners/platforms"], + getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], + getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], + getOrgVariable: ["GET /orgs/{org}/actions/variables/{name}"], + getPendingDeploymentsForRun: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" + ], + getRepoPermissions: [ + "GET /repos/{owner}/{repo}/actions/permissions", + {}, + { renamed: ["actions", "getGithubActionsPermissionsRepository"] } + ], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + getRepoVariable: ["GET /repos/{owner}/{repo}/actions/variables/{name}"], + getReviewsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"], + getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], + getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], + getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], + getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"], + getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], + getWorkflowRunAttempt: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}" + ], + getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], + getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], + listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], + listCustomImageVersionsForOrg: [ + "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions" + ], + listCustomImagesForOrg: ["GET /orgs/{org}/actions/hosted-runners/images/custom"], + listEnvironmentSecrets: ["GET /repos/{owner}/{repo}/environments/{environment_name}/secrets"], + listEnvironmentVariables: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/variables" + ], + listGithubHostedRunnersInGroupForOrg: [ + "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners" + ], + listHostedRunnersForOrg: ["GET /orgs/{org}/actions/hosted-runners"], + listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], + listJobsForWorkflowRunAttempt: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs" + ], + listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"], + listLabelsForSelfHostedRunnerForRepo: [ + "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], + listOrgVariables: ["GET /orgs/{org}/actions/variables"], + listRepoOrganizationSecrets: ["GET /repos/{owner}/{repo}/actions/organization-secrets"], + listRepoOrganizationVariables: ["GET /repos/{owner}/{repo}/actions/organization-variables"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], + listRepoVariables: ["GET /repos/{owner}/{repo}/actions/variables"], + listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], + listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], + listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], + listSelectedReposForOrgVariable: ["GET /orgs/{org}/actions/variables/{name}/repositories"], + listSelectedRepositoriesEnabledGithubActionsOrganization: [ + "GET /orgs/{org}/actions/permissions/repositories" + ], + listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], + listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], + listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], + listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], + listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], + reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"], + reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], + reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"], + removeAllCustomLabelsFromSelfHostedRunnerForOrg: [ + "DELETE /orgs/{org}/actions/runners/{runner_id}/labels" + ], + removeAllCustomLabelsFromSelfHostedRunnerForRepo: [ + "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + removeCustomLabelFromSelfHostedRunnerForOrg: [ + "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}" + ], + removeCustomLabelFromSelfHostedRunnerForRepo: [ + "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}" + ], + removeSelectedRepoFromOrgSecret: [ + "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" + ], + removeSelectedRepoFromOrgVariable: [ + "DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" + ], + reviewCustomGatesForRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule" + ], + reviewPendingDeploymentsForRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" + ], + setAllowedActionsOrganization: ["PUT /orgs/{org}/actions/permissions/selected-actions"], + setAllowedActionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"], + setCustomLabelsForSelfHostedRunnerForOrg: [ + "PUT /orgs/{org}/actions/runners/{runner_id}/labels" + ], + setCustomLabelsForSelfHostedRunnerForRepo: [ + "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + setCustomOidcSubClaimForRepo: ["PUT /repos/{owner}/{repo}/actions/oidc/customization/sub"], + setGithubActionsDefaultWorkflowPermissionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/workflow" + ], + setGithubActionsDefaultWorkflowPermissionsRepository: [ + "PUT /repos/{owner}/{repo}/actions/permissions/workflow" + ], + setGithubActionsPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions"], + setGithubActionsPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"], + setSelectedReposForOrgVariable: ["PUT /orgs/{org}/actions/variables/{name}/repositories"], + setSelectedRepositoriesEnabledGithubActionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/repositories" + ], + setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"], + updateEnvironmentVariable: [ + "PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" + ], + updateHostedRunnerForOrg: ["PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"], + updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"], + updateRepoVariable: ["PATCH /repos/{owner}/{repo}/actions/variables/{name}"] + }, + activity: { + checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], + deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], + deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], + getFeeds: ["GET /feeds"], + getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], + getThread: ["GET /notifications/threads/{thread_id}"], + getThreadSubscriptionForAuthenticatedUser: [ + "GET /notifications/threads/{thread_id}/subscription" + ], + listEventsForAuthenticatedUser: ["GET /users/{username}/events"], + listNotificationsForAuthenticatedUser: ["GET /notifications"], + listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], + listPublicEvents: ["GET /events"], + listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], + listPublicEventsForUser: ["GET /users/{username}/events/public"], + listPublicOrgEvents: ["GET /orgs/{org}/events"], + listReceivedEventsForUser: ["GET /users/{username}/received_events"], + listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], + listRepoEvents: ["GET /repos/{owner}/{repo}/events"], + listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], + listReposStarredByAuthenticatedUser: ["GET /user/starred"], + listReposStarredByUser: ["GET /users/{username}/starred"], + listReposWatchedByUser: ["GET /users/{username}/subscriptions"], + listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], + listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], + listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], + markNotificationsAsRead: ["PUT /notifications"], + markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"], + markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], + setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], + setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], + starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], + unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] + }, + apps: { + addRepoToInstallation: [ + "PUT /user/installations/{installation_id}/repositories/{repository_id}", + {}, + { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] } + ], + addRepoToInstallationForAuthenticatedUser: [ + "PUT /user/installations/{installation_id}/repositories/{repository_id}" + ], + checkToken: ["POST /applications/{client_id}/token"], + createFromManifest: ["POST /app-manifests/{code}/conversions"], + createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], + deleteAuthorization: ["DELETE /applications/{client_id}/grant"], + deleteInstallation: ["DELETE /app/installations/{installation_id}"], + deleteToken: ["DELETE /applications/{client_id}/token"], + getAuthenticated: ["GET /app"], + getBySlug: ["GET /apps/{app_slug}"], + getInstallation: ["GET /app/installations/{installation_id}"], + getOrgInstallation: ["GET /orgs/{org}/installation"], + getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], + getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], + getSubscriptionPlanForAccountStubbed: [ + "GET /marketplace_listing/stubbed/accounts/{account_id}" + ], + getUserInstallation: ["GET /users/{username}/installation"], + getWebhookConfigForApp: ["GET /app/hook/config"], + getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], + listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], + listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], + listInstallationReposForAuthenticatedUser: [ + "GET /user/installations/{installation_id}/repositories" + ], + listInstallationRequestsForAuthenticatedApp: ["GET /app/installation-requests"], + listInstallations: ["GET /app/installations"], + listInstallationsForAuthenticatedUser: ["GET /user/installations"], + listPlans: ["GET /marketplace_listing/plans"], + listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], + listReposAccessibleToInstallation: ["GET /installation/repositories"], + listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], + listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], + listWebhookDeliveries: ["GET /app/hook/deliveries"], + redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"], + removeRepoFromInstallation: [ + "DELETE /user/installations/{installation_id}/repositories/{repository_id}", + {}, + { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] } + ], + removeRepoFromInstallationForAuthenticatedUser: [ + "DELETE /user/installations/{installation_id}/repositories/{repository_id}" + ], + resetToken: ["PATCH /applications/{client_id}/token"], + revokeInstallationAccessToken: ["DELETE /installation/token"], + scopeToken: ["POST /applications/{client_id}/token/scoped"], + suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], + unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"], + updateWebhookConfigForApp: ["PATCH /app/hook/config"] + }, + billing: { + getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], + getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], + getGithubBillingPremiumRequestUsageReportOrg: [ + "GET /organizations/{org}/settings/billing/premium_request/usage" + ], + getGithubBillingPremiumRequestUsageReportUser: [ + "GET /users/{username}/settings/billing/premium_request/usage" + ], + getGithubBillingUsageReportOrg: ["GET /organizations/{org}/settings/billing/usage"], + getGithubBillingUsageReportUser: ["GET /users/{username}/settings/billing/usage"], + getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], + getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], + getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], + getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] + }, + campaigns: { + createCampaign: ["POST /orgs/{org}/campaigns"], + deleteCampaign: ["DELETE /orgs/{org}/campaigns/{campaign_number}"], + getCampaignSummary: ["GET /orgs/{org}/campaigns/{campaign_number}"], + listOrgCampaigns: ["GET /orgs/{org}/campaigns"], + updateCampaign: ["PATCH /orgs/{org}/campaigns/{campaign_number}"] + }, + checks: { + create: ["POST /repos/{owner}/{repo}/check-runs"], + createSuite: ["POST /repos/{owner}/{repo}/check-suites"], + get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], + getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], + listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"], + listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], + listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"], + listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], + rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"], + rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"], + setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences"], + update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] + }, + codeScanning: { + commitAutofix: [ + "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits" + ], + createAutofix: ["POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"], + createVariantAnalysis: ["POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses"], + deleteAnalysis: [ + "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}" + ], + deleteCodeqlDatabase: [ + "DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" + ], + getAlert: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", + {}, + { renamedParameters: { alert_id: "alert_number" } } + ], + getAnalysis: ["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"], + getAutofix: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"], + getCodeqlDatabase: ["GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"], + getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"], + getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + getVariantAnalysis: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}" + ], + getVariantAnalysisRepoTask: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}" + ], + listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"], + listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], + listAlertsInstances: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", + {}, + { renamed: ["codeScanning", "listAlertInstances"] } + ], + listCodeqlDatabases: ["GET /repos/{owner}/{repo}/code-scanning/codeql/databases"], + listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], + updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], + updateDefaultSetup: ["PATCH /repos/{owner}/{repo}/code-scanning/default-setup"], + uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] + }, + codeSecurity: { + attachConfiguration: [ + "POST /orgs/{org}/code-security/configurations/{configuration_id}/attach" + ], + attachEnterpriseConfiguration: [ + "POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach" + ], + createConfiguration: ["POST /orgs/{org}/code-security/configurations"], + createConfigurationForEnterprise: [ + "POST /enterprises/{enterprise}/code-security/configurations" + ], + deleteConfiguration: ["DELETE /orgs/{org}/code-security/configurations/{configuration_id}"], + deleteConfigurationForEnterprise: [ + "DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ], + detachConfiguration: ["DELETE /orgs/{org}/code-security/configurations/detach"], + getConfiguration: ["GET /orgs/{org}/code-security/configurations/{configuration_id}"], + getConfigurationForRepository: ["GET /repos/{owner}/{repo}/code-security-configuration"], + getConfigurationsForEnterprise: ["GET /enterprises/{enterprise}/code-security/configurations"], + getConfigurationsForOrg: ["GET /orgs/{org}/code-security/configurations"], + getDefaultConfigurations: ["GET /orgs/{org}/code-security/configurations/defaults"], + getDefaultConfigurationsForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations/defaults" + ], + getRepositoriesForConfiguration: [ + "GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories" + ], + getRepositoriesForEnterpriseConfiguration: [ + "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories" + ], + getSingleConfigurationForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ], + setConfigurationAsDefault: [ + "PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults" + ], + setConfigurationAsDefaultForEnterprise: [ + "PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults" + ], + updateConfiguration: ["PATCH /orgs/{org}/code-security/configurations/{configuration_id}"], + updateEnterpriseConfiguration: [ + "PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ] + }, + codesOfConduct: { + getAllCodesOfConduct: ["GET /codes_of_conduct"], + getConductCode: ["GET /codes_of_conduct/{key}"] + }, + codespaces: { + addRepositoryForSecretForAuthenticatedUser: [ + "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + addSelectedRepoToOrgSecret: [ + "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + checkPermissionsForDevcontainer: ["GET /repos/{owner}/{repo}/codespaces/permissions_check"], + codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"], + createForAuthenticatedUser: ["POST /user/codespaces"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/codespaces/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"], + createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"], + createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"], + deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], + deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"], + exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"], + getCodespacesForUserInOrg: ["GET /orgs/{org}/members/{username}/codespaces"], + getExportDetailsForAuthenticatedUser: [ + "GET /user/codespaces/{codespace_name}/exports/{export_id}" + ], + getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], + getOrgPublicKey: ["GET /orgs/{org}/codespaces/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/codespaces/secrets/{secret_name}"], + getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"], + listDevcontainersInRepositoryForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/codespaces/devcontainers" + ], + listForAuthenticatedUser: ["GET /user/codespaces"], + listInOrganization: [ + "GET /orgs/{org}/codespaces", + {}, + { renamedParameters: { org_id: "org" } } + ], + listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"], + listOrgSecrets: ["GET /orgs/{org}/codespaces/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], + listRepositoriesForSecretForAuthenticatedUser: [ + "GET /user/codespaces/secrets/{secret_name}/repositories" + ], + listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], + listSelectedReposForOrgSecret: [ + "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories" + ], + preFlightWithRepoForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/new"], + publishForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/publish"], + removeRepositoryForSecretForAuthenticatedUser: [ + "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + removeSelectedRepoFromOrgSecret: [ + "DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"], + setRepositoriesForSecretForAuthenticatedUser: [ + "PUT /user/codespaces/secrets/{secret_name}/repositories" + ], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories"], + startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], + stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], + stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"], + updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] + }, + copilot: { + addCopilotSeatsForTeams: ["POST /orgs/{org}/copilot/billing/selected_teams"], + addCopilotSeatsForUsers: ["POST /orgs/{org}/copilot/billing/selected_users"], + cancelCopilotSeatAssignmentForTeams: ["DELETE /orgs/{org}/copilot/billing/selected_teams"], + cancelCopilotSeatAssignmentForUsers: ["DELETE /orgs/{org}/copilot/billing/selected_users"], + copilotMetricsForOrganization: ["GET /orgs/{org}/copilot/metrics"], + copilotMetricsForTeam: ["GET /orgs/{org}/team/{team_slug}/copilot/metrics"], + getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"], + getCopilotSeatDetailsForUser: ["GET /orgs/{org}/members/{username}/copilot"], + listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"] + }, + credentials: { revoke: ["POST /credentials/revoke"] }, + dependabot: { + addSelectedRepoToOrgSecret: [ + "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" + ], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"], + getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + listAlertsForEnterprise: ["GET /enterprises/{enterprise}/dependabot/alerts"], + listAlertsForOrg: ["GET /orgs/{org}/dependabot/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"], + listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], + listSelectedReposForOrgSecret: [ + "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories" + ], + removeSelectedRepoFromOrgSecret: [ + "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" + ], + repositoryAccessForOrg: ["GET /organizations/{org}/dependabot/repository-access"], + setRepositoryAccessDefaultLevel: [ + "PUT /organizations/{org}/dependabot/repository-access/default-level" + ], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"], + updateAlert: ["PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"], + updateRepositoryAccessForOrg: ["PATCH /organizations/{org}/dependabot/repository-access"] + }, + dependencyGraph: { + createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"], + diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"], + exportSbom: ["GET /repos/{owner}/{repo}/dependency-graph/sbom"] + }, + emojis: { get: ["GET /emojis"] }, + enterpriseTeamMemberships: { + add: ["PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"], + bulkAdd: ["POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add"], + bulkRemove: ["POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove"], + get: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"], + list: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships"], + remove: ["DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"] + }, + enterpriseTeamOrganizations: { + add: ["PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"], + bulkAdd: ["POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add"], + bulkRemove: ["POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/remove"], + delete: ["DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"], + getAssignment: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"], + getAssignments: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations"] + }, + enterpriseTeams: { + create: ["POST /enterprises/{enterprise}/teams"], + delete: ["DELETE /enterprises/{enterprise}/teams/{team_slug}"], + get: ["GET /enterprises/{enterprise}/teams/{team_slug}"], + list: ["GET /enterprises/{enterprise}/teams"], + update: ["PATCH /enterprises/{enterprise}/teams/{team_slug}"] + }, + gists: { + checkIsStarred: ["GET /gists/{gist_id}/star"], + create: ["POST /gists"], + createComment: ["POST /gists/{gist_id}/comments"], + delete: ["DELETE /gists/{gist_id}"], + deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], + fork: ["POST /gists/{gist_id}/forks"], + get: ["GET /gists/{gist_id}"], + getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], + getRevision: ["GET /gists/{gist_id}/{sha}"], + list: ["GET /gists"], + listComments: ["GET /gists/{gist_id}/comments"], + listCommits: ["GET /gists/{gist_id}/commits"], + listForUser: ["GET /users/{username}/gists"], + listForks: ["GET /gists/{gist_id}/forks"], + listPublic: ["GET /gists/public"], + listStarred: ["GET /gists/starred"], + star: ["PUT /gists/{gist_id}/star"], + unstar: ["DELETE /gists/{gist_id}/star"], + update: ["PATCH /gists/{gist_id}"], + updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] + }, + git: { + createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], + createCommit: ["POST /repos/{owner}/{repo}/git/commits"], + createRef: ["POST /repos/{owner}/{repo}/git/refs"], + createTag: ["POST /repos/{owner}/{repo}/git/tags"], + createTree: ["POST /repos/{owner}/{repo}/git/trees"], + deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], + getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], + getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], + getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], + getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], + getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], + listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], + updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] + }, + gitignore: { + getAllTemplates: ["GET /gitignore/templates"], + getTemplate: ["GET /gitignore/templates/{name}"] + }, + hostedCompute: { + createNetworkConfigurationForOrg: ["POST /orgs/{org}/settings/network-configurations"], + deleteNetworkConfigurationFromOrg: [ + "DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}" + ], + getNetworkConfigurationForOrg: [ + "GET /orgs/{org}/settings/network-configurations/{network_configuration_id}" + ], + getNetworkSettingsForOrg: ["GET /orgs/{org}/settings/network-settings/{network_settings_id}"], + listNetworkConfigurationsForOrg: ["GET /orgs/{org}/settings/network-configurations"], + updateNetworkConfigurationForOrg: [ + "PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}" + ] + }, + interactions: { + getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], + getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], + getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], + getRestrictionsForYourPublicRepos: [ + "GET /user/interaction-limits", + {}, + { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] } + ], + removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], + removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], + removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits"], + removeRestrictionsForYourPublicRepos: [ + "DELETE /user/interaction-limits", + {}, + { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] } + ], + setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], + setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], + setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], + setRestrictionsForYourPublicRepos: [ + "PUT /user/interaction-limits", + {}, + { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] } + ] + }, + issues: { + addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + addBlockedByDependency: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by" + ], + addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + addSubIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"], + checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], + checkUserCanBeAssignedToIssue: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}" + ], + create: ["POST /repos/{owner}/{repo}/issues"], + createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], + createLabel: ["POST /repos/{owner}/{repo}/labels"], + createMilestone: ["POST /repos/{owner}/{repo}/milestones"], + deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], + deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], + deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], + get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], + getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], + getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], + getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], + getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], + getParent: ["GET /repos/{owner}/{repo}/issues/{issue_number}/parent"], + list: ["GET /issues"], + listAssignees: ["GET /repos/{owner}/{repo}/assignees"], + listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], + listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], + listDependenciesBlockedBy: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by" + ], + listDependenciesBlocking: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking" + ], + listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], + listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], + listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"], + listForAuthenticatedUser: ["GET /user/issues"], + listForOrg: ["GET /orgs/{org}/issues"], + listForRepo: ["GET /repos/{owner}/{repo}/issues"], + listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], + listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], + listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], + listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + listSubIssues: ["GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"], + lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], + removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], + removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + removeDependencyBlockedBy: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}" + ], + removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], + removeSubIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue"], + reprioritizeSubIssue: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority"], + setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], + unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], + update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], + updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], + updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], + updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] + }, + licenses: { + get: ["GET /licenses/{license}"], + getAllCommonlyUsed: ["GET /licenses"], + getForRepo: ["GET /repos/{owner}/{repo}/license"] + }, + markdown: { + render: ["POST /markdown"], + renderRaw: ["POST /markdown/raw", { headers: { "content-type": "text/plain; charset=utf-8" } }] + }, + meta: { + get: ["GET /meta"], + getAllVersions: ["GET /versions"], + getOctocat: ["GET /octocat"], + getZen: ["GET /zen"], + root: ["GET /"] + }, + migrations: { + deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive"], + deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"], + downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"], + getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"], + getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], + getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], + listForAuthenticatedUser: ["GET /user/migrations"], + listForOrg: ["GET /orgs/{org}/migrations"], + listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"], + listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], + listReposForUser: [ + "GET /user/migrations/{migration_id}/repositories", + {}, + { renamed: ["migrations", "listReposForAuthenticatedUser"] } + ], + startForAuthenticatedUser: ["POST /user/migrations"], + startForOrg: ["POST /orgs/{org}/migrations"], + unlockRepoForAuthenticatedUser: [ + "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock" + ], + unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"] + }, + oidc: { + getOidcCustomSubTemplateForOrg: ["GET /orgs/{org}/actions/oidc/customization/sub"], + updateOidcCustomSubTemplateForOrg: ["PUT /orgs/{org}/actions/oidc/customization/sub"] + }, + orgs: { + addSecurityManagerTeam: [ + "PUT /orgs/{org}/security-managers/teams/{team_slug}", + {}, + { + deprecated: + "octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team" + } + ], + assignTeamToOrgRole: ["PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"], + assignUserToOrgRole: ["PUT /orgs/{org}/organization-roles/users/{username}/{role_id}"], + blockUser: ["PUT /orgs/{org}/blocks/{username}"], + cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], + checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], + checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], + checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], + convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], + createArtifactStorageRecord: ["POST /orgs/{org}/artifacts/metadata/storage-record"], + createInvitation: ["POST /orgs/{org}/invitations"], + createIssueType: ["POST /orgs/{org}/issue-types"], + createWebhook: ["POST /orgs/{org}/hooks"], + customPropertiesForOrgsCreateOrUpdateOrganizationValues: [ + "PATCH /organizations/{org}/org-properties/values" + ], + customPropertiesForOrgsGetOrganizationValues: [ + "GET /organizations/{org}/org-properties/values" + ], + customPropertiesForReposCreateOrUpdateOrganizationDefinition: [ + "PUT /orgs/{org}/properties/schema/{custom_property_name}" + ], + customPropertiesForReposCreateOrUpdateOrganizationDefinitions: [ + "PATCH /orgs/{org}/properties/schema" + ], + customPropertiesForReposCreateOrUpdateOrganizationValues: [ + "PATCH /orgs/{org}/properties/values" + ], + customPropertiesForReposDeleteOrganizationDefinition: [ + "DELETE /orgs/{org}/properties/schema/{custom_property_name}" + ], + customPropertiesForReposGetOrganizationDefinition: [ + "GET /orgs/{org}/properties/schema/{custom_property_name}" + ], + customPropertiesForReposGetOrganizationDefinitions: ["GET /orgs/{org}/properties/schema"], + customPropertiesForReposGetOrganizationValues: ["GET /orgs/{org}/properties/values"], + delete: ["DELETE /orgs/{org}"], + deleteAttestationsBulk: ["POST /orgs/{org}/attestations/delete-request"], + deleteAttestationsById: ["DELETE /orgs/{org}/attestations/{attestation_id}"], + deleteAttestationsBySubjectDigest: ["DELETE /orgs/{org}/attestations/digest/{subject_digest}"], + deleteIssueType: ["DELETE /orgs/{org}/issue-types/{issue_type_id}"], + deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], + disableSelectedRepositoryImmutableReleasesOrganization: [ + "DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}" + ], + enableSelectedRepositoryImmutableReleasesOrganization: [ + "PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}" + ], + get: ["GET /orgs/{org}"], + getImmutableReleasesSettings: ["GET /orgs/{org}/settings/immutable-releases"], + getImmutableReleasesSettingsRepositories: [ + "GET /orgs/{org}/settings/immutable-releases/repositories" + ], + getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], + getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], + getOrgRulesetHistory: ["GET /orgs/{org}/rulesets/{ruleset_id}/history"], + getOrgRulesetVersion: ["GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}"], + getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], + getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"], + list: ["GET /organizations"], + listAppInstallations: ["GET /orgs/{org}/installations"], + listArtifactStorageRecords: [ + "GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records" + ], + listAttestationRepositories: ["GET /orgs/{org}/attestations/repositories"], + listAttestations: ["GET /orgs/{org}/attestations/{subject_digest}"], + listAttestationsBulk: ["POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}"], + listBlockedUsers: ["GET /orgs/{org}/blocks"], + listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], + listForAuthenticatedUser: ["GET /user/orgs"], + listForUser: ["GET /users/{username}/orgs"], + listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], + listIssueTypes: ["GET /orgs/{org}/issue-types"], + listMembers: ["GET /orgs/{org}/members"], + listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], + listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"], + listOrgRoles: ["GET /orgs/{org}/organization-roles"], + listOrganizationFineGrainedPermissions: [ + "GET /orgs/{org}/organization-fine-grained-permissions" + ], + listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], + listPatGrantRepositories: ["GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"], + listPatGrantRequestRepositories: [ + "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories" + ], + listPatGrantRequests: ["GET /orgs/{org}/personal-access-token-requests"], + listPatGrants: ["GET /orgs/{org}/personal-access-tokens"], + listPendingInvitations: ["GET /orgs/{org}/invitations"], + listPublicMembers: ["GET /orgs/{org}/public_members"], + listSecurityManagerTeams: [ + "GET /orgs/{org}/security-managers", + {}, + { + deprecated: + "octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams" + } + ], + listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /orgs/{org}/hooks"], + pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: [ + "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" + ], + removeMember: ["DELETE /orgs/{org}/members/{username}"], + removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], + removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], + removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], + removeSecurityManagerTeam: [ + "DELETE /orgs/{org}/security-managers/teams/{team_slug}", + {}, + { + deprecated: + "octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team" + } + ], + reviewPatGrantRequest: ["POST /orgs/{org}/personal-access-token-requests/{pat_request_id}"], + reviewPatGrantRequestsInBulk: ["POST /orgs/{org}/personal-access-token-requests"], + revokeAllOrgRolesTeam: ["DELETE /orgs/{org}/organization-roles/teams/{team_slug}"], + revokeAllOrgRolesUser: ["DELETE /orgs/{org}/organization-roles/users/{username}"], + revokeOrgRoleTeam: ["DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"], + revokeOrgRoleUser: ["DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}"], + setImmutableReleasesSettings: ["PUT /orgs/{org}/settings/immutable-releases"], + setImmutableReleasesSettingsRepositories: [ + "PUT /orgs/{org}/settings/immutable-releases/repositories" + ], + setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], + setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], + unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], + update: ["PATCH /orgs/{org}"], + updateIssueType: ["PUT /orgs/{org}/issue-types/{issue_type_id}"], + updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], + updatePatAccess: ["POST /orgs/{org}/personal-access-tokens/{pat_id}"], + updatePatAccesses: ["POST /orgs/{org}/personal-access-tokens"], + updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], + updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] + }, + packages: { + deletePackageForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}"], + deletePackageForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}"], + deletePackageForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}"], + deletePackageVersionForAuthenticatedUser: [ + "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + deletePackageVersionForOrg: [ + "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + deletePackageVersionForUser: [ + "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + getAllPackageVersionsForAPackageOwnedByAnOrg: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", + {}, + { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] } + ], + getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}/versions", + {}, + { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"] + } + ], + getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}/versions" + ], + getAllPackageVersionsForPackageOwnedByOrg: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions" + ], + getAllPackageVersionsForPackageOwnedByUser: [ + "GET /users/{username}/packages/{package_type}/{package_name}/versions" + ], + getPackageForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}"], + getPackageForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}"], + getPackageForUser: ["GET /users/{username}/packages/{package_type}/{package_name}"], + getPackageVersionForAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + getPackageVersionForOrganization: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + getPackageVersionForUser: [ + "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + listDockerMigrationConflictingPackagesForAuthenticatedUser: ["GET /user/docker/conflicts"], + listDockerMigrationConflictingPackagesForOrganization: ["GET /orgs/{org}/docker/conflicts"], + listDockerMigrationConflictingPackagesForUser: ["GET /users/{username}/docker/conflicts"], + listPackagesForAuthenticatedUser: ["GET /user/packages"], + listPackagesForOrganization: ["GET /orgs/{org}/packages"], + listPackagesForUser: ["GET /users/{username}/packages"], + restorePackageForAuthenticatedUser: [ + "POST /user/packages/{package_type}/{package_name}/restore{?token}" + ], + restorePackageForOrg: [ + "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}" + ], + restorePackageForUser: [ + "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}" + ], + restorePackageVersionForAuthenticatedUser: [ + "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" + ], + restorePackageVersionForOrg: [ + "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" + ], + restorePackageVersionForUser: [ + "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" + ] + }, + privateRegistries: { + createOrgPrivateRegistry: ["POST /orgs/{org}/private-registries"], + deleteOrgPrivateRegistry: ["DELETE /orgs/{org}/private-registries/{secret_name}"], + getOrgPrivateRegistry: ["GET /orgs/{org}/private-registries/{secret_name}"], + getOrgPublicKey: ["GET /orgs/{org}/private-registries/public-key"], + listOrgPrivateRegistries: ["GET /orgs/{org}/private-registries"], + updateOrgPrivateRegistry: ["PATCH /orgs/{org}/private-registries/{secret_name}"] + }, + projects: { + addItemForOrg: ["POST /orgs/{org}/projectsV2/{project_number}/items"], + addItemForUser: ["POST /users/{username}/projectsV2/{project_number}/items"], + deleteItemForOrg: ["DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}"], + deleteItemForUser: ["DELETE /users/{username}/projectsV2/{project_number}/items/{item_id}"], + getFieldForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}"], + getFieldForUser: ["GET /users/{username}/projectsV2/{project_number}/fields/{field_id}"], + getForOrg: ["GET /orgs/{org}/projectsV2/{project_number}"], + getForUser: ["GET /users/{username}/projectsV2/{project_number}"], + getOrgItem: ["GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}"], + getUserItem: ["GET /users/{username}/projectsV2/{project_number}/items/{item_id}"], + listFieldsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/fields"], + listFieldsForUser: ["GET /users/{username}/projectsV2/{project_number}/fields"], + listForOrg: ["GET /orgs/{org}/projectsV2"], + listForUser: ["GET /users/{username}/projectsV2"], + listItemsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/items"], + listItemsForUser: ["GET /users/{username}/projectsV2/{project_number}/items"], + updateItemForOrg: ["PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}"], + updateItemForUser: ["PATCH /users/{username}/projectsV2/{project_number}/items/{item_id}"] + }, + pulls: { + checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + create: ["POST /repos/{owner}/{repo}/pulls"], + createReplyForReviewComment: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies" + ], + createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], + get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], + getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + list: ["GET /repos/{owner}/{repo}/pulls"], + listCommentsForReview: [ + "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments" + ], + listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], + listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], + listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], + listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + removeRequestedReviewers: [ + "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" + ], + requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], + update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], + updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"], + updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] + }, + rateLimit: { get: ["GET /rate_limit"] }, + reactions: { + createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + createForPullRequestReviewComment: [ + "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" + ], + createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"], + createForTeamDiscussionCommentInOrg: [ + "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" + ], + createForTeamDiscussionInOrg: [ + "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" + ], + deleteForCommitComment: [ + "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}" + ], + deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"], + deleteForIssueComment: [ + "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}" + ], + deleteForPullRequestComment: [ + "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}" + ], + deleteForRelease: [ + "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}" + ], + deleteForTeamDiscussion: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}" + ], + deleteForTeamDiscussionComment: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}" + ], + listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + listForPullRequestReviewComment: [ + "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" + ], + listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"], + listForTeamDiscussionCommentInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" + ], + listForTeamDiscussionInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" + ] + }, + repos: { + acceptInvitation: [ + "PATCH /user/repository_invitations/{invitation_id}", + {}, + { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] } + ], + acceptInvitationForAuthenticatedUser: ["PATCH /user/repository_invitations/{invitation_id}"], + addAppAccessRestrictions: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", + {}, + { mapToData: "apps" } + ], + addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], + addStatusCheckContexts: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", + {}, + { mapToData: "contexts" } + ], + addTeamAccessRestrictions: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", + {}, + { mapToData: "teams" } + ], + addUserAccessRestrictions: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", + {}, + { mapToData: "users" } + ], + cancelPagesDeployment: [ + "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel" + ], + checkAutomatedSecurityFixes: ["GET /repos/{owner}/{repo}/automated-security-fixes"], + checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], + checkImmutableReleases: ["GET /repos/{owner}/{repo}/immutable-releases"], + checkPrivateVulnerabilityReporting: [ + "GET /repos/{owner}/{repo}/private-vulnerability-reporting" + ], + checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts"], + codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], + compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], + compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"], + createAttestation: ["POST /repos/{owner}/{repo}/attestations"], + createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], + createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + createCommitSignatureProtection: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" + ], + createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], + createDeployKey: ["POST /repos/{owner}/{repo}/keys"], + createDeployment: ["POST /repos/{owner}/{repo}/deployments"], + createDeploymentBranchPolicy: [ + "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" + ], + createDeploymentProtectionRule: [ + "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" + ], + createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], + createForAuthenticatedUser: ["POST /user/repos"], + createFork: ["POST /repos/{owner}/{repo}/forks"], + createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateEnvironment: ["PUT /repos/{owner}/{repo}/environments/{environment_name}"], + createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], + createOrgRuleset: ["POST /orgs/{org}/rulesets"], + createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"], + createPagesSite: ["POST /repos/{owner}/{repo}/pages"], + createRelease: ["POST /repos/{owner}/{repo}/releases"], + createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], + createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"], + createWebhook: ["POST /repos/{owner}/{repo}/hooks"], + customPropertiesForReposCreateOrUpdateRepositoryValues: [ + "PATCH /repos/{owner}/{repo}/properties/values" + ], + customPropertiesForReposGetRepositoryValues: ["GET /repos/{owner}/{repo}/properties/values"], + declineInvitation: [ + "DELETE /user/repository_invitations/{invitation_id}", + {}, + { renamed: ["repos", "declineInvitationForAuthenticatedUser"] } + ], + declineInvitationForAuthenticatedUser: ["DELETE /user/repository_invitations/{invitation_id}"], + delete: ["DELETE /repos/{owner}/{repo}"], + deleteAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions" + ], + deleteAdminBranchProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" + ], + deleteAnEnvironment: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}"], + deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], + deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], + deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], + deleteCommitSignatureProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" + ], + deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], + deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], + deleteDeploymentBranchPolicy: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" + ], + deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], + deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], + deleteOrgRuleset: ["DELETE /orgs/{org}/rulesets/{ruleset_id}"], + deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], + deletePullRequestReviewProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" + ], + deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], + deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], + deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"], + deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], + disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"], + disableDeploymentProtectionRule: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" + ], + disableImmutableReleases: ["DELETE /repos/{owner}/{repo}/immutable-releases"], + disablePrivateVulnerabilityReporting: [ + "DELETE /repos/{owner}/{repo}/private-vulnerability-reporting" + ], + disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"], + downloadArchive: [ + "GET /repos/{owner}/{repo}/zipball/{ref}", + {}, + { renamed: ["repos", "downloadZipballArchive"] } + ], + downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], + downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], + enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes"], + enableImmutableReleases: ["PUT /repos/{owner}/{repo}/immutable-releases"], + enablePrivateVulnerabilityReporting: [ + "PUT /repos/{owner}/{repo}/private-vulnerability-reporting" + ], + enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"], + generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"], + get: ["GET /repos/{owner}/{repo}"], + getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + getAdminBranchProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" + ], + getAllDeploymentProtectionRules: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" + ], + getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], + getAllStatusCheckContexts: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts" + ], + getAllTopics: ["GET /repos/{owner}/{repo}/topics"], + getAppsWithAccessToProtectedBranch: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps" + ], + getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], + getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], + getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], + getBranchRules: ["GET /repos/{owner}/{repo}/rules/branches/{branch}"], + getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], + getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], + getCollaboratorPermissionLevel: [ + "GET /repos/{owner}/{repo}/collaborators/{username}/permission" + ], + getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], + getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], + getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], + getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], + getCommitSignatureProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" + ], + getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], + getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], + getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], + getCustomDeploymentProtectionRule: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" + ], + getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], + getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], + getDeploymentBranchPolicy: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" + ], + getDeploymentStatus: [ + "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}" + ], + getEnvironment: ["GET /repos/{owner}/{repo}/environments/{environment_name}"], + getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], + getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"], + getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"], + getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"], + getOrgRulesets: ["GET /orgs/{org}/rulesets"], + getPages: ["GET /repos/{owner}/{repo}/pages"], + getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesDeployment: ["GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}"], + getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], + getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], + getPullRequestReviewProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" + ], + getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], + getReadme: ["GET /repos/{owner}/{repo}/readme"], + getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], + getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], + getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], + getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getRepoRuleSuite: ["GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}"], + getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"], + getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"], + getRepoRulesetHistory: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history"], + getRepoRulesetVersion: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}"], + getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"], + getStatusChecksProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" + ], + getTeamsWithAccessToProtectedBranch: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams" + ], + getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], + getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], + getUsersWithAccessToProtectedBranch: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users" + ], + getViews: ["GET /repos/{owner}/{repo}/traffic/views"], + getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], + getWebhookConfigForRepo: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"], + listActivities: ["GET /repos/{owner}/{repo}/activity"], + listAttestations: ["GET /repos/{owner}/{repo}/attestations/{subject_digest}"], + listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], + listBranches: ["GET /repos/{owner}/{repo}/branches"], + listBranchesForHeadCommit: [ + "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head" + ], + listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], + listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], + listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], + listCommits: ["GET /repos/{owner}/{repo}/commits"], + listContributors: ["GET /repos/{owner}/{repo}/contributors"], + listCustomDeploymentRuleIntegrations: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps" + ], + listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], + listDeploymentBranchPolicies: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" + ], + listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + listDeployments: ["GET /repos/{owner}/{repo}/deployments"], + listForAuthenticatedUser: ["GET /user/repos"], + listForOrg: ["GET /orgs/{org}/repos"], + listForUser: ["GET /users/{username}/repos"], + listForks: ["GET /repos/{owner}/{repo}/forks"], + listInvitations: ["GET /repos/{owner}/{repo}/invitations"], + listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], + listLanguages: ["GET /repos/{owner}/{repo}/languages"], + listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], + listPublic: ["GET /repositories"], + listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"], + listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], + listReleases: ["GET /repos/{owner}/{repo}/releases"], + listTags: ["GET /repos/{owner}/{repo}/tags"], + listTeams: ["GET /repos/{owner}/{repo}/teams"], + listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], + merge: ["POST /repos/{owner}/{repo}/merges"], + mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], + pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: [ + "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" + ], + removeAppAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", + {}, + { mapToData: "apps" } + ], + removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], + removeStatusCheckContexts: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", + {}, + { mapToData: "contexts" } + ], + removeStatusCheckProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" + ], + removeTeamAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", + {}, + { mapToData: "teams" } + ], + removeUserAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", + {}, + { mapToData: "users" } + ], + renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], + replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], + requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], + setAdminBranchProtection: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" + ], + setAppAccessRestrictions: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", + {}, + { mapToData: "apps" } + ], + setStatusCheckContexts: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", + {}, + { mapToData: "contexts" } + ], + setTeamAccessRestrictions: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", + {}, + { mapToData: "teams" } + ], + setUserAccessRestrictions: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", + {}, + { mapToData: "users" } + ], + testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], + transfer: ["POST /repos/{owner}/{repo}/transfer"], + update: ["PATCH /repos/{owner}/{repo}"], + updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], + updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], + updateDeploymentBranchPolicy: [ + "PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" + ], + updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], + updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], + updateOrgRuleset: ["PUT /orgs/{org}/rulesets/{ruleset_id}"], + updatePullRequestReviewProtection: [ + "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" + ], + updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], + updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], + updateRepoRuleset: ["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"], + updateStatusCheckPotection: [ + "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", + {}, + { renamed: ["repos", "updateStatusCheckProtection"] } + ], + updateStatusCheckProtection: [ + "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" + ], + updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], + updateWebhookConfigForRepo: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"], + uploadReleaseAsset: [ + "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", + { baseUrl: "https://uploads.github.com" } + ] + }, + search: { + code: ["GET /search/code"], + commits: ["GET /search/commits"], + issuesAndPullRequests: ["GET /search/issues"], + labels: ["GET /search/labels"], + repos: ["GET /search/repositories"], + topics: ["GET /search/topics"], + users: ["GET /search/users"] + }, + secretScanning: { + createPushProtectionBypass: [ + "POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses" + ], + getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], + getScanHistory: ["GET /repos/{owner}/{repo}/secret-scanning/scan-history"], + listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], + listLocationsForAlert: [ + "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations" + ], + listOrgPatternConfigs: ["GET /orgs/{org}/secret-scanning/pattern-configurations"], + updateAlert: ["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], + updateOrgPatternConfigs: ["PATCH /orgs/{org}/secret-scanning/pattern-configurations"] + }, + securityAdvisories: { + createFork: ["POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks"], + createPrivateVulnerabilityReport: ["POST /repos/{owner}/{repo}/security-advisories/reports"], + createRepositoryAdvisory: ["POST /repos/{owner}/{repo}/security-advisories"], + createRepositoryAdvisoryCveRequest: [ + "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve" + ], + getGlobalAdvisory: ["GET /advisories/{ghsa_id}"], + getRepositoryAdvisory: ["GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}"], + listGlobalAdvisories: ["GET /advisories"], + listOrgRepositoryAdvisories: ["GET /orgs/{org}/security-advisories"], + listRepositoryAdvisories: ["GET /repos/{owner}/{repo}/security-advisories"], + updateRepositoryAdvisory: ["PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}"] + }, + teams: { + addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], + addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + create: ["POST /orgs/{org}/teams"], + createDiscussionCommentInOrg: [ + "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" + ], + createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], + deleteDiscussionCommentInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" + ], + deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], + getByName: ["GET /orgs/{org}/teams/{team_slug}"], + getDiscussionCommentInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" + ], + getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], + list: ["GET /orgs/{org}/teams"], + listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], + listDiscussionCommentsInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" + ], + listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], + listForAuthenticatedUser: ["GET /user/teams"], + listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], + listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], + listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], + removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], + removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + updateDiscussionCommentInOrg: [ + "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" + ], + updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] + }, + users: { + addEmailForAuthenticated: [ + "POST /user/emails", + {}, + { renamed: ["users", "addEmailForAuthenticatedUser"] } + ], + addEmailForAuthenticatedUser: ["POST /user/emails"], + addSocialAccountForAuthenticatedUser: ["POST /user/social_accounts"], + block: ["PUT /user/blocks/{username}"], + checkBlocked: ["GET /user/blocks/{username}"], + checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], + checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], + createGpgKeyForAuthenticated: [ + "POST /user/gpg_keys", + {}, + { renamed: ["users", "createGpgKeyForAuthenticatedUser"] } + ], + createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], + createPublicSshKeyForAuthenticated: [ + "POST /user/keys", + {}, + { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] } + ], + createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], + createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"], + deleteAttestationsBulk: ["POST /users/{username}/attestations/delete-request"], + deleteAttestationsById: ["DELETE /users/{username}/attestations/{attestation_id}"], + deleteAttestationsBySubjectDigest: [ + "DELETE /users/{username}/attestations/digest/{subject_digest}" + ], + deleteEmailForAuthenticated: [ + "DELETE /user/emails", + {}, + { renamed: ["users", "deleteEmailForAuthenticatedUser"] } + ], + deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], + deleteGpgKeyForAuthenticated: [ + "DELETE /user/gpg_keys/{gpg_key_id}", + {}, + { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] } + ], + deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], + deletePublicSshKeyForAuthenticated: [ + "DELETE /user/keys/{key_id}", + {}, + { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] } + ], + deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], + deleteSocialAccountForAuthenticatedUser: ["DELETE /user/social_accounts"], + deleteSshSigningKeyForAuthenticatedUser: ["DELETE /user/ssh_signing_keys/{ssh_signing_key_id}"], + follow: ["PUT /user/following/{username}"], + getAuthenticated: ["GET /user"], + getById: ["GET /user/{account_id}"], + getByUsername: ["GET /users/{username}"], + getContextForUser: ["GET /users/{username}/hovercard"], + getGpgKeyForAuthenticated: [ + "GET /user/gpg_keys/{gpg_key_id}", + {}, + { renamed: ["users", "getGpgKeyForAuthenticatedUser"] } + ], + getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], + getPublicSshKeyForAuthenticated: [ + "GET /user/keys/{key_id}", + {}, + { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] } + ], + getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], + getSshSigningKeyForAuthenticatedUser: ["GET /user/ssh_signing_keys/{ssh_signing_key_id}"], + list: ["GET /users"], + listAttestations: ["GET /users/{username}/attestations/{subject_digest}"], + listAttestationsBulk: ["POST /users/{username}/attestations/bulk-list{?per_page,before,after}"], + listBlockedByAuthenticated: [ + "GET /user/blocks", + {}, + { renamed: ["users", "listBlockedByAuthenticatedUser"] } + ], + listBlockedByAuthenticatedUser: ["GET /user/blocks"], + listEmailsForAuthenticated: [ + "GET /user/emails", + {}, + { renamed: ["users", "listEmailsForAuthenticatedUser"] } + ], + listEmailsForAuthenticatedUser: ["GET /user/emails"], + listFollowedByAuthenticated: [ + "GET /user/following", + {}, + { renamed: ["users", "listFollowedByAuthenticatedUser"] } + ], + listFollowedByAuthenticatedUser: ["GET /user/following"], + listFollowersForAuthenticatedUser: ["GET /user/followers"], + listFollowersForUser: ["GET /users/{username}/followers"], + listFollowingForUser: ["GET /users/{username}/following"], + listGpgKeysForAuthenticated: [ + "GET /user/gpg_keys", + {}, + { renamed: ["users", "listGpgKeysForAuthenticatedUser"] } + ], + listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], + listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], + listPublicEmailsForAuthenticated: [ + "GET /user/public_emails", + {}, + { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] } + ], + listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], + listPublicKeysForUser: ["GET /users/{username}/keys"], + listPublicSshKeysForAuthenticated: [ + "GET /user/keys", + {}, + { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] } + ], + listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], + listSocialAccountsForAuthenticatedUser: ["GET /user/social_accounts"], + listSocialAccountsForUser: ["GET /users/{username}/social_accounts"], + listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"], + listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"], + setPrimaryEmailVisibilityForAuthenticated: [ + "PATCH /user/email/visibility", + {}, + { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] } + ], + setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"], + unblock: ["DELETE /user/blocks/{username}"], + unfollow: ["DELETE /user/following/{username}"], + updateAuthenticated: ["PATCH /user"] + } +}; +var endpoints_default = Endpoints; + +// ../node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/endpoints-to-methods.js +var endpointMethodsMap = /* @__PURE__ */ new Map(); +for (const [scope, endpoints] of Object.entries(endpoints_default)) { + for (const [methodName, endpoint2] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint2; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign( + { + method, + url + }, + defaults + ); + if (!endpointMethodsMap.has(scope)) { + endpointMethodsMap.set(scope, /* @__PURE__ */ new Map()); + } + endpointMethodsMap.get(scope).set(methodName, { + scope, + methodName, + endpointDefaults, + decorations + }); + } +} +var handler = { + has({ scope }, methodName) { + return endpointMethodsMap.get(scope).has(methodName); + }, + getOwnPropertyDescriptor(target, methodName) { + return { + value: this.get(target, methodName), + // ensures method is in the cache + configurable: true, + writable: true, + enumerable: true + }; + }, + defineProperty(target, methodName, descriptor) { + Object.defineProperty(target.cache, methodName, descriptor); + return true; + }, + deleteProperty(target, methodName) { + delete target.cache[methodName]; + return true; + }, + ownKeys({ scope }) { + return [...endpointMethodsMap.get(scope).keys()]; + }, + set(target, methodName, value) { + return (target.cache[methodName] = value); + }, + get({ octokit, scope, cache: cache3 }, methodName) { + if (cache3[methodName]) { + return cache3[methodName]; + } + const method = endpointMethodsMap.get(scope).get(methodName); + if (!method) { + return void 0; + } + const { endpointDefaults, decorations } = method; + if (decorations) { + cache3[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); + } else { + cache3[methodName] = octokit.request.defaults(endpointDefaults); + } + return cache3[methodName]; + } +}; +function endpointsToMethods(octokit) { + const newMethods = {}; + for (const scope of endpointMethodsMap.keys()) { + newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler); + } + return newMethods; +} +function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + function withDecorations(...args) { + let options = requestWithDefaults.endpoint.merge(...args); + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: void 0 + }); + return requestWithDefaults(options); + } + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn( + `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()` + ); + } + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } + if (decorations.renamedParameters) { + const options2 = requestWithDefaults.endpoint.merge(...args); + for (const [name, alias] of Object.entries(decorations.renamedParameters)) { + if (name in options2) { + octokit.log.warn( + `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead` + ); + if (!(alias in options2)) { + options2[alias] = options2[name]; + } + delete options2[name]; + } + } + return requestWithDefaults(options2); + } + return requestWithDefaults(...args); + } + return Object.assign(withDecorations, requestWithDefaults); +} + +// ../node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/index.js +function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit); + return { + rest: api + }; +} +restEndpointMethods.VERSION = VERSION7; +function legacyRestEndpointMethods(octokit) { + const api = endpointsToMethods(octokit); + return { + ...api, + rest: api + }; +} +legacyRestEndpointMethods.VERSION = VERSION7; + +// ../node_modules/@octokit/rest/dist-src/version.js +var VERSION8 = "22.0.1"; + +// ../node_modules/@octokit/rest/dist-src/index.js +var Octokit2 = Octokit.plugin(requestLog, legacyRestEndpointMethods, paginateRest).defaults({ + userAgent: `octokit-rest.js/${VERSION8}` +}); + +// ../src/services/github.ts +var execFileAsync2 = (0, import_node_util2.promisify)(import_node_child_process2.execFile); +function createGitHubClient(token) { + return new Octokit2({ auth: token }); +} +async function createPullRequest(params) { + const client = createGitHubClient(params.token); + const response = await client.rest.pulls.create({ + owner: params.owner, + repo: params.repo, + title: params.title, + body: params.body, + head: params.head, + base: params.base + }); + return response.data.html_url; +} + +// src/commands/analyze.ts +var cachedAnalysis; +function getCachedAnalysis() { + return cachedAnalysis; +} +function setCachedAnalysis(analysis) { + cachedAnalysis = analysis; + vscode.commands.executeCommand("setContext", "primer.hasAnalysis", !!analysis); +} +async function analyzeCommand() { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + await vscode.window.withProgress( + { location: vscode.ProgressLocation.Notification, title: "Primer: Analyzing repository\u2026" }, + async () => { + try { + const analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Analysis failed \u2014 ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} +function getWorkspacePath() { + const folder = vscode.workspace.workspaceFolders?.[0]; + if (!folder) { + vscode.window.showWarningMessage("Primer: No workspace folder open."); + return void 0; + } + return folder.uri.fsPath; +} + +// src/commands/generate.ts +var vscode2 = __toESM(require("vscode")); +var GENERATE_OPTIONS = [ + { label: "MCP Config", value: "mcp", description: ".vscode/mcp.json" }, + { label: "VS Code Settings", value: "vscode", description: ".vscode/settings.json" } +]; +async function generateCommand() { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + const picked = await vscode2.window.showQuickPick( + GENERATE_OPTIONS.map((o) => ({ label: o.label, description: o.description, value: o.value })), + { placeHolder: "Select config type to generate" } + ); + if (!picked) return; + let analysis = getCachedAnalysis(); + const result = await vscode2.window.withProgress( + { + location: vscode2.ProgressLocation.Notification, + title: `Primer: Generating ${picked.label}\u2026` + }, + async () => { + try { + if (!analysis) { + analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + } + return await generateConfigs({ + repoPath: workspacePath, + analysis, + selections: [picked.value], + force: false + }); + } catch (err) { + vscode2.window.showErrorMessage( + `Primer: Config generation failed \u2014 ${err instanceof Error ? err.message : String(err)}` + ); + return void 0; + } + } + ); + if (!result) return; + const wrote = result.files.filter((f) => f.action === "wrote"); + const skipped = result.files.filter((f) => f.action === "skipped"); + if (wrote.length > 0) { + const openAction = "Open File"; + const msg = `Generated ${wrote.map((f) => f.path).join(", ")}${skipped.length ? ` (${skipped.length} skipped)` : ""}`; + const action = await vscode2.window.showInformationMessage(`Primer: ${msg}`, openAction); + if (action === openAction && wrote[0]) { + const doc = await vscode2.workspace.openTextDocument(wrote[0].path); + await vscode2.window.showTextDocument(doc); + } + } else if (skipped.length > 0) { + const overwrite = "Overwrite"; + const action = await vscode2.window.showWarningMessage( + "Primer: All config files already exist.", + overwrite + ); + if (action === overwrite) { + await vscode2.window.withProgress( + { + location: vscode2.ProgressLocation.Notification, + title: `Primer: Overwriting ${picked.label}\u2026` + }, + async () => { + const forceResult = await generateConfigs({ + repoPath: workspacePath, + analysis, + selections: [picked.value], + force: true + }); + const forceWrote = forceResult.files.filter((f) => f.action === "wrote"); + if (forceWrote.length > 0) { + const doc = await vscode2.workspace.openTextDocument(forceWrote[0].path); + await vscode2.window.showTextDocument(doc); + } + } + ); + } + } +} + +// src/commands/instructions.ts +var vscode3 = __toESM(require("vscode")); + +// src/progress.ts +var VscodeProgressReporter = class { + constructor(progress) { + this.progress = progress; + } + update(message) { + this.progress.report({ message }); + } + succeed(message) { + this.progress.report({ message: `$(check) ${message}` }); + } + fail(message) { + this.progress.report({ message: `$(error) ${message}` }); + } + done() {} +}; + +// src/commands/instructions.ts +async function instructionsCommand() { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + const model = vscode3.workspace.getConfiguration("primer").get("model"); + let analysis = getCachedAnalysis(); + if (!analysis) { + await vscode3.window.withProgress( + { + location: vscode3.ProgressLocation.Notification, + title: "Primer: Analyzing repository\u2026" + }, + async () => { + analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + } + ); + } + if (!analysis) return; + let selectedAreas = void 0; + if (analysis.areas && analysis.areas.length > 0) { + const picked = await vscode3.window.showQuickPick( + analysis.areas.map((a) => ({ label: a.name, description: a.description, area: a })), + { placeHolder: "Select areas for instructions (or Escape for root only)", canPickMany: true } + ); + if (picked && picked.length > 0) { + selectedAreas = picked.map((p) => p.area); + } + } + await vscode3.window.withProgress( + { + location: vscode3.ProgressLocation.Notification, + title: "Primer: Generating Copilot instructions\u2026", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + reporter.update("Generating root instructions\u2026"); + await generateCopilotInstructions({ + repoPath: workspacePath, + model, + onProgress: (msg) => reporter.update(msg) + }); + if (selectedAreas) { + for (const area of selectedAreas) { + reporter.update(`Generating instructions for ${area.name}\u2026`); + await generateAreaInstructions({ + repoPath: workspacePath, + area, + model, + onProgress: (msg) => reporter.update(msg) + }); + } + } + reporter.succeed("Instructions generated."); + } catch (err) { + vscode3.window.showErrorMessage( + `Primer: Instruction generation failed \u2014 ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} + +// src/commands/readiness.ts +var vscode7 = __toESM(require("vscode")); + +// src/webview.ts +var vscode4 = __toESM(require("vscode")); +var panels = /* @__PURE__ */ new Map(); +function createWebviewPanel(id, title, html) { + const existing = panels.get(id); + if (existing) { + existing.webview.html = html; + existing.reveal(); + return existing; + } + const panel = vscode4.window.createWebviewPanel(id, title, vscode4.ViewColumn.One, { + enableScripts: true, + localResourceRoots: [] + }); + panel.webview.html = html; + panel.onDidDispose(() => panels.delete(id)); + panels.set(id, panel); + return panel; +} + +// src/views/AnalysisTreeProvider.ts +var vscode5 = __toESM(require("vscode")); +var AnalysisTreeProvider = class { + _onDidChangeTreeData = new vscode5.EventEmitter(); + onDidChangeTreeData = this._onDidChangeTreeData.event; + refresh() { + this._onDidChangeTreeData.fire(void 0); + } + getTreeItem(element) { + return element; + } + getChildren(element) { + if (element) return element.children ?? []; + const analysis = getCachedAnalysis(); + if (!analysis) return []; + return this.getRootItems(analysis); + } + getRootItems(analysis) { + const items = []; + if (analysis.languages.length > 0) { + const langs = new AnalysisItem( + "Languages", + vscode5.TreeItemCollapsibleState.Expanded, + analysis.languages.map((l) => { + const item = new AnalysisItem(l, vscode5.TreeItemCollapsibleState.None); + item.contextValue = "language"; + return item; + }) + ); + langs.iconPath = new vscode5.ThemeIcon("code"); + langs.description = `${analysis.languages.length}`; + langs.contextValue = "category"; + items.push(langs); + } + if (analysis.frameworks.length > 0) { + const frameworks = new AnalysisItem( + "Frameworks", + vscode5.TreeItemCollapsibleState.Expanded, + analysis.frameworks.map((f) => { + const item = new AnalysisItem(f, vscode5.TreeItemCollapsibleState.None); + item.contextValue = "framework"; + return item; + }) + ); + frameworks.iconPath = new vscode5.ThemeIcon("extensions"); + frameworks.description = `${analysis.frameworks.length}`; + frameworks.contextValue = "category"; + items.push(frameworks); + } + if (analysis.isMonorepo && analysis.areas) { + const areas = new AnalysisItem( + "Monorepo", + vscode5.TreeItemCollapsibleState.Expanded, + analysis.areas.map((a) => { + const item = new AnalysisItem(a.name, vscode5.TreeItemCollapsibleState.None); + item.description = typeof a.applyTo === "string" ? a.applyTo : a.applyTo.join(", "); + item.iconPath = new vscode5.ThemeIcon("folder"); + item.contextValue = "area"; + const md = new vscode5.MarkdownString(); + md.appendMarkdown(`**${a.name}**`); + if (a.description) + md.appendMarkdown(` + +${a.description}`); + md.appendMarkdown(` + +Globs: \`${typeof a.applyTo === "string" ? a.applyTo : a.applyTo.join("`, `")}\``); + item.tooltip = md; + return item; + }) + ); + areas.iconPath = new vscode5.ThemeIcon("folder-library"); + areas.description = analysis.workspaceType ?? void 0; + areas.contextValue = "category"; + items.push(areas); + } + if (analysis.packageManager) { + const pm = new AnalysisItem("Package Manager", vscode5.TreeItemCollapsibleState.None); + pm.description = analysis.packageManager; + pm.iconPath = new vscode5.ThemeIcon("package"); + pm.contextValue = "info"; + items.push(pm); + } + return items; + } +}; +var AnalysisItem = class extends vscode5.TreeItem { + constructor(label, collapsibleState, children) { + super(label, collapsibleState); + this.children = children; + } +}; + +// src/views/ReadinessTreeProvider.ts +var vscode6 = __toESM(require("vscode")); +var ReadinessTreeProvider = class { + _onDidChangeTreeData = new vscode6.EventEmitter(); + onDidChangeTreeData = this._onDidChangeTreeData.event; + report; + setReport(report) { + this.report = report; + this._onDidChangeTreeData.fire(void 0); + } + getReport() { + return this.report; + } + refresh() { + this._onDidChangeTreeData.fire(void 0); + } + getTreeItem(element) { + return element; + } + getChildren(element) { + if (element) return element.children ?? []; + if (!this.report) return []; + return this.getRootItems(this.report); + } + getRootItems(report) { + const items = []; + const levelInfo = report.levels.find((l) => l.level === report.achievedLevel); + const level = new ReadinessItem( + levelInfo?.name ?? `Level ${report.achievedLevel}`, + vscode6.TreeItemCollapsibleState.None + ); + level.description = `Level ${report.achievedLevel}`; + level.iconPath = new vscode6.ThemeIcon( + report.achievedLevel >= 3 ? "pass" : "warning", + new vscode6.ThemeColor( + report.achievedLevel >= 3 ? "testing.iconPassed" : "problemsWarningIcon.foreground" + ) + ); + level.contextValue = "level"; + items.push(level); + for (const pillar of report.pillars) { + const criteria = report.criteria.filter((c) => c.pillar === pillar.id); + items.push(this.createPillarItem(pillar, criteria)); + } + return items; + } + createPillarItem(pillar, criteria) { + const pct = Math.round(pillar.passRate * 100); + const item = new ReadinessItem( + pillar.name, + criteria.length > 0 + ? vscode6.TreeItemCollapsibleState.Collapsed + : vscode6.TreeItemCollapsibleState.None, + criteria.map((c) => { + const ci = new ReadinessItem(c.title, vscode6.TreeItemCollapsibleState.None); + ci.iconPath = new vscode6.ThemeIcon( + c.status === "pass" ? "pass" : c.status === "fail" ? "error" : "circle-outline", + c.status === "pass" + ? new vscode6.ThemeColor("testing.iconPassed") + : c.status === "fail" + ? new vscode6.ThemeColor("testing.iconFailed") + : void 0 + ); + ci.description = c.reason; + ci.contextValue = `criterion.${c.status}`; + const md = new vscode6.MarkdownString(); + md.appendMarkdown(`**${c.title}** + +`); + if (c.reason) + md.appendMarkdown(`${c.reason} + +`); + if (c.evidence && c.evidence.length > 0) { + md.appendMarkdown("**Evidence:**\n"); + for (const e of c.evidence) { + md.appendMarkdown(`- ${e} +`); + } + } + ci.tooltip = md; + return ci; + }) + ); + item.iconPath = new vscode6.ThemeIcon( + pct === 100 ? "pass" : pct >= 50 ? "warning" : "error", + pct === 100 + ? new vscode6.ThemeColor("testing.iconPassed") + : pct >= 50 + ? new vscode6.ThemeColor("problemsWarningIcon.foreground") + : new vscode6.ThemeColor("testing.iconFailed") + ); + item.description = `${pillar.passed}/${pillar.total} (${pct}%)`; + item.contextValue = "pillar"; + return item; + } +}; +var ReadinessItem = class extends vscode6.TreeItem { + constructor(label, collapsibleState, children) { + super(label, collapsibleState); + this.children = children; + } +}; + +// src/views/providers.ts +var analysisTreeProvider = new AnalysisTreeProvider(); +var readinessTreeProvider = new ReadinessTreeProvider(); + +// src/commands/readiness.ts +async function readinessCommand() { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + await vscode7.window.withProgress( + { + location: vscode7.ProgressLocation.Notification, + title: "Primer: Running readiness assessment\u2026", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + let analysis = getCachedAnalysis(); + if (!analysis) { + reporter.update("Analyzing repository\u2026"); + analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + } + reporter.update("Evaluating readiness pillars\u2026"); + const report = await runReadinessReport({ repoPath: workspacePath }); + reporter.update("Generating report\u2026"); + const repoName = vscode7.workspace.workspaceFolders?.[0]?.name ?? "Repository"; + const html = generateVisualReport({ + reports: [{ repo: repoName, report }], + title: `${repoName} \u2014 AI Readiness` + }); + createWebviewPanel("primer.readinessReport", "AI Readiness Report", html); + readinessTreeProvider.setReport(report); + reporter.succeed(`Readiness: Level ${report.achievedLevel} achieved.`); + } catch (err) { + vscode7.window.showErrorMessage( + `Primer: Readiness assessment failed \u2014 ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} + +// src/commands/eval.ts +var vscode8 = __toESM(require("vscode")); +var import_node_path2 = __toESM(require("node:path")); +var import_node_fs = __toESM(require("node:fs")); +async function evalCommand() { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + const configPath = import_node_path2.default.join(workspacePath, "primer.eval.json"); + if (!import_node_fs.default.existsSync(configPath)) { + const action = await vscode8.window.showWarningMessage( + "Primer: No primer.eval.json found. Create one?", + "Scaffold", + "Cancel" + ); + if (action === "Scaffold") { + await evalInitCommand(); + } + return; + } + const config = vscode8.workspace.getConfiguration("primer"); + const model = config.get("model") ?? "claude-sonnet-4.5"; + await vscode8.window.withProgress( + { + location: vscode8.ProgressLocation.Notification, + title: "Primer: Running eval\u2026", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + reporter.update("Running evaluation\u2026"); + const result = await runEval({ + configPath, + repoPath: workspacePath, + model, + judgeModel: model, + onProgress: (msg) => reporter.update(msg) + }); + reporter.succeed(`Eval complete. ${result.summary}`); + if (result.viewerPath && import_node_fs.default.existsSync(result.viewerPath)) { + const html = import_node_fs.default.readFileSync(result.viewerPath, "utf-8"); + createWebviewPanel("primer.evalResults", "Eval Results", html); + } + } catch (err) { + vscode8.window.showErrorMessage( + `Primer: Eval failed \u2014 ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} +async function evalInitCommand() { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + const config = vscode8.workspace.getConfiguration("primer"); + const model = config.get("model"); + await vscode8.window.withProgress( + { + location: vscode8.ProgressLocation.Notification, + title: "Primer: Scaffolding eval config\u2026", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + let analysis = getCachedAnalysis(); + if (!analysis) { + reporter.update("Analyzing repository\u2026"); + analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + } + reporter.update("Generating eval cases\u2026"); + const evalConfig = await generateEvalScaffold({ + repoPath: workspacePath, + count: 5, + model, + areas: analysis.areas, + onProgress: (msg) => reporter.update(msg) + }); + const outputPath = import_node_path2.default.join(workspacePath, "primer.eval.json"); + await safeWriteFile(outputPath, JSON.stringify(evalConfig, null, 2) + "\n", false); + reporter.succeed("Eval config scaffolded."); + const doc = await vscode8.workspace.openTextDocument(outputPath); + await vscode8.window.showTextDocument(doc); + } catch (err) { + vscode8.window.showErrorMessage( + `Primer: Eval scaffold failed \u2014 ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} + +// src/commands/init.ts +var vscode9 = __toESM(require("vscode")); +var import_node_path3 = __toESM(require("node:path")); +async function initCommand() { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + const config = vscode9.workspace.getConfiguration("primer"); + const model = config.get("model"); + await vscode9.window.withProgress( + { + location: vscode9.ProgressLocation.Notification, + title: "Primer: Initializing repository\u2026", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + reporter.update("Analyzing repository\u2026"); + const analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + reporter.update("Generating Copilot instructions\u2026"); + await generateCopilotInstructions({ + repoPath: workspacePath, + model, + onProgress: (msg) => reporter.update(msg) + }); + reporter.update("Generating configs\u2026"); + const result = await generateConfigs({ + repoPath: workspacePath, + analysis, + selections: ["mcp", "vscode"], + force: false + }); + const wrote = result.files.filter((f) => f.action === "wrote"); + const skipped = result.files.filter((f) => f.action === "skipped"); + const parts = []; + if (wrote.length) parts.push(`${wrote.length} files generated`); + if (skipped.length) parts.push(`${skipped.length} skipped (already exist)`); + reporter.succeed("Repository initialized."); + const instructionsPath = import_node_path3.default.join( + workspacePath, + ".github", + "copilot-instructions.md" + ); + try { + const doc = await vscode9.workspace.openTextDocument(instructionsPath); + await vscode9.window.showTextDocument(doc); + } catch {} + vscode9.window.showInformationMessage(`Primer: ${parts.join(", ") || "Done."}`); + } catch (err) { + vscode9.window.showErrorMessage( + `Primer: Initialization failed \u2014 ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} + +// src/commands/pr.ts +var vscode11 = __toESM(require("vscode")); + +// src/auth.ts +var vscode10 = __toESM(require("vscode")); +async function getGitHubToken() { + const session = await vscode10.authentication.getSession("github", ["repo"], { + createIfNone: true + }); + return session.accessToken; +} + +// node_modules/simple-git/dist/esm/index.js +var import_node_buffer2 = require("node:buffer"); +var import_file_exists2 = __toESM(require_dist3(), 1); +var import_debug2 = __toESM(require_src3(), 1); +var import_child_process2 = require("child_process"); +var import_promise_deferred3 = __toESM(require_dist4(), 1); +var import_node_path4 = require("node:path"); +var import_promise_deferred4 = __toESM(require_dist4(), 1); +var import_node_events = require("node:events"); +var __defProp3 = Object.defineProperty; +var __getOwnPropDesc3 = Object.getOwnPropertyDescriptor; +var __getOwnPropNames3 = Object.getOwnPropertyNames; +var __hasOwnProp3 = Object.prototype.hasOwnProperty; +var __esm2 = (fn, res) => + function __init() { + return (fn && (res = (0, fn[__getOwnPropNames3(fn)[0]])((fn = 0))), res); + }; +var __commonJS3 = (cb, mod) => + function __require() { + return ( + mod || (0, cb[__getOwnPropNames3(cb)[0]])((mod = { exports: {} }).exports, mod), + mod.exports + ); + }; +var __export3 = (target, all) => { + for (var name in all) __defProp3(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps3 = (to, from, except, desc) => { + if ((from && typeof from === "object") || typeof from === "function") { + for (let key of __getOwnPropNames3(from)) + if (!__hasOwnProp3.call(to, key) && key !== except) + __defProp3(to, key, { + get: () => from[key], + enumerable: !(desc = __getOwnPropDesc3(from, key)) || desc.enumerable + }); + } + return to; +}; +var __toCommonJS3 = (mod) => __copyProps3(__defProp3({}, "__esModule", { value: true }), mod); +function pathspec2(...paths) { + const key = new String(paths); + cache2.set(key, paths); + return key; +} +function isPathSpec2(path11) { + return path11 instanceof String && cache2.has(path11); +} +function toPaths(pathSpec) { + return cache2.get(pathSpec) || []; +} +var cache2; +var init_pathspec2 = __esm2({ + "src/lib/args/pathspec.ts"() { + "use strict"; + cache2 = /* @__PURE__ */ new WeakMap(); + } +}); +var GitError2; +var init_git_error2 = __esm2({ + "src/lib/errors/git-error.ts"() { + "use strict"; + GitError2 = class extends Error { + constructor(task, message) { + super(message); + this.task = task; + Object.setPrototypeOf(this, new.target.prototype); + } + }; + } +}); +var GitResponseError2; +var init_git_response_error2 = __esm2({ + "src/lib/errors/git-response-error.ts"() { + "use strict"; + init_git_error2(); + GitResponseError2 = class extends GitError2 { + constructor(git, message) { + super(void 0, message || String(git)); + this.git = git; + } + }; + } +}); +var TaskConfigurationError2; +var init_task_configuration_error2 = __esm2({ + "src/lib/errors/task-configuration-error.ts"() { + "use strict"; + init_git_error2(); + TaskConfigurationError2 = class extends GitError2 { + constructor(message) { + super(void 0, message); + } + }; + } +}); +function asFunction2(source) { + if (typeof source !== "function") { + return NOOP2; + } + return source; +} +function isUserFunction2(source) { + return typeof source === "function" && source !== NOOP2; +} +function splitOn2(input, char) { + const index = input.indexOf(char); + if (index <= 0) { + return [input, ""]; + } + return [input.substr(0, index), input.substr(index + 1)]; +} +function first2(input, offset = 0) { + return isArrayLike2(input) && input.length > offset ? input[offset] : void 0; +} +function last2(input, offset = 0) { + if (isArrayLike2(input) && input.length > offset) { + return input[input.length - 1 - offset]; + } +} +function isArrayLike2(input) { + return filterHasLength2(input); +} +function toLinesWithContent2(input = "", trimmed22 = true, separator = "\n") { + return input.split(separator).reduce((output, line) => { + const lineContent = trimmed22 ? line.trim() : line; + if (lineContent) { + output.push(lineContent); + } + return output; + }, []); +} +function forEachLineWithContent2(input, callback) { + return toLinesWithContent2(input, true).map((line) => callback(line)); +} +function folderExists2(path11) { + return (0, import_file_exists2.exists)(path11, import_file_exists2.FOLDER); +} +function append2(target, item) { + if (Array.isArray(target)) { + if (!target.includes(item)) { + target.push(item); + } + } else { + target.add(item); + } + return item; +} +function including2(target, item) { + if (Array.isArray(target) && !target.includes(item)) { + target.push(item); + } + return target; +} +function remove2(target, item) { + if (Array.isArray(target)) { + const index = target.indexOf(item); + if (index >= 0) { + target.splice(index, 1); + } + } else { + target.delete(item); + } + return item; +} +function asArray2(source) { + return Array.isArray(source) ? source : [source]; +} +function asCamelCase2(str) { + return str.replace(/[\s-]+(.)/g, (_all, chr) => { + return chr.toUpperCase(); + }); +} +function asStringArray2(source) { + return asArray2(source).map((item) => { + return item instanceof String ? item : String(item); + }); +} +function asNumber2(source, onNaN = 0) { + if (source == null) { + return onNaN; + } + const num = parseInt(source, 10); + return Number.isNaN(num) ? onNaN : num; +} +function prefixedArray2(input, prefix) { + const output = []; + for (let i = 0, max = input.length; i < max; i++) { + output.push(prefix, input[i]); + } + return output; +} +function bufferToString2(input) { + return (Array.isArray(input) ? import_node_buffer2.Buffer.concat(input) : input).toString( + "utf-8" + ); +} +function pick2(source, properties) { + const out = {}; + properties.forEach((key) => { + if (source[key] !== void 0) { + out[key] = source[key]; + } + }); + return out; +} +function delay2(duration = 0) { + return new Promise((done) => setTimeout(done, duration)); +} +function orVoid2(input) { + if (input === false) { + return void 0; + } + return input; +} +var NULL2; +var NOOP2; +var objectToString2; +var init_util2 = __esm2({ + "src/lib/utils/util.ts"() { + "use strict"; + init_argument_filters2(); + NULL2 = "\0"; + NOOP2 = () => {}; + objectToString2 = Object.prototype.toString.call.bind(Object.prototype.toString); + } +}); +function filterType2(input, filter, def) { + if (filter(input)) { + return input; + } + return arguments.length > 2 ? def : void 0; +} +function filterPrimitives2(input, omit2) { + const type = isPathSpec2(input) ? "string" : typeof input; + return /number|string|boolean/.test(type) && (!omit2 || !omit2.includes(type)); +} +function filterPlainObject2(input) { + return !!input && objectToString2(input) === "[object Object]"; +} +function filterFunction2(input) { + return typeof input === "function"; +} +var filterArray2; +var filterNumber2; +var filterString2; +var filterStringOrStringArray2; +var filterHasLength2; +var init_argument_filters2 = __esm2({ + "src/lib/utils/argument-filters.ts"() { + "use strict"; + init_pathspec2(); + init_util2(); + filterArray2 = (input) => { + return Array.isArray(input); + }; + filterNumber2 = (input) => { + return typeof input === "number"; + }; + filterString2 = (input) => { + return typeof input === "string"; + }; + filterStringOrStringArray2 = (input) => { + return filterString2(input) || (Array.isArray(input) && input.every(filterString2)); + }; + filterHasLength2 = (input) => { + if (input == null || "number|boolean|function".includes(typeof input)) { + return false; + } + return typeof input.length === "number"; + }; + } +}); +var ExitCodes2; +var init_exit_codes2 = __esm2({ + "src/lib/utils/exit-codes.ts"() { + "use strict"; + ExitCodes2 = /* @__PURE__ */ ((ExitCodes22) => { + ExitCodes22[(ExitCodes22["SUCCESS"] = 0)] = "SUCCESS"; + ExitCodes22[(ExitCodes22["ERROR"] = 1)] = "ERROR"; + ExitCodes22[(ExitCodes22["NOT_FOUND"] = -2)] = "NOT_FOUND"; + ExitCodes22[(ExitCodes22["UNCLEAN"] = 128)] = "UNCLEAN"; + return ExitCodes22; + })(ExitCodes2 || {}); + } +}); +var GitOutputStreams2; +var init_git_output_streams2 = __esm2({ + "src/lib/utils/git-output-streams.ts"() { + "use strict"; + GitOutputStreams2 = class _GitOutputStreams { + constructor(stdOut, stdErr) { + this.stdOut = stdOut; + this.stdErr = stdErr; + } + asStrings() { + return new _GitOutputStreams(this.stdOut.toString("utf8"), this.stdErr.toString("utf8")); + } + }; + } +}); +function useMatchesDefault2() { + throw new Error(`LineParser:useMatches not implemented`); +} +var LineParser2; +var RemoteLineParser2; +var init_line_parser2 = __esm2({ + "src/lib/utils/line-parser.ts"() { + "use strict"; + LineParser2 = class { + constructor(regExp, useMatches) { + this.matches = []; + this.useMatches = useMatchesDefault2; + this.parse = (line, target) => { + this.resetMatches(); + if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) { + return false; + } + return this.useMatches(target, this.prepareMatches()) !== false; + }; + this._regExp = Array.isArray(regExp) ? regExp : [regExp]; + if (useMatches) { + this.useMatches = useMatches; + } + } + resetMatches() { + this.matches.length = 0; + } + prepareMatches() { + return this.matches; + } + addMatch(reg, index, line) { + const matched = line && reg.exec(line); + if (matched) { + this.pushMatch(index, matched); + } + return !!matched; + } + pushMatch(_index, matched) { + this.matches.push(...matched.slice(1)); + } + }; + RemoteLineParser2 = class extends LineParser2 { + addMatch(reg, index, line) { + return /^remote:\s/.test(String(line)) && super.addMatch(reg, index, line); + } + pushMatch(index, matched) { + if (index > 0 || matched.length > 1) { + super.pushMatch(index, matched); + } + } + }; + } +}); +function createInstanceConfig2(...options) { + const baseDir = process.cwd(); + const config = Object.assign( + { baseDir, ...defaultOptions2 }, + ...options.filter((o) => typeof o === "object" && o) + ); + config.baseDir = config.baseDir || baseDir; + config.trimmed = config.trimmed === true; + return config; +} +var defaultOptions2; +var init_simple_git_options2 = __esm2({ + "src/lib/utils/simple-git-options.ts"() { + "use strict"; + defaultOptions2 = { + binary: "git", + maxConcurrentProcesses: 5, + config: [], + trimmed: false + }; + } +}); +function appendTaskOptions2(options, commands3 = []) { + if (!filterPlainObject2(options)) { + return commands3; + } + return Object.keys(options).reduce((commands22, key) => { + const value = options[key]; + if (isPathSpec2(value)) { + commands22.push(value); + } else if (filterPrimitives2(value, ["boolean"])) { + commands22.push(key + "=" + value); + } else if (Array.isArray(value)) { + for (const v of value) { + if (!filterPrimitives2(v, ["string", "number"])) { + commands22.push(key + "=" + v); + } + } + } else { + commands22.push(key); + } + return commands22; + }, commands3); +} +function getTrailingOptions2(args, initialPrimitive = 0, objectOnly = false) { + const command = []; + for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) { + if ("string|number".includes(typeof args[i])) { + command.push(String(args[i])); + } + } + appendTaskOptions2(trailingOptionsArgument2(args), command); + if (!objectOnly) { + command.push(...trailingArrayArgument2(args)); + } + return command; +} +function trailingArrayArgument2(args) { + const hasTrailingCallback = typeof last2(args) === "function"; + return asStringArray2(filterType2(last2(args, hasTrailingCallback ? 1 : 0), filterArray2, [])); +} +function trailingOptionsArgument2(args) { + const hasTrailingCallback = filterFunction2(last2(args)); + return filterType2(last2(args, hasTrailingCallback ? 1 : 0), filterPlainObject2); +} +function trailingFunctionArgument2(args, includeNoop = true) { + const callback = asFunction2(last2(args)); + return includeNoop || isUserFunction2(callback) ? callback : void 0; +} +var init_task_options2 = __esm2({ + "src/lib/utils/task-options.ts"() { + "use strict"; + init_argument_filters2(); + init_util2(); + init_pathspec2(); + } +}); +function callTaskParser2(parser42, streams) { + return parser42(streams.stdOut, streams.stdErr); +} +function parseStringResponse2(result, parsers122, texts, trim = true) { + asArray2(texts).forEach((text) => { + for (let lines = toLinesWithContent2(text, trim), i = 0, max = lines.length; i < max; i++) { + const line = (offset = 0) => { + if (i + offset >= max) { + return; + } + return lines[i + offset]; + }; + parsers122.some(({ parse: parse2 }) => parse2(line, result)); + } + }); + return result; +} +var init_task_parser2 = __esm2({ + "src/lib/utils/task-parser.ts"() { + "use strict"; + init_util2(); + } +}); +var utils_exports2 = {}; +__export3(utils_exports2, { + ExitCodes: () => ExitCodes2, + GitOutputStreams: () => GitOutputStreams2, + LineParser: () => LineParser2, + NOOP: () => NOOP2, + NULL: () => NULL2, + RemoteLineParser: () => RemoteLineParser2, + append: () => append2, + appendTaskOptions: () => appendTaskOptions2, + asArray: () => asArray2, + asCamelCase: () => asCamelCase2, + asFunction: () => asFunction2, + asNumber: () => asNumber2, + asStringArray: () => asStringArray2, + bufferToString: () => bufferToString2, + callTaskParser: () => callTaskParser2, + createInstanceConfig: () => createInstanceConfig2, + delay: () => delay2, + filterArray: () => filterArray2, + filterFunction: () => filterFunction2, + filterHasLength: () => filterHasLength2, + filterNumber: () => filterNumber2, + filterPlainObject: () => filterPlainObject2, + filterPrimitives: () => filterPrimitives2, + filterString: () => filterString2, + filterStringOrStringArray: () => filterStringOrStringArray2, + filterType: () => filterType2, + first: () => first2, + folderExists: () => folderExists2, + forEachLineWithContent: () => forEachLineWithContent2, + getTrailingOptions: () => getTrailingOptions2, + including: () => including2, + isUserFunction: () => isUserFunction2, + last: () => last2, + objectToString: () => objectToString2, + orVoid: () => orVoid2, + parseStringResponse: () => parseStringResponse2, + pick: () => pick2, + prefixedArray: () => prefixedArray2, + remove: () => remove2, + splitOn: () => splitOn2, + toLinesWithContent: () => toLinesWithContent2, + trailingFunctionArgument: () => trailingFunctionArgument2, + trailingOptionsArgument: () => trailingOptionsArgument2 +}); +var init_utils2 = __esm2({ + "src/lib/utils/index.ts"() { + "use strict"; + init_argument_filters2(); + init_exit_codes2(); + init_git_output_streams2(); + init_line_parser2(); + init_simple_git_options2(); + init_task_options2(); + init_task_parser2(); + init_util2(); + } +}); +var check_is_repo_exports2 = {}; +__export3(check_is_repo_exports2, { + CheckRepoActions: () => CheckRepoActions2, + checkIsBareRepoTask: () => checkIsBareRepoTask2, + checkIsRepoRootTask: () => checkIsRepoRootTask2, + checkIsRepoTask: () => checkIsRepoTask2 +}); +function checkIsRepoTask2(action) { + switch (action) { + case "bare": + return checkIsBareRepoTask2(); + case "root": + return checkIsRepoRootTask2(); + } + const commands3 = ["rev-parse", "--is-inside-work-tree"]; + return { + commands: commands3, + format: "utf-8", + onError: onError2, + parser: parser4 + }; +} +function checkIsRepoRootTask2() { + const commands3 = ["rev-parse", "--git-dir"]; + return { + commands: commands3, + format: "utf-8", + onError: onError2, + parser(path11) { + return /^\.(git)?$/.test(path11.trim()); + } + }; +} +function checkIsBareRepoTask2() { + const commands3 = ["rev-parse", "--is-bare-repository"]; + return { + commands: commands3, + format: "utf-8", + onError: onError2, + parser: parser4 + }; +} +function isNotRepoMessage2(error) { + return /(Not a git repository|Kein Git-Repository)/i.test(String(error)); +} +var CheckRepoActions2; +var onError2; +var parser4; +var init_check_is_repo2 = __esm2({ + "src/lib/tasks/check-is-repo.ts"() { + "use strict"; + init_utils2(); + CheckRepoActions2 = /* @__PURE__ */ ((CheckRepoActions22) => { + CheckRepoActions22["BARE"] = "bare"; + CheckRepoActions22["IN_TREE"] = "tree"; + CheckRepoActions22["IS_REPO_ROOT"] = "root"; + return CheckRepoActions22; + })(CheckRepoActions2 || {}); + onError2 = ({ exitCode }, error, done, fail) => { + if (exitCode === 128 && isNotRepoMessage2(error)) { + return done(Buffer.from("false")); + } + fail(error); + }; + parser4 = (text) => { + return text.trim() === "true"; + }; + } +}); +function cleanSummaryParser2(dryRun, text) { + const summary = new CleanResponse2(dryRun); + const regexp = dryRun ? dryRunRemovalRegexp2 : removalRegexp2; + toLinesWithContent2(text).forEach((line) => { + const removed = line.replace(regexp, ""); + summary.paths.push(removed); + (isFolderRegexp2.test(removed) ? summary.folders : summary.files).push(removed); + }); + return summary; +} +var CleanResponse2; +var removalRegexp2; +var dryRunRemovalRegexp2; +var isFolderRegexp2; +var init_CleanSummary2 = __esm2({ + "src/lib/responses/CleanSummary.ts"() { + "use strict"; + init_utils2(); + CleanResponse2 = class { + constructor(dryRun) { + this.dryRun = dryRun; + this.paths = []; + this.files = []; + this.folders = []; + } + }; + removalRegexp2 = /^[a-z]+\s*/i; + dryRunRemovalRegexp2 = /^[a-z]+\s+[a-z]+\s*/i; + isFolderRegexp2 = /\/$/; + } +}); +var task_exports2 = {}; +__export3(task_exports2, { + EMPTY_COMMANDS: () => EMPTY_COMMANDS2, + adhocExecTask: () => adhocExecTask2, + configurationErrorTask: () => configurationErrorTask2, + isBufferTask: () => isBufferTask2, + isEmptyTask: () => isEmptyTask2, + straightThroughBufferTask: () => straightThroughBufferTask2, + straightThroughStringTask: () => straightThroughStringTask2 +}); +function adhocExecTask2(parser42) { + return { + commands: EMPTY_COMMANDS2, + format: "empty", + parser: parser42 + }; +} +function configurationErrorTask2(error) { + return { + commands: EMPTY_COMMANDS2, + format: "empty", + parser() { + throw typeof error === "string" ? new TaskConfigurationError2(error) : error; + } + }; +} +function straightThroughStringTask2(commands3, trimmed22 = false) { + return { + commands: commands3, + format: "utf-8", + parser(text) { + return trimmed22 ? String(text).trim() : text; + } + }; +} +function straightThroughBufferTask2(commands3) { + return { + commands: commands3, + format: "buffer", + parser(buffer) { + return buffer; + } + }; +} +function isBufferTask2(task) { + return task.format === "buffer"; +} +function isEmptyTask2(task) { + return task.format === "empty" || !task.commands.length; +} +var EMPTY_COMMANDS2; +var init_task2 = __esm2({ + "src/lib/tasks/task.ts"() { + "use strict"; + init_task_configuration_error2(); + EMPTY_COMMANDS2 = []; + } +}); +var clean_exports2 = {}; +__export3(clean_exports2, { + CONFIG_ERROR_INTERACTIVE_MODE: () => CONFIG_ERROR_INTERACTIVE_MODE2, + CONFIG_ERROR_MODE_REQUIRED: () => CONFIG_ERROR_MODE_REQUIRED2, + CONFIG_ERROR_UNKNOWN_OPTION: () => CONFIG_ERROR_UNKNOWN_OPTION2, + CleanOptions: () => CleanOptions2, + cleanTask: () => cleanTask2, + cleanWithOptionsTask: () => cleanWithOptionsTask2, + isCleanOptionsArray: () => isCleanOptionsArray2 +}); +function cleanWithOptionsTask2(mode, customArgs) { + const { cleanMode, options, valid } = getCleanOptions2(mode); + if (!cleanMode) { + return configurationErrorTask2(CONFIG_ERROR_MODE_REQUIRED2); + } + if (!valid.options) { + return configurationErrorTask2(CONFIG_ERROR_UNKNOWN_OPTION2 + JSON.stringify(mode)); + } + options.push(...customArgs); + if (options.some(isInteractiveMode2)) { + return configurationErrorTask2(CONFIG_ERROR_INTERACTIVE_MODE2); + } + return cleanTask2(cleanMode, options); +} +function cleanTask2(mode, customArgs) { + const commands3 = ["clean", `-${mode}`, ...customArgs]; + return { + commands: commands3, + format: "utf-8", + parser(text) { + return cleanSummaryParser2(mode === "n", text); + } + }; +} +function isCleanOptionsArray2(input) { + return Array.isArray(input) && input.every((test) => CleanOptionValues2.has(test)); +} +function getCleanOptions2(input) { + let cleanMode; + let options = []; + let valid = { cleanMode: false, options: true }; + input + .replace(/[^a-z]i/g, "") + .split("") + .forEach((char) => { + if (isCleanMode2(char)) { + cleanMode = char; + valid.cleanMode = true; + } else { + valid.options = valid.options && isKnownOption2((options[options.length] = `-${char}`)); + } + }); + return { + cleanMode, + options, + valid + }; +} +function isCleanMode2(cleanMode) { + return cleanMode === "f" || cleanMode === "n"; +} +function isKnownOption2(option) { + return /^-[a-z]$/i.test(option) && CleanOptionValues2.has(option.charAt(1)); +} +function isInteractiveMode2(option) { + if (/^-[^\-]/.test(option)) { + return option.indexOf("i") > 0; + } + return option === "--interactive"; +} +var CONFIG_ERROR_INTERACTIVE_MODE2; +var CONFIG_ERROR_MODE_REQUIRED2; +var CONFIG_ERROR_UNKNOWN_OPTION2; +var CleanOptions2; +var CleanOptionValues2; +var init_clean2 = __esm2({ + "src/lib/tasks/clean.ts"() { + "use strict"; + init_CleanSummary2(); + init_utils2(); + init_task2(); + CONFIG_ERROR_INTERACTIVE_MODE2 = "Git clean interactive mode is not supported"; + CONFIG_ERROR_MODE_REQUIRED2 = 'Git clean mode parameter ("n" or "f") is required'; + CONFIG_ERROR_UNKNOWN_OPTION2 = "Git clean unknown option found in: "; + CleanOptions2 = /* @__PURE__ */ ((CleanOptions22) => { + CleanOptions22["DRY_RUN"] = "n"; + CleanOptions22["FORCE"] = "f"; + CleanOptions22["IGNORED_INCLUDED"] = "x"; + CleanOptions22["IGNORED_ONLY"] = "X"; + CleanOptions22["EXCLUDING"] = "e"; + CleanOptions22["QUIET"] = "q"; + CleanOptions22["RECURSIVE"] = "d"; + return CleanOptions22; + })(CleanOptions2 || {}); + CleanOptionValues2 = /* @__PURE__ */ new Set([ + "i", + ...asStringArray2(Object.values(CleanOptions2)) + ]); + } +}); +function configListParser2(text) { + const config = new ConfigList2(); + for (const item of configParser2(text)) { + config.addValue(item.file, String(item.key), item.value); + } + return config; +} +function configGetParser2(text, key) { + let value = null; + const values = []; + const scopes = /* @__PURE__ */ new Map(); + for (const item of configParser2(text, key)) { + if (item.key !== key) { + continue; + } + values.push((value = item.value)); + if (!scopes.has(item.file)) { + scopes.set(item.file, []); + } + scopes.get(item.file).push(value); + } + return { + key, + paths: Array.from(scopes.keys()), + scopes, + value, + values + }; +} +function configFilePath2(filePath) { + return filePath.replace(/^(file):/, ""); +} +function* configParser2(text, requestedKey = null) { + const lines = text.split("\0"); + for (let i = 0, max = lines.length - 1; i < max; ) { + const file = configFilePath2(lines[i++]); + let value = lines[i++]; + let key = requestedKey; + if (value.includes("\n")) { + const line = splitOn2(value, "\n"); + key = line[0]; + value = line[1]; + } + yield { file, key, value }; + } +} +var ConfigList2; +var init_ConfigList2 = __esm2({ + "src/lib/responses/ConfigList.ts"() { + "use strict"; + init_utils2(); + ConfigList2 = class { + constructor() { + this.files = []; + this.values = /* @__PURE__ */ Object.create(null); + } + get all() { + if (!this._all) { + this._all = this.files.reduce((all, file) => { + return Object.assign(all, this.values[file]); + }, {}); + } + return this._all; + } + addFile(file) { + if (!(file in this.values)) { + const latest = last2(this.files); + this.values[file] = latest ? Object.create(this.values[latest]) : {}; + this.files.push(file); + } + return this.values[file]; + } + addValue(file, key, value) { + const values = this.addFile(file); + if (!Object.hasOwn(values, key)) { + values[key] = value; + } else if (Array.isArray(values[key])) { + values[key].push(value); + } else { + values[key] = [values[key], value]; + } + this._all = void 0; + } + }; + } +}); +function asConfigScope2(scope, fallback) { + if (typeof scope === "string" && Object.hasOwn(GitConfigScope2, scope)) { + return scope; + } + return fallback; +} +function addConfigTask2(key, value, append22, scope) { + const commands3 = ["config", `--${scope}`]; + if (append22) { + commands3.push("--add"); + } + commands3.push(key, value); + return { + commands: commands3, + format: "utf-8", + parser(text) { + return text; + } + }; +} +function getConfigTask2(key, scope) { + const commands3 = ["config", "--null", "--show-origin", "--get-all", key]; + if (scope) { + commands3.splice(1, 0, `--${scope}`); + } + return { + commands: commands3, + format: "utf-8", + parser(text) { + return configGetParser2(text, key); + } + }; +} +function listConfigTask2(scope) { + const commands3 = ["config", "--list", "--show-origin", "--null"]; + if (scope) { + commands3.push(`--${scope}`); + } + return { + commands: commands3, + format: "utf-8", + parser(text) { + return configListParser2(text); + } + }; +} +function config_default2() { + return { + addConfig(key, value, ...rest) { + return this._runTask( + addConfigTask2( + key, + value, + rest[0] === true, + asConfigScope2( + rest[1], + "local" + /* local */ + ) + ), + trailingFunctionArgument2(arguments) + ); + }, + getConfig(key, scope) { + return this._runTask( + getConfigTask2(key, asConfigScope2(scope, void 0)), + trailingFunctionArgument2(arguments) + ); + }, + listConfig(...rest) { + return this._runTask( + listConfigTask2(asConfigScope2(rest[0], void 0)), + trailingFunctionArgument2(arguments) + ); + } + }; +} +var GitConfigScope2; +var init_config2 = __esm2({ + "src/lib/tasks/config.ts"() { + "use strict"; + init_ConfigList2(); + init_utils2(); + GitConfigScope2 = /* @__PURE__ */ ((GitConfigScope22) => { + GitConfigScope22["system"] = "system"; + GitConfigScope22["global"] = "global"; + GitConfigScope22["local"] = "local"; + GitConfigScope22["worktree"] = "worktree"; + return GitConfigScope22; + })(GitConfigScope2 || {}); + } +}); +function isDiffNameStatus2(input) { + return diffNameStatus2.has(input); +} +var DiffNameStatus2; +var diffNameStatus2; +var init_diff_name_status2 = __esm2({ + "src/lib/tasks/diff-name-status.ts"() { + "use strict"; + DiffNameStatus2 = /* @__PURE__ */ ((DiffNameStatus22) => { + DiffNameStatus22["ADDED"] = "A"; + DiffNameStatus22["COPIED"] = "C"; + DiffNameStatus22["DELETED"] = "D"; + DiffNameStatus22["MODIFIED"] = "M"; + DiffNameStatus22["RENAMED"] = "R"; + DiffNameStatus22["CHANGED"] = "T"; + DiffNameStatus22["UNMERGED"] = "U"; + DiffNameStatus22["UNKNOWN"] = "X"; + DiffNameStatus22["BROKEN"] = "B"; + return DiffNameStatus22; + })(DiffNameStatus2 || {}); + diffNameStatus2 = new Set(Object.values(DiffNameStatus2)); + } +}); +function grepQueryBuilder2(...params) { + return new GrepQuery2().param(...params); +} +function parseGrep2(grep) { + const paths = /* @__PURE__ */ new Set(); + const results = {}; + forEachLineWithContent2(grep, (input) => { + const [path11, line, preview] = input.split(NULL2); + paths.add(path11); + (results[path11] = results[path11] || []).push({ + line: asNumber2(line), + path: path11, + preview + }); + }); + return { + paths, + results + }; +} +function grep_default2() { + return { + grep(searchTerm) { + const then = trailingFunctionArgument2(arguments); + const options = getTrailingOptions2(arguments); + for (const option of disallowedOptions2) { + if (options.includes(option)) { + return this._runTask( + configurationErrorTask2(`git.grep: use of "${option}" is not supported.`), + then + ); + } + } + if (typeof searchTerm === "string") { + searchTerm = grepQueryBuilder2().param(searchTerm); + } + const commands3 = ["grep", "--null", "-n", "--full-name", ...options, ...searchTerm]; + return this._runTask( + { + commands: commands3, + format: "utf-8", + parser(stdOut) { + return parseGrep2(stdOut); + } + }, + then + ); + } + }; +} +var disallowedOptions2; +var Query2; +var _a2; +var GrepQuery2; +var init_grep2 = __esm2({ + "src/lib/tasks/grep.ts"() { + "use strict"; + init_utils2(); + init_task2(); + disallowedOptions2 = ["-h"]; + Query2 = Symbol("grepQuery"); + GrepQuery2 = class { + constructor() { + this[_a2] = []; + } + *[((_a2 = Query2), Symbol.iterator)]() { + for (const query of this[Query2]) { + yield query; + } + } + and(...and) { + and.length && this[Query2].push("--and", "(", ...prefixedArray2(and, "-e"), ")"); + return this; + } + param(...param) { + this[Query2].push(...prefixedArray2(param, "-e")); + return this; + } + }; + } +}); +var reset_exports2 = {}; +__export3(reset_exports2, { + ResetMode: () => ResetMode2, + getResetMode: () => getResetMode2, + resetTask: () => resetTask2 +}); +function resetTask2(mode, customArgs) { + const commands3 = ["reset"]; + if (isValidResetMode2(mode)) { + commands3.push(`--${mode}`); + } + commands3.push(...customArgs); + return straightThroughStringTask2(commands3); +} +function getResetMode2(mode) { + if (isValidResetMode2(mode)) { + return mode; + } + switch (typeof mode) { + case "string": + case "undefined": + return "soft"; + } + return; +} +function isValidResetMode2(mode) { + return typeof mode === "string" && validResetModes2.includes(mode); +} +var ResetMode2; +var validResetModes2; +var init_reset2 = __esm2({ + "src/lib/tasks/reset.ts"() { + "use strict"; + init_utils2(); + init_task2(); + ResetMode2 = /* @__PURE__ */ ((ResetMode22) => { + ResetMode22["MIXED"] = "mixed"; + ResetMode22["SOFT"] = "soft"; + ResetMode22["HARD"] = "hard"; + ResetMode22["MERGE"] = "merge"; + ResetMode22["KEEP"] = "keep"; + return ResetMode22; + })(ResetMode2 || {}); + validResetModes2 = asStringArray2(Object.values(ResetMode2)); + } +}); +function createLog2() { + return (0, import_debug2.default)("simple-git"); +} +function prefixedLogger2(to, prefix, forward) { + if (!prefix || !String(prefix).replace(/\s*/, "")) { + return !forward + ? to + : (message, ...args) => { + to(message, ...args); + forward(message, ...args); + }; + } + return (message, ...args) => { + to(`%s ${message}`, prefix, ...args); + if (forward) { + forward(message, ...args); + } + }; +} +function childLoggerName2(name, childDebugger, { namespace: parentNamespace }) { + if (typeof name === "string") { + return name; + } + const childNamespace = (childDebugger && childDebugger.namespace) || ""; + if (childNamespace.startsWith(parentNamespace)) { + return childNamespace.substr(parentNamespace.length + 1); + } + return childNamespace || parentNamespace; +} +function createLogger3(label, verbose, initialStep, infoDebugger = createLog2()) { + const labelPrefix = (label && `[${label}]`) || ""; + const spawned = []; + const debugDebugger = typeof verbose === "string" ? infoDebugger.extend(verbose) : verbose; + const key = childLoggerName2(filterType2(verbose, filterString2), debugDebugger, infoDebugger); + return step(initialStep); + function sibling(name, initial) { + return append2( + spawned, + createLogger3(label, key.replace(/^[^:]+/, name), initial, infoDebugger) + ); + } + function step(phase) { + const stepPrefix = (phase && `[${phase}]`) || ""; + const debug22 = (debugDebugger && prefixedLogger2(debugDebugger, stepPrefix)) || NOOP2; + const info = prefixedLogger2(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug22); + return Object.assign(debugDebugger ? debug22 : info, { + label, + sibling, + info, + step + }); + } +} +var init_git_logger2 = __esm2({ + "src/lib/git-logger.ts"() { + "use strict"; + init_utils2(); + import_debug2.default.formatters.L = (value) => + String(filterHasLength2(value) ? value.length : "-"); + import_debug2.default.formatters.B = (value) => { + if (Buffer.isBuffer(value)) { + return value.toString("utf8"); + } + return objectToString2(value); + }; + } +}); +var TasksPendingQueue2; +var init_tasks_pending_queue2 = __esm2({ + "src/lib/runners/tasks-pending-queue.ts"() { + "use strict"; + init_git_error2(); + init_git_logger2(); + TasksPendingQueue2 = class _TasksPendingQueue { + constructor(logLabel = "GitExecutor") { + this.logLabel = logLabel; + this._queue = /* @__PURE__ */ new Map(); + } + withProgress(task) { + return this._queue.get(task); + } + createProgress(task) { + const name = _TasksPendingQueue.getName(task.commands[0]); + const logger = createLogger3(this.logLabel, name); + return { + task, + logger, + name + }; + } + push(task) { + const progress = this.createProgress(task); + progress.logger("Adding task to the queue, commands = %o", task.commands); + this._queue.set(task, progress); + return progress; + } + fatal(err) { + for (const [task, { logger }] of Array.from(this._queue.entries())) { + if (task === err.task) { + logger.info(`Failed %o`, err); + logger( + `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted` + ); + } else { + logger.info( + `A fatal exception occurred in a previous task, the queue has been purged: %o`, + err.message + ); + } + this.complete(task); + } + if (this._queue.size !== 0) { + throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`); + } + } + complete(task) { + const progress = this.withProgress(task); + if (progress) { + this._queue.delete(task); + } + } + attempt(task) { + const progress = this.withProgress(task); + if (!progress) { + throw new GitError2(void 0, "TasksPendingQueue: attempt called for an unknown task"); + } + progress.logger("Starting task"); + return progress; + } + static getName(name = "empty") { + return `task:${name}:${++_TasksPendingQueue.counter}`; + } + static { + this.counter = 0; + } + }; + } +}); +function pluginContext2(task, commands3) { + return { + method: first2(task.commands) || "", + commands: commands3 + }; +} +function onErrorReceived2(target, logger) { + return (err) => { + logger(`[ERROR] child process exception %o`, err); + target.push(Buffer.from(String(err.stack), "ascii")); + }; +} +function onDataReceived2(target, name, logger, output) { + return (buffer) => { + logger(`%s received %L bytes`, name, buffer); + output(`%B`, buffer); + target.push(buffer); + }; +} +var GitExecutorChain2; +var init_git_executor_chain2 = __esm2({ + "src/lib/runners/git-executor-chain.ts"() { + "use strict"; + init_git_error2(); + init_task2(); + init_utils2(); + init_tasks_pending_queue2(); + GitExecutorChain2 = class { + constructor(_executor, _scheduler, _plugins) { + this._executor = _executor; + this._scheduler = _scheduler; + this._plugins = _plugins; + this._chain = Promise.resolve(); + this._queue = new TasksPendingQueue2(); + } + get cwd() { + return this._cwd || this._executor.cwd; + } + set cwd(cwd) { + this._cwd = cwd; + } + get env() { + return this._executor.env; + } + get outputHandler() { + return this._executor.outputHandler; + } + chain() { + return this; + } + push(task) { + this._queue.push(task); + return (this._chain = this._chain.then(() => this.attemptTask(task))); + } + async attemptTask(task) { + const onScheduleComplete = await this._scheduler.next(); + const onQueueComplete = () => this._queue.complete(task); + try { + const { logger } = this._queue.attempt(task); + return await (isEmptyTask2(task) + ? this.attemptEmptyTask(task, logger) + : this.attemptRemoteTask(task, logger)); + } catch (e) { + throw this.onFatalException(task, e); + } finally { + onQueueComplete(); + onScheduleComplete(); + } + } + onFatalException(task, e) { + const gitError = + e instanceof GitError2 ? Object.assign(e, { task }) : new GitError2(task, e && String(e)); + this._chain = Promise.resolve(); + this._queue.fatal(gitError); + return gitError; + } + async attemptRemoteTask(task, logger) { + const binary = this._plugins.exec("spawn.binary", "", pluginContext2(task, task.commands)); + const args = this._plugins.exec( + "spawn.args", + [...task.commands], + pluginContext2(task, task.commands) + ); + const raw = await this.gitResponse( + task, + binary, + args, + this.outputHandler, + logger.step("SPAWN") + ); + const outputStreams = await this.handleTaskData(task, args, raw, logger.step("HANDLE")); + logger(`passing response to task's parser as a %s`, task.format); + if (isBufferTask2(task)) { + return callTaskParser2(task.parser, outputStreams); + } + return callTaskParser2(task.parser, outputStreams.asStrings()); + } + async attemptEmptyTask(task, logger) { + logger(`empty task bypassing child process to call to task's parser`); + return task.parser(this); + } + handleTaskData(task, args, result, logger) { + const { exitCode, rejection, stdOut, stdErr } = result; + return new Promise((done, fail) => { + logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); + const { error } = this._plugins.exec( + "task.error", + { error: rejection }, + { + ...pluginContext2(task, args), + ...result + } + ); + if (error && task.onError) { + logger.info(`exitCode=%s handling with custom error handler`); + return task.onError( + result, + error, + (newStdOut) => { + logger.info(`custom error handler treated as success`); + logger(`custom error returned a %s`, objectToString2(newStdOut)); + done( + new GitOutputStreams2( + Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, + Buffer.concat(stdErr) + ) + ); + }, + fail + ); + } + if (error) { + logger.info( + `handling as error: exitCode=%s stdErr=%s rejection=%o`, + exitCode, + stdErr.length, + rejection + ); + return fail(error); + } + logger.info(`retrieving task output complete`); + done(new GitOutputStreams2(Buffer.concat(stdOut), Buffer.concat(stdErr))); + }); + } + async gitResponse(task, command, args, outputHandler, logger) { + const outputLogger = logger.sibling("output"); + const spawnOptions = this._plugins.exec( + "spawn.options", + { + cwd: this.cwd, + env: this.env, + windowsHide: true + }, + pluginContext2(task, task.commands) + ); + return new Promise((done) => { + const stdOut = []; + const stdErr = []; + logger.info(`%s %o`, command, args); + logger("%O", spawnOptions); + let rejection = this._beforeSpawn(task, args); + if (rejection) { + return done({ + stdOut, + stdErr, + exitCode: 9901, + rejection + }); + } + this._plugins.exec("spawn.before", void 0, { + ...pluginContext2(task, args), + kill(reason) { + rejection = reason || rejection; + } + }); + const spawned = (0, import_child_process2.spawn)(command, args, spawnOptions); + spawned.stdout.on( + "data", + onDataReceived2(stdOut, "stdOut", logger, outputLogger.step("stdOut")) + ); + spawned.stderr.on( + "data", + onDataReceived2(stdErr, "stdErr", logger, outputLogger.step("stdErr")) + ); + spawned.on("error", onErrorReceived2(stdErr, logger)); + if (outputHandler) { + logger(`Passing child process stdOut/stdErr to custom outputHandler`); + outputHandler(command, spawned.stdout, spawned.stderr, [...args]); + } + this._plugins.exec("spawn.after", void 0, { + ...pluginContext2(task, args), + spawned, + close(exitCode, reason) { + done({ + stdOut, + stdErr, + exitCode, + rejection: rejection || reason + }); + }, + kill(reason) { + if (spawned.killed) { + return; + } + rejection = reason; + spawned.kill("SIGINT"); + } + }); + }); + } + _beforeSpawn(task, args) { + let rejection; + this._plugins.exec("spawn.before", void 0, { + ...pluginContext2(task, args), + kill(reason) { + rejection = reason || rejection; + } + }); + return rejection; + } + }; + } +}); +var git_executor_exports2 = {}; +__export3(git_executor_exports2, { + GitExecutor: () => GitExecutor2 +}); +var GitExecutor2; +var init_git_executor2 = __esm2({ + "src/lib/runners/git-executor.ts"() { + "use strict"; + init_git_executor_chain2(); + GitExecutor2 = class { + constructor(cwd, _scheduler, _plugins) { + this.cwd = cwd; + this._scheduler = _scheduler; + this._plugins = _plugins; + this._chain = new GitExecutorChain2(this, this._scheduler, this._plugins); + } + chain() { + return new GitExecutorChain2(this, this._scheduler, this._plugins); + } + push(task) { + return this._chain.push(task); + } + }; + } +}); +function taskCallback2(task, response, callback = NOOP2) { + const onSuccess = (data) => { + callback(null, data); + }; + const onError22 = (err) => { + if (err?.task === task) { + callback(err instanceof GitResponseError2 ? addDeprecationNoticeToError2(err) : err, void 0); + } + }; + response.then(onSuccess, onError22); +} +function addDeprecationNoticeToError2(err) { + let log = (name) => { + console.warn( + `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3` + ); + log = NOOP2; + }; + return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); + function descriptorReducer(all, name) { + if (name in err) { + return all; + } + all[name] = { + enumerable: false, + configurable: false, + get() { + log(name); + return err.git[name]; + } + }; + return all; + } +} +var init_task_callback2 = __esm2({ + "src/lib/task-callback.ts"() { + "use strict"; + init_git_response_error2(); + init_utils2(); + } +}); +function changeWorkingDirectoryTask2(directory, root) { + return adhocExecTask2((instance) => { + if (!folderExists2(directory)) { + throw new Error(`Git.cwd: cannot change to non-directory "${directory}"`); + } + return ((root || instance).cwd = directory); + }); +} +var init_change_working_directory2 = __esm2({ + "src/lib/tasks/change-working-directory.ts"() { + "use strict"; + init_utils2(); + init_task2(); + } +}); +function checkoutTask2(args) { + const commands3 = ["checkout", ...args]; + if (commands3[1] === "-b" && commands3.includes("-B")) { + commands3[1] = remove2(commands3, "-B"); + } + return straightThroughStringTask2(commands3); +} +function checkout_default2() { + return { + checkout() { + return this._runTask( + checkoutTask2(getTrailingOptions2(arguments, 1)), + trailingFunctionArgument2(arguments) + ); + }, + checkoutBranch(branchName, startPoint) { + return this._runTask( + checkoutTask2(["-b", branchName, startPoint, ...getTrailingOptions2(arguments)]), + trailingFunctionArgument2(arguments) + ); + }, + checkoutLocalBranch(branchName) { + return this._runTask( + checkoutTask2(["-b", branchName, ...getTrailingOptions2(arguments)]), + trailingFunctionArgument2(arguments) + ); + } + }; +} +var init_checkout2 = __esm2({ + "src/lib/tasks/checkout.ts"() { + "use strict"; + init_utils2(); + init_task2(); + } +}); +function countObjectsResponse2() { + return { + count: 0, + garbage: 0, + inPack: 0, + packs: 0, + prunePackable: 0, + size: 0, + sizeGarbage: 0, + sizePack: 0 + }; +} +function count_objects_default2() { + return { + countObjects() { + return this._runTask({ + commands: ["count-objects", "--verbose"], + format: "utf-8", + parser(stdOut) { + return parseStringResponse2(countObjectsResponse2(), [parser22], stdOut); + } + }); + } + }; +} +var parser22; +var init_count_objects2 = __esm2({ + "src/lib/tasks/count-objects.ts"() { + "use strict"; + init_utils2(); + parser22 = new LineParser2(/([a-z-]+): (\d+)$/, (result, [key, value]) => { + const property = asCamelCase2(key); + if (Object.hasOwn(result, property)) { + result[property] = asNumber2(value); + } + }); + } +}); +function parseCommitResult2(stdOut) { + const result = { + author: null, + branch: "", + commit: "", + root: false, + summary: { + changes: 0, + insertions: 0, + deletions: 0 + } + }; + return parseStringResponse2(result, parsers12, stdOut); +} +var parsers12; +var init_parse_commit2 = __esm2({ + "src/lib/parsers/parse-commit.ts"() { + "use strict"; + init_utils2(); + parsers12 = [ + new LineParser2(/^\[([^\s]+)( \([^)]+\))? ([^\]]+)/, (result, [branch, root, commit]) => { + result.branch = branch; + result.commit = commit; + result.root = !!root; + }), + new LineParser2(/\s*Author:\s(.+)/i, (result, [author]) => { + const parts = author.split("<"); + const email = parts.pop(); + if (!email || !email.includes("@")) { + return; + } + result.author = { + email: email.substr(0, email.length - 1), + name: parts.join("<").trim() + }; + }), + new LineParser2( + /(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, + (result, [changes, insertions, deletions]) => { + result.summary.changes = parseInt(changes, 10) || 0; + result.summary.insertions = parseInt(insertions, 10) || 0; + result.summary.deletions = parseInt(deletions, 10) || 0; + } + ), + new LineParser2( + /^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, + (result, [changes, lines, direction]) => { + result.summary.changes = parseInt(changes, 10) || 0; + const count = parseInt(lines, 10) || 0; + if (direction === "-") { + result.summary.deletions = count; + } else if (direction === "+") { + result.summary.insertions = count; + } + } + ) + ]; + } +}); +function commitTask2(message, files, customArgs) { + const commands3 = [ + "-c", + "core.abbrev=40", + "commit", + ...prefixedArray2(message, "-m"), + ...files, + ...customArgs + ]; + return { + commands: commands3, + format: "utf-8", + parser: parseCommitResult2 + }; +} +function commit_default2() { + return { + commit(message, ...rest) { + const next = trailingFunctionArgument2(arguments); + const task = + rejectDeprecatedSignatures(message) || + commitTask2( + asArray2(message), + asArray2(filterType2(rest[0], filterStringOrStringArray2, [])), + [ + ...asStringArray2(filterType2(rest[1], filterArray2, [])), + ...getTrailingOptions2(arguments, 0, true) + ] + ); + return this._runTask(task, next); + } + }; + function rejectDeprecatedSignatures(message) { + return ( + !filterStringOrStringArray2(message) && + configurationErrorTask2( + `git.commit: requires the commit message to be supplied as a string/string[]` + ) + ); + } +} +var init_commit2 = __esm2({ + "src/lib/tasks/commit.ts"() { + "use strict"; + init_parse_commit2(); + init_utils2(); + init_task2(); + } +}); +function first_commit_default2() { + return { + firstCommit() { + return this._runTask( + straightThroughStringTask2(["rev-list", "--max-parents=0", "HEAD"], true), + trailingFunctionArgument2(arguments) + ); + } + }; +} +var init_first_commit2 = __esm2({ + "src/lib/tasks/first-commit.ts"() { + "use strict"; + init_utils2(); + init_task2(); + } +}); +function hashObjectTask2(filePath, write) { + const commands3 = ["hash-object", filePath]; + if (write) { + commands3.push("-w"); + } + return straightThroughStringTask2(commands3, true); +} +var init_hash_object2 = __esm2({ + "src/lib/tasks/hash-object.ts"() { + "use strict"; + init_task2(); + } +}); +function parseInit2(bare, path11, text) { + const response = String(text).trim(); + let result; + if ((result = initResponseRegex2.exec(response))) { + return new InitSummary2(bare, path11, false, result[1]); + } + if ((result = reInitResponseRegex2.exec(response))) { + return new InitSummary2(bare, path11, true, result[1]); + } + let gitDir = ""; + const tokens = response.split(" "); + while (tokens.length) { + const token = tokens.shift(); + if (token === "in") { + gitDir = tokens.join(" "); + break; + } + } + return new InitSummary2(bare, path11, /^re/i.test(response), gitDir); +} +var InitSummary2; +var initResponseRegex2; +var reInitResponseRegex2; +var init_InitSummary2 = __esm2({ + "src/lib/responses/InitSummary.ts"() { + "use strict"; + InitSummary2 = class { + constructor(bare, path11, existing, gitDir) { + this.bare = bare; + this.path = path11; + this.existing = existing; + this.gitDir = gitDir; + } + }; + initResponseRegex2 = /^Init.+ repository in (.+)$/; + reInitResponseRegex2 = /^Rein.+ in (.+)$/; + } +}); +function hasBareCommand2(command) { + return command.includes(bareCommand2); +} +function initTask2(bare = false, path11, customArgs) { + const commands3 = ["init", ...customArgs]; + if (bare && !hasBareCommand2(commands3)) { + commands3.splice(1, 0, bareCommand2); + } + return { + commands: commands3, + format: "utf-8", + parser(text) { + return parseInit2(commands3.includes("--bare"), path11, text); + } + }; +} +var bareCommand2; +var init_init2 = __esm2({ + "src/lib/tasks/init.ts"() { + "use strict"; + init_InitSummary2(); + bareCommand2 = "--bare"; + } +}); +function logFormatFromCommand2(customArgs) { + for (let i = 0; i < customArgs.length; i++) { + const format = logFormatRegex2.exec(customArgs[i]); + if (format) { + return `--${format[1]}`; + } + } + return ""; +} +function isLogFormat2(customArg) { + return logFormatRegex2.test(customArg); +} +var logFormatRegex2; +var init_log_format2 = __esm2({ + "src/lib/args/log-format.ts"() { + "use strict"; + logFormatRegex2 = /^--(stat|numstat|name-only|name-status)(=|$)/; + } +}); +var DiffSummary2; +var init_DiffSummary2 = __esm2({ + "src/lib/responses/DiffSummary.ts"() { + "use strict"; + DiffSummary2 = class { + constructor() { + this.changed = 0; + this.deletions = 0; + this.insertions = 0; + this.files = []; + } + }; + } +}); +function getDiffParser2(format = "") { + const parser42 = diffSummaryParsers2[format]; + return (stdOut) => parseStringResponse2(new DiffSummary2(), parser42, stdOut, false); +} +var statParser2; +var numStatParser2; +var nameOnlyParser2; +var nameStatusParser2; +var diffSummaryParsers2; +var init_parse_diff_summary2 = __esm2({ + "src/lib/parsers/parse-diff-summary.ts"() { + "use strict"; + init_log_format2(); + init_DiffSummary2(); + init_diff_name_status2(); + init_utils2(); + statParser2 = [ + new LineParser2( + /^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, + (result, [file, changes, alterations = ""]) => { + result.files.push({ + file: file.trim(), + changes: asNumber2(changes), + insertions: alterations.replace(/[^+]/g, "").length, + deletions: alterations.replace(/[^-]/g, "").length, + binary: false + }); + } + ), + new LineParser2( + /^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, + (result, [file, before, after]) => { + result.files.push({ + file: file.trim(), + before: asNumber2(before), + after: asNumber2(after), + binary: true + }); + } + ), + new LineParser2( + /(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, + (result, [changed, summary]) => { + const inserted = /(\d+) i/.exec(summary); + const deleted = /(\d+) d/.exec(summary); + result.changed = asNumber2(changed); + result.insertions = asNumber2(inserted?.[1]); + result.deletions = asNumber2(deleted?.[1]); + } + ) + ]; + numStatParser2 = [ + new LineParser2(/(\d+)\t(\d+)\t(.+)$/, (result, [changesInsert, changesDelete, file]) => { + const insertions = asNumber2(changesInsert); + const deletions = asNumber2(changesDelete); + result.changed++; + result.insertions += insertions; + result.deletions += deletions; + result.files.push({ + file, + changes: insertions + deletions, + insertions, + deletions, + binary: false + }); + }), + new LineParser2(/-\t-\t(.+)$/, (result, [file]) => { + result.changed++; + result.files.push({ + file, + after: 0, + before: 0, + binary: true + }); + }) + ]; + nameOnlyParser2 = [ + new LineParser2(/(.+)$/, (result, [file]) => { + result.changed++; + result.files.push({ + file, + changes: 0, + insertions: 0, + deletions: 0, + binary: false + }); + }) + ]; + nameStatusParser2 = [ + new LineParser2( + /([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, + (result, [status, similarity, from, _to, to]) => { + result.changed++; + result.files.push({ + file: to ?? from, + changes: 0, + insertions: 0, + deletions: 0, + binary: false, + status: orVoid2(isDiffNameStatus2(status) && status), + from: orVoid2(!!to && from !== to && from), + similarity: asNumber2(similarity) + }); + } + ) + ]; + diffSummaryParsers2 = { + [""]: + /* NONE */ + statParser2, + ["--stat"]: + /* STAT */ + statParser2, + ["--numstat"]: + /* NUM_STAT */ + numStatParser2, + ["--name-status"]: + /* NAME_STATUS */ + nameStatusParser2, + ["--name-only"]: + /* NAME_ONLY */ + nameOnlyParser2 + }; + } +}); +function lineBuilder2(tokens, fields) { + return fields.reduce( + (line, field, index) => { + line[field] = tokens[index] || ""; + return line; + }, + /* @__PURE__ */ Object.create({ diff: null }) + ); +} +function createListLogSummaryParser2( + splitter = SPLITTER2, + fields = defaultFieldNames2, + logFormat = "" +) { + const parseDiffResult = getDiffParser2(logFormat); + return function (stdOut) { + const all = toLinesWithContent2(stdOut.trim(), false, START_BOUNDARY2).map(function (item) { + const lineDetail = item.split(COMMIT_BOUNDARY2); + const listLogLine = lineBuilder2(lineDetail[0].split(splitter), fields); + if (lineDetail.length > 1 && !!lineDetail[1].trim()) { + listLogLine.diff = parseDiffResult(lineDetail[1]); + } + return listLogLine; + }); + return { + all, + latest: (all.length && all[0]) || null, + total: all.length + }; + }; +} +var START_BOUNDARY2; +var COMMIT_BOUNDARY2; +var SPLITTER2; +var defaultFieldNames2; +var init_parse_list_log_summary2 = __esm2({ + "src/lib/parsers/parse-list-log-summary.ts"() { + "use strict"; + init_utils2(); + init_parse_diff_summary2(); + init_log_format2(); + START_BOUNDARY2 = "\xF2\xF2\xF2\xF2\xF2\xF2 "; + COMMIT_BOUNDARY2 = " \xF2\xF2"; + SPLITTER2 = " \xF2 "; + defaultFieldNames2 = ["hash", "date", "message", "refs", "author_name", "author_email"]; + } +}); +var diff_exports2 = {}; +__export3(diff_exports2, { + diffSummaryTask: () => diffSummaryTask2, + validateLogFormatConfig: () => validateLogFormatConfig2 +}); +function diffSummaryTask2(customArgs) { + let logFormat = logFormatFromCommand2(customArgs); + const commands3 = ["diff"]; + if (logFormat === "") { + logFormat = "--stat"; + commands3.push("--stat=4096"); + } + commands3.push(...customArgs); + return ( + validateLogFormatConfig2(commands3) || { + commands: commands3, + format: "utf-8", + parser: getDiffParser2(logFormat) + } + ); +} +function validateLogFormatConfig2(customArgs) { + const flags = customArgs.filter(isLogFormat2); + if (flags.length > 1) { + return configurationErrorTask2( + `Summary flags are mutually exclusive - pick one of ${flags.join(",")}` + ); + } + if (flags.length && customArgs.includes("-z")) { + return configurationErrorTask2( + `Summary flag ${flags} parsing is not compatible with null termination option '-z'` + ); + } +} +var init_diff2 = __esm2({ + "src/lib/tasks/diff.ts"() { + "use strict"; + init_log_format2(); + init_parse_diff_summary2(); + init_task2(); + } +}); +function prettyFormat2(format, splitter) { + const fields = []; + const formatStr = []; + Object.keys(format).forEach((field) => { + fields.push(field); + formatStr.push(String(format[field])); + }); + return [fields, formatStr.join(splitter)]; +} +function userOptions2(input) { + return Object.keys(input).reduce((out, key) => { + if (!(key in excludeOptions2)) { + out[key] = input[key]; + } + return out; + }, {}); +} +function parseLogOptions2(opt = {}, customArgs = []) { + const splitter = filterType2(opt.splitter, filterString2, SPLITTER2); + const format = filterPlainObject2(opt.format) + ? opt.format + : { + hash: "%H", + date: opt.strictDate === false ? "%ai" : "%aI", + message: "%s", + refs: "%D", + body: opt.multiLine ? "%B" : "%b", + author_name: opt.mailMap !== false ? "%aN" : "%an", + author_email: opt.mailMap !== false ? "%aE" : "%ae" + }; + const [fields, formatStr] = prettyFormat2(format, splitter); + const suffix = []; + const command = [ + `--pretty=format:${START_BOUNDARY2}${formatStr}${COMMIT_BOUNDARY2}`, + ...customArgs + ]; + const maxCount = opt.n || opt["max-count"] || opt.maxCount; + if (maxCount) { + command.push(`--max-count=${maxCount}`); + } + if (opt.from || opt.to) { + const rangeOperator = opt.symmetric !== false ? "..." : ".."; + suffix.push(`${opt.from || ""}${rangeOperator}${opt.to || ""}`); + } + if (filterString2(opt.file)) { + command.push("--follow", pathspec2(opt.file)); + } + appendTaskOptions2(userOptions2(opt), command); + return { + fields, + splitter, + commands: [...command, ...suffix] + }; +} +function logTask2(splitter, fields, customArgs) { + const parser42 = createListLogSummaryParser2(splitter, fields, logFormatFromCommand2(customArgs)); + return { + commands: ["log", ...customArgs], + format: "utf-8", + parser: parser42 + }; +} +function log_default2() { + return { + log(...rest) { + const next = trailingFunctionArgument2(arguments); + const options = parseLogOptions2( + trailingOptionsArgument2(arguments), + asStringArray2(filterType2(arguments[0], filterArray2, [])) + ); + const task = + rejectDeprecatedSignatures(...rest) || + validateLogFormatConfig2(options.commands) || + createLogTask(options); + return this._runTask(task, next); + } + }; + function createLogTask(options) { + return logTask2(options.splitter, options.fields, options.commands); + } + function rejectDeprecatedSignatures(from, to) { + return ( + filterString2(from) && + filterString2(to) && + configurationErrorTask2( + `git.log(string, string) should be replaced with git.log({ from: string, to: string })` + ) + ); + } +} +var excludeOptions2; +var init_log2 = __esm2({ + "src/lib/tasks/log.ts"() { + "use strict"; + init_log_format2(); + init_pathspec2(); + init_parse_list_log_summary2(); + init_utils2(); + init_task2(); + init_diff2(); + excludeOptions2 = /* @__PURE__ */ ((excludeOptions22) => { + excludeOptions22[(excludeOptions22["--pretty"] = 0)] = "--pretty"; + excludeOptions22[(excludeOptions22["max-count"] = 1)] = "max-count"; + excludeOptions22[(excludeOptions22["maxCount"] = 2)] = "maxCount"; + excludeOptions22[(excludeOptions22["n"] = 3)] = "n"; + excludeOptions22[(excludeOptions22["file"] = 4)] = "file"; + excludeOptions22[(excludeOptions22["format"] = 5)] = "format"; + excludeOptions22[(excludeOptions22["from"] = 6)] = "from"; + excludeOptions22[(excludeOptions22["to"] = 7)] = "to"; + excludeOptions22[(excludeOptions22["splitter"] = 8)] = "splitter"; + excludeOptions22[(excludeOptions22["symmetric"] = 9)] = "symmetric"; + excludeOptions22[(excludeOptions22["mailMap"] = 10)] = "mailMap"; + excludeOptions22[(excludeOptions22["multiLine"] = 11)] = "multiLine"; + excludeOptions22[(excludeOptions22["strictDate"] = 12)] = "strictDate"; + return excludeOptions22; + })(excludeOptions2 || {}); + } +}); +var MergeSummaryConflict2; +var MergeSummaryDetail2; +var init_MergeSummary2 = __esm2({ + "src/lib/responses/MergeSummary.ts"() { + "use strict"; + MergeSummaryConflict2 = class { + constructor(reason, file = null, meta) { + this.reason = reason; + this.file = file; + this.meta = meta; + } + toString() { + return `${this.file}:${this.reason}`; + } + }; + MergeSummaryDetail2 = class { + constructor() { + this.conflicts = []; + this.merges = []; + this.result = "success"; + } + get failed() { + return this.conflicts.length > 0; + } + get reason() { + return this.result; + } + toString() { + if (this.conflicts.length) { + return `CONFLICTS: ${this.conflicts.join(", ")}`; + } + return "OK"; + } + }; + } +}); +var PullSummary2; +var PullFailedSummary2; +var init_PullSummary2 = __esm2({ + "src/lib/responses/PullSummary.ts"() { + "use strict"; + PullSummary2 = class { + constructor() { + this.remoteMessages = { + all: [] + }; + this.created = []; + this.deleted = []; + this.files = []; + this.deletions = {}; + this.insertions = {}; + this.summary = { + changes: 0, + deletions: 0, + insertions: 0 + }; + } + }; + PullFailedSummary2 = class { + constructor() { + this.remote = ""; + this.hash = { + local: "", + remote: "" + }; + this.branch = { + local: "", + remote: "" + }; + this.message = ""; + } + toString() { + return this.message; + } + }; + } +}); +function objectEnumerationResult2(remoteMessages) { + return (remoteMessages.objects = remoteMessages.objects || { + compressing: 0, + counting: 0, + enumerating: 0, + packReused: 0, + reused: { count: 0, delta: 0 }, + total: { count: 0, delta: 0 } + }); +} +function asObjectCount2(source) { + const count = /^\s*(\d+)/.exec(source); + const delta = /delta (\d+)/i.exec(source); + return { + count: asNumber2((count && count[1]) || "0"), + delta: asNumber2((delta && delta[1]) || "0") + }; +} +var remoteMessagesObjectParsers2; +var init_parse_remote_objects2 = __esm2({ + "src/lib/parsers/parse-remote-objects.ts"() { + "use strict"; + init_utils2(); + remoteMessagesObjectParsers2 = [ + new RemoteLineParser2( + /^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, + (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult2(result.remoteMessages); + Object.assign(enumeration, { [key]: asNumber2(count) }); + } + ), + new RemoteLineParser2( + /^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, + (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult2(result.remoteMessages); + Object.assign(enumeration, { [key]: asNumber2(count) }); + } + ), + new RemoteLineParser2( + /total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, + (result, [total, reused, packReused]) => { + const objects = objectEnumerationResult2(result.remoteMessages); + objects.total = asObjectCount2(total); + objects.reused = asObjectCount2(reused); + objects.packReused = asNumber2(packReused); + } + ) + ]; + } +}); +function parseRemoteMessages2(_stdOut, stdErr) { + return parseStringResponse2({ remoteMessages: new RemoteMessageSummary2() }, parsers22, stdErr); +} +var parsers22; +var RemoteMessageSummary2; +var init_parse_remote_messages2 = __esm2({ + "src/lib/parsers/parse-remote-messages.ts"() { + "use strict"; + init_utils2(); + init_parse_remote_objects2(); + parsers22 = [ + new RemoteLineParser2(/^remote:\s*(.+)$/, (result, [text]) => { + result.remoteMessages.all.push(text.trim()); + return false; + }), + ...remoteMessagesObjectParsers2, + new RemoteLineParser2( + [/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], + (result, [pullRequestUrl]) => { + result.remoteMessages.pullRequestUrl = pullRequestUrl; + } + ), + new RemoteLineParser2( + [/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], + (result, [count, summary, url]) => { + result.remoteMessages.vulnerabilities = { + count: asNumber2(count), + summary, + url + }; + } + ) + ]; + RemoteMessageSummary2 = class { + constructor() { + this.all = []; + } + }; + } +}); +function parsePullErrorResult2(stdOut, stdErr) { + const pullError = parseStringResponse2(new PullFailedSummary2(), errorParsers2, [stdOut, stdErr]); + return pullError.message && pullError; +} +var FILE_UPDATE_REGEX2; +var SUMMARY_REGEX2; +var ACTION_REGEX2; +var parsers32; +var errorParsers2; +var parsePullDetail2; +var parsePullResult2; +var init_parse_pull2 = __esm2({ + "src/lib/parsers/parse-pull.ts"() { + "use strict"; + init_PullSummary2(); + init_utils2(); + init_parse_remote_messages2(); + FILE_UPDATE_REGEX2 = /^\s*(.+?)\s+\|\s+\d+\s*(\+*)(-*)/; + SUMMARY_REGEX2 = /(\d+)\D+((\d+)\D+\(\+\))?(\D+(\d+)\D+\(-\))?/; + ACTION_REGEX2 = /^(create|delete) mode \d+ (.+)/; + parsers32 = [ + new LineParser2(FILE_UPDATE_REGEX2, (result, [file, insertions, deletions]) => { + result.files.push(file); + if (insertions) { + result.insertions[file] = insertions.length; + } + if (deletions) { + result.deletions[file] = deletions.length; + } + }), + new LineParser2(SUMMARY_REGEX2, (result, [changes, , insertions, , deletions]) => { + if (insertions !== void 0 || deletions !== void 0) { + result.summary.changes = +changes || 0; + result.summary.insertions = +insertions || 0; + result.summary.deletions = +deletions || 0; + return true; + } + return false; + }), + new LineParser2(ACTION_REGEX2, (result, [action, file]) => { + append2(result.files, file); + append2(action === "create" ? result.created : result.deleted, file); + }) + ]; + errorParsers2 = [ + new LineParser2(/^from\s(.+)$/i, (result, [remote]) => void (result.remote = remote)), + new LineParser2(/^fatal:\s(.+)$/, (result, [message]) => void (result.message = message)), + new LineParser2( + /([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, + (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { + result.branch.local = branchLocal; + result.hash.local = hashLocal; + result.branch.remote = branchRemote; + result.hash.remote = hashRemote; + } + ) + ]; + parsePullDetail2 = (stdOut, stdErr) => { + return parseStringResponse2(new PullSummary2(), parsers32, [stdOut, stdErr]); + }; + parsePullResult2 = (stdOut, stdErr) => { + return Object.assign( + new PullSummary2(), + parsePullDetail2(stdOut, stdErr), + parseRemoteMessages2(stdOut, stdErr) + ); + }; + } +}); +var parsers42; +var parseMergeResult2; +var parseMergeDetail2; +var init_parse_merge2 = __esm2({ + "src/lib/parsers/parse-merge.ts"() { + "use strict"; + init_MergeSummary2(); + init_utils2(); + init_parse_pull2(); + parsers42 = [ + new LineParser2(/^Auto-merging\s+(.+)$/, (summary, [autoMerge]) => { + summary.merges.push(autoMerge); + }), + new LineParser2( + /^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, + (summary, [reason, file]) => { + summary.conflicts.push(new MergeSummaryConflict2(reason, file)); + } + ), + new LineParser2( + /^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, + (summary, [reason, file, deleteRef]) => { + summary.conflicts.push(new MergeSummaryConflict2(reason, file, { deleteRef })); + } + ), + new LineParser2(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { + summary.conflicts.push(new MergeSummaryConflict2(reason, null)); + }), + new LineParser2(/^Automatic merge failed;\s+(.+)$/, (summary, [result]) => { + summary.result = result; + }) + ]; + parseMergeResult2 = (stdOut, stdErr) => { + return Object.assign(parseMergeDetail2(stdOut, stdErr), parsePullResult2(stdOut, stdErr)); + }; + parseMergeDetail2 = (stdOut) => { + return parseStringResponse2(new MergeSummaryDetail2(), parsers42, stdOut); + }; + } +}); +function mergeTask2(customArgs) { + if (!customArgs.length) { + return configurationErrorTask2("Git.merge requires at least one option"); + } + return { + commands: ["merge", ...customArgs], + format: "utf-8", + parser(stdOut, stdErr) { + const merge2 = parseMergeResult2(stdOut, stdErr); + if (merge2.failed) { + throw new GitResponseError2(merge2); + } + return merge2; + } + }; +} +var init_merge2 = __esm2({ + "src/lib/tasks/merge.ts"() { + "use strict"; + init_git_response_error2(); + init_parse_merge2(); + init_task2(); + } +}); +function pushResultPushedItem2(local, remote, status) { + const deleted = status.includes("deleted"); + const tag = status.includes("tag") || /^refs\/tags/.test(local); + const alreadyUpdated = !status.includes("new"); + return { + deleted, + tag, + branch: !tag, + new: !alreadyUpdated, + alreadyUpdated, + local, + remote + }; +} +var parsers52; +var parsePushResult2; +var parsePushDetail2; +var init_parse_push2 = __esm2({ + "src/lib/parsers/parse-push.ts"() { + "use strict"; + init_utils2(); + init_parse_remote_messages2(); + parsers52 = [ + new LineParser2(/^Pushing to (.+)$/, (result, [repo]) => { + result.repo = repo; + }), + new LineParser2(/^updating local tracking ref '(.+)'/, (result, [local]) => { + result.ref = { + ...(result.ref || {}), + local + }; + }), + new LineParser2(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { + result.pushed.push(pushResultPushedItem2(local, remote, type)); + }), + new LineParser2( + /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, + (result, [local, remote, remoteName]) => { + result.branch = { + ...(result.branch || {}), + local, + remote, + remoteName + }; + } + ), + new LineParser2( + /^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, + (result, [local, remote, from, to]) => { + result.update = { + head: { + local, + remote + }, + hash: { + from, + to + } + }; + } + ) + ]; + parsePushResult2 = (stdOut, stdErr) => { + const pushDetail = parsePushDetail2(stdOut, stdErr); + const responseDetail = parseRemoteMessages2(stdOut, stdErr); + return { + ...pushDetail, + ...responseDetail + }; + }; + parsePushDetail2 = (stdOut, stdErr) => { + return parseStringResponse2({ pushed: [] }, parsers52, [stdOut, stdErr]); + }; + } +}); +var push_exports2 = {}; +__export3(push_exports2, { + pushTagsTask: () => pushTagsTask2, + pushTask: () => pushTask2 +}); +function pushTagsTask2(ref = {}, customArgs) { + append2(customArgs, "--tags"); + return pushTask2(ref, customArgs); +} +function pushTask2(ref = {}, customArgs) { + const commands3 = ["push", ...customArgs]; + if (ref.branch) { + commands3.splice(1, 0, ref.branch); + } + if (ref.remote) { + commands3.splice(1, 0, ref.remote); + } + remove2(commands3, "-v"); + append2(commands3, "--verbose"); + append2(commands3, "--porcelain"); + return { + commands: commands3, + format: "utf-8", + parser: parsePushResult2 + }; +} +var init_push2 = __esm2({ + "src/lib/tasks/push.ts"() { + "use strict"; + init_parse_push2(); + init_utils2(); + } +}); +function show_default2() { + return { + showBuffer() { + const commands3 = ["show", ...getTrailingOptions2(arguments, 1)]; + if (!commands3.includes("--binary")) { + commands3.splice(1, 0, "--binary"); + } + return this._runTask( + straightThroughBufferTask2(commands3), + trailingFunctionArgument2(arguments) + ); + }, + show() { + const commands3 = ["show", ...getTrailingOptions2(arguments, 1)]; + return this._runTask( + straightThroughStringTask2(commands3), + trailingFunctionArgument2(arguments) + ); + } + }; +} +var init_show2 = __esm2({ + "src/lib/tasks/show.ts"() { + "use strict"; + init_utils2(); + init_task2(); + } +}); +var fromPathRegex2; +var FileStatusSummary2; +var init_FileStatusSummary2 = __esm2({ + "src/lib/responses/FileStatusSummary.ts"() { + "use strict"; + fromPathRegex2 = /^(.+)\0(.+)$/; + FileStatusSummary2 = class { + constructor(path11, index, working_dir) { + this.path = path11; + this.index = index; + this.working_dir = working_dir; + if (index === "R" || working_dir === "R") { + const detail = fromPathRegex2.exec(path11) || [null, path11, path11]; + this.from = detail[2] || ""; + this.path = detail[1] || ""; + } + } + }; + } +}); +function renamedFile2(line) { + const [to, from] = line.split(NULL2); + return { + from: from || to, + to + }; +} +function parser32(indexX, indexY, handler2) { + return [`${indexX}${indexY}`, handler2]; +} +function conflicts2(indexX, ...indexY) { + return indexY.map((y) => parser32(indexX, y, (result, file) => result.conflicted.push(file))); +} +function splitLine2(result, lineStr) { + const trimmed22 = lineStr.trim(); + switch (" ") { + case trimmed22.charAt(2): + return data(trimmed22.charAt(0), trimmed22.charAt(1), trimmed22.slice(3)); + case trimmed22.charAt(1): + return data(" ", trimmed22.charAt(0), trimmed22.slice(2)); + default: + return; + } + function data(index, workingDir, path11) { + const raw = `${index}${workingDir}`; + const handler2 = parsers62.get(raw); + if (handler2) { + handler2(result, path11); + } + if (raw !== "##" && raw !== "!!") { + result.files.push(new FileStatusSummary2(path11, index, workingDir)); + } + } +} +var StatusSummary2; +var parsers62; +var parseStatusSummary2; +var init_StatusSummary2 = __esm2({ + "src/lib/responses/StatusSummary.ts"() { + "use strict"; + init_utils2(); + init_FileStatusSummary2(); + StatusSummary2 = class { + constructor() { + this.not_added = []; + this.conflicted = []; + this.created = []; + this.deleted = []; + this.ignored = void 0; + this.modified = []; + this.renamed = []; + this.files = []; + this.staged = []; + this.ahead = 0; + this.behind = 0; + this.current = null; + this.tracking = null; + this.detached = false; + this.isClean = () => { + return !this.files.length; + }; + } + }; + parsers62 = new Map([ + parser32(" ", "A", (result, file) => result.created.push(file)), + parser32(" ", "D", (result, file) => result.deleted.push(file)), + parser32(" ", "M", (result, file) => result.modified.push(file)), + parser32("A", " ", (result, file) => { + result.created.push(file); + result.staged.push(file); + }), + parser32("A", "M", (result, file) => { + result.created.push(file); + result.staged.push(file); + result.modified.push(file); + }), + parser32("D", " ", (result, file) => { + result.deleted.push(file); + result.staged.push(file); + }), + parser32("M", " ", (result, file) => { + result.modified.push(file); + result.staged.push(file); + }), + parser32("M", "M", (result, file) => { + result.modified.push(file); + result.staged.push(file); + }), + parser32("R", " ", (result, file) => { + result.renamed.push(renamedFile2(file)); + }), + parser32("R", "M", (result, file) => { + const renamed = renamedFile2(file); + result.renamed.push(renamed); + result.modified.push(renamed.to); + }), + parser32("!", "!", (_result, _file) => { + (_result.ignored = _result.ignored || []).push(_file); + }), + parser32("?", "?", (result, file) => result.not_added.push(file)), + ...conflicts2( + "A", + "A", + "U" + /* UNMERGED */ + ), + ...conflicts2( + "D", + "D", + "U" + /* UNMERGED */ + ), + ...conflicts2( + "U", + "A", + "D", + "U" + /* UNMERGED */ + ), + [ + "##", + (result, line) => { + const aheadReg = /ahead (\d+)/; + const behindReg = /behind (\d+)/; + const currentReg = /^(.+?(?=(?:\.{3}|\s|$)))/; + const trackingReg = /\.{3}(\S*)/; + const onEmptyBranchReg = /\son\s(\S+?)(?=\.{3}|$)/; + let regexResult = aheadReg.exec(line); + result.ahead = (regexResult && +regexResult[1]) || 0; + regexResult = behindReg.exec(line); + result.behind = (regexResult && +regexResult[1]) || 0; + regexResult = currentReg.exec(line); + result.current = filterType2(regexResult?.[1], filterString2, null); + regexResult = trackingReg.exec(line); + result.tracking = filterType2(regexResult?.[1], filterString2, null); + regexResult = onEmptyBranchReg.exec(line); + if (regexResult) { + result.current = filterType2(regexResult?.[1], filterString2, result.current); + } + result.detached = /\(no branch\)/.test(line); + } + ] + ]); + parseStatusSummary2 = function (text) { + const lines = text.split(NULL2); + const status = new StatusSummary2(); + for (let i = 0, l = lines.length; i < l; ) { + let line = lines[i++].trim(); + if (!line) { + continue; + } + if (line.charAt(0) === "R") { + line += NULL2 + (lines[i++] || ""); + } + splitLine2(status, line); + } + return status; + }; + } +}); +function statusTask2(customArgs) { + const commands3 = [ + "status", + "--porcelain", + "-b", + "-u", + "--null", + ...customArgs.filter((arg) => !ignoredOptions2.includes(arg)) + ]; + return { + format: "utf-8", + commands: commands3, + parser(text) { + return parseStatusSummary2(text); + } + }; +} +var ignoredOptions2; +var init_status2 = __esm2({ + "src/lib/tasks/status.ts"() { + "use strict"; + init_StatusSummary2(); + ignoredOptions2 = ["--null", "-z"]; + } +}); +function versionResponse2(major = 0, minor = 0, patch = 0, agent = "", installed = true) { + return Object.defineProperty( + { + major, + minor, + patch, + agent, + installed + }, + "toString", + { + value() { + return `${this.major}.${this.minor}.${this.patch}`; + }, + configurable: false, + enumerable: false + } + ); +} +function notInstalledResponse2() { + return versionResponse2(0, 0, 0, "", false); +} +function version_default2() { + return { + version() { + return this._runTask({ + commands: ["--version"], + format: "utf-8", + parser: versionParser2, + onError(result, error, done, fail) { + if (result.exitCode === -2) { + return done(Buffer.from(NOT_INSTALLED2)); + } + fail(error); + } + }); + } + }; +} +function versionParser2(stdOut) { + if (stdOut === NOT_INSTALLED2) { + return notInstalledResponse2(); + } + return parseStringResponse2(versionResponse2(0, 0, 0, stdOut), parsers72, stdOut); +} +var NOT_INSTALLED2; +var parsers72; +var init_version2 = __esm2({ + "src/lib/tasks/version.ts"() { + "use strict"; + init_utils2(); + NOT_INSTALLED2 = "installed=false"; + parsers72 = [ + new LineParser2( + /version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, + (result, [major, minor, patch, agent = ""]) => { + Object.assign( + result, + versionResponse2(asNumber2(major), asNumber2(minor), asNumber2(patch), agent) + ); + } + ), + new LineParser2( + /version (\d+)\.(\d+)\.(\D+)(.+)?$/, + (result, [major, minor, patch, agent = ""]) => { + Object.assign(result, versionResponse2(asNumber2(major), asNumber2(minor), patch, agent)); + } + ) + ]; + } +}); +var simple_git_api_exports2 = {}; +__export3(simple_git_api_exports2, { + SimpleGitApi: () => SimpleGitApi2 +}); +var SimpleGitApi2; +var init_simple_git_api2 = __esm2({ + "src/lib/simple-git-api.ts"() { + "use strict"; + init_task_callback2(); + init_change_working_directory2(); + init_checkout2(); + init_count_objects2(); + init_commit2(); + init_config2(); + init_first_commit2(); + init_grep2(); + init_hash_object2(); + init_init2(); + init_log2(); + init_merge2(); + init_push2(); + init_show2(); + init_status2(); + init_task2(); + init_version2(); + init_utils2(); + SimpleGitApi2 = class { + constructor(_executor) { + this._executor = _executor; + } + _runTask(task, then) { + const chain = this._executor.chain(); + const promise = chain.push(task); + if (then) { + taskCallback2(task, promise, then); + } + return Object.create(this, { + then: { value: promise.then.bind(promise) }, + catch: { value: promise.catch.bind(promise) }, + _executor: { value: chain } + }); + } + add(files) { + return this._runTask( + straightThroughStringTask2(["add", ...asArray2(files)]), + trailingFunctionArgument2(arguments) + ); + } + cwd(directory) { + const next = trailingFunctionArgument2(arguments); + if (typeof directory === "string") { + return this._runTask(changeWorkingDirectoryTask2(directory, this._executor), next); + } + if (typeof directory?.path === "string") { + return this._runTask( + changeWorkingDirectoryTask2( + directory.path, + (directory.root && this._executor) || void 0 + ), + next + ); + } + return this._runTask( + configurationErrorTask2("Git.cwd: workingDirectory must be supplied as a string"), + next + ); + } + hashObject(path11, write) { + return this._runTask( + hashObjectTask2(path11, write === true), + trailingFunctionArgument2(arguments) + ); + } + init(bare) { + return this._runTask( + initTask2(bare === true, this._executor.cwd, getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); + } + merge() { + return this._runTask( + mergeTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); + } + mergeFromTo(remote, branch) { + if (!(filterString2(remote) && filterString2(branch))) { + return this._runTask( + configurationErrorTask2( + `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings` + ) + ); + } + return this._runTask( + mergeTask2([remote, branch, ...getTrailingOptions2(arguments)]), + trailingFunctionArgument2(arguments, false) + ); + } + outputHandler(handler2) { + this._executor.outputHandler = handler2; + return this; + } + push() { + const task = pushTask2( + { + remote: filterType2(arguments[0], filterString2), + branch: filterType2(arguments[1], filterString2) + }, + getTrailingOptions2(arguments) + ); + return this._runTask(task, trailingFunctionArgument2(arguments)); + } + stash() { + return this._runTask( + straightThroughStringTask2(["stash", ...getTrailingOptions2(arguments)]), + trailingFunctionArgument2(arguments) + ); + } + status() { + return this._runTask( + statusTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); + } + }; + Object.assign( + SimpleGitApi2.prototype, + checkout_default2(), + commit_default2(), + config_default2(), + count_objects_default2(), + first_commit_default2(), + grep_default2(), + log_default2(), + show_default2(), + version_default2() + ); + } +}); +var scheduler_exports2 = {}; +__export3(scheduler_exports2, { + Scheduler: () => Scheduler2 +}); +var createScheduledTask2; +var Scheduler2; +var init_scheduler2 = __esm2({ + "src/lib/runners/scheduler.ts"() { + "use strict"; + init_utils2(); + init_git_logger2(); + createScheduledTask2 = /* @__PURE__ */ (() => { + let id = 0; + return () => { + id++; + const { promise, done } = (0, import_promise_deferred3.createDeferred)(); + return { + promise, + done, + id + }; + }; + })(); + Scheduler2 = class { + constructor(concurrency = 2) { + this.concurrency = concurrency; + this.logger = createLogger3("", "scheduler"); + this.pending = []; + this.running = []; + this.logger(`Constructed, concurrency=%s`, concurrency); + } + schedule() { + if (!this.pending.length || this.running.length >= this.concurrency) { + this.logger( + `Schedule attempt ignored, pending=%s running=%s concurrency=%s`, + this.pending.length, + this.running.length, + this.concurrency + ); + return; + } + const task = append2(this.running, this.pending.shift()); + this.logger(`Attempting id=%s`, task.id); + task.done(() => { + this.logger(`Completing id=`, task.id); + remove2(this.running, task); + this.schedule(); + }); + } + next() { + const { promise, id } = append2(this.pending, createScheduledTask2()); + this.logger(`Scheduling id=%s`, id); + this.schedule(); + return promise; + } + }; + } +}); +var apply_patch_exports2 = {}; +__export3(apply_patch_exports2, { + applyPatchTask: () => applyPatchTask2 +}); +function applyPatchTask2(patches, customArgs) { + return straightThroughStringTask2(["apply", ...customArgs, ...patches]); +} +var init_apply_patch2 = __esm2({ + "src/lib/tasks/apply-patch.ts"() { + "use strict"; + init_task2(); + } +}); +function branchDeletionSuccess2(branch, hash) { + return { + branch, + hash, + success: true + }; +} +function branchDeletionFailure2(branch) { + return { + branch, + hash: null, + success: false + }; +} +var BranchDeletionBatch2; +var init_BranchDeleteSummary2 = __esm2({ + "src/lib/responses/BranchDeleteSummary.ts"() { + "use strict"; + BranchDeletionBatch2 = class { + constructor() { + this.all = []; + this.branches = {}; + this.errors = []; + } + get success() { + return !this.errors.length; + } + }; + } +}); +function hasBranchDeletionError2(data, processExitCode) { + return processExitCode === 1 && deleteErrorRegex2.test(data); +} +var deleteSuccessRegex2; +var deleteErrorRegex2; +var parsers82; +var parseBranchDeletions2; +var init_parse_branch_delete2 = __esm2({ + "src/lib/parsers/parse-branch-delete.ts"() { + "use strict"; + init_BranchDeleteSummary2(); + init_utils2(); + deleteSuccessRegex2 = /(\S+)\s+\(\S+\s([^)]+)\)/; + deleteErrorRegex2 = /^error[^']+'([^']+)'/m; + parsers82 = [ + new LineParser2(deleteSuccessRegex2, (result, [branch, hash]) => { + const deletion = branchDeletionSuccess2(branch, hash); + result.all.push(deletion); + result.branches[branch] = deletion; + }), + new LineParser2(deleteErrorRegex2, (result, [branch]) => { + const deletion = branchDeletionFailure2(branch); + result.errors.push(deletion); + result.all.push(deletion); + result.branches[branch] = deletion; + }) + ]; + parseBranchDeletions2 = (stdOut, stdErr) => { + return parseStringResponse2(new BranchDeletionBatch2(), parsers82, [stdOut, stdErr]); + }; + } +}); +var BranchSummaryResult2; +var init_BranchSummary2 = __esm2({ + "src/lib/responses/BranchSummary.ts"() { + "use strict"; + BranchSummaryResult2 = class { + constructor() { + this.all = []; + this.branches = {}; + this.current = ""; + this.detached = false; + } + push(status, detached, name, commit, label) { + if (status === "*") { + this.detached = detached; + this.current = name; + } + this.all.push(name); + this.branches[name] = { + current: status === "*", + linkedWorkTree: status === "+", + name, + commit, + label + }; + } + }; + } +}); +function branchStatus2(input) { + return input ? input.charAt(0) : ""; +} +function parseBranchSummary2(stdOut, currentOnly = false) { + return parseStringResponse2( + new BranchSummaryResult2(), + currentOnly ? [currentBranchParser2] : parsers92, + stdOut + ); +} +var parsers92; +var currentBranchParser2; +var init_parse_branch2 = __esm2({ + "src/lib/parsers/parse-branch.ts"() { + "use strict"; + init_BranchSummary2(); + init_utils2(); + parsers92 = [ + new LineParser2( + /^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, + (result, [current, name, commit, label]) => { + result.push(branchStatus2(current), true, name, commit, label); + } + ), + new LineParser2( + /^([*+]\s)?(\S+)\s+([a-z0-9]+)\s?(.*)$/s, + (result, [current, name, commit, label]) => { + result.push(branchStatus2(current), false, name, commit, label); + } + ) + ]; + currentBranchParser2 = new LineParser2(/^(\S+)$/s, (result, [name]) => { + result.push("*", false, name, "", ""); + }); + } +}); +var branch_exports2 = {}; +__export3(branch_exports2, { + branchLocalTask: () => branchLocalTask2, + branchTask: () => branchTask2, + containsDeleteBranchCommand: () => containsDeleteBranchCommand2, + deleteBranchTask: () => deleteBranchTask2, + deleteBranchesTask: () => deleteBranchesTask2 +}); +function containsDeleteBranchCommand2(commands3) { + const deleteCommands = ["-d", "-D", "--delete"]; + return commands3.some((command) => deleteCommands.includes(command)); +} +function branchTask2(customArgs) { + const isDelete = containsDeleteBranchCommand2(customArgs); + const isCurrentOnly = customArgs.includes("--show-current"); + const commands3 = ["branch", ...customArgs]; + if (commands3.length === 1) { + commands3.push("-a"); + } + if (!commands3.includes("-v")) { + commands3.splice(1, 0, "-v"); + } + return { + format: "utf-8", + commands: commands3, + parser(stdOut, stdErr) { + if (isDelete) { + return parseBranchDeletions2(stdOut, stdErr).all[0]; + } + return parseBranchSummary2(stdOut, isCurrentOnly); + } + }; +} +function branchLocalTask2() { + return { + format: "utf-8", + commands: ["branch", "-v"], + parser(stdOut) { + return parseBranchSummary2(stdOut); + } + }; +} +function deleteBranchesTask2(branches, forceDelete = false) { + return { + format: "utf-8", + commands: ["branch", "-v", forceDelete ? "-D" : "-d", ...branches], + parser(stdOut, stdErr) { + return parseBranchDeletions2(stdOut, stdErr); + }, + onError({ exitCode, stdOut }, error, done, fail) { + if (!hasBranchDeletionError2(String(error), exitCode)) { + return fail(error); + } + done(stdOut); + } + }; +} +function deleteBranchTask2(branch, forceDelete = false) { + const task = { + format: "utf-8", + commands: ["branch", "-v", forceDelete ? "-D" : "-d", branch], + parser(stdOut, stdErr) { + return parseBranchDeletions2(stdOut, stdErr).branches[branch]; + }, + onError({ exitCode, stdErr, stdOut }, error, _, fail) { + if (!hasBranchDeletionError2(String(error), exitCode)) { + return fail(error); + } + throw new GitResponseError2( + task.parser(bufferToString2(stdOut), bufferToString2(stdErr)), + String(error) + ); + } + }; + return task; +} +var init_branch2 = __esm2({ + "src/lib/tasks/branch.ts"() { + "use strict"; + init_git_response_error2(); + init_parse_branch_delete2(); + init_parse_branch2(); + init_utils2(); + } +}); +function toPath2(input) { + const path11 = input.trim().replace(/^["']|["']$/g, ""); + return path11 && (0, import_node_path4.normalize)(path11); +} +var parseCheckIgnore2; +var init_CheckIgnore2 = __esm2({ + "src/lib/responses/CheckIgnore.ts"() { + "use strict"; + parseCheckIgnore2 = (text) => { + return text.split(/\n/g).map(toPath2).filter(Boolean); + }; + } +}); +var check_ignore_exports2 = {}; +__export3(check_ignore_exports2, { + checkIgnoreTask: () => checkIgnoreTask2 +}); +function checkIgnoreTask2(paths) { + return { + commands: ["check-ignore", ...paths], + format: "utf-8", + parser: parseCheckIgnore2 + }; +} +var init_check_ignore2 = __esm2({ + "src/lib/tasks/check-ignore.ts"() { + "use strict"; + init_CheckIgnore2(); + } +}); +var clone_exports2 = {}; +__export3(clone_exports2, { + cloneMirrorTask: () => cloneMirrorTask2, + cloneTask: () => cloneTask2 +}); +function disallowedCommand3(command) { + return /^--upload-pack(=|$)/.test(command); +} +function cloneTask2(repo, directory, customArgs) { + const commands3 = ["clone", ...customArgs]; + filterString2(repo) && commands3.push(repo); + filterString2(directory) && commands3.push(directory); + const banned = commands3.find(disallowedCommand3); + if (banned) { + return configurationErrorTask2(`git.fetch: potential exploit argument blocked.`); + } + return straightThroughStringTask2(commands3); +} +function cloneMirrorTask2(repo, directory, customArgs) { + append2(customArgs, "--mirror"); + return cloneTask2(repo, directory, customArgs); +} +var init_clone2 = __esm2({ + "src/lib/tasks/clone.ts"() { + "use strict"; + init_task2(); + init_utils2(); + } +}); +function parseFetchResult2(stdOut, stdErr) { + const result = { + raw: stdOut, + remote: null, + branches: [], + tags: [], + updated: [], + deleted: [] + }; + return parseStringResponse2(result, parsers102, [stdOut, stdErr]); +} +var parsers102; +var init_parse_fetch2 = __esm2({ + "src/lib/parsers/parse-fetch.ts"() { + "use strict"; + init_utils2(); + parsers102 = [ + new LineParser2(/From (.+)$/, (result, [remote]) => { + result.remote = remote; + }), + new LineParser2(/\* \[new branch]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { + result.branches.push({ + name, + tracking + }); + }), + new LineParser2(/\* \[new tag]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { + result.tags.push({ + name, + tracking + }); + }), + new LineParser2(/- \[deleted]\s+\S+\s*-> (.+)$/, (result, [tracking]) => { + result.deleted.push({ + tracking + }); + }), + new LineParser2( + /\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, + (result, [from, to, name, tracking]) => { + result.updated.push({ + name, + tracking, + to, + from + }); + } + ) + ]; + } +}); +var fetch_exports2 = {}; +__export3(fetch_exports2, { + fetchTask: () => fetchTask2 +}); +function disallowedCommand22(command) { + return /^--upload-pack(=|$)/.test(command); +} +function fetchTask2(remote, branch, customArgs) { + const commands3 = ["fetch", ...customArgs]; + if (remote && branch) { + commands3.push(remote, branch); + } + const banned = commands3.find(disallowedCommand22); + if (banned) { + return configurationErrorTask2(`git.fetch: potential exploit argument blocked.`); + } + return { + commands: commands3, + format: "utf-8", + parser: parseFetchResult2 + }; +} +var init_fetch2 = __esm2({ + "src/lib/tasks/fetch.ts"() { + "use strict"; + init_parse_fetch2(); + init_task2(); + } +}); +function parseMoveResult2(stdOut) { + return parseStringResponse2({ moves: [] }, parsers112, stdOut); +} +var parsers112; +var init_parse_move2 = __esm2({ + "src/lib/parsers/parse-move.ts"() { + "use strict"; + init_utils2(); + parsers112 = [ + new LineParser2(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { + result.moves.push({ from, to }); + }) + ]; + } +}); +var move_exports2 = {}; +__export3(move_exports2, { + moveTask: () => moveTask2 +}); +function moveTask2(from, to) { + return { + commands: ["mv", "-v", ...asArray2(from), to], + format: "utf-8", + parser: parseMoveResult2 + }; +} +var init_move2 = __esm2({ + "src/lib/tasks/move.ts"() { + "use strict"; + init_parse_move2(); + init_utils2(); + } +}); +var pull_exports2 = {}; +__export3(pull_exports2, { + pullTask: () => pullTask2 +}); +function pullTask2(remote, branch, customArgs) { + const commands3 = ["pull", ...customArgs]; + if (remote && branch) { + commands3.splice(1, 0, remote, branch); + } + return { + commands: commands3, + format: "utf-8", + parser(stdOut, stdErr) { + return parsePullResult2(stdOut, stdErr); + }, + onError(result, _error, _done, fail) { + const pullError = parsePullErrorResult2( + bufferToString2(result.stdOut), + bufferToString2(result.stdErr) + ); + if (pullError) { + return fail(new GitResponseError2(pullError)); + } + fail(_error); + } + }; +} +var init_pull2 = __esm2({ + "src/lib/tasks/pull.ts"() { + "use strict"; + init_git_response_error2(); + init_parse_pull2(); + init_utils2(); + } +}); +function parseGetRemotes2(text) { + const remotes = {}; + forEach2(text, ([name]) => (remotes[name] = { name })); + return Object.values(remotes); +} +function parseGetRemotesVerbose2(text) { + const remotes = {}; + forEach2(text, ([name, url, purpose]) => { + if (!Object.hasOwn(remotes, name)) { + remotes[name] = { + name, + refs: { fetch: "", push: "" } + }; + } + if (purpose && url) { + remotes[name].refs[purpose.replace(/[^a-z]/g, "")] = url; + } + }); + return Object.values(remotes); +} +function forEach2(text, handler2) { + forEachLineWithContent2(text, (line) => handler2(line.split(/\s+/))); +} +var init_GetRemoteSummary2 = __esm2({ + "src/lib/responses/GetRemoteSummary.ts"() { + "use strict"; + init_utils2(); + } +}); +var remote_exports2 = {}; +__export3(remote_exports2, { + addRemoteTask: () => addRemoteTask2, + getRemotesTask: () => getRemotesTask2, + listRemotesTask: () => listRemotesTask2, + remoteTask: () => remoteTask2, + removeRemoteTask: () => removeRemoteTask2 +}); +function addRemoteTask2(remoteName, remoteRepo, customArgs) { + return straightThroughStringTask2(["remote", "add", ...customArgs, remoteName, remoteRepo]); +} +function getRemotesTask2(verbose) { + const commands3 = ["remote"]; + if (verbose) { + commands3.push("-v"); + } + return { + commands: commands3, + format: "utf-8", + parser: verbose ? parseGetRemotesVerbose2 : parseGetRemotes2 + }; +} +function listRemotesTask2(customArgs) { + const commands3 = [...customArgs]; + if (commands3[0] !== "ls-remote") { + commands3.unshift("ls-remote"); + } + return straightThroughStringTask2(commands3); +} +function remoteTask2(customArgs) { + const commands3 = [...customArgs]; + if (commands3[0] !== "remote") { + commands3.unshift("remote"); + } + return straightThroughStringTask2(commands3); +} +function removeRemoteTask2(remoteName) { + return straightThroughStringTask2(["remote", "remove", remoteName]); +} +var init_remote2 = __esm2({ + "src/lib/tasks/remote.ts"() { + "use strict"; + init_GetRemoteSummary2(); + init_task2(); + } +}); +var stash_list_exports2 = {}; +__export3(stash_list_exports2, { + stashListTask: () => stashListTask2 +}); +function stashListTask2(opt = {}, customArgs) { + const options = parseLogOptions2(opt); + const commands3 = ["stash", "list", ...options.commands, ...customArgs]; + const parser42 = createListLogSummaryParser2( + options.splitter, + options.fields, + logFormatFromCommand2(commands3) + ); + return ( + validateLogFormatConfig2(commands3) || { + commands: commands3, + format: "utf-8", + parser: parser42 + } + ); +} +var init_stash_list2 = __esm2({ + "src/lib/tasks/stash-list.ts"() { + "use strict"; + init_log_format2(); + init_parse_list_log_summary2(); + init_diff2(); + init_log2(); + } +}); +var sub_module_exports2 = {}; +__export3(sub_module_exports2, { + addSubModuleTask: () => addSubModuleTask2, + initSubModuleTask: () => initSubModuleTask2, + subModuleTask: () => subModuleTask2, + updateSubModuleTask: () => updateSubModuleTask2 +}); +function addSubModuleTask2(repo, path11) { + return subModuleTask2(["add", repo, path11]); +} +function initSubModuleTask2(customArgs) { + return subModuleTask2(["init", ...customArgs]); +} +function subModuleTask2(customArgs) { + const commands3 = [...customArgs]; + if (commands3[0] !== "submodule") { + commands3.unshift("submodule"); + } + return straightThroughStringTask2(commands3); +} +function updateSubModuleTask2(customArgs) { + return subModuleTask2(["update", ...customArgs]); +} +var init_sub_module2 = __esm2({ + "src/lib/tasks/sub-module.ts"() { + "use strict"; + init_task2(); + } +}); +function singleSorted2(a, b) { + const aIsNum = Number.isNaN(a); + const bIsNum = Number.isNaN(b); + if (aIsNum !== bIsNum) { + return aIsNum ? 1 : -1; + } + return aIsNum ? sorted2(a, b) : 0; +} +function sorted2(a, b) { + return a === b ? 0 : a > b ? 1 : -1; +} +function trimmed2(input) { + return input.trim(); +} +function toNumber2(input) { + if (typeof input === "string") { + return parseInt(input.replace(/^\D+/g, ""), 10) || 0; + } + return 0; +} +var TagList2; +var parseTagList2; +var init_TagList2 = __esm2({ + "src/lib/responses/TagList.ts"() { + "use strict"; + TagList2 = class { + constructor(all, latest) { + this.all = all; + this.latest = latest; + } + }; + parseTagList2 = function (data, customSort = false) { + const tags = data.split("\n").map(trimmed2).filter(Boolean); + if (!customSort) { + tags.sort(function (tagA, tagB) { + const partsA = tagA.split("."); + const partsB = tagB.split("."); + if (partsA.length === 1 || partsB.length === 1) { + return singleSorted2(toNumber2(partsA[0]), toNumber2(partsB[0])); + } + for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) { + const diff = sorted2(toNumber2(partsA[i]), toNumber2(partsB[i])); + if (diff) { + return diff; + } + } + return 0; + }); + } + const latest = customSort + ? tags[0] + : [...tags].reverse().find((tag) => tag.indexOf(".") >= 0); + return new TagList2(tags, latest); + }; + } +}); +var tag_exports2 = {}; +__export3(tag_exports2, { + addAnnotatedTagTask: () => addAnnotatedTagTask2, + addTagTask: () => addTagTask2, + tagListTask: () => tagListTask2 +}); +function tagListTask2(customArgs = []) { + const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option)); + return { + format: "utf-8", + commands: ["tag", "-l", ...customArgs], + parser(text) { + return parseTagList2(text, hasCustomSort); + } + }; +} +function addTagTask2(name) { + return { + format: "utf-8", + commands: ["tag", name], + parser() { + return { name }; + } + }; +} +function addAnnotatedTagTask2(name, tagMessage) { + return { + format: "utf-8", + commands: ["tag", "-a", "-m", tagMessage, name], + parser() { + return { name }; + } + }; +} +var init_tag2 = __esm2({ + "src/lib/tasks/tag.ts"() { + "use strict"; + init_TagList2(); + } +}); +var require_git2 = __commonJS3({ + "src/git.js"(exports2, module2) { + "use strict"; + var { GitExecutor: GitExecutor22 } = + (init_git_executor2(), __toCommonJS3(git_executor_exports2)); + var { SimpleGitApi: SimpleGitApi22 } = + (init_simple_git_api2(), __toCommonJS3(simple_git_api_exports2)); + var { Scheduler: Scheduler22 } = (init_scheduler2(), __toCommonJS3(scheduler_exports2)); + var { configurationErrorTask: configurationErrorTask22 } = + (init_task2(), __toCommonJS3(task_exports2)); + var { + asArray: asArray22, + filterArray: filterArray22, + filterPrimitives: filterPrimitives22, + filterString: filterString22, + filterStringOrStringArray: filterStringOrStringArray22, + filterType: filterType22, + getTrailingOptions: getTrailingOptions22, + trailingFunctionArgument: trailingFunctionArgument22, + trailingOptionsArgument: trailingOptionsArgument22 + } = (init_utils2(), __toCommonJS3(utils_exports2)); + var { applyPatchTask: applyPatchTask22 } = + (init_apply_patch2(), __toCommonJS3(apply_patch_exports2)); + var { + branchTask: branchTask22, + branchLocalTask: branchLocalTask22, + deleteBranchesTask: deleteBranchesTask22, + deleteBranchTask: deleteBranchTask22 + } = (init_branch2(), __toCommonJS3(branch_exports2)); + var { checkIgnoreTask: checkIgnoreTask22 } = + (init_check_ignore2(), __toCommonJS3(check_ignore_exports2)); + var { checkIsRepoTask: checkIsRepoTask22 } = + (init_check_is_repo2(), __toCommonJS3(check_is_repo_exports2)); + var { cloneTask: cloneTask22, cloneMirrorTask: cloneMirrorTask22 } = + (init_clone2(), __toCommonJS3(clone_exports2)); + var { + cleanWithOptionsTask: cleanWithOptionsTask22, + isCleanOptionsArray: isCleanOptionsArray22 + } = (init_clean2(), __toCommonJS3(clean_exports2)); + var { diffSummaryTask: diffSummaryTask22 } = (init_diff2(), __toCommonJS3(diff_exports2)); + var { fetchTask: fetchTask22 } = (init_fetch2(), __toCommonJS3(fetch_exports2)); + var { moveTask: moveTask22 } = (init_move2(), __toCommonJS3(move_exports2)); + var { pullTask: pullTask22 } = (init_pull2(), __toCommonJS3(pull_exports2)); + var { pushTagsTask: pushTagsTask22 } = (init_push2(), __toCommonJS3(push_exports2)); + var { + addRemoteTask: addRemoteTask22, + getRemotesTask: getRemotesTask22, + listRemotesTask: listRemotesTask22, + remoteTask: remoteTask22, + removeRemoteTask: removeRemoteTask22 + } = (init_remote2(), __toCommonJS3(remote_exports2)); + var { getResetMode: getResetMode22, resetTask: resetTask22 } = + (init_reset2(), __toCommonJS3(reset_exports2)); + var { stashListTask: stashListTask22 } = + (init_stash_list2(), __toCommonJS3(stash_list_exports2)); + var { + addSubModuleTask: addSubModuleTask22, + initSubModuleTask: initSubModuleTask22, + subModuleTask: subModuleTask22, + updateSubModuleTask: updateSubModuleTask22 + } = (init_sub_module2(), __toCommonJS3(sub_module_exports2)); + var { + addAnnotatedTagTask: addAnnotatedTagTask22, + addTagTask: addTagTask22, + tagListTask: tagListTask22 + } = (init_tag2(), __toCommonJS3(tag_exports2)); + var { + straightThroughBufferTask: straightThroughBufferTask22, + straightThroughStringTask: straightThroughStringTask22 + } = (init_task2(), __toCommonJS3(task_exports2)); + function Git22(options, plugins) { + this._plugins = plugins; + this._executor = new GitExecutor22( + options.baseDir, + new Scheduler22(options.maxConcurrentProcesses), + plugins + ); + this._trimmed = options.trimmed; + } + (Git22.prototype = Object.create(SimpleGitApi22.prototype)).constructor = Git22; + Git22.prototype.customBinary = function (command) { + this._plugins.reconfigure("binary", command); + return this; + }; + Git22.prototype.env = function (name, value) { + if (arguments.length === 1 && typeof name === "object") { + this._executor.env = name; + } else { + (this._executor.env = this._executor.env || {})[name] = value; + } + return this; + }; + Git22.prototype.stashList = function (options) { + return this._runTask( + stashListTask22( + trailingOptionsArgument22(arguments) || {}, + (filterArray22(options) && options) || [] + ), + trailingFunctionArgument22(arguments) + ); + }; + function createCloneTask(api, task, repoPath, localPath) { + if (typeof repoPath !== "string") { + return configurationErrorTask22(`git.${api}() requires a string 'repoPath'`); + } + return task( + repoPath, + filterType22(localPath, filterString22), + getTrailingOptions22(arguments) + ); + } + Git22.prototype.clone = function () { + return this._runTask( + createCloneTask("clone", cloneTask22, ...arguments), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.mirror = function () { + return this._runTask( + createCloneTask("mirror", cloneMirrorTask22, ...arguments), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.mv = function (from, to) { + return this._runTask(moveTask22(from, to), trailingFunctionArgument22(arguments)); + }; + Git22.prototype.checkoutLatestTag = function (then) { + var git = this; + return this.pull(function () { + git.tags(function (err, tags) { + git.checkout(tags.latest, then); + }); + }); + }; + Git22.prototype.pull = function (remote, branch, options, then) { + return this._runTask( + pullTask22( + filterType22(remote, filterString22), + filterType22(branch, filterString22), + getTrailingOptions22(arguments) + ), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.fetch = function (remote, branch) { + return this._runTask( + fetchTask22( + filterType22(remote, filterString22), + filterType22(branch, filterString22), + getTrailingOptions22(arguments) + ), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.silent = function (silence) { + console.warn( + "simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3" + ); + return this; + }; + Git22.prototype.tags = function (options, then) { + return this._runTask( + tagListTask22(getTrailingOptions22(arguments)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.rebase = function () { + return this._runTask( + straightThroughStringTask22(["rebase", ...getTrailingOptions22(arguments)]), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.reset = function (mode) { + return this._runTask( + resetTask22(getResetMode22(mode), getTrailingOptions22(arguments)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.revert = function (commit) { + const next = trailingFunctionArgument22(arguments); + if (typeof commit !== "string") { + return this._runTask(configurationErrorTask22("Commit must be a string"), next); + } + return this._runTask( + straightThroughStringTask22([ + "revert", + ...getTrailingOptions22(arguments, 0, true), + commit + ]), + next + ); + }; + Git22.prototype.addTag = function (name) { + const task = + typeof name === "string" + ? addTagTask22(name) + : configurationErrorTask22("Git.addTag requires a tag name"); + return this._runTask(task, trailingFunctionArgument22(arguments)); + }; + Git22.prototype.addAnnotatedTag = function (tagName, tagMessage) { + return this._runTask( + addAnnotatedTagTask22(tagName, tagMessage), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.deleteLocalBranch = function (branchName, forceDelete, then) { + return this._runTask( + deleteBranchTask22(branchName, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) { + return this._runTask( + deleteBranchesTask22(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.branch = function (options, then) { + return this._runTask( + branchTask22(getTrailingOptions22(arguments)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.branchLocal = function (then) { + return this._runTask(branchLocalTask22(), trailingFunctionArgument22(arguments)); + }; + Git22.prototype.raw = function (commands3) { + const createRestCommands = !Array.isArray(commands3); + const command = [].slice.call(createRestCommands ? arguments : commands3, 0); + for (let i = 0; i < command.length && createRestCommands; i++) { + if (!filterPrimitives22(command[i])) { + command.splice(i, command.length - i); + break; + } + } + command.push(...getTrailingOptions22(arguments, 0, true)); + var next = trailingFunctionArgument22(arguments); + if (!command.length) { + return this._runTask( + configurationErrorTask22("Raw: must supply one or more command to execute"), + next + ); + } + return this._runTask(straightThroughStringTask22(command, this._trimmed), next); + }; + Git22.prototype.submoduleAdd = function (repo, path11, then) { + return this._runTask(addSubModuleTask22(repo, path11), trailingFunctionArgument22(arguments)); + }; + Git22.prototype.submoduleUpdate = function (args, then) { + return this._runTask( + updateSubModuleTask22(getTrailingOptions22(arguments, true)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.submoduleInit = function (args, then) { + return this._runTask( + initSubModuleTask22(getTrailingOptions22(arguments, true)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.subModule = function (options, then) { + return this._runTask( + subModuleTask22(getTrailingOptions22(arguments)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.listRemote = function () { + return this._runTask( + listRemotesTask22(getTrailingOptions22(arguments)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.addRemote = function (remoteName, remoteRepo, then) { + return this._runTask( + addRemoteTask22(remoteName, remoteRepo, getTrailingOptions22(arguments)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.removeRemote = function (remoteName, then) { + return this._runTask(removeRemoteTask22(remoteName), trailingFunctionArgument22(arguments)); + }; + Git22.prototype.getRemotes = function (verbose, then) { + return this._runTask( + getRemotesTask22(verbose === true), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.remote = function (options, then) { + return this._runTask( + remoteTask22(getTrailingOptions22(arguments)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.tag = function (options, then) { + const command = getTrailingOptions22(arguments); + if (command[0] !== "tag") { + command.unshift("tag"); + } + return this._runTask( + straightThroughStringTask22(command), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.updateServerInfo = function (then) { + return this._runTask( + straightThroughStringTask22(["update-server-info"]), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.pushTags = function (remote, then) { + const task = pushTagsTask22( + { remote: filterType22(remote, filterString22) }, + getTrailingOptions22(arguments) + ); + return this._runTask(task, trailingFunctionArgument22(arguments)); + }; + Git22.prototype.rm = function (files) { + return this._runTask( + straightThroughStringTask22(["rm", "-f", ...asArray22(files)]), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.rmKeepLocal = function (files) { + return this._runTask( + straightThroughStringTask22(["rm", "--cached", ...asArray22(files)]), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.catFile = function (options, then) { + return this._catFile("utf-8", arguments); + }; + Git22.prototype.binaryCatFile = function () { + return this._catFile("buffer", arguments); + }; + Git22.prototype._catFile = function (format, args) { + var handler2 = trailingFunctionArgument22(args); + var command = ["cat-file"]; + var options = args[0]; + if (typeof options === "string") { + return this._runTask( + configurationErrorTask22("Git.catFile: options must be supplied as an array of strings"), + handler2 + ); + } + if (Array.isArray(options)) { + command.push.apply(command, options); + } + const task = + format === "buffer" + ? straightThroughBufferTask22(command) + : straightThroughStringTask22(command); + return this._runTask(task, handler2); + }; + Git22.prototype.diff = function (options, then) { + const task = filterString22(options) + ? configurationErrorTask22( + "git.diff: supplying options as a single string is no longer supported, switch to an array of strings" + ) + : straightThroughStringTask22(["diff", ...getTrailingOptions22(arguments)]); + return this._runTask(task, trailingFunctionArgument22(arguments)); + }; + Git22.prototype.diffSummary = function () { + return this._runTask( + diffSummaryTask22(getTrailingOptions22(arguments, 1)), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.applyPatch = function (patches) { + const task = !filterStringOrStringArray22(patches) + ? configurationErrorTask22( + `git.applyPatch requires one or more string patches as the first argument` + ) + : applyPatchTask22(asArray22(patches), getTrailingOptions22([].slice.call(arguments, 1))); + return this._runTask(task, trailingFunctionArgument22(arguments)); + }; + Git22.prototype.revparse = function () { + const commands3 = ["rev-parse", ...getTrailingOptions22(arguments, true)]; + return this._runTask( + straightThroughStringTask22(commands3, true), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.clean = function (mode, options, then) { + const usingCleanOptionsArray = isCleanOptionsArray22(mode); + const cleanMode = + (usingCleanOptionsArray && mode.join("")) || filterType22(mode, filterString22) || ""; + const customArgs = getTrailingOptions22( + [].slice.call(arguments, usingCleanOptionsArray ? 1 : 0) + ); + return this._runTask( + cleanWithOptionsTask22(cleanMode, customArgs), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.exec = function (then) { + const task = { + commands: [], + format: "utf-8", + parser() { + if (typeof then === "function") { + then(); + } + } + }; + return this._runTask(task); + }; + Git22.prototype.clearQueue = function () { + return this; + }; + Git22.prototype.checkIgnore = function (pathnames, then) { + return this._runTask( + checkIgnoreTask22(asArray22(filterType22(pathnames, filterStringOrStringArray22, []))), + trailingFunctionArgument22(arguments) + ); + }; + Git22.prototype.checkIsRepo = function (checkType, then) { + return this._runTask( + checkIsRepoTask22(filterType22(checkType, filterString22)), + trailingFunctionArgument22(arguments) + ); + }; + module2.exports = Git22; + } +}); +init_pathspec2(); +init_git_error2(); +var GitConstructError = class extends GitError2 { + constructor(config, message) { + super(void 0, message); + this.config = config; + } +}; +init_git_error2(); +init_git_error2(); +var GitPluginError = class extends GitError2 { + constructor(task, plugin, message) { + super(task, message); + this.task = task; + this.plugin = plugin; + Object.setPrototypeOf(this, new.target.prototype); + } +}; +init_git_response_error2(); +init_task_configuration_error2(); +init_check_is_repo2(); +init_clean2(); +init_config2(); +init_diff_name_status2(); +init_grep2(); +init_reset2(); +function abortPlugin(signal) { + if (!signal) { + return; + } + const onSpawnAfter = { + type: "spawn.after", + action(_data, context) { + function kill() { + context.kill(new GitPluginError(void 0, "abort", "Abort signal received")); + } + signal.addEventListener("abort", kill); + context.spawned.on("close", () => signal.removeEventListener("abort", kill)); + } + }; + const onSpawnBefore = { + type: "spawn.before", + action(_data, context) { + if (signal.aborted) { + context.kill(new GitPluginError(void 0, "abort", "Abort already signaled")); + } + } + }; + return [onSpawnBefore, onSpawnAfter]; +} +function isConfigSwitch(arg) { + return typeof arg === "string" && arg.trim().toLowerCase() === "-c"; +} +function preventProtocolOverride(arg, next) { + if (!isConfigSwitch(arg)) { + return; + } + if (!/^\s*protocol(.[a-z]+)?.allow/.test(next)) { + return; + } + throw new GitPluginError( + void 0, + "unsafe", + "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol" + ); +} +function preventUploadPack(arg, method) { + if (/^\s*--(upload|receive)-pack/.test(arg)) { + throw new GitPluginError( + void 0, + "unsafe", + `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack` + ); + } + if (method === "clone" && /^\s*-u\b/.test(arg)) { + throw new GitPluginError( + void 0, + "unsafe", + `Use of clone with option -u is not permitted without enabling allowUnsafePack` + ); + } + if (method === "push" && /^\s*--exec\b/.test(arg)) { + throw new GitPluginError( + void 0, + "unsafe", + `Use of push with option --exec is not permitted without enabling allowUnsafePack` + ); + } +} +function blockUnsafeOperationsPlugin({ + allowUnsafeProtocolOverride = false, + allowUnsafePack = false +} = {}) { + return { + type: "spawn.args", + action(args, context) { + args.forEach((current, index) => { + const next = index < args.length ? args[index + 1] : ""; + allowUnsafeProtocolOverride || preventProtocolOverride(current, next); + allowUnsafePack || preventUploadPack(current, context.method); + }); + return args; + } + }; +} +init_utils2(); +function commandConfigPrefixingPlugin(configuration) { + const prefix = prefixedArray2(configuration, "-c"); + return { + type: "spawn.args", + action(data) { + return [...prefix, ...data]; + } + }; +} +init_utils2(); +var never2 = (0, import_promise_deferred4.deferred)().promise; +function completionDetectionPlugin({ onClose = true, onExit = 50 } = {}) { + function createEvents() { + let exitCode = -1; + const events = { + close: (0, import_promise_deferred4.deferred)(), + closeTimeout: (0, import_promise_deferred4.deferred)(), + exit: (0, import_promise_deferred4.deferred)(), + exitTimeout: (0, import_promise_deferred4.deferred)() + }; + const result = Promise.race([ + onClose === false ? never2 : events.closeTimeout.promise, + onExit === false ? never2 : events.exitTimeout.promise + ]); + configureTimeout(onClose, events.close, events.closeTimeout); + configureTimeout(onExit, events.exit, events.exitTimeout); + return { + close(code) { + exitCode = code; + events.close.done(); + }, + exit(code) { + exitCode = code; + events.exit.done(); + }, + get exitCode() { + return exitCode; + }, + result + }; + } + function configureTimeout(flag, event, timeout) { + if (flag === false) { + return; + } + (flag === true ? event.promise : event.promise.then(() => delay2(flag))).then(timeout.done); + } + return { + type: "spawn.after", + async action(_data, { spawned, close }) { + const events = createEvents(); + let deferClose = true; + let quickClose = () => void (deferClose = false); + spawned.stdout?.on("data", quickClose); + spawned.stderr?.on("data", quickClose); + spawned.on("error", quickClose); + spawned.on("close", (code) => events.close(code)); + spawned.on("exit", (code) => events.exit(code)); + try { + await events.result; + if (deferClose) { + await delay2(50); + } + close(events.exitCode); + } catch (err) { + close(events.exitCode, err); + } + } + }; +} +init_utils2(); +var WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`; +var WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`; +function isBadArgument(arg) { + return !arg || !/^([a-z]:)?([a-z0-9/.\\_~-]+)$/i.test(arg); +} +function toBinaryConfig(input, allowUnsafe) { + if (input.length < 1 || input.length > 2) { + throw new GitPluginError(void 0, "binary", WRONG_NUMBER_ERR); + } + const isBad = input.some(isBadArgument); + if (isBad) { + if (allowUnsafe) { + console.warn(WRONG_CHARS_ERR); + } else { + throw new GitPluginError(void 0, "binary", WRONG_CHARS_ERR); + } + } + const [binary, prefix] = input; + return { + binary, + prefix + }; +} +function customBinaryPlugin(plugins, input = ["git"], allowUnsafe = false) { + let config = toBinaryConfig(asArray2(input), allowUnsafe); + plugins.on("binary", (input2) => { + config = toBinaryConfig(asArray2(input2), allowUnsafe); + }); + plugins.append("spawn.binary", () => { + return config.binary; + }); + plugins.append("spawn.args", (data) => { + return config.prefix ? [config.prefix, ...data] : data; + }); +} +init_git_error2(); +function isTaskError(result) { + return !!(result.exitCode && result.stdErr.length); +} +function getErrorMessage(result) { + return Buffer.concat([...result.stdOut, ...result.stdErr]); +} +function errorDetectionHandler( + overwrite = false, + isError = isTaskError, + errorMessage = getErrorMessage +) { + return (error, result) => { + if ((!overwrite && error) || !isError(result)) { + return error; + } + return errorMessage(result); + }; +} +function errorDetectionPlugin(config) { + return { + type: "task.error", + action(data, context) { + const error = config(data.error, { + stdErr: context.stdErr, + stdOut: context.stdOut, + exitCode: context.exitCode + }); + if (Buffer.isBuffer(error)) { + return { error: new GitError2(void 0, error.toString("utf-8")) }; + } + return { + error + }; + } + }; +} +init_utils2(); +var PluginStore = class { + constructor() { + this.plugins = /* @__PURE__ */ new Set(); + this.events = new import_node_events.EventEmitter(); + } + on(type, listener) { + this.events.on(type, listener); + } + reconfigure(type, data) { + this.events.emit(type, data); + } + append(type, action) { + const plugin = append2(this.plugins, { type, action }); + return () => this.plugins.delete(plugin); + } + add(plugin) { + const plugins = []; + asArray2(plugin).forEach((plugin2) => plugin2 && this.plugins.add(append2(plugins, plugin2))); + return () => { + plugins.forEach((plugin2) => this.plugins.delete(plugin2)); + }; + } + exec(type, data, context) { + let output = data; + const contextual = Object.freeze(Object.create(context)); + for (const plugin of this.plugins) { + if (plugin.type === type) { + output = plugin.action(output, contextual); + } + } + return output; + } +}; +init_utils2(); +function progressMonitorPlugin(progress) { + const progressCommand = "--progress"; + const progressMethods = ["checkout", "clone", "fetch", "pull", "push"]; + const onProgress = { + type: "spawn.after", + action(_data, context) { + if (!context.commands.includes(progressCommand)) { + return; + } + context.spawned.stderr?.on("data", (chunk) => { + const message = /^([\s\S]+?):\s*(\d+)% \((\d+)\/(\d+)\)/.exec(chunk.toString("utf8")); + if (!message) { + return; + } + progress({ + method: context.method, + stage: progressEventStage(message[1]), + progress: asNumber2(message[2]), + processed: asNumber2(message[3]), + total: asNumber2(message[4]) + }); + }); + } + }; + const onArgs = { + type: "spawn.args", + action(args, context) { + if (!progressMethods.includes(context.method)) { + return args; + } + return including2(args, progressCommand); + } + }; + return [onArgs, onProgress]; +} +function progressEventStage(input) { + return String(input.toLowerCase().split(" ", 1)) || "unknown"; +} +init_utils2(); +function spawnOptionsPlugin(spawnOptions) { + const options = pick2(spawnOptions, ["uid", "gid"]); + return { + type: "spawn.options", + action(data) { + return { ...options, ...data }; + } + }; +} +function timeoutPlugin({ block, stdErr = true, stdOut = true }) { + if (block > 0) { + return { + type: "spawn.after", + action(_data, context) { + let timeout; + function wait() { + timeout && clearTimeout(timeout); + timeout = setTimeout(kill, block); + } + function stop() { + context.spawned.stdout?.off("data", wait); + context.spawned.stderr?.off("data", wait); + context.spawned.off("exit", stop); + context.spawned.off("close", stop); + timeout && clearTimeout(timeout); + } + function kill() { + stop(); + context.kill(new GitPluginError(void 0, "timeout", `block timeout reached`)); + } + stdOut && context.spawned.stdout?.on("data", wait); + stdErr && context.spawned.stderr?.on("data", wait); + context.spawned.on("exit", stop); + context.spawned.on("close", stop); + wait(); + } + }; + } +} +init_pathspec2(); +function suffixPathsPlugin() { + return { + type: "spawn.args", + action(data) { + const prefix = []; + let suffix; + function append22(args) { + (suffix = suffix || []).push(...args); + } + for (let i = 0; i < data.length; i++) { + const param = data[i]; + if (isPathSpec2(param)) { + append22(toPaths(param)); + continue; + } + if (param === "--") { + append22( + data.slice(i + 1).flatMap((item) => (isPathSpec2(item) && toPaths(item)) || item) + ); + break; + } + prefix.push(param); + } + return !suffix ? prefix : [...prefix, "--", ...suffix.map(String)]; + } + }; +} +init_utils2(); +var Git2 = require_git2(); +function gitInstanceFactory(baseDir, options) { + const plugins = new PluginStore(); + const config = createInstanceConfig2( + (baseDir && (typeof baseDir === "string" ? { baseDir } : baseDir)) || {}, + options + ); + if (!folderExists2(config.baseDir)) { + throw new GitConstructError(config, `Cannot use simple-git on a directory that does not exist`); + } + if (Array.isArray(config.config)) { + plugins.add(commandConfigPrefixingPlugin(config.config)); + } + plugins.add(blockUnsafeOperationsPlugin(config.unsafe)); + plugins.add(suffixPathsPlugin()); + plugins.add(completionDetectionPlugin(config.completion)); + config.abort && plugins.add(abortPlugin(config.abort)); + config.progress && plugins.add(progressMonitorPlugin(config.progress)); + config.timeout && plugins.add(timeoutPlugin(config.timeout)); + config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions)); + plugins.add(errorDetectionPlugin(errorDetectionHandler(true))); + config.errors && plugins.add(errorDetectionPlugin(config.errors)); + customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary); + return new Git2(config, plugins); +} +init_git_response_error2(); +var esm_default2 = gitInstanceFactory; + +// src/commands/pr.ts +async function prCommand() { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + const git = esm_default2(workspacePath); + const remotes = await git.getRemotes(true); + const origin = remotes.find((r) => r.name === "origin"); + if (!origin?.refs.push) { + vscode11.window.showErrorMessage("Primer: No origin remote found."); + return; + } + const match = origin.refs.push.match(/github\.com[:/]([^/]+)\/([^/.]+)/); + if (!match) { + vscode11.window.showErrorMessage( + "Primer: Could not parse GitHub owner/repo from origin remote." + ); + return; + } + const [, owner, repo] = match; + const branch = (await git.branch()).current; + const defaultBranch = await git + .raw(["symbolic-ref", "refs/remotes/origin/HEAD", "--short"]) + .catch(() => "origin/main"); + const base = defaultBranch.replace("origin/", "").trim(); + if (branch === base) { + vscode11.window.showErrorMessage( + "Primer: Cannot create PR from the default branch. Check out a feature branch first." + ); + return; + } + const title = await vscode11.window.showInputBox({ + prompt: "Pull request title", + value: `Add Primer AI configs for ${repo}` + }); + if (!title) return; + await vscode11.window.withProgress( + { + location: vscode11.ProgressLocation.Notification, + title: "Primer: Creating pull request\u2026" + }, + async () => { + try { + const token = await getGitHubToken(); + const status = await git.status(); + if (status.files.length > 0) { + const primerFiles = status.files + .map((f) => f.path) + .filter( + (p) => + p.startsWith(".github/") || + p.startsWith(".vscode/") || + p.endsWith(".instructions.md") || + p === "primer.eval.json" + ); + if (primerFiles.length === 0) { + vscode11.window.showWarningMessage("Primer: No Primer-generated files to commit."); + return; + } + await git.add(primerFiles); + await git.commit(title); + await git.push("origin", branch); + } + const prUrl = await createPullRequest({ + token, + owner, + repo, + title, + body: "Generated by Primer VS Code extension.", + head: branch, + base + }); + const openAction = "Open in Browser"; + const action = await vscode11.window.showInformationMessage( + `Primer: Pull request created.`, + openAction + ); + if (action === openAction && prUrl.startsWith("https://")) { + vscode11.env.openExternal(vscode11.Uri.parse(prUrl)); + } + } catch (err) { + vscode11.window.showErrorMessage( + `Primer: PR creation failed \u2014 ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} + +// src/extension.ts +function activate(context) { + const statusBar = vscode12.window.createStatusBarItem(vscode12.StatusBarAlignment.Left, 0); + statusBar.text = "$(beaker) Primer"; + statusBar.tooltip = "Primer \u2014 click to analyze repository"; + statusBar.command = "primer.analyze"; + statusBar.show(); + context.subscriptions.push(statusBar); + const analysisView = vscode12.window.createTreeView("primer.analysis", { + treeDataProvider: analysisTreeProvider + }); + const readinessView = vscode12.window.createTreeView("primer.readiness", { + treeDataProvider: readinessTreeProvider + }); + context.subscriptions.push(analysisView, readinessView); + function updateAnalysisView() { + const analysis = getCachedAnalysis(); + if (analysis) { + const parts = [...analysis.languages.slice(0, 3), ...analysis.frameworks.slice(0, 2)]; + analysisView.description = parts.join(", ") || void 0; + } else { + analysisView.description = void 0; + } + } + function updateReadinessView() { + const report = readinessTreeProvider.getReport(); + if (report) { + readinessView.description = `Level ${report.achievedLevel}`; + } else { + readinessView.description = void 0; + } + } + function updateStatusBar() { + const analysis = getCachedAnalysis(); + if (analysis) { + const parts = analysis.languages.slice(0, 2); + statusBar.text = `$(beaker) ${parts.join(", ") || "Primer"}`; + statusBar.tooltip = `Primer \u2014 ${analysis.languages.join(", ")}${analysis.isMonorepo ? " | monorepo" : ""}`; + } else { + statusBar.text = "$(beaker) Primer"; + statusBar.tooltip = "Primer \u2014 click to analyze repository"; + } + } + context.subscriptions.push( + vscode12.commands.registerCommand("primer.analyze", async () => { + await analyzeCommand(); + analysisTreeProvider.refresh(); + updateAnalysisView(); + updateStatusBar(); + vscode12.commands.executeCommand("primer.analysis.focus"); + }), + vscode12.commands.registerCommand("primer.generate", generateCommand), + vscode12.commands.registerCommand("primer.instructions", instructionsCommand), + vscode12.commands.registerCommand("primer.readiness", async () => { + await readinessCommand(); + updateReadinessView(); + updateStatusBar(); + }), + vscode12.commands.registerCommand("primer.eval", evalCommand), + vscode12.commands.registerCommand("primer.evalInit", evalInitCommand), + vscode12.commands.registerCommand("primer.init", async () => { + await initCommand(); + analysisTreeProvider.refresh(); + updateAnalysisView(); + updateStatusBar(); + vscode12.commands.executeCommand("primer.analysis.focus"); + }), + vscode12.commands.registerCommand("primer.pr", prCommand) + ); + const config = vscode12.workspace.getConfiguration("primer"); + if (config.get("autoAnalyze") && vscode12.workspace.workspaceFolders?.length) { + analyzeCommand() + .then(() => { + analysisTreeProvider.refresh(); + updateAnalysisView(); + updateStatusBar(); + }) + .catch(() => {}); + } +} +function deactivate() {} +// Annotate the CommonJS export names for ESM import in node: +0 && + (module.exports = { + activate, + deactivate + }); +/*! Bundled license information: + +is-extglob/index.js: + (*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + *) + +is-glob/index.js: + (*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + *) + +is-number/index.js: + (*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + *) + +to-regex-range/index.js: + (*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + *) + +fill-range/index.js: + (*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + *) + +queue-microtask/index.js: + (*! queue-microtask. MIT License. Feross Aboukhadijeh *) + +run-parallel/index.js: + (*! run-parallel. MIT License. Feross Aboukhadijeh *) + +@octokit/request-error/dist-src/index.js: + (* v8 ignore else -- @preserve -- Bug with vitest coverage where it sees an else branch that doesn't exist *) + +@octokit/request/dist-bundle/index.js: + (* v8 ignore next -- @preserve *) + (* v8 ignore else -- @preserve *) +*/ +//# sourceMappingURL=extension.js.map diff --git a/vscode-extension/out/extension.js.map b/vscode-extension/out/extension.js.map new file mode 100644 index 0000000..d73ba72 --- /dev/null +++ b/vscode-extension/out/extension.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../node_modules/fast-glob/out/utils/array.js", "../../node_modules/fast-glob/out/utils/errno.js", "../../node_modules/fast-glob/out/utils/fs.js", "../../node_modules/fast-glob/out/utils/path.js", "../../node_modules/is-extglob/index.js", "../../node_modules/is-glob/index.js", "../../node_modules/fast-glob/node_modules/glob-parent/index.js", "../../node_modules/braces/lib/utils.js", "../../node_modules/braces/lib/stringify.js", "../../node_modules/is-number/index.js", "../../node_modules/to-regex-range/index.js", "../../node_modules/fill-range/index.js", "../../node_modules/braces/lib/compile.js", "../../node_modules/braces/lib/expand.js", "../../node_modules/braces/lib/constants.js", "../../node_modules/braces/lib/parse.js", "../../node_modules/braces/index.js", "../../node_modules/picomatch/lib/constants.js", "../../node_modules/picomatch/lib/utils.js", "../../node_modules/picomatch/lib/scan.js", "../../node_modules/picomatch/lib/parse.js", "../../node_modules/picomatch/lib/picomatch.js", "../../node_modules/picomatch/index.js", "../../node_modules/micromatch/index.js", "../../node_modules/fast-glob/out/utils/pattern.js", "../../node_modules/merge2/index.js", "../../node_modules/fast-glob/out/utils/stream.js", "../../node_modules/fast-glob/out/utils/string.js", "../../node_modules/fast-glob/out/utils/index.js", "../../node_modules/fast-glob/out/managers/tasks.js", "../../node_modules/@nodelib/fs.stat/out/providers/async.js", "../../node_modules/@nodelib/fs.stat/out/providers/sync.js", "../../node_modules/@nodelib/fs.stat/out/adapters/fs.js", "../../node_modules/@nodelib/fs.stat/out/settings.js", "../../node_modules/@nodelib/fs.stat/out/index.js", "../../node_modules/queue-microtask/index.js", "../../node_modules/run-parallel/index.js", "../../node_modules/@nodelib/fs.scandir/out/constants.js", "../../node_modules/@nodelib/fs.scandir/out/utils/fs.js", "../../node_modules/@nodelib/fs.scandir/out/utils/index.js", "../../node_modules/@nodelib/fs.scandir/out/providers/common.js", "../../node_modules/@nodelib/fs.scandir/out/providers/async.js", "../../node_modules/@nodelib/fs.scandir/out/providers/sync.js", "../../node_modules/@nodelib/fs.scandir/out/adapters/fs.js", "../../node_modules/@nodelib/fs.scandir/out/settings.js", "../../node_modules/@nodelib/fs.scandir/out/index.js", "../../node_modules/reusify/reusify.js", "../../node_modules/fastq/queue.js", "../../node_modules/@nodelib/fs.walk/out/readers/common.js", "../../node_modules/@nodelib/fs.walk/out/readers/reader.js", "../../node_modules/@nodelib/fs.walk/out/readers/async.js", "../../node_modules/@nodelib/fs.walk/out/providers/async.js", "../../node_modules/@nodelib/fs.walk/out/providers/stream.js", "../../node_modules/@nodelib/fs.walk/out/readers/sync.js", "../../node_modules/@nodelib/fs.walk/out/providers/sync.js", "../../node_modules/@nodelib/fs.walk/out/settings.js", "../../node_modules/@nodelib/fs.walk/out/index.js", "../../node_modules/fast-glob/out/readers/reader.js", "../../node_modules/fast-glob/out/readers/stream.js", "../../node_modules/fast-glob/out/readers/async.js", "../../node_modules/fast-glob/out/providers/matchers/matcher.js", "../../node_modules/fast-glob/out/providers/matchers/partial.js", "../../node_modules/fast-glob/out/providers/filters/deep.js", "../../node_modules/fast-glob/out/providers/filters/entry.js", "../../node_modules/fast-glob/out/providers/filters/error.js", "../../node_modules/fast-glob/out/providers/transformers/entry.js", "../../node_modules/fast-glob/out/providers/provider.js", "../../node_modules/fast-glob/out/providers/async.js", "../../node_modules/fast-glob/out/providers/stream.js", "../../node_modules/fast-glob/out/readers/sync.js", "../../node_modules/fast-glob/out/providers/sync.js", "../../node_modules/fast-glob/out/settings.js", "../../node_modules/fast-glob/out/index.js", "../../node_modules/ms/index.js", "../../node_modules/debug/src/common.js", "../../node_modules/debug/src/browser.js", "../../node_modules/has-flag/index.js", "../../node_modules/supports-color/index.js", "../../node_modules/debug/src/node.js", "../../node_modules/debug/src/index.js", "../../node_modules/@kwsites/file-exists/src/index.ts", "../../node_modules/@kwsites/file-exists/index.ts", "../../node_modules/@kwsites/promise-deferred/src/index.ts", "../../node_modules/fast-content-type-parse/index.js", "../node_modules/ms/index.js", "../node_modules/debug/src/common.js", "../node_modules/debug/src/browser.js", "../node_modules/debug/src/node.js", "../node_modules/debug/src/index.js", "../node_modules/@kwsites/file-exists/src/index.ts", "../node_modules/@kwsites/file-exists/index.ts", "../node_modules/@kwsites/promise-deferred/src/index.ts", "../src/extension.ts", "../src/commands/analyze.ts", "../../src/services/analyzer.ts", "../../src/utils/fs.ts", "../../src/services/git.ts", "../../node_modules/simple-git/src/lib/args/pathspec.ts", "../../node_modules/simple-git/src/lib/errors/git-error.ts", "../../node_modules/simple-git/src/lib/errors/git-response-error.ts", "../../node_modules/simple-git/src/lib/errors/task-configuration-error.ts", "../../node_modules/simple-git/src/lib/utils/util.ts", "../../node_modules/simple-git/src/lib/utils/argument-filters.ts", "../../node_modules/simple-git/src/lib/utils/exit-codes.ts", "../../node_modules/simple-git/src/lib/utils/git-output-streams.ts", "../../node_modules/simple-git/src/lib/utils/line-parser.ts", "../../node_modules/simple-git/src/lib/utils/simple-git-options.ts", "../../node_modules/simple-git/src/lib/utils/task-options.ts", "../../node_modules/simple-git/src/lib/utils/task-parser.ts", "../../node_modules/simple-git/src/lib/utils/index.ts", "../../node_modules/simple-git/src/lib/tasks/check-is-repo.ts", "../../node_modules/simple-git/src/lib/responses/CleanSummary.ts", "../../node_modules/simple-git/src/lib/tasks/task.ts", "../../node_modules/simple-git/src/lib/tasks/clean.ts", "../../node_modules/simple-git/src/lib/responses/ConfigList.ts", "../../node_modules/simple-git/src/lib/tasks/config.ts", "../../node_modules/simple-git/src/lib/tasks/diff-name-status.ts", "../../node_modules/simple-git/src/lib/tasks/grep.ts", "../../node_modules/simple-git/src/lib/tasks/reset.ts", "../../node_modules/simple-git/src/lib/git-logger.ts", "../../node_modules/simple-git/src/lib/runners/tasks-pending-queue.ts", "../../node_modules/simple-git/src/lib/runners/git-executor-chain.ts", "../../node_modules/simple-git/src/lib/runners/git-executor.ts", "../../node_modules/simple-git/src/lib/task-callback.ts", "../../node_modules/simple-git/src/lib/tasks/change-working-directory.ts", "../../node_modules/simple-git/src/lib/tasks/checkout.ts", "../../node_modules/simple-git/src/lib/tasks/count-objects.ts", "../../node_modules/simple-git/src/lib/parsers/parse-commit.ts", "../../node_modules/simple-git/src/lib/tasks/commit.ts", "../../node_modules/simple-git/src/lib/tasks/first-commit.ts", "../../node_modules/simple-git/src/lib/tasks/hash-object.ts", "../../node_modules/simple-git/src/lib/responses/InitSummary.ts", "../../node_modules/simple-git/src/lib/tasks/init.ts", "../../node_modules/simple-git/src/lib/args/log-format.ts", "../../node_modules/simple-git/src/lib/responses/DiffSummary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-diff-summary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-list-log-summary.ts", "../../node_modules/simple-git/src/lib/tasks/diff.ts", "../../node_modules/simple-git/src/lib/tasks/log.ts", "../../node_modules/simple-git/src/lib/responses/MergeSummary.ts", "../../node_modules/simple-git/src/lib/responses/PullSummary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-remote-objects.ts", "../../node_modules/simple-git/src/lib/parsers/parse-remote-messages.ts", "../../node_modules/simple-git/src/lib/parsers/parse-pull.ts", "../../node_modules/simple-git/src/lib/parsers/parse-merge.ts", "../../node_modules/simple-git/src/lib/tasks/merge.ts", "../../node_modules/simple-git/src/lib/parsers/parse-push.ts", "../../node_modules/simple-git/src/lib/tasks/push.ts", "../../node_modules/simple-git/src/lib/tasks/show.ts", "../../node_modules/simple-git/src/lib/responses/FileStatusSummary.ts", "../../node_modules/simple-git/src/lib/responses/StatusSummary.ts", "../../node_modules/simple-git/src/lib/tasks/status.ts", "../../node_modules/simple-git/src/lib/tasks/version.ts", "../../node_modules/simple-git/src/lib/simple-git-api.ts", "../../node_modules/simple-git/src/lib/runners/scheduler.ts", "../../node_modules/simple-git/src/lib/tasks/apply-patch.ts", "../../node_modules/simple-git/src/lib/responses/BranchDeleteSummary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-branch-delete.ts", "../../node_modules/simple-git/src/lib/responses/BranchSummary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-branch.ts", "../../node_modules/simple-git/src/lib/tasks/branch.ts", "../../node_modules/simple-git/src/lib/responses/CheckIgnore.ts", "../../node_modules/simple-git/src/lib/tasks/check-ignore.ts", "../../node_modules/simple-git/src/lib/tasks/clone.ts", "../../node_modules/simple-git/src/lib/parsers/parse-fetch.ts", "../../node_modules/simple-git/src/lib/tasks/fetch.ts", "../../node_modules/simple-git/src/lib/parsers/parse-move.ts", "../../node_modules/simple-git/src/lib/tasks/move.ts", "../../node_modules/simple-git/src/lib/tasks/pull.ts", "../../node_modules/simple-git/src/lib/responses/GetRemoteSummary.ts", "../../node_modules/simple-git/src/lib/tasks/remote.ts", "../../node_modules/simple-git/src/lib/tasks/stash-list.ts", "../../node_modules/simple-git/src/lib/tasks/sub-module.ts", "../../node_modules/simple-git/src/lib/responses/TagList.ts", "../../node_modules/simple-git/src/lib/tasks/tag.ts", "../../node_modules/simple-git/src/git.js", "../../node_modules/simple-git/src/lib/api.ts", "../../node_modules/simple-git/src/lib/errors/git-construct-error.ts", "../../node_modules/simple-git/src/lib/errors/git-plugin-error.ts", "../../node_modules/simple-git/src/lib/plugins/abort-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/completion-detection.plugin.ts", "../../node_modules/simple-git/src/lib/plugins/custom-binary.plugin.ts", "../../node_modules/simple-git/src/lib/plugins/error-detection.plugin.ts", "../../node_modules/simple-git/src/lib/plugins/plugin-store.ts", "../../node_modules/simple-git/src/lib/plugins/progress-monitor-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/spawn-options-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/timout-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/suffix-paths.plugin.ts", "../../node_modules/simple-git/src/lib/git-factory.ts", "../../node_modules/simple-git/src/lib/runners/promise-wrapped.ts", "../../node_modules/simple-git/src/esm.mjs", "../../src/services/generator.ts", "../../src/config.ts", "../../src/services/copilot.ts", "../../src/services/instructions.ts", "../../src/services/evaluator.ts", "../../src/services/evalScaffold.ts", "../../src/services/readiness.ts", "../../src/services/policy.ts", "../../src/services/visualReport.ts", "../../src/services/github.ts", "../../node_modules/universal-user-agent/index.js", "../../node_modules/before-after-hook/lib/register.js", "../../node_modules/before-after-hook/lib/add.js", "../../node_modules/before-after-hook/lib/remove.js", "../../node_modules/before-after-hook/index.js", "../../node_modules/@octokit/endpoint/dist-bundle/index.js", "../../node_modules/@octokit/request/dist-bundle/index.js", "../../node_modules/@octokit/request-error/dist-src/index.js", "../../node_modules/@octokit/graphql/dist-bundle/index.js", "../../node_modules/@octokit/auth-token/dist-bundle/index.js", "../../node_modules/@octokit/core/dist-src/version.js", "../../node_modules/@octokit/core/dist-src/index.js", "../../node_modules/@octokit/plugin-request-log/dist-src/version.js", "../../node_modules/@octokit/plugin-request-log/dist-src/index.js", "../../node_modules/@octokit/plugin-paginate-rest/dist-bundle/index.js", "../../node_modules/@octokit/src/version.ts", "../../node_modules/@octokit/src/generated/endpoints.ts", "../../node_modules/@octokit/src/endpoints-to-methods.ts", "../../node_modules/@octokit/src/index.ts", "../../node_modules/@octokit/rest/dist-src/version.js", "../../node_modules/@octokit/rest/dist-src/index.js", "../src/commands/generate.ts", "../src/commands/instructions.ts", "../src/progress.ts", "../src/commands/readiness.ts", "../src/webview.ts", "../src/views/AnalysisTreeProvider.ts", "../src/views/ReadinessTreeProvider.ts", "../src/views/providers.ts", "../src/commands/eval.ts", "../src/commands/init.ts", "../src/commands/pr.ts", "../src/auth.ts", "../node_modules/simple-git/src/lib/args/pathspec.ts", "../node_modules/simple-git/src/lib/errors/git-error.ts", "../node_modules/simple-git/src/lib/errors/git-response-error.ts", "../node_modules/simple-git/src/lib/errors/task-configuration-error.ts", "../node_modules/simple-git/src/lib/utils/util.ts", "../node_modules/simple-git/src/lib/utils/argument-filters.ts", "../node_modules/simple-git/src/lib/utils/exit-codes.ts", "../node_modules/simple-git/src/lib/utils/git-output-streams.ts", "../node_modules/simple-git/src/lib/utils/line-parser.ts", "../node_modules/simple-git/src/lib/utils/simple-git-options.ts", "../node_modules/simple-git/src/lib/utils/task-options.ts", "../node_modules/simple-git/src/lib/utils/task-parser.ts", "../node_modules/simple-git/src/lib/utils/index.ts", "../node_modules/simple-git/src/lib/tasks/check-is-repo.ts", "../node_modules/simple-git/src/lib/responses/CleanSummary.ts", "../node_modules/simple-git/src/lib/tasks/task.ts", "../node_modules/simple-git/src/lib/tasks/clean.ts", "../node_modules/simple-git/src/lib/responses/ConfigList.ts", "../node_modules/simple-git/src/lib/tasks/config.ts", "../node_modules/simple-git/src/lib/tasks/diff-name-status.ts", "../node_modules/simple-git/src/lib/tasks/grep.ts", "../node_modules/simple-git/src/lib/tasks/reset.ts", "../node_modules/simple-git/src/lib/git-logger.ts", "../node_modules/simple-git/src/lib/runners/tasks-pending-queue.ts", "../node_modules/simple-git/src/lib/runners/git-executor-chain.ts", "../node_modules/simple-git/src/lib/runners/git-executor.ts", "../node_modules/simple-git/src/lib/task-callback.ts", "../node_modules/simple-git/src/lib/tasks/change-working-directory.ts", "../node_modules/simple-git/src/lib/tasks/checkout.ts", "../node_modules/simple-git/src/lib/tasks/count-objects.ts", "../node_modules/simple-git/src/lib/parsers/parse-commit.ts", "../node_modules/simple-git/src/lib/tasks/commit.ts", "../node_modules/simple-git/src/lib/tasks/first-commit.ts", "../node_modules/simple-git/src/lib/tasks/hash-object.ts", "../node_modules/simple-git/src/lib/responses/InitSummary.ts", "../node_modules/simple-git/src/lib/tasks/init.ts", "../node_modules/simple-git/src/lib/args/log-format.ts", "../node_modules/simple-git/src/lib/responses/DiffSummary.ts", "../node_modules/simple-git/src/lib/parsers/parse-diff-summary.ts", "../node_modules/simple-git/src/lib/parsers/parse-list-log-summary.ts", "../node_modules/simple-git/src/lib/tasks/diff.ts", "../node_modules/simple-git/src/lib/tasks/log.ts", "../node_modules/simple-git/src/lib/responses/MergeSummary.ts", "../node_modules/simple-git/src/lib/responses/PullSummary.ts", "../node_modules/simple-git/src/lib/parsers/parse-remote-objects.ts", "../node_modules/simple-git/src/lib/parsers/parse-remote-messages.ts", "../node_modules/simple-git/src/lib/parsers/parse-pull.ts", "../node_modules/simple-git/src/lib/parsers/parse-merge.ts", "../node_modules/simple-git/src/lib/tasks/merge.ts", "../node_modules/simple-git/src/lib/parsers/parse-push.ts", "../node_modules/simple-git/src/lib/tasks/push.ts", "../node_modules/simple-git/src/lib/tasks/show.ts", "../node_modules/simple-git/src/lib/responses/FileStatusSummary.ts", "../node_modules/simple-git/src/lib/responses/StatusSummary.ts", "../node_modules/simple-git/src/lib/tasks/status.ts", "../node_modules/simple-git/src/lib/tasks/version.ts", "../node_modules/simple-git/src/lib/simple-git-api.ts", "../node_modules/simple-git/src/lib/runners/scheduler.ts", "../node_modules/simple-git/src/lib/tasks/apply-patch.ts", "../node_modules/simple-git/src/lib/responses/BranchDeleteSummary.ts", "../node_modules/simple-git/src/lib/parsers/parse-branch-delete.ts", "../node_modules/simple-git/src/lib/responses/BranchSummary.ts", "../node_modules/simple-git/src/lib/parsers/parse-branch.ts", "../node_modules/simple-git/src/lib/tasks/branch.ts", "../node_modules/simple-git/src/lib/responses/CheckIgnore.ts", "../node_modules/simple-git/src/lib/tasks/check-ignore.ts", "../node_modules/simple-git/src/lib/tasks/clone.ts", "../node_modules/simple-git/src/lib/parsers/parse-fetch.ts", "../node_modules/simple-git/src/lib/tasks/fetch.ts", "../node_modules/simple-git/src/lib/parsers/parse-move.ts", "../node_modules/simple-git/src/lib/tasks/move.ts", "../node_modules/simple-git/src/lib/tasks/pull.ts", "../node_modules/simple-git/src/lib/responses/GetRemoteSummary.ts", "../node_modules/simple-git/src/lib/tasks/remote.ts", "../node_modules/simple-git/src/lib/tasks/stash-list.ts", "../node_modules/simple-git/src/lib/tasks/sub-module.ts", "../node_modules/simple-git/src/lib/responses/TagList.ts", "../node_modules/simple-git/src/lib/tasks/tag.ts", "../node_modules/simple-git/src/git.js", "../node_modules/simple-git/src/lib/api.ts", "../node_modules/simple-git/src/lib/errors/git-construct-error.ts", "../node_modules/simple-git/src/lib/errors/git-plugin-error.ts", "../node_modules/simple-git/src/lib/plugins/abort-plugin.ts", "../node_modules/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts", "../node_modules/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts", "../node_modules/simple-git/src/lib/plugins/completion-detection.plugin.ts", "../node_modules/simple-git/src/lib/plugins/custom-binary.plugin.ts", "../node_modules/simple-git/src/lib/plugins/error-detection.plugin.ts", "../node_modules/simple-git/src/lib/plugins/plugin-store.ts", "../node_modules/simple-git/src/lib/plugins/progress-monitor-plugin.ts", "../node_modules/simple-git/src/lib/plugins/spawn-options-plugin.ts", "../node_modules/simple-git/src/lib/plugins/timout-plugin.ts", "../node_modules/simple-git/src/lib/plugins/suffix-paths.plugin.ts", "../node_modules/simple-git/src/lib/git-factory.ts", "../node_modules/simple-git/src/lib/runners/promise-wrapped.ts", "../node_modules/simple-git/src/esm.mjs"], + "sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.splitWhen = exports.flatten = void 0;\nfunction flatten(items) {\n return items.reduce((collection, item) => [].concat(collection, item), []);\n}\nexports.flatten = flatten;\nfunction splitWhen(items, predicate) {\n const result = [[]];\n let groupIndex = 0;\n for (const item of items) {\n if (predicate(item)) {\n groupIndex++;\n result[groupIndex] = [];\n }\n else {\n result[groupIndex].push(item);\n }\n }\n return result;\n}\nexports.splitWhen = splitWhen;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isEnoentCodeError = void 0;\nfunction isEnoentCodeError(error) {\n return error.code === 'ENOENT';\n}\nexports.isEnoentCodeError = isEnoentCodeError;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createDirentFromStats = void 0;\nclass DirentFromStats {\n constructor(name, stats) {\n this.name = name;\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\n this.isDirectory = stats.isDirectory.bind(stats);\n this.isFIFO = stats.isFIFO.bind(stats);\n this.isFile = stats.isFile.bind(stats);\n this.isSocket = stats.isSocket.bind(stats);\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\n }\n}\nfunction createDirentFromStats(name, stats) {\n return new DirentFromStats(name, stats);\n}\nexports.createDirentFromStats = createDirentFromStats;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertPosixPathToPattern = exports.convertWindowsPathToPattern = exports.convertPathToPattern = exports.escapePosixPath = exports.escapeWindowsPath = exports.escape = exports.removeLeadingDotSegment = exports.makeAbsolute = exports.unixify = void 0;\nconst os = require(\"os\");\nconst path = require(\"path\");\nconst IS_WINDOWS_PLATFORM = os.platform() === 'win32';\nconst LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\\\\n/**\n * All non-escaped special characters.\n * Posix: ()*?[]{|}, !+@ before (, ! at the beginning, \\\\ before non-special characters.\n * Windows: (){}[], !+@ before (, ! at the beginning.\n */\nconst POSIX_UNESCAPED_GLOB_SYMBOLS_RE = /(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\()|\\\\(?![!()*+?@[\\]{|}]))/g;\nconst WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE = /(\\\\?)([()[\\]{}]|^!|[!+@](?=\\())/g;\n/**\n * The device path (\\\\.\\ or \\\\?\\).\n * https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats#dos-device-paths\n */\nconst DOS_DEVICE_PATH_RE = /^\\\\\\\\([.?])/;\n/**\n * All backslashes except those escaping special characters.\n * Windows: !()+@{}\n * https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions\n */\nconst WINDOWS_BACKSLASHES_RE = /\\\\(?![!()+@[\\]{}])/g;\n/**\n * Designed to work only with simple paths: `dir\\\\file`.\n */\nfunction unixify(filepath) {\n return filepath.replace(/\\\\/g, '/');\n}\nexports.unixify = unixify;\nfunction makeAbsolute(cwd, filepath) {\n return path.resolve(cwd, filepath);\n}\nexports.makeAbsolute = makeAbsolute;\nfunction removeLeadingDotSegment(entry) {\n // We do not use `startsWith` because this is 10x slower than current implementation for some cases.\n // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\n if (entry.charAt(0) === '.') {\n const secondCharactery = entry.charAt(1);\n if (secondCharactery === '/' || secondCharactery === '\\\\') {\n return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT);\n }\n }\n return entry;\n}\nexports.removeLeadingDotSegment = removeLeadingDotSegment;\nexports.escape = IS_WINDOWS_PLATFORM ? escapeWindowsPath : escapePosixPath;\nfunction escapeWindowsPath(pattern) {\n return pattern.replace(WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE, '\\\\$2');\n}\nexports.escapeWindowsPath = escapeWindowsPath;\nfunction escapePosixPath(pattern) {\n return pattern.replace(POSIX_UNESCAPED_GLOB_SYMBOLS_RE, '\\\\$2');\n}\nexports.escapePosixPath = escapePosixPath;\nexports.convertPathToPattern = IS_WINDOWS_PLATFORM ? convertWindowsPathToPattern : convertPosixPathToPattern;\nfunction convertWindowsPathToPattern(filepath) {\n return escapeWindowsPath(filepath)\n .replace(DOS_DEVICE_PATH_RE, '//$1')\n .replace(WINDOWS_BACKSLASHES_RE, '/');\n}\nexports.convertWindowsPathToPattern = convertWindowsPathToPattern;\nfunction convertPosixPathToPattern(filepath) {\n return escapePosixPath(filepath);\n}\nexports.convertPosixPathToPattern = convertPosixPathToPattern;\n", "/*!\n * is-extglob \n *\n * Copyright (c) 2014-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nmodule.exports = function isExtglob(str) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n var match;\n while ((match = /(\\\\).|([@?!+*]\\(.*\\))/g.exec(str))) {\n if (match[2]) return true;\n str = str.slice(match.index + match[0].length);\n }\n\n return false;\n};\n", "/*!\n * is-glob \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nvar isExtglob = require('is-extglob');\nvar chars = { '{': '}', '(': ')', '[': ']'};\nvar strictCheck = function(str) {\n if (str[0] === '!') {\n return true;\n }\n var index = 0;\n var pipeIndex = -2;\n var closeSquareIndex = -2;\n var closeCurlyIndex = -2;\n var closeParenIndex = -2;\n var backSlashIndex = -2;\n while (index < str.length) {\n if (str[index] === '*') {\n return true;\n }\n\n if (str[index + 1] === '?' && /[\\].+)]/.test(str[index])) {\n return true;\n }\n\n if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') {\n if (closeSquareIndex < index) {\n closeSquareIndex = str.indexOf(']', index);\n }\n if (closeSquareIndex > index) {\n if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {\n return true;\n }\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {\n return true;\n }\n }\n }\n\n if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') {\n closeCurlyIndex = str.indexOf('}', index);\n if (closeCurlyIndex > index) {\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) {\n return true;\n }\n }\n }\n\n if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') {\n closeParenIndex = str.indexOf(')', index);\n if (closeParenIndex > index) {\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {\n return true;\n }\n }\n }\n\n if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') {\n if (pipeIndex < index) {\n pipeIndex = str.indexOf('|', index);\n }\n if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') {\n closeParenIndex = str.indexOf(')', pipeIndex);\n if (closeParenIndex > pipeIndex) {\n backSlashIndex = str.indexOf('\\\\', pipeIndex);\n if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {\n return true;\n }\n }\n }\n }\n\n if (str[index] === '\\\\') {\n var open = str[index + 1];\n index += 2;\n var close = chars[open];\n\n if (close) {\n var n = str.indexOf(close, index);\n if (n !== -1) {\n index = n + 1;\n }\n }\n\n if (str[index] === '!') {\n return true;\n }\n } else {\n index++;\n }\n }\n return false;\n};\n\nvar relaxedCheck = function(str) {\n if (str[0] === '!') {\n return true;\n }\n var index = 0;\n while (index < str.length) {\n if (/[*?{}()[\\]]/.test(str[index])) {\n return true;\n }\n\n if (str[index] === '\\\\') {\n var open = str[index + 1];\n index += 2;\n var close = chars[open];\n\n if (close) {\n var n = str.indexOf(close, index);\n if (n !== -1) {\n index = n + 1;\n }\n }\n\n if (str[index] === '!') {\n return true;\n }\n } else {\n index++;\n }\n }\n return false;\n};\n\nmodule.exports = function isGlob(str, options) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n if (isExtglob(str)) {\n return true;\n }\n\n var check = strictCheck;\n\n // optionally relax check\n if (options && options.strict === false) {\n check = relaxedCheck;\n }\n\n return check(str);\n};\n", "'use strict';\n\nvar isGlob = require('is-glob');\nvar pathPosixDirname = require('path').posix.dirname;\nvar isWin32 = require('os').platform() === 'win32';\n\nvar slash = '/';\nvar backslash = /\\\\/g;\nvar enclosure = /[\\{\\[].*[\\}\\]]$/;\nvar globby = /(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/;\nvar escaped = /\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;\n\n/**\n * @param {string} str\n * @param {Object} opts\n * @param {boolean} [opts.flipBackslashes=true]\n * @returns {string}\n */\nmodule.exports = function globParent(str, opts) {\n var options = Object.assign({ flipBackslashes: true }, opts);\n\n // flip windows path separators\n if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {\n str = str.replace(backslash, slash);\n }\n\n // special case for strings ending in enclosure containing path separator\n if (enclosure.test(str)) {\n str += slash;\n }\n\n // preserves full path in case of trailing path separator\n str += 'a';\n\n // remove path parts that are globby\n do {\n str = pathPosixDirname(str);\n } while (isGlob(str) || globby.test(str));\n\n // remove escape chars and return result\n return str.replace(escaped, '$1');\n};\n", "'use strict';\n\nexports.isInteger = num => {\n if (typeof num === 'number') {\n return Number.isInteger(num);\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isInteger(Number(num));\n }\n return false;\n};\n\n/**\n * Find a node of the given type\n */\n\nexports.find = (node, type) => node.nodes.find(node => node.type === type);\n\n/**\n * Find a node of the given type\n */\n\nexports.exceedsLimit = (min, max, step = 1, limit) => {\n if (limit === false) return false;\n if (!exports.isInteger(min) || !exports.isInteger(max)) return false;\n return ((Number(max) - Number(min)) / Number(step)) >= limit;\n};\n\n/**\n * Escape the given node with '\\\\' before node.value\n */\n\nexports.escapeNode = (block, n = 0, type) => {\n const node = block.nodes[n];\n if (!node) return;\n\n if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {\n if (node.escaped !== true) {\n node.value = '\\\\' + node.value;\n node.escaped = true;\n }\n }\n};\n\n/**\n * Returns true if the given brace node should be enclosed in literal braces\n */\n\nexports.encloseBrace = node => {\n if (node.type !== 'brace') return false;\n if ((node.commas >> 0 + node.ranges >> 0) === 0) {\n node.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a brace node is invalid.\n */\n\nexports.isInvalidBrace = block => {\n if (block.type !== 'brace') return false;\n if (block.invalid === true || block.dollar) return true;\n if ((block.commas >> 0 + block.ranges >> 0) === 0) {\n block.invalid = true;\n return true;\n }\n if (block.open !== true || block.close !== true) {\n block.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a node is an open or close node\n */\n\nexports.isOpenOrClose = node => {\n if (node.type === 'open' || node.type === 'close') {\n return true;\n }\n return node.open === true || node.close === true;\n};\n\n/**\n * Reduce an array of text nodes.\n */\n\nexports.reduce = nodes => nodes.reduce((acc, node) => {\n if (node.type === 'text') acc.push(node.value);\n if (node.type === 'range') node.type = 'text';\n return acc;\n}, []);\n\n/**\n * Flatten an array\n */\n\nexports.flatten = (...args) => {\n const result = [];\n\n const flat = arr => {\n for (let i = 0; i < arr.length; i++) {\n const ele = arr[i];\n\n if (Array.isArray(ele)) {\n flat(ele);\n continue;\n }\n\n if (ele !== undefined) {\n result.push(ele);\n }\n }\n return result;\n };\n\n flat(args);\n return result;\n};\n", "'use strict';\n\nconst utils = require('./utils');\n\nmodule.exports = (ast, options = {}) => {\n const stringify = (node, parent = {}) => {\n const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n let output = '';\n\n if (node.value) {\n if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) {\n return '\\\\' + node.value;\n }\n return node.value;\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += stringify(child);\n }\n }\n return output;\n };\n\n return stringify(ast);\n};\n\n", "/*!\n * is-number \n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function(num) {\n if (typeof num === 'number') {\n return num - num === 0;\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);\n }\n return false;\n};\n", "/*!\n * to-regex-range \n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst isNumber = require('is-number');\n\nconst toRegexRange = (min, max, options) => {\n if (isNumber(min) === false) {\n throw new TypeError('toRegexRange: expected the first argument to be a number');\n }\n\n if (max === void 0 || min === max) {\n return String(min);\n }\n\n if (isNumber(max) === false) {\n throw new TypeError('toRegexRange: expected the second argument to be a number.');\n }\n\n let opts = { relaxZeros: true, ...options };\n if (typeof opts.strictZeros === 'boolean') {\n opts.relaxZeros = opts.strictZeros === false;\n }\n\n let relax = String(opts.relaxZeros);\n let shorthand = String(opts.shorthand);\n let capture = String(opts.capture);\n let wrap = String(opts.wrap);\n let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;\n\n if (toRegexRange.cache.hasOwnProperty(cacheKey)) {\n return toRegexRange.cache[cacheKey].result;\n }\n\n let a = Math.min(min, max);\n let b = Math.max(min, max);\n\n if (Math.abs(a - b) === 1) {\n let result = min + '|' + max;\n if (opts.capture) {\n return `(${result})`;\n }\n if (opts.wrap === false) {\n return result;\n }\n return `(?:${result})`;\n }\n\n let isPadded = hasPadding(min) || hasPadding(max);\n let state = { min, max, a, b };\n let positives = [];\n let negatives = [];\n\n if (isPadded) {\n state.isPadded = isPadded;\n state.maxLen = String(state.max).length;\n }\n\n if (a < 0) {\n let newMin = b < 0 ? Math.abs(b) : 1;\n negatives = splitToPatterns(newMin, Math.abs(a), state, opts);\n a = state.a = 0;\n }\n\n if (b >= 0) {\n positives = splitToPatterns(a, b, state, opts);\n }\n\n state.negatives = negatives;\n state.positives = positives;\n state.result = collatePatterns(negatives, positives, opts);\n\n if (opts.capture === true) {\n state.result = `(${state.result})`;\n } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {\n state.result = `(?:${state.result})`;\n }\n\n toRegexRange.cache[cacheKey] = state;\n return state.result;\n};\n\nfunction collatePatterns(neg, pos, options) {\n let onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];\n let onlyPositive = filterPatterns(pos, neg, '', false, options) || [];\n let intersected = filterPatterns(neg, pos, '-?', true, options) || [];\n let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);\n return subpatterns.join('|');\n}\n\nfunction splitToRanges(min, max) {\n let nines = 1;\n let zeros = 1;\n\n let stop = countNines(min, nines);\n let stops = new Set([max]);\n\n while (min <= stop && stop <= max) {\n stops.add(stop);\n nines += 1;\n stop = countNines(min, nines);\n }\n\n stop = countZeros(max + 1, zeros) - 1;\n\n while (min < stop && stop <= max) {\n stops.add(stop);\n zeros += 1;\n stop = countZeros(max + 1, zeros) - 1;\n }\n\n stops = [...stops];\n stops.sort(compare);\n return stops;\n}\n\n/**\n * Convert a range to a regex pattern\n * @param {Number} `start`\n * @param {Number} `stop`\n * @return {String}\n */\n\nfunction rangeToPattern(start, stop, options) {\n if (start === stop) {\n return { pattern: start, count: [], digits: 0 };\n }\n\n let zipped = zip(start, stop);\n let digits = zipped.length;\n let pattern = '';\n let count = 0;\n\n for (let i = 0; i < digits; i++) {\n let [startDigit, stopDigit] = zipped[i];\n\n if (startDigit === stopDigit) {\n pattern += startDigit;\n\n } else if (startDigit !== '0' || stopDigit !== '9') {\n pattern += toCharacterClass(startDigit, stopDigit, options);\n\n } else {\n count++;\n }\n }\n\n if (count) {\n pattern += options.shorthand === true ? '\\\\d' : '[0-9]';\n }\n\n return { pattern, count: [count], digits };\n}\n\nfunction splitToPatterns(min, max, tok, options) {\n let ranges = splitToRanges(min, max);\n let tokens = [];\n let start = min;\n let prev;\n\n for (let i = 0; i < ranges.length; i++) {\n let max = ranges[i];\n let obj = rangeToPattern(String(start), String(max), options);\n let zeros = '';\n\n if (!tok.isPadded && prev && prev.pattern === obj.pattern) {\n if (prev.count.length > 1) {\n prev.count.pop();\n }\n\n prev.count.push(obj.count[0]);\n prev.string = prev.pattern + toQuantifier(prev.count);\n start = max + 1;\n continue;\n }\n\n if (tok.isPadded) {\n zeros = padZeros(max, tok, options);\n }\n\n obj.string = zeros + obj.pattern + toQuantifier(obj.count);\n tokens.push(obj);\n start = max + 1;\n prev = obj;\n }\n\n return tokens;\n}\n\nfunction filterPatterns(arr, comparison, prefix, intersection, options) {\n let result = [];\n\n for (let ele of arr) {\n let { string } = ele;\n\n // only push if _both_ are negative...\n if (!intersection && !contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n\n // or _both_ are positive\n if (intersection && contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n }\n return result;\n}\n\n/**\n * Zip strings\n */\n\nfunction zip(a, b) {\n let arr = [];\n for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);\n return arr;\n}\n\nfunction compare(a, b) {\n return a > b ? 1 : b > a ? -1 : 0;\n}\n\nfunction contains(arr, key, val) {\n return arr.some(ele => ele[key] === val);\n}\n\nfunction countNines(min, len) {\n return Number(String(min).slice(0, -len) + '9'.repeat(len));\n}\n\nfunction countZeros(integer, zeros) {\n return integer - (integer % Math.pow(10, zeros));\n}\n\nfunction toQuantifier(digits) {\n let [start = 0, stop = ''] = digits;\n if (stop || start > 1) {\n return `{${start + (stop ? ',' + stop : '')}}`;\n }\n return '';\n}\n\nfunction toCharacterClass(a, b, options) {\n return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;\n}\n\nfunction hasPadding(str) {\n return /^-?(0+)\\d/.test(str);\n}\n\nfunction padZeros(value, tok, options) {\n if (!tok.isPadded) {\n return value;\n }\n\n let diff = Math.abs(tok.maxLen - String(value).length);\n let relax = options.relaxZeros !== false;\n\n switch (diff) {\n case 0:\n return '';\n case 1:\n return relax ? '0?' : '0';\n case 2:\n return relax ? '0{0,2}' : '00';\n default: {\n return relax ? `0{0,${diff}}` : `0{${diff}}`;\n }\n }\n}\n\n/**\n * Cache\n */\n\ntoRegexRange.cache = {};\ntoRegexRange.clearCache = () => (toRegexRange.cache = {});\n\n/**\n * Expose `toRegexRange`\n */\n\nmodule.exports = toRegexRange;\n", "/*!\n * fill-range \n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst util = require('util');\nconst toRegexRange = require('to-regex-range');\n\nconst isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\n\nconst transform = toNumber => {\n return value => toNumber === true ? Number(value) : String(value);\n};\n\nconst isValidValue = value => {\n return typeof value === 'number' || (typeof value === 'string' && value !== '');\n};\n\nconst isNumber = num => Number.isInteger(+num);\n\nconst zeros = input => {\n let value = `${input}`;\n let index = -1;\n if (value[0] === '-') value = value.slice(1);\n if (value === '0') return false;\n while (value[++index] === '0');\n return index > 0;\n};\n\nconst stringify = (start, end, options) => {\n if (typeof start === 'string' || typeof end === 'string') {\n return true;\n }\n return options.stringify === true;\n};\n\nconst pad = (input, maxLength, toNumber) => {\n if (maxLength > 0) {\n let dash = input[0] === '-' ? '-' : '';\n if (dash) input = input.slice(1);\n input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));\n }\n if (toNumber === false) {\n return String(input);\n }\n return input;\n};\n\nconst toMaxLen = (input, maxLength) => {\n let negative = input[0] === '-' ? '-' : '';\n if (negative) {\n input = input.slice(1);\n maxLength--;\n }\n while (input.length < maxLength) input = '0' + input;\n return negative ? ('-' + input) : input;\n};\n\nconst toSequence = (parts, options, maxLen) => {\n parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n\n let prefix = options.capture ? '' : '?:';\n let positives = '';\n let negatives = '';\n let result;\n\n if (parts.positives.length) {\n positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|');\n }\n\n if (parts.negatives.length) {\n negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`;\n }\n\n if (positives && negatives) {\n result = `${positives}|${negatives}`;\n } else {\n result = positives || negatives;\n }\n\n if (options.wrap) {\n return `(${prefix}${result})`;\n }\n\n return result;\n};\n\nconst toRange = (a, b, isNumbers, options) => {\n if (isNumbers) {\n return toRegexRange(a, b, { wrap: false, ...options });\n }\n\n let start = String.fromCharCode(a);\n if (a === b) return start;\n\n let stop = String.fromCharCode(b);\n return `[${start}-${stop}]`;\n};\n\nconst toRegex = (start, end, options) => {\n if (Array.isArray(start)) {\n let wrap = options.wrap === true;\n let prefix = options.capture ? '' : '?:';\n return wrap ? `(${prefix}${start.join('|')})` : start.join('|');\n }\n return toRegexRange(start, end, options);\n};\n\nconst rangeError = (...args) => {\n return new RangeError('Invalid range arguments: ' + util.inspect(...args));\n};\n\nconst invalidRange = (start, end, options) => {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n};\n\nconst invalidStep = (step, options) => {\n if (options.strictRanges === true) {\n throw new TypeError(`Expected step \"${step}\" to be a number`);\n }\n return [];\n};\n\nconst fillNumbers = (start, end, step = 1, options = {}) => {\n let a = Number(start);\n let b = Number(end);\n\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n }\n\n // fix negative zero\n if (a === 0) a = 0;\n if (b === 0) b = 0;\n\n let descending = a > b;\n let startString = String(start);\n let endString = String(end);\n let stepString = String(step);\n step = Math.max(Math.abs(step), 1);\n\n let padded = zeros(startString) || zeros(endString) || zeros(stepString);\n let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;\n let toNumber = padded === false && stringify(start, end, options) === false;\n let format = options.transform || transform(toNumber);\n\n if (options.toRegex && step === 1) {\n return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);\n }\n\n let parts = { negatives: [], positives: [] };\n let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n if (options.toRegex === true && step > 1) {\n push(a);\n } else {\n range.push(pad(format(a, index), maxLen, toNumber));\n }\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return step > 1\n ? toSequence(parts, options, maxLen)\n : toRegex(range, null, { wrap: false, ...options });\n }\n\n return range;\n};\n\nconst fillLetters = (start, end, step = 1, options = {}) => {\n if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {\n return invalidRange(start, end, options);\n }\n\n let format = options.transform || (val => String.fromCharCode(val));\n let a = `${start}`.charCodeAt(0);\n let b = `${end}`.charCodeAt(0);\n\n let descending = a > b;\n let min = Math.min(a, b);\n let max = Math.max(a, b);\n\n if (options.toRegex && step === 1) {\n return toRange(min, max, false, options);\n }\n\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n range.push(format(a, index));\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return toRegex(range, null, { wrap: false, options });\n }\n\n return range;\n};\n\nconst fill = (start, end, step, options = {}) => {\n if (end == null && isValidValue(start)) {\n return [start];\n }\n\n if (!isValidValue(start) || !isValidValue(end)) {\n return invalidRange(start, end, options);\n }\n\n if (typeof step === 'function') {\n return fill(start, end, 1, { transform: step });\n }\n\n if (isObject(step)) {\n return fill(start, end, 0, step);\n }\n\n let opts = { ...options };\n if (opts.capture === true) opts.wrap = true;\n step = step || opts.step || 1;\n\n if (!isNumber(step)) {\n if (step != null && !isObject(step)) return invalidStep(step, opts);\n return fill(start, end, 1, step);\n }\n\n if (isNumber(start) && isNumber(end)) {\n return fillNumbers(start, end, step, opts);\n }\n\n return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);\n};\n\nmodule.exports = fill;\n", "'use strict';\n\nconst fill = require('fill-range');\nconst utils = require('./utils');\n\nconst compile = (ast, options = {}) => {\n const walk = (node, parent = {}) => {\n const invalidBlock = utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n const invalid = invalidBlock === true || invalidNode === true;\n const prefix = options.escapeInvalid === true ? '\\\\' : '';\n let output = '';\n\n if (node.isOpen === true) {\n return prefix + node.value;\n }\n\n if (node.isClose === true) {\n console.log('node.isClose', prefix, node.value);\n return prefix + node.value;\n }\n\n if (node.type === 'open') {\n return invalid ? prefix + node.value : '(';\n }\n\n if (node.type === 'close') {\n return invalid ? prefix + node.value : ')';\n }\n\n if (node.type === 'comma') {\n return node.prev.type === 'comma' ? '' : invalid ? node.value : '|';\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true });\n\n if (range.length !== 0) {\n return args.length > 1 && range.length > 1 ? `(${range})` : range;\n }\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += walk(child, node);\n }\n }\n\n return output;\n };\n\n return walk(ast);\n};\n\nmodule.exports = compile;\n", "'use strict';\n\nconst fill = require('fill-range');\nconst stringify = require('./stringify');\nconst utils = require('./utils');\n\nconst append = (queue = '', stash = '', enclose = false) => {\n const result = [];\n\n queue = [].concat(queue);\n stash = [].concat(stash);\n\n if (!stash.length) return queue;\n if (!queue.length) {\n return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;\n }\n\n for (const item of queue) {\n if (Array.isArray(item)) {\n for (const value of item) {\n result.push(append(value, stash, enclose));\n }\n } else {\n for (let ele of stash) {\n if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;\n result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele);\n }\n }\n }\n return utils.flatten(result);\n};\n\nconst expand = (ast, options = {}) => {\n const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit;\n\n const walk = (node, parent = {}) => {\n node.queue = [];\n\n let p = parent;\n let q = parent.queue;\n\n while (p.type !== 'brace' && p.type !== 'root' && p.parent) {\n p = p.parent;\n q = p.queue;\n }\n\n if (node.invalid || node.dollar) {\n q.push(append(q.pop(), stringify(node, options)));\n return;\n }\n\n if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {\n q.push(append(q.pop(), ['{}']));\n return;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n\n if (utils.exceedsLimit(...args, options.step, rangeLimit)) {\n throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');\n }\n\n let range = fill(...args, options);\n if (range.length === 0) {\n range = stringify(node, options);\n }\n\n q.push(append(q.pop(), range));\n node.nodes = [];\n return;\n }\n\n const enclose = utils.encloseBrace(node);\n let queue = node.queue;\n let block = node;\n\n while (block.type !== 'brace' && block.type !== 'root' && block.parent) {\n block = block.parent;\n queue = block.queue;\n }\n\n for (let i = 0; i < node.nodes.length; i++) {\n const child = node.nodes[i];\n\n if (child.type === 'comma' && node.type === 'brace') {\n if (i === 1) queue.push('');\n queue.push('');\n continue;\n }\n\n if (child.type === 'close') {\n q.push(append(q.pop(), queue, enclose));\n continue;\n }\n\n if (child.value && child.type !== 'open') {\n queue.push(append(queue.pop(), child.value));\n continue;\n }\n\n if (child.nodes) {\n walk(child, node);\n }\n }\n\n return queue;\n };\n\n return utils.flatten(walk(ast));\n};\n\nmodule.exports = expand;\n", "'use strict';\n\nmodule.exports = {\n MAX_LENGTH: 10000,\n\n // Digits\n CHAR_0: '0', /* 0 */\n CHAR_9: '9', /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 'A', /* A */\n CHAR_LOWERCASE_A: 'a', /* a */\n CHAR_UPPERCASE_Z: 'Z', /* Z */\n CHAR_LOWERCASE_Z: 'z', /* z */\n\n CHAR_LEFT_PARENTHESES: '(', /* ( */\n CHAR_RIGHT_PARENTHESES: ')', /* ) */\n\n CHAR_ASTERISK: '*', /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: '&', /* & */\n CHAR_AT: '@', /* @ */\n CHAR_BACKSLASH: '\\\\', /* \\ */\n CHAR_BACKTICK: '`', /* ` */\n CHAR_CARRIAGE_RETURN: '\\r', /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */\n CHAR_COLON: ':', /* : */\n CHAR_COMMA: ',', /* , */\n CHAR_DOLLAR: '$', /* . */\n CHAR_DOT: '.', /* . */\n CHAR_DOUBLE_QUOTE: '\"', /* \" */\n CHAR_EQUAL: '=', /* = */\n CHAR_EXCLAMATION_MARK: '!', /* ! */\n CHAR_FORM_FEED: '\\f', /* \\f */\n CHAR_FORWARD_SLASH: '/', /* / */\n CHAR_HASH: '#', /* # */\n CHAR_HYPHEN_MINUS: '-', /* - */\n CHAR_LEFT_ANGLE_BRACKET: '<', /* < */\n CHAR_LEFT_CURLY_BRACE: '{', /* { */\n CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */\n CHAR_LINE_FEED: '\\n', /* \\n */\n CHAR_NO_BREAK_SPACE: '\\u00A0', /* \\u00A0 */\n CHAR_PERCENT: '%', /* % */\n CHAR_PLUS: '+', /* + */\n CHAR_QUESTION_MARK: '?', /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */\n CHAR_RIGHT_CURLY_BRACE: '}', /* } */\n CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */\n CHAR_SEMICOLON: ';', /* ; */\n CHAR_SINGLE_QUOTE: '\\'', /* ' */\n CHAR_SPACE: ' ', /* */\n CHAR_TAB: '\\t', /* \\t */\n CHAR_UNDERSCORE: '_', /* _ */\n CHAR_VERTICAL_LINE: '|', /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\\uFEFF' /* \\uFEFF */\n};\n", "'use strict';\n\nconst stringify = require('./stringify');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n CHAR_BACKSLASH, /* \\ */\n CHAR_BACKTICK, /* ` */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_RIGHT_SQUARE_BRACKET, /* ] */\n CHAR_DOUBLE_QUOTE, /* \" */\n CHAR_SINGLE_QUOTE, /* ' */\n CHAR_NO_BREAK_SPACE,\n CHAR_ZERO_WIDTH_NOBREAK_SPACE\n} = require('./constants');\n\n/**\n * parse\n */\n\nconst parse = (input, options = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n const opts = options || {};\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n if (input.length > max) {\n throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);\n }\n\n const ast = { type: 'root', input, nodes: [] };\n const stack = [ast];\n let block = ast;\n let prev = ast;\n let brackets = 0;\n const length = input.length;\n let index = 0;\n let depth = 0;\n let value;\n\n /**\n * Helpers\n */\n\n const advance = () => input[index++];\n const push = node => {\n if (node.type === 'text' && prev.type === 'dot') {\n prev.type = 'text';\n }\n\n if (prev && prev.type === 'text' && node.type === 'text') {\n prev.value += node.value;\n return;\n }\n\n block.nodes.push(node);\n node.parent = block;\n node.prev = prev;\n prev = node;\n return node;\n };\n\n push({ type: 'bos' });\n\n while (index < length) {\n block = stack[stack.length - 1];\n value = advance();\n\n /**\n * Invalid chars\n */\n\n if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {\n continue;\n }\n\n /**\n * Escaped chars\n */\n\n if (value === CHAR_BACKSLASH) {\n push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });\n continue;\n }\n\n /**\n * Right square bracket (literal): ']'\n */\n\n if (value === CHAR_RIGHT_SQUARE_BRACKET) {\n push({ type: 'text', value: '\\\\' + value });\n continue;\n }\n\n /**\n * Left square bracket: '['\n */\n\n if (value === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n\n let next;\n\n while (index < length && (next = advance())) {\n value += next;\n\n if (next === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n continue;\n }\n\n if (next === CHAR_BACKSLASH) {\n value += advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n brackets--;\n\n if (brackets === 0) {\n break;\n }\n }\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === CHAR_LEFT_PARENTHESES) {\n block = push({ type: 'paren', nodes: [] });\n stack.push(block);\n push({ type: 'text', value });\n continue;\n }\n\n if (value === CHAR_RIGHT_PARENTHESES) {\n if (block.type !== 'paren') {\n push({ type: 'text', value });\n continue;\n }\n block = stack.pop();\n push({ type: 'text', value });\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Quotes: '|\"|`\n */\n\n if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {\n const open = value;\n let next;\n\n if (options.keepQuotes !== true) {\n value = '';\n }\n\n while (index < length && (next = advance())) {\n if (next === CHAR_BACKSLASH) {\n value += next + advance();\n continue;\n }\n\n if (next === open) {\n if (options.keepQuotes === true) value += next;\n break;\n }\n\n value += next;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Left curly brace: '{'\n */\n\n if (value === CHAR_LEFT_CURLY_BRACE) {\n depth++;\n\n const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;\n const brace = {\n type: 'brace',\n open: true,\n close: false,\n dollar,\n depth,\n commas: 0,\n ranges: 0,\n nodes: []\n };\n\n block = push(brace);\n stack.push(block);\n push({ type: 'open', value });\n continue;\n }\n\n /**\n * Right curly brace: '}'\n */\n\n if (value === CHAR_RIGHT_CURLY_BRACE) {\n if (block.type !== 'brace') {\n push({ type: 'text', value });\n continue;\n }\n\n const type = 'close';\n block = stack.pop();\n block.close = true;\n\n push({ type, value });\n depth--;\n\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Comma: ','\n */\n\n if (value === CHAR_COMMA && depth > 0) {\n if (block.ranges > 0) {\n block.ranges = 0;\n const open = block.nodes.shift();\n block.nodes = [open, { type: 'text', value: stringify(block) }];\n }\n\n push({ type: 'comma', value });\n block.commas++;\n continue;\n }\n\n /**\n * Dot: '.'\n */\n\n if (value === CHAR_DOT && depth > 0 && block.commas === 0) {\n const siblings = block.nodes;\n\n if (depth === 0 || siblings.length === 0) {\n push({ type: 'text', value });\n continue;\n }\n\n if (prev.type === 'dot') {\n block.range = [];\n prev.value += value;\n prev.type = 'range';\n\n if (block.nodes.length !== 3 && block.nodes.length !== 5) {\n block.invalid = true;\n block.ranges = 0;\n prev.type = 'text';\n continue;\n }\n\n block.ranges++;\n block.args = [];\n continue;\n }\n\n if (prev.type === 'range') {\n siblings.pop();\n\n const before = siblings[siblings.length - 1];\n before.value += prev.value + value;\n prev = before;\n block.ranges--;\n continue;\n }\n\n push({ type: 'dot', value });\n continue;\n }\n\n /**\n * Text\n */\n\n push({ type: 'text', value });\n }\n\n // Mark imbalanced braces and brackets as invalid\n do {\n block = stack.pop();\n\n if (block.type !== 'root') {\n block.nodes.forEach(node => {\n if (!node.nodes) {\n if (node.type === 'open') node.isOpen = true;\n if (node.type === 'close') node.isClose = true;\n if (!node.nodes) node.type = 'text';\n node.invalid = true;\n }\n });\n\n // get the location of the block on parent.nodes (block's siblings)\n const parent = stack[stack.length - 1];\n const index = parent.nodes.indexOf(block);\n // replace the (invalid) block with it's nodes\n parent.nodes.splice(index, 1, ...block.nodes);\n }\n } while (stack.length > 0);\n\n push({ type: 'eos' });\n return ast;\n};\n\nmodule.exports = parse;\n", "'use strict';\n\nconst stringify = require('./lib/stringify');\nconst compile = require('./lib/compile');\nconst expand = require('./lib/expand');\nconst parse = require('./lib/parse');\n\n/**\n * Expand the given pattern or create a regex-compatible string.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']\n * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nconst braces = (input, options = {}) => {\n let output = [];\n\n if (Array.isArray(input)) {\n for (const pattern of input) {\n const result = braces.create(pattern, options);\n if (Array.isArray(result)) {\n output.push(...result);\n } else {\n output.push(result);\n }\n }\n } else {\n output = [].concat(braces.create(input, options));\n }\n\n if (options && options.expand === true && options.nodupes === true) {\n output = [...new Set(output)];\n }\n return output;\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * // braces.parse(pattern, [, options]);\n * const ast = braces.parse('a/{b,c}/d');\n * console.log(ast);\n * ```\n * @param {String} pattern Brace pattern to parse\n * @param {Object} options\n * @return {Object} Returns an AST\n * @api public\n */\n\nbraces.parse = (input, options = {}) => parse(input, options);\n\n/**\n * Creates a braces string from an AST, or an AST node.\n *\n * ```js\n * const braces = require('braces');\n * let ast = braces.parse('foo/{a,b}/bar');\n * console.log(stringify(ast.nodes[2])); //=> '{a,b}'\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.stringify = (input, options = {}) => {\n if (typeof input === 'string') {\n return stringify(braces.parse(input, options), options);\n }\n return stringify(input, options);\n};\n\n/**\n * Compiles a brace pattern into a regex-compatible, optimized string.\n * This method is called by the main [braces](#braces) function by default.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.compile('a/{b,c}/d'));\n * //=> ['a/(b|c)/d']\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.compile = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n return compile(input, options);\n};\n\n/**\n * Expands a brace pattern into an array. This method is called by the\n * main [braces](#braces) function when `options.expand` is true. Before\n * using this method it's recommended that you read the [performance notes](#performance))\n * and advantages of using [.compile](#compile) instead.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.expand('a/{b,c}/d'));\n * //=> ['a/b/d', 'a/c/d'];\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.expand = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n\n let result = expand(input, options);\n\n // filter out empty strings if specified\n if (options.noempty === true) {\n result = result.filter(Boolean);\n }\n\n // filter out duplicates if specified\n if (options.nodupes === true) {\n result = [...new Set(result)];\n }\n\n return result;\n};\n\n/**\n * Processes a brace pattern and returns either an expanded array\n * (if `options.expand` is true), a highly optimized regex-compatible string.\n * This method is called by the main [braces](#braces) function.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))\n * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.create = (input, options = {}) => {\n if (input === '' || input.length < 3) {\n return [input];\n }\n\n return options.expand !== true\n ? braces.compile(input, options)\n : braces.expand(input, options);\n};\n\n/**\n * Expose \"braces\"\n */\n\nmodule.exports = braces;\n", "'use strict';\n\nconst path = require('path');\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n SEP: path.sep,\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n", "'use strict';\n\nconst path = require('path');\nconst win32 = process.platform === 'win32';\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.supportsLookbehinds = () => {\n const segs = process.version.slice(1).split('.').map(Number);\n if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {\n return true;\n }\n return false;\n};\n\nexports.isWindows = options => {\n if (options && typeof options.windows === 'boolean') {\n return options.windows;\n }\n return win32 === true || path.sep === '\\\\';\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n", "'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n", "'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(win32);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = opts => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index] || '';\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren') {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.value += tok.value;\n prev.output = (prev.output || '') + tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n let rest;\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n // In this case, we need to parse the string and use it in the output of the original pattern.\n // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n //\n // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n output = token.close = `)${expression})${extglobStar})`;\n }\n\n if (token.prev.type === 'bos') {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance();\n } else {\n value += advance();\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if (next === '<' && !utils.supportsLookbehinds()) {\n throw new Error('Node.js v10 or higher is required for regex lookbehinds');\n }\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(win32);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = opts => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n", "'use strict';\n\nconst path = require('path');\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = utils.isWindows(options);\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(path.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return state.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${state.output})${append}`;\n if (state && state.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = state;\n }\n\n return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n let parsed = { negated: false, fastpaths: true };\n\n if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n parsed.output = parse.fastpaths(input, options);\n }\n\n if (!parsed.output) {\n parsed = parse(input, options);\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n", "'use strict';\n\nmodule.exports = require('./lib/picomatch');\n", "'use strict';\n\nconst util = require('util');\nconst braces = require('braces');\nconst picomatch = require('picomatch');\nconst utils = require('picomatch/lib/utils');\n\nconst isEmptyString = v => v === '' || v === './';\nconst hasBraces = v => {\n const index = v.indexOf('{');\n return index > -1 && v.indexOf('}', index) > -1;\n};\n\n/**\n * Returns an array of strings that match one or more glob patterns.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm(list, patterns[, options]);\n *\n * console.log(mm(['a.js', 'a.txt'], ['*.js']));\n * //=> [ 'a.js' ]\n * ```\n * @param {String|Array} `list` List of strings to match.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options)\n * @return {Array} Returns an array of matches\n * @summary false\n * @api public\n */\n\nconst micromatch = (list, patterns, options) => {\n patterns = [].concat(patterns);\n list = [].concat(list);\n\n let omit = new Set();\n let keep = new Set();\n let items = new Set();\n let negatives = 0;\n\n let onResult = state => {\n items.add(state.output);\n if (options && options.onResult) {\n options.onResult(state);\n }\n };\n\n for (let i = 0; i < patterns.length; i++) {\n let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true);\n let negated = isMatch.state.negated || isMatch.state.negatedExtglob;\n if (negated) negatives++;\n\n for (let item of list) {\n let matched = isMatch(item, true);\n\n let match = negated ? !matched.isMatch : matched.isMatch;\n if (!match) continue;\n\n if (negated) {\n omit.add(matched.output);\n } else {\n omit.delete(matched.output);\n keep.add(matched.output);\n }\n }\n }\n\n let result = negatives === patterns.length ? [...items] : [...keep];\n let matches = result.filter(item => !omit.has(item));\n\n if (options && matches.length === 0) {\n if (options.failglob === true) {\n throw new Error(`No matches found for \"${patterns.join(', ')}\"`);\n }\n\n if (options.nonull === true || options.nullglob === true) {\n return options.unescape ? patterns.map(p => p.replace(/\\\\/g, '')) : patterns;\n }\n }\n\n return matches;\n};\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.match = micromatch;\n\n/**\n * Returns a matcher function from the given glob `pattern` and `options`.\n * The returned function takes a string to match as its only argument and returns\n * true if the string is a match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matcher(pattern[, options]);\n *\n * const isMatch = mm.matcher('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @param {String} `pattern` Glob pattern\n * @param {Object} `options`\n * @return {Function} Returns a matcher function.\n * @api public\n */\n\nmicromatch.matcher = (pattern, options) => picomatch(pattern, options);\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.isMatch(string, patterns[, options]);\n *\n * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(mm.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `[options]` See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.any = micromatch.isMatch;\n\n/**\n * Returns a list of strings that _**do not match any**_ of the given `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.not(list, patterns[, options]);\n *\n * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));\n * //=> ['b.b', 'c.c']\n * ```\n * @param {Array} `list` Array of strings to match.\n * @param {String|Array} `patterns` One or more glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of strings that **do not match** the given patterns.\n * @api public\n */\n\nmicromatch.not = (list, patterns, options = {}) => {\n patterns = [].concat(patterns).map(String);\n let result = new Set();\n let items = [];\n\n let onResult = state => {\n if (options.onResult) options.onResult(state);\n items.push(state.output);\n };\n\n let matches = new Set(micromatch(list, patterns, { ...options, onResult }));\n\n for (let item of items) {\n if (!matches.has(item)) {\n result.add(item);\n }\n }\n return [...result];\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar\n * to [.isMatch](#isMatch) but the pattern can match any part of the string.\n *\n * ```js\n * var mm = require('micromatch');\n * // mm.contains(string, pattern[, options]);\n *\n * console.log(mm.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(mm.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String|Array} `patterns` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any of the patterns matches any part of `str`.\n * @api public\n */\n\nmicromatch.contains = (str, pattern, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n if (Array.isArray(pattern)) {\n return pattern.some(p => micromatch.contains(str, p, options));\n }\n\n if (typeof pattern === 'string') {\n if (isEmptyString(str) || isEmptyString(pattern)) {\n return false;\n }\n\n if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) {\n return true;\n }\n }\n\n return micromatch.isMatch(str, pattern, { ...options, contains: true });\n};\n\n/**\n * Filter the keys of the given object with the given `glob` pattern\n * and `options`. Does not attempt to match nested keys. If you need this feature,\n * use [glob-object][] instead.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matchKeys(object, patterns[, options]);\n *\n * const obj = { aa: 'a', ab: 'b', ac: 'c' };\n * console.log(mm.matchKeys(obj, '*b'));\n * //=> { ab: 'b' }\n * ```\n * @param {Object} `object` The object with keys to filter.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Object} Returns an object with only keys that match the given patterns.\n * @api public\n */\n\nmicromatch.matchKeys = (obj, patterns, options) => {\n if (!utils.isObject(obj)) {\n throw new TypeError('Expected the first argument to be an object');\n }\n let keys = micromatch(Object.keys(obj), patterns, options);\n let res = {};\n for (let key of keys) res[key] = obj[key];\n return res;\n};\n\n/**\n * Returns true if some of the strings in the given `list` match any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.some(list, patterns[, options]);\n *\n * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // true\n * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any `patterns` matches any of the strings in `list`\n * @api public\n */\n\nmicromatch.some = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (items.some(item => isMatch(item))) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if every string in the given `list` matches\n * any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.every(list, patterns[, options]);\n *\n * console.log(mm.every('foo.js', ['foo.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // false\n * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if all `patterns` matches all of the strings in `list`\n * @api public\n */\n\nmicromatch.every = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (!items.every(item => isMatch(item))) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns true if **all** of the given `patterns` match\n * the specified string.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.all(string, patterns[, options]);\n *\n * console.log(mm.all('foo.js', ['foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', '!foo.js']));\n * // false\n *\n * console.log(mm.all('foo.js', ['*.js', 'foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));\n * // true\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.all = (str, patterns, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n return [].concat(patterns).every(p => picomatch(p, options)(str));\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.capture(pattern, string[, options]);\n *\n * console.log(mm.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(mm.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `glob` Glob pattern to use for matching.\n * @param {String} `input` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array|null} Returns an array of captures if the input matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nmicromatch.capture = (glob, input, options) => {\n let posix = utils.isWindows(options);\n let regex = picomatch.makeRe(String(glob), { ...options, capture: true });\n let match = regex.exec(posix ? utils.toPosixSlashes(input) : input);\n\n if (match) {\n return match.slice(1).map(v => v === void 0 ? '' : v);\n }\n};\n\n/**\n * Create a regular expression from the given glob `pattern`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.makeRe(pattern[, options]);\n *\n * console.log(mm.makeRe('*.js'));\n * //=> /^(?:(\\.[\\\\\\/])?(?!\\.)(?=.)[^\\/]*?\\.js)$/\n * ```\n * @param {String} `pattern` A glob pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\nmicromatch.makeRe = (...args) => picomatch.makeRe(...args);\n\n/**\n * Scan a glob pattern to separate the pattern into segments. Used\n * by the [split](#split) method.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.scan(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\nmicromatch.scan = (...args) => picomatch.scan(...args);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.parse(pattern[, options]);\n * ```\n * @param {String} `glob`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as regex source string.\n * @api public\n */\n\nmicromatch.parse = (patterns, options) => {\n let res = [];\n for (let pattern of [].concat(patterns || [])) {\n for (let str of braces(String(pattern), options)) {\n res.push(picomatch.parse(str, options));\n }\n }\n return res;\n};\n\n/**\n * Process the given brace `pattern`.\n *\n * ```js\n * const { braces } = require('micromatch');\n * console.log(braces('foo/{a,b,c}/bar'));\n * //=> [ 'foo/(a|b|c)/bar' ]\n *\n * console.log(braces('foo/{a,b,c}/bar', { expand: true }));\n * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]\n * ```\n * @param {String} `pattern` String with brace pattern to process.\n * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.\n * @return {Array}\n * @api public\n */\n\nmicromatch.braces = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n if ((options && options.nobrace === true) || !hasBraces(pattern)) {\n return [pattern];\n }\n return braces(pattern, options);\n};\n\n/**\n * Expand braces\n */\n\nmicromatch.braceExpand = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n return micromatch.braces(pattern, { ...options, expand: true });\n};\n\n/**\n * Expose micromatch\n */\n\n// exposed for tests\nmicromatch.hasBraces = hasBraces;\nmodule.exports = micromatch;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isAbsolute = exports.partitionAbsoluteAndRelative = exports.removeDuplicateSlashes = exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;\nconst path = require(\"path\");\nconst globParent = require(\"glob-parent\");\nconst micromatch = require(\"micromatch\");\nconst GLOBSTAR = '**';\nconst ESCAPE_SYMBOL = '\\\\';\nconst COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;\nconst REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\\[[^[]*]/;\nconst REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\\([^(]*\\|[^|]*\\)/;\nconst GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\\([^(]*\\)/;\nconst BRACE_EXPANSION_SEPARATORS_RE = /,|\\.\\./;\n/**\n * Matches a sequence of two or more consecutive slashes, excluding the first two slashes at the beginning of the string.\n * The latter is due to the presence of the device path at the beginning of the UNC path.\n */\nconst DOUBLE_SLASH_RE = /(?!^)\\/{2,}/g;\nfunction isStaticPattern(pattern, options = {}) {\n return !isDynamicPattern(pattern, options);\n}\nexports.isStaticPattern = isStaticPattern;\nfunction isDynamicPattern(pattern, options = {}) {\n /**\n * A special case with an empty string is necessary for matching patterns that start with a forward slash.\n * An empty string cannot be a dynamic pattern.\n * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'.\n */\n if (pattern === '') {\n return false;\n }\n /**\n * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check\n * filepath directly (without read directory).\n */\n if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) {\n return true;\n }\n if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) {\n return true;\n }\n if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) {\n return true;\n }\n if (options.braceExpansion !== false && hasBraceExpansion(pattern)) {\n return true;\n }\n return false;\n}\nexports.isDynamicPattern = isDynamicPattern;\nfunction hasBraceExpansion(pattern) {\n const openingBraceIndex = pattern.indexOf('{');\n if (openingBraceIndex === -1) {\n return false;\n }\n const closingBraceIndex = pattern.indexOf('}', openingBraceIndex + 1);\n if (closingBraceIndex === -1) {\n return false;\n }\n const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex);\n return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent);\n}\nfunction convertToPositivePattern(pattern) {\n return isNegativePattern(pattern) ? pattern.slice(1) : pattern;\n}\nexports.convertToPositivePattern = convertToPositivePattern;\nfunction convertToNegativePattern(pattern) {\n return '!' + pattern;\n}\nexports.convertToNegativePattern = convertToNegativePattern;\nfunction isNegativePattern(pattern) {\n return pattern.startsWith('!') && pattern[1] !== '(';\n}\nexports.isNegativePattern = isNegativePattern;\nfunction isPositivePattern(pattern) {\n return !isNegativePattern(pattern);\n}\nexports.isPositivePattern = isPositivePattern;\nfunction getNegativePatterns(patterns) {\n return patterns.filter(isNegativePattern);\n}\nexports.getNegativePatterns = getNegativePatterns;\nfunction getPositivePatterns(patterns) {\n return patterns.filter(isPositivePattern);\n}\nexports.getPositivePatterns = getPositivePatterns;\n/**\n * Returns patterns that can be applied inside the current directory.\n *\n * @example\n * // ['./*', '*', 'a/*']\n * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])\n */\nfunction getPatternsInsideCurrentDirectory(patterns) {\n return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern));\n}\nexports.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory;\n/**\n * Returns patterns to be expanded relative to (outside) the current directory.\n *\n * @example\n * // ['../*', './../*']\n * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])\n */\nfunction getPatternsOutsideCurrentDirectory(patterns) {\n return patterns.filter(isPatternRelatedToParentDirectory);\n}\nexports.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory;\nfunction isPatternRelatedToParentDirectory(pattern) {\n return pattern.startsWith('..') || pattern.startsWith('./..');\n}\nexports.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory;\nfunction getBaseDirectory(pattern) {\n return globParent(pattern, { flipBackslashes: false });\n}\nexports.getBaseDirectory = getBaseDirectory;\nfunction hasGlobStar(pattern) {\n return pattern.includes(GLOBSTAR);\n}\nexports.hasGlobStar = hasGlobStar;\nfunction endsWithSlashGlobStar(pattern) {\n return pattern.endsWith('/' + GLOBSTAR);\n}\nexports.endsWithSlashGlobStar = endsWithSlashGlobStar;\nfunction isAffectDepthOfReadingPattern(pattern) {\n const basename = path.basename(pattern);\n return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);\n}\nexports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;\nfunction expandPatternsWithBraceExpansion(patterns) {\n return patterns.reduce((collection, pattern) => {\n return collection.concat(expandBraceExpansion(pattern));\n }, []);\n}\nexports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion;\nfunction expandBraceExpansion(pattern) {\n const patterns = micromatch.braces(pattern, { expand: true, nodupes: true, keepEscaping: true });\n /**\n * Sort the patterns by length so that the same depth patterns are processed side by side.\n * `a/{b,}/{c,}/*` \u2013 `['a///*', 'a/b//*', 'a//c/*', 'a/b/c/*']`\n */\n patterns.sort((a, b) => a.length - b.length);\n /**\n * Micromatch can return an empty string in the case of patterns like `{a,}`.\n */\n return patterns.filter((pattern) => pattern !== '');\n}\nexports.expandBraceExpansion = expandBraceExpansion;\nfunction getPatternParts(pattern, options) {\n let { parts } = micromatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true }));\n /**\n * The scan method returns an empty array in some cases.\n * See micromatch/picomatch#58 for more details.\n */\n if (parts.length === 0) {\n parts = [pattern];\n }\n /**\n * The scan method does not return an empty part for the pattern with a forward slash.\n * This is another part of micromatch/picomatch#58.\n */\n if (parts[0].startsWith('/')) {\n parts[0] = parts[0].slice(1);\n parts.unshift('');\n }\n return parts;\n}\nexports.getPatternParts = getPatternParts;\nfunction makeRe(pattern, options) {\n return micromatch.makeRe(pattern, options);\n}\nexports.makeRe = makeRe;\nfunction convertPatternsToRe(patterns, options) {\n return patterns.map((pattern) => makeRe(pattern, options));\n}\nexports.convertPatternsToRe = convertPatternsToRe;\nfunction matchAny(entry, patternsRe) {\n return patternsRe.some((patternRe) => patternRe.test(entry));\n}\nexports.matchAny = matchAny;\n/**\n * This package only works with forward slashes as a path separator.\n * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes.\n */\nfunction removeDuplicateSlashes(pattern) {\n return pattern.replace(DOUBLE_SLASH_RE, '/');\n}\nexports.removeDuplicateSlashes = removeDuplicateSlashes;\nfunction partitionAbsoluteAndRelative(patterns) {\n const absolute = [];\n const relative = [];\n for (const pattern of patterns) {\n if (isAbsolute(pattern)) {\n absolute.push(pattern);\n }\n else {\n relative.push(pattern);\n }\n }\n return [absolute, relative];\n}\nexports.partitionAbsoluteAndRelative = partitionAbsoluteAndRelative;\nfunction isAbsolute(pattern) {\n return path.isAbsolute(pattern);\n}\nexports.isAbsolute = isAbsolute;\n", "'use strict'\n/*\n * merge2\n * https://github.com/teambition/merge2\n *\n * Copyright (c) 2014-2020 Teambition\n * Licensed under the MIT license.\n */\nconst Stream = require('stream')\nconst PassThrough = Stream.PassThrough\nconst slice = Array.prototype.slice\n\nmodule.exports = merge2\n\nfunction merge2 () {\n const streamsQueue = []\n const args = slice.call(arguments)\n let merging = false\n let options = args[args.length - 1]\n\n if (options && !Array.isArray(options) && options.pipe == null) {\n args.pop()\n } else {\n options = {}\n }\n\n const doEnd = options.end !== false\n const doPipeError = options.pipeError === true\n if (options.objectMode == null) {\n options.objectMode = true\n }\n if (options.highWaterMark == null) {\n options.highWaterMark = 64 * 1024\n }\n const mergedStream = PassThrough(options)\n\n function addStream () {\n for (let i = 0, len = arguments.length; i < len; i++) {\n streamsQueue.push(pauseStreams(arguments[i], options))\n }\n mergeStream()\n return this\n }\n\n function mergeStream () {\n if (merging) {\n return\n }\n merging = true\n\n let streams = streamsQueue.shift()\n if (!streams) {\n process.nextTick(endStream)\n return\n }\n if (!Array.isArray(streams)) {\n streams = [streams]\n }\n\n let pipesCount = streams.length + 1\n\n function next () {\n if (--pipesCount > 0) {\n return\n }\n merging = false\n mergeStream()\n }\n\n function pipe (stream) {\n function onend () {\n stream.removeListener('merge2UnpipeEnd', onend)\n stream.removeListener('end', onend)\n if (doPipeError) {\n stream.removeListener('error', onerror)\n }\n next()\n }\n function onerror (err) {\n mergedStream.emit('error', err)\n }\n // skip ended stream\n if (stream._readableState.endEmitted) {\n return next()\n }\n\n stream.on('merge2UnpipeEnd', onend)\n stream.on('end', onend)\n\n if (doPipeError) {\n stream.on('error', onerror)\n }\n\n stream.pipe(mergedStream, { end: false })\n // compatible for old stream\n stream.resume()\n }\n\n for (let i = 0; i < streams.length; i++) {\n pipe(streams[i])\n }\n\n next()\n }\n\n function endStream () {\n merging = false\n // emit 'queueDrain' when all streams merged.\n mergedStream.emit('queueDrain')\n if (doEnd) {\n mergedStream.end()\n }\n }\n\n mergedStream.setMaxListeners(0)\n mergedStream.add = addStream\n mergedStream.on('unpipe', function (stream) {\n stream.emit('merge2UnpipeEnd')\n })\n\n if (args.length) {\n addStream.apply(null, args)\n }\n return mergedStream\n}\n\n// check and pause streams for pipe.\nfunction pauseStreams (streams, options) {\n if (!Array.isArray(streams)) {\n // Backwards-compat with old-style streams\n if (!streams._readableState && streams.pipe) {\n streams = streams.pipe(PassThrough(options))\n }\n if (!streams._readableState || !streams.pause || !streams.pipe) {\n throw new Error('Only readable stream can be merged.')\n }\n streams.pause()\n } else {\n for (let i = 0, len = streams.length; i < len; i++) {\n streams[i] = pauseStreams(streams[i], options)\n }\n }\n return streams\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.merge = void 0;\nconst merge2 = require(\"merge2\");\nfunction merge(streams) {\n const mergedStream = merge2(streams);\n streams.forEach((stream) => {\n stream.once('error', (error) => mergedStream.emit('error', error));\n });\n mergedStream.once('close', () => propagateCloseEventToSources(streams));\n mergedStream.once('end', () => propagateCloseEventToSources(streams));\n return mergedStream;\n}\nexports.merge = merge;\nfunction propagateCloseEventToSources(streams) {\n streams.forEach((stream) => stream.emit('close'));\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isEmpty = exports.isString = void 0;\nfunction isString(input) {\n return typeof input === 'string';\n}\nexports.isString = isString;\nfunction isEmpty(input) {\n return input === '';\n}\nexports.isEmpty = isEmpty;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0;\nconst array = require(\"./array\");\nexports.array = array;\nconst errno = require(\"./errno\");\nexports.errno = errno;\nconst fs = require(\"./fs\");\nexports.fs = fs;\nconst path = require(\"./path\");\nexports.path = path;\nconst pattern = require(\"./pattern\");\nexports.pattern = pattern;\nconst stream = require(\"./stream\");\nexports.stream = stream;\nconst string = require(\"./string\");\nexports.string = string;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0;\nconst utils = require(\"../utils\");\nfunction generate(input, settings) {\n const patterns = processPatterns(input, settings);\n const ignore = processPatterns(settings.ignore, settings);\n const positivePatterns = getPositivePatterns(patterns);\n const negativePatterns = getNegativePatternsAsPositive(patterns, ignore);\n const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings));\n const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings));\n const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false);\n const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true);\n return staticTasks.concat(dynamicTasks);\n}\nexports.generate = generate;\nfunction processPatterns(input, settings) {\n let patterns = input;\n /**\n * The original pattern like `{,*,**,a/*}` can lead to problems checking the depth when matching entry\n * and some problems with the micromatch package (see fast-glob issues: #365, #394).\n *\n * To solve this problem, we expand all patterns containing brace expansion. This can lead to a slight slowdown\n * in matching in the case of a large set of patterns after expansion.\n */\n if (settings.braceExpansion) {\n patterns = utils.pattern.expandPatternsWithBraceExpansion(patterns);\n }\n /**\n * If the `baseNameMatch` option is enabled, we must add globstar to patterns, so that they can be used\n * at any nesting level.\n *\n * We do this here, because otherwise we have to complicate the filtering logic. For example, we need to change\n * the pattern in the filter before creating a regular expression. There is no need to change the patterns\n * in the application. Only on the input.\n */\n if (settings.baseNameMatch) {\n patterns = patterns.map((pattern) => pattern.includes('/') ? pattern : `**/${pattern}`);\n }\n /**\n * This method also removes duplicate slashes that may have been in the pattern or formed as a result of expansion.\n */\n return patterns.map((pattern) => utils.pattern.removeDuplicateSlashes(pattern));\n}\n/**\n * Returns tasks grouped by basic pattern directories.\n *\n * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately.\n * This is necessary because directory traversal starts at the base directory and goes deeper.\n */\nfunction convertPatternsToTasks(positive, negative, dynamic) {\n const tasks = [];\n const patternsOutsideCurrentDirectory = utils.pattern.getPatternsOutsideCurrentDirectory(positive);\n const patternsInsideCurrentDirectory = utils.pattern.getPatternsInsideCurrentDirectory(positive);\n const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory);\n const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory);\n tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic));\n /*\n * For the sake of reducing future accesses to the file system, we merge all tasks within the current directory\n * into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest.\n */\n if ('.' in insideCurrentDirectoryGroup) {\n tasks.push(convertPatternGroupToTask('.', patternsInsideCurrentDirectory, negative, dynamic));\n }\n else {\n tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic));\n }\n return tasks;\n}\nexports.convertPatternsToTasks = convertPatternsToTasks;\nfunction getPositivePatterns(patterns) {\n return utils.pattern.getPositivePatterns(patterns);\n}\nexports.getPositivePatterns = getPositivePatterns;\nfunction getNegativePatternsAsPositive(patterns, ignore) {\n const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore);\n const positive = negative.map(utils.pattern.convertToPositivePattern);\n return positive;\n}\nexports.getNegativePatternsAsPositive = getNegativePatternsAsPositive;\nfunction groupPatternsByBaseDirectory(patterns) {\n const group = {};\n return patterns.reduce((collection, pattern) => {\n const base = utils.pattern.getBaseDirectory(pattern);\n if (base in collection) {\n collection[base].push(pattern);\n }\n else {\n collection[base] = [pattern];\n }\n return collection;\n }, group);\n}\nexports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;\nfunction convertPatternGroupsToTasks(positive, negative, dynamic) {\n return Object.keys(positive).map((base) => {\n return convertPatternGroupToTask(base, positive[base], negative, dynamic);\n });\n}\nexports.convertPatternGroupsToTasks = convertPatternGroupsToTasks;\nfunction convertPatternGroupToTask(base, positive, negative, dynamic) {\n return {\n dynamic,\n positive,\n negative,\n base,\n patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern))\n };\n}\nexports.convertPatternGroupToTask = convertPatternGroupToTask;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.read = void 0;\nfunction read(path, settings, callback) {\n settings.fs.lstat(path, (lstatError, lstat) => {\n if (lstatError !== null) {\n callFailureCallback(callback, lstatError);\n return;\n }\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\n callSuccessCallback(callback, lstat);\n return;\n }\n settings.fs.stat(path, (statError, stat) => {\n if (statError !== null) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n callFailureCallback(callback, statError);\n return;\n }\n callSuccessCallback(callback, lstat);\n return;\n }\n if (settings.markSymbolicLink) {\n stat.isSymbolicLink = () => true;\n }\n callSuccessCallback(callback, stat);\n });\n });\n}\nexports.read = read;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, result) {\n callback(null, result);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.read = void 0;\nfunction read(path, settings) {\n const lstat = settings.fs.lstatSync(path);\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\n return lstat;\n }\n try {\n const stat = settings.fs.statSync(path);\n if (settings.markSymbolicLink) {\n stat.isSymbolicLink = () => true;\n }\n return stat;\n }\n catch (error) {\n if (!settings.throwErrorOnBrokenSymbolicLink) {\n return lstat;\n }\n throw error;\n }\n}\nexports.read = read;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nexports.FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n stat: fs.stat,\n lstatSync: fs.lstatSync,\n statSync: fs.statSync\n};\nfunction createFileSystemAdapter(fsMethods) {\n if (fsMethods === undefined) {\n return exports.FILE_SYSTEM_ADAPTER;\n }\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\n}\nexports.createFileSystemAdapter = createFileSystemAdapter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs = require(\"./adapters/fs\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true);\n this.fs = fs.createFileSystemAdapter(this._options.fs);\n this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.statSync = exports.stat = exports.Settings = void 0;\nconst async = require(\"./providers/async\");\nconst sync = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction stat(path, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n async.read(path, getSettings(), optionsOrSettingsOrCallback);\n return;\n }\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\n}\nexports.stat = stat;\nfunction statSync(path, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n return sync.read(path, settings);\n}\nexports.statSync = statSync;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "/*! queue-microtask. MIT License. Feross Aboukhadijeh */\nlet promise\n\nmodule.exports = typeof queueMicrotask === 'function'\n ? queueMicrotask.bind(typeof window !== 'undefined' ? window : global)\n // reuse resolved promise, and allocate it lazily\n : cb => (promise || (promise = Promise.resolve()))\n .then(cb)\n .catch(err => setTimeout(() => { throw err }, 0))\n", "/*! run-parallel. MIT License. Feross Aboukhadijeh */\nmodule.exports = runParallel\n\nconst queueMicrotask = require('queue-microtask')\n\nfunction runParallel (tasks, cb) {\n let results, pending, keys\n let isSync = true\n\n if (Array.isArray(tasks)) {\n results = []\n pending = tasks.length\n } else {\n keys = Object.keys(tasks)\n results = {}\n pending = keys.length\n }\n\n function done (err) {\n function end () {\n if (cb) cb(err, results)\n cb = null\n }\n if (isSync) queueMicrotask(end)\n else end()\n }\n\n function each (i, err, result) {\n results[i] = result\n if (--pending === 0 || err) {\n done(err)\n }\n }\n\n if (!pending) {\n // empty\n done(null)\n } else if (keys) {\n // object\n keys.forEach(function (key) {\n tasks[key](function (err, result) { each(key, err, result) })\n })\n } else {\n // array\n tasks.forEach(function (task, i) {\n task(function (err, result) { each(i, err, result) })\n })\n }\n\n isSync = false\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0;\nconst NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.');\nif (NODE_PROCESS_VERSION_PARTS[0] === undefined || NODE_PROCESS_VERSION_PARTS[1] === undefined) {\n throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);\n}\nconst MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10);\nconst MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10);\nconst SUPPORTED_MAJOR_VERSION = 10;\nconst SUPPORTED_MINOR_VERSION = 10;\nconst IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION;\nconst IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION;\n/**\n * IS `true` for Node.js 10.10 and greater.\n */\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createDirentFromStats = void 0;\nclass DirentFromStats {\n constructor(name, stats) {\n this.name = name;\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\n this.isDirectory = stats.isDirectory.bind(stats);\n this.isFIFO = stats.isFIFO.bind(stats);\n this.isFile = stats.isFile.bind(stats);\n this.isSocket = stats.isSocket.bind(stats);\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\n }\n}\nfunction createDirentFromStats(name, stats) {\n return new DirentFromStats(name, stats);\n}\nexports.createDirentFromStats = createDirentFromStats;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fs = void 0;\nconst fs = require(\"./fs\");\nexports.fs = fs;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.joinPathSegments = void 0;\nfunction joinPathSegments(a, b, separator) {\n /**\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\n */\n if (a.endsWith(separator)) {\n return a + b;\n }\n return a + separator + b;\n}\nexports.joinPathSegments = joinPathSegments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst rpl = require(\"run-parallel\");\nconst constants_1 = require(\"../constants\");\nconst utils = require(\"../utils\");\nconst common = require(\"./common\");\nfunction read(directory, settings, callback) {\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\n readdirWithFileTypes(directory, settings, callback);\n return;\n }\n readdir(directory, settings, callback);\n}\nexports.read = read;\nfunction readdirWithFileTypes(directory, settings, callback) {\n settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => {\n if (readdirError !== null) {\n callFailureCallback(callback, readdirError);\n return;\n }\n const entries = dirents.map((dirent) => ({\n dirent,\n name: dirent.name,\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\n }));\n if (!settings.followSymbolicLinks) {\n callSuccessCallback(callback, entries);\n return;\n }\n const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings));\n rpl(tasks, (rplError, rplEntries) => {\n if (rplError !== null) {\n callFailureCallback(callback, rplError);\n return;\n }\n callSuccessCallback(callback, rplEntries);\n });\n });\n}\nexports.readdirWithFileTypes = readdirWithFileTypes;\nfunction makeRplTaskEntry(entry, settings) {\n return (done) => {\n if (!entry.dirent.isSymbolicLink()) {\n done(null, entry);\n return;\n }\n settings.fs.stat(entry.path, (statError, stats) => {\n if (statError !== null) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n done(statError);\n return;\n }\n done(null, entry);\n return;\n }\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\n done(null, entry);\n });\n };\n}\nfunction readdir(directory, settings, callback) {\n settings.fs.readdir(directory, (readdirError, names) => {\n if (readdirError !== null) {\n callFailureCallback(callback, readdirError);\n return;\n }\n const tasks = names.map((name) => {\n const path = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);\n return (done) => {\n fsStat.stat(path, settings.fsStatSettings, (error, stats) => {\n if (error !== null) {\n done(error);\n return;\n }\n const entry = {\n name,\n path,\n dirent: utils.fs.createDirentFromStats(name, stats)\n };\n if (settings.stats) {\n entry.stats = stats;\n }\n done(null, entry);\n });\n };\n });\n rpl(tasks, (rplError, entries) => {\n if (rplError !== null) {\n callFailureCallback(callback, rplError);\n return;\n }\n callSuccessCallback(callback, entries);\n });\n });\n}\nexports.readdir = readdir;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, result) {\n callback(null, result);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst constants_1 = require(\"../constants\");\nconst utils = require(\"../utils\");\nconst common = require(\"./common\");\nfunction read(directory, settings) {\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\n return readdirWithFileTypes(directory, settings);\n }\n return readdir(directory, settings);\n}\nexports.read = read;\nfunction readdirWithFileTypes(directory, settings) {\n const dirents = settings.fs.readdirSync(directory, { withFileTypes: true });\n return dirents.map((dirent) => {\n const entry = {\n dirent,\n name: dirent.name,\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\n };\n if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) {\n try {\n const stats = settings.fs.statSync(entry.path);\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\n }\n catch (error) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n throw error;\n }\n }\n }\n return entry;\n });\n}\nexports.readdirWithFileTypes = readdirWithFileTypes;\nfunction readdir(directory, settings) {\n const names = settings.fs.readdirSync(directory);\n return names.map((name) => {\n const entryPath = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);\n const stats = fsStat.statSync(entryPath, settings.fsStatSettings);\n const entry = {\n name,\n path: entryPath,\n dirent: utils.fs.createDirentFromStats(name, stats)\n };\n if (settings.stats) {\n entry.stats = stats;\n }\n return entry;\n });\n}\nexports.readdir = readdir;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nexports.FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n stat: fs.stat,\n lstatSync: fs.lstatSync,\n statSync: fs.statSync,\n readdir: fs.readdir,\n readdirSync: fs.readdirSync\n};\nfunction createFileSystemAdapter(fsMethods) {\n if (fsMethods === undefined) {\n return exports.FILE_SYSTEM_ADAPTER;\n }\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\n}\nexports.createFileSystemAdapter = createFileSystemAdapter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fs = require(\"./adapters/fs\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false);\n this.fs = fs.createFileSystemAdapter(this._options.fs);\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\n this.stats = this._getValue(this._options.stats, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\n this.fsStatSettings = new fsStat.Settings({\n followSymbolicLink: this.followSymbolicLinks,\n fs: this.fs,\n throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink\n });\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Settings = exports.scandirSync = exports.scandir = void 0;\nconst async = require(\"./providers/async\");\nconst sync = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction scandir(path, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n async.read(path, getSettings(), optionsOrSettingsOrCallback);\n return;\n }\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\n}\nexports.scandir = scandir;\nfunction scandirSync(path, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n return sync.read(path, settings);\n}\nexports.scandirSync = scandirSync;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "'use strict'\n\nfunction reusify (Constructor) {\n var head = new Constructor()\n var tail = head\n\n function get () {\n var current = head\n\n if (current.next) {\n head = current.next\n } else {\n head = new Constructor()\n tail = head\n }\n\n current.next = null\n\n return current\n }\n\n function release (obj) {\n tail.next = obj\n tail = obj\n }\n\n return {\n get: get,\n release: release\n }\n}\n\nmodule.exports = reusify\n", "'use strict'\n\n/* eslint-disable no-var */\n\nvar reusify = require('reusify')\n\nfunction fastqueue (context, worker, _concurrency) {\n if (typeof context === 'function') {\n _concurrency = worker\n worker = context\n context = null\n }\n\n if (!(_concurrency >= 1)) {\n throw new Error('fastqueue concurrency must be equal to or greater than 1')\n }\n\n var cache = reusify(Task)\n var queueHead = null\n var queueTail = null\n var _running = 0\n var errorHandler = null\n\n var self = {\n push: push,\n drain: noop,\n saturated: noop,\n pause: pause,\n paused: false,\n\n get concurrency () {\n return _concurrency\n },\n set concurrency (value) {\n if (!(value >= 1)) {\n throw new Error('fastqueue concurrency must be equal to or greater than 1')\n }\n _concurrency = value\n\n if (self.paused) return\n for (; queueHead && _running < _concurrency;) {\n _running++\n release()\n }\n },\n\n running: running,\n resume: resume,\n idle: idle,\n length: length,\n getQueue: getQueue,\n unshift: unshift,\n empty: noop,\n kill: kill,\n killAndDrain: killAndDrain,\n error: error,\n abort: abort\n }\n\n return self\n\n function running () {\n return _running\n }\n\n function pause () {\n self.paused = true\n }\n\n function length () {\n var current = queueHead\n var counter = 0\n\n while (current) {\n current = current.next\n counter++\n }\n\n return counter\n }\n\n function getQueue () {\n var current = queueHead\n var tasks = []\n\n while (current) {\n tasks.push(current.value)\n current = current.next\n }\n\n return tasks\n }\n\n function resume () {\n if (!self.paused) return\n self.paused = false\n if (queueHead === null) {\n _running++\n release()\n return\n }\n for (; queueHead && _running < _concurrency;) {\n _running++\n release()\n }\n }\n\n function idle () {\n return _running === 0 && self.length() === 0\n }\n\n function push (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n current.errorHandler = errorHandler\n\n if (_running >= _concurrency || self.paused) {\n if (queueTail) {\n queueTail.next = current\n queueTail = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function unshift (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n current.errorHandler = errorHandler\n\n if (_running >= _concurrency || self.paused) {\n if (queueHead) {\n current.next = queueHead\n queueHead = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function release (holder) {\n if (holder) {\n cache.release(holder)\n }\n var next = queueHead\n if (next && _running <= _concurrency) {\n if (!self.paused) {\n if (queueTail === queueHead) {\n queueTail = null\n }\n queueHead = next.next\n next.next = null\n worker.call(context, next.value, next.worked)\n if (queueTail === null) {\n self.empty()\n }\n } else {\n _running--\n }\n } else if (--_running === 0) {\n self.drain()\n }\n }\n\n function kill () {\n queueHead = null\n queueTail = null\n self.drain = noop\n }\n\n function killAndDrain () {\n queueHead = null\n queueTail = null\n self.drain()\n self.drain = noop\n }\n\n function abort () {\n var current = queueHead\n queueHead = null\n queueTail = null\n\n while (current) {\n var next = current.next\n var callback = current.callback\n var errorHandler = current.errorHandler\n var val = current.value\n var context = current.context\n\n // Reset the task state\n current.value = null\n current.callback = noop\n current.errorHandler = null\n\n // Call error handler if present\n if (errorHandler) {\n errorHandler(new Error('abort'), val)\n }\n\n // Call callback with error\n callback.call(context, new Error('abort'))\n\n // Release the task back to the pool\n current.release(current)\n\n current = next\n }\n\n self.drain = noop\n }\n\n function error (handler) {\n errorHandler = handler\n }\n}\n\nfunction noop () {}\n\nfunction Task () {\n this.value = null\n this.callback = noop\n this.next = null\n this.release = noop\n this.context = null\n this.errorHandler = null\n\n var self = this\n\n this.worked = function worked (err, result) {\n var callback = self.callback\n var errorHandler = self.errorHandler\n var val = self.value\n self.value = null\n self.callback = noop\n if (self.errorHandler) {\n errorHandler(err, val)\n }\n callback.call(self.context, err, result)\n self.release(self)\n }\n}\n\nfunction queueAsPromised (context, worker, _concurrency) {\n if (typeof context === 'function') {\n _concurrency = worker\n worker = context\n context = null\n }\n\n function asyncWrapper (arg, cb) {\n worker.call(this, arg)\n .then(function (res) {\n cb(null, res)\n }, cb)\n }\n\n var queue = fastqueue(context, asyncWrapper, _concurrency)\n\n var pushCb = queue.push\n var unshiftCb = queue.unshift\n\n queue.push = push\n queue.unshift = unshift\n queue.drained = drained\n\n return queue\n\n function push (value) {\n var p = new Promise(function (resolve, reject) {\n pushCb(value, function (err, result) {\n if (err) {\n reject(err)\n return\n }\n resolve(result)\n })\n })\n\n // Let's fork the promise chain to\n // make the error bubble up to the user but\n // not lead to a unhandledRejection\n p.catch(noop)\n\n return p\n }\n\n function unshift (value) {\n var p = new Promise(function (resolve, reject) {\n unshiftCb(value, function (err, result) {\n if (err) {\n reject(err)\n return\n }\n resolve(result)\n })\n })\n\n // Let's fork the promise chain to\n // make the error bubble up to the user but\n // not lead to a unhandledRejection\n p.catch(noop)\n\n return p\n }\n\n function drained () {\n var p = new Promise(function (resolve) {\n process.nextTick(function () {\n if (queue.idle()) {\n resolve()\n } else {\n var previousDrain = queue.drain\n queue.drain = function () {\n if (typeof previousDrain === 'function') previousDrain()\n resolve()\n queue.drain = previousDrain\n }\n }\n })\n })\n\n return p\n }\n}\n\nmodule.exports = fastqueue\nmodule.exports.promise = queueAsPromised\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.joinPathSegments = exports.replacePathSegmentSeparator = exports.isAppliedFilter = exports.isFatalError = void 0;\nfunction isFatalError(settings, error) {\n if (settings.errorFilter === null) {\n return true;\n }\n return !settings.errorFilter(error);\n}\nexports.isFatalError = isFatalError;\nfunction isAppliedFilter(filter, value) {\n return filter === null || filter(value);\n}\nexports.isAppliedFilter = isAppliedFilter;\nfunction replacePathSegmentSeparator(filepath, separator) {\n return filepath.split(/[/\\\\]/).join(separator);\n}\nexports.replacePathSegmentSeparator = replacePathSegmentSeparator;\nfunction joinPathSegments(a, b, separator) {\n if (a === '') {\n return b;\n }\n /**\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\n */\n if (a.endsWith(separator)) {\n return a + b;\n }\n return a + separator + b;\n}\nexports.joinPathSegments = joinPathSegments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst common = require(\"./common\");\nclass Reader {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator);\n }\n}\nexports.default = Reader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nconst fastq = require(\"fastq\");\nconst common = require(\"./common\");\nconst reader_1 = require(\"./reader\");\nclass AsyncReader extends reader_1.default {\n constructor(_root, _settings) {\n super(_root, _settings);\n this._settings = _settings;\n this._scandir = fsScandir.scandir;\n this._emitter = new events_1.EventEmitter();\n this._queue = fastq(this._worker.bind(this), this._settings.concurrency);\n this._isFatalError = false;\n this._isDestroyed = false;\n this._queue.drain = () => {\n if (!this._isFatalError) {\n this._emitter.emit('end');\n }\n };\n }\n read() {\n this._isFatalError = false;\n this._isDestroyed = false;\n setImmediate(() => {\n this._pushToQueue(this._root, this._settings.basePath);\n });\n return this._emitter;\n }\n get isDestroyed() {\n return this._isDestroyed;\n }\n destroy() {\n if (this._isDestroyed) {\n throw new Error('The reader is already destroyed');\n }\n this._isDestroyed = true;\n this._queue.killAndDrain();\n }\n onEntry(callback) {\n this._emitter.on('entry', callback);\n }\n onError(callback) {\n this._emitter.once('error', callback);\n }\n onEnd(callback) {\n this._emitter.once('end', callback);\n }\n _pushToQueue(directory, base) {\n const queueItem = { directory, base };\n this._queue.push(queueItem, (error) => {\n if (error !== null) {\n this._handleError(error);\n }\n });\n }\n _worker(item, done) {\n this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => {\n if (error !== null) {\n done(error, undefined);\n return;\n }\n for (const entry of entries) {\n this._handleEntry(entry, item.base);\n }\n done(null, undefined);\n });\n }\n _handleError(error) {\n if (this._isDestroyed || !common.isFatalError(this._settings, error)) {\n return;\n }\n this._isFatalError = true;\n this._isDestroyed = true;\n this._emitter.emit('error', error);\n }\n _handleEntry(entry, base) {\n if (this._isDestroyed || this._isFatalError) {\n return;\n }\n const fullpath = entry.path;\n if (base !== undefined) {\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\n }\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\n this._emitEntry(entry);\n }\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\n this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);\n }\n }\n _emitEntry(entry) {\n this._emitter.emit('entry', entry);\n }\n}\nexports.default = AsyncReader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst async_1 = require(\"../readers/async\");\nclass AsyncProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new async_1.default(this._root, this._settings);\n this._storage = [];\n }\n read(callback) {\n this._reader.onError((error) => {\n callFailureCallback(callback, error);\n });\n this._reader.onEntry((entry) => {\n this._storage.push(entry);\n });\n this._reader.onEnd(() => {\n callSuccessCallback(callback, this._storage);\n });\n this._reader.read();\n }\n}\nexports.default = AsyncProvider;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, entries) {\n callback(null, entries);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst async_1 = require(\"../readers/async\");\nclass StreamProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new async_1.default(this._root, this._settings);\n this._stream = new stream_1.Readable({\n objectMode: true,\n read: () => { },\n destroy: () => {\n if (!this._reader.isDestroyed) {\n this._reader.destroy();\n }\n }\n });\n }\n read() {\n this._reader.onError((error) => {\n this._stream.emit('error', error);\n });\n this._reader.onEntry((entry) => {\n this._stream.push(entry);\n });\n this._reader.onEnd(() => {\n this._stream.push(null);\n });\n this._reader.read();\n return this._stream;\n }\n}\nexports.default = StreamProvider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nconst common = require(\"./common\");\nconst reader_1 = require(\"./reader\");\nclass SyncReader extends reader_1.default {\n constructor() {\n super(...arguments);\n this._scandir = fsScandir.scandirSync;\n this._storage = [];\n this._queue = new Set();\n }\n read() {\n this._pushToQueue(this._root, this._settings.basePath);\n this._handleQueue();\n return this._storage;\n }\n _pushToQueue(directory, base) {\n this._queue.add({ directory, base });\n }\n _handleQueue() {\n for (const item of this._queue.values()) {\n this._handleDirectory(item.directory, item.base);\n }\n }\n _handleDirectory(directory, base) {\n try {\n const entries = this._scandir(directory, this._settings.fsScandirSettings);\n for (const entry of entries) {\n this._handleEntry(entry, base);\n }\n }\n catch (error) {\n this._handleError(error);\n }\n }\n _handleError(error) {\n if (!common.isFatalError(this._settings, error)) {\n return;\n }\n throw error;\n }\n _handleEntry(entry, base) {\n const fullpath = entry.path;\n if (base !== undefined) {\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\n }\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\n this._pushToStorage(entry);\n }\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\n this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);\n }\n }\n _pushToStorage(entry) {\n this._storage.push(entry);\n }\n}\nexports.default = SyncReader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst sync_1 = require(\"../readers/sync\");\nclass SyncProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new sync_1.default(this._root, this._settings);\n }\n read() {\n return this._reader.read();\n }\n}\nexports.default = SyncProvider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.basePath = this._getValue(this._options.basePath, undefined);\n this.concurrency = this._getValue(this._options.concurrency, Number.POSITIVE_INFINITY);\n this.deepFilter = this._getValue(this._options.deepFilter, null);\n this.entryFilter = this._getValue(this._options.entryFilter, null);\n this.errorFilter = this._getValue(this._options.errorFilter, null);\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\n this.fsScandirSettings = new fsScandir.Settings({\n followSymbolicLinks: this._options.followSymbolicLinks,\n fs: this._options.fs,\n pathSegmentSeparator: this._options.pathSegmentSeparator,\n stats: this._options.stats,\n throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink\n });\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Settings = exports.walkStream = exports.walkSync = exports.walk = void 0;\nconst async_1 = require(\"./providers/async\");\nconst stream_1 = require(\"./providers/stream\");\nconst sync_1 = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction walk(directory, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback);\n return;\n }\n new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback);\n}\nexports.walk = walk;\nfunction walkSync(directory, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n const provider = new sync_1.default(directory, settings);\n return provider.read();\n}\nexports.walkSync = walkSync;\nfunction walkStream(directory, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n const provider = new stream_1.default(directory, settings);\n return provider.read();\n}\nexports.walkStream = walkStream;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst utils = require(\"../utils\");\nclass Reader {\n constructor(_settings) {\n this._settings = _settings;\n this._fsStatSettings = new fsStat.Settings({\n followSymbolicLink: this._settings.followSymbolicLinks,\n fs: this._settings.fs,\n throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks\n });\n }\n _getFullEntryPath(filepath) {\n return path.resolve(this._settings.cwd, filepath);\n }\n _makeEntry(stats, pattern) {\n const entry = {\n name: pattern,\n path: pattern,\n dirent: utils.fs.createDirentFromStats(pattern, stats)\n };\n if (this._settings.stats) {\n entry.stats = stats;\n }\n return entry;\n }\n _isFatalError(error) {\n return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors;\n }\n}\nexports.default = Reader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fsWalk = require(\"@nodelib/fs.walk\");\nconst reader_1 = require(\"./reader\");\nclass ReaderStream extends reader_1.default {\n constructor() {\n super(...arguments);\n this._walkStream = fsWalk.walkStream;\n this._stat = fsStat.stat;\n }\n dynamic(root, options) {\n return this._walkStream(root, options);\n }\n static(patterns, options) {\n const filepaths = patterns.map(this._getFullEntryPath, this);\n const stream = new stream_1.PassThrough({ objectMode: true });\n stream._write = (index, _enc, done) => {\n return this._getEntry(filepaths[index], patterns[index], options)\n .then((entry) => {\n if (entry !== null && options.entryFilter(entry)) {\n stream.push(entry);\n }\n if (index === filepaths.length - 1) {\n stream.end();\n }\n done();\n })\n .catch(done);\n };\n for (let i = 0; i < filepaths.length; i++) {\n stream.write(i);\n }\n return stream;\n }\n _getEntry(filepath, pattern, options) {\n return this._getStat(filepath)\n .then((stats) => this._makeEntry(stats, pattern))\n .catch((error) => {\n if (options.errorFilter(error)) {\n return null;\n }\n throw error;\n });\n }\n _getStat(filepath) {\n return new Promise((resolve, reject) => {\n this._stat(filepath, this._fsStatSettings, (error, stats) => {\n return error === null ? resolve(stats) : reject(error);\n });\n });\n }\n}\nexports.default = ReaderStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsWalk = require(\"@nodelib/fs.walk\");\nconst reader_1 = require(\"./reader\");\nconst stream_1 = require(\"./stream\");\nclass ReaderAsync extends reader_1.default {\n constructor() {\n super(...arguments);\n this._walkAsync = fsWalk.walk;\n this._readerStream = new stream_1.default(this._settings);\n }\n dynamic(root, options) {\n return new Promise((resolve, reject) => {\n this._walkAsync(root, options, (error, entries) => {\n if (error === null) {\n resolve(entries);\n }\n else {\n reject(error);\n }\n });\n });\n }\n async static(patterns, options) {\n const entries = [];\n const stream = this._readerStream.static(patterns, options);\n // After #235, replace it with an asynchronous iterator.\n return new Promise((resolve, reject) => {\n stream.once('error', reject);\n stream.on('data', (entry) => entries.push(entry));\n stream.once('end', () => resolve(entries));\n });\n }\n}\nexports.default = ReaderAsync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass Matcher {\n constructor(_patterns, _settings, _micromatchOptions) {\n this._patterns = _patterns;\n this._settings = _settings;\n this._micromatchOptions = _micromatchOptions;\n this._storage = [];\n this._fillStorage();\n }\n _fillStorage() {\n for (const pattern of this._patterns) {\n const segments = this._getPatternSegments(pattern);\n const sections = this._splitSegmentsIntoSections(segments);\n this._storage.push({\n complete: sections.length <= 1,\n pattern,\n segments,\n sections\n });\n }\n }\n _getPatternSegments(pattern) {\n const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions);\n return parts.map((part) => {\n const dynamic = utils.pattern.isDynamicPattern(part, this._settings);\n if (!dynamic) {\n return {\n dynamic: false,\n pattern: part\n };\n }\n return {\n dynamic: true,\n pattern: part,\n patternRe: utils.pattern.makeRe(part, this._micromatchOptions)\n };\n });\n }\n _splitSegmentsIntoSections(segments) {\n return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern));\n }\n}\nexports.default = Matcher;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst matcher_1 = require(\"./matcher\");\nclass PartialMatcher extends matcher_1.default {\n match(filepath) {\n const parts = filepath.split('/');\n const levels = parts.length;\n const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels);\n for (const pattern of patterns) {\n const section = pattern.sections[0];\n /**\n * In this case, the pattern has a globstar and we must read all directories unconditionally,\n * but only if the level has reached the end of the first group.\n *\n * fixtures/{a,b}/**\n * ^ true/false ^ always true\n */\n if (!pattern.complete && levels > section.length) {\n return true;\n }\n const match = parts.every((part, index) => {\n const segment = pattern.segments[index];\n if (segment.dynamic && segment.patternRe.test(part)) {\n return true;\n }\n if (!segment.dynamic && segment.pattern === part) {\n return true;\n }\n return false;\n });\n if (match) {\n return true;\n }\n }\n return false;\n }\n}\nexports.default = PartialMatcher;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nconst partial_1 = require(\"../matchers/partial\");\nclass DeepFilter {\n constructor(_settings, _micromatchOptions) {\n this._settings = _settings;\n this._micromatchOptions = _micromatchOptions;\n }\n getFilter(basePath, positive, negative) {\n const matcher = this._getMatcher(positive);\n const negativeRe = this._getNegativePatternsRe(negative);\n return (entry) => this._filter(basePath, entry, matcher, negativeRe);\n }\n _getMatcher(patterns) {\n return new partial_1.default(patterns, this._settings, this._micromatchOptions);\n }\n _getNegativePatternsRe(patterns) {\n const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern);\n return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions);\n }\n _filter(basePath, entry, matcher, negativeRe) {\n if (this._isSkippedByDeep(basePath, entry.path)) {\n return false;\n }\n if (this._isSkippedSymbolicLink(entry)) {\n return false;\n }\n const filepath = utils.path.removeLeadingDotSegment(entry.path);\n if (this._isSkippedByPositivePatterns(filepath, matcher)) {\n return false;\n }\n return this._isSkippedByNegativePatterns(filepath, negativeRe);\n }\n _isSkippedByDeep(basePath, entryPath) {\n /**\n * Avoid unnecessary depth calculations when it doesn't matter.\n */\n if (this._settings.deep === Infinity) {\n return false;\n }\n return this._getEntryLevel(basePath, entryPath) >= this._settings.deep;\n }\n _getEntryLevel(basePath, entryPath) {\n const entryPathDepth = entryPath.split('/').length;\n if (basePath === '') {\n return entryPathDepth;\n }\n const basePathDepth = basePath.split('/').length;\n return entryPathDepth - basePathDepth;\n }\n _isSkippedSymbolicLink(entry) {\n return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink();\n }\n _isSkippedByPositivePatterns(entryPath, matcher) {\n return !this._settings.baseNameMatch && !matcher.match(entryPath);\n }\n _isSkippedByNegativePatterns(entryPath, patternsRe) {\n return !utils.pattern.matchAny(entryPath, patternsRe);\n }\n}\nexports.default = DeepFilter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass EntryFilter {\n constructor(_settings, _micromatchOptions) {\n this._settings = _settings;\n this._micromatchOptions = _micromatchOptions;\n this.index = new Map();\n }\n getFilter(positive, negative) {\n const [absoluteNegative, relativeNegative] = utils.pattern.partitionAbsoluteAndRelative(negative);\n const patterns = {\n positive: {\n all: utils.pattern.convertPatternsToRe(positive, this._micromatchOptions)\n },\n negative: {\n absolute: utils.pattern.convertPatternsToRe(absoluteNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true })),\n relative: utils.pattern.convertPatternsToRe(relativeNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true }))\n }\n };\n return (entry) => this._filter(entry, patterns);\n }\n _filter(entry, patterns) {\n const filepath = utils.path.removeLeadingDotSegment(entry.path);\n if (this._settings.unique && this._isDuplicateEntry(filepath)) {\n return false;\n }\n if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) {\n return false;\n }\n const isMatched = this._isMatchToPatternsSet(filepath, patterns, entry.dirent.isDirectory());\n if (this._settings.unique && isMatched) {\n this._createIndexRecord(filepath);\n }\n return isMatched;\n }\n _isDuplicateEntry(filepath) {\n return this.index.has(filepath);\n }\n _createIndexRecord(filepath) {\n this.index.set(filepath, undefined);\n }\n _onlyFileFilter(entry) {\n return this._settings.onlyFiles && !entry.dirent.isFile();\n }\n _onlyDirectoryFilter(entry) {\n return this._settings.onlyDirectories && !entry.dirent.isDirectory();\n }\n _isMatchToPatternsSet(filepath, patterns, isDirectory) {\n const isMatched = this._isMatchToPatterns(filepath, patterns.positive.all, isDirectory);\n if (!isMatched) {\n return false;\n }\n const isMatchedByRelativeNegative = this._isMatchToPatterns(filepath, patterns.negative.relative, isDirectory);\n if (isMatchedByRelativeNegative) {\n return false;\n }\n const isMatchedByAbsoluteNegative = this._isMatchToAbsoluteNegative(filepath, patterns.negative.absolute, isDirectory);\n if (isMatchedByAbsoluteNegative) {\n return false;\n }\n return true;\n }\n _isMatchToAbsoluteNegative(filepath, patternsRe, isDirectory) {\n if (patternsRe.length === 0) {\n return false;\n }\n const fullpath = utils.path.makeAbsolute(this._settings.cwd, filepath);\n return this._isMatchToPatterns(fullpath, patternsRe, isDirectory);\n }\n _isMatchToPatterns(filepath, patternsRe, isDirectory) {\n if (patternsRe.length === 0) {\n return false;\n }\n // Trying to match files and directories by patterns.\n const isMatched = utils.pattern.matchAny(filepath, patternsRe);\n // A pattern with a trailling slash can be used for directory matching.\n // To apply such pattern, we need to add a tralling slash to the path.\n if (!isMatched && isDirectory) {\n return utils.pattern.matchAny(filepath + '/', patternsRe);\n }\n return isMatched;\n }\n}\nexports.default = EntryFilter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass ErrorFilter {\n constructor(_settings) {\n this._settings = _settings;\n }\n getFilter() {\n return (error) => this._isNonFatalError(error);\n }\n _isNonFatalError(error) {\n return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors;\n }\n}\nexports.default = ErrorFilter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass EntryTransformer {\n constructor(_settings) {\n this._settings = _settings;\n }\n getTransformer() {\n return (entry) => this._transform(entry);\n }\n _transform(entry) {\n let filepath = entry.path;\n if (this._settings.absolute) {\n filepath = utils.path.makeAbsolute(this._settings.cwd, filepath);\n filepath = utils.path.unixify(filepath);\n }\n if (this._settings.markDirectories && entry.dirent.isDirectory()) {\n filepath += '/';\n }\n if (!this._settings.objectMode) {\n return filepath;\n }\n return Object.assign(Object.assign({}, entry), { path: filepath });\n }\n}\nexports.default = EntryTransformer;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst deep_1 = require(\"./filters/deep\");\nconst entry_1 = require(\"./filters/entry\");\nconst error_1 = require(\"./filters/error\");\nconst entry_2 = require(\"./transformers/entry\");\nclass Provider {\n constructor(_settings) {\n this._settings = _settings;\n this.errorFilter = new error_1.default(this._settings);\n this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions());\n this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions());\n this.entryTransformer = new entry_2.default(this._settings);\n }\n _getRootDirectory(task) {\n return path.resolve(this._settings.cwd, task.base);\n }\n _getReaderOptions(task) {\n const basePath = task.base === '.' ? '' : task.base;\n return {\n basePath,\n pathSegmentSeparator: '/',\n concurrency: this._settings.concurrency,\n deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative),\n entryFilter: this.entryFilter.getFilter(task.positive, task.negative),\n errorFilter: this.errorFilter.getFilter(),\n followSymbolicLinks: this._settings.followSymbolicLinks,\n fs: this._settings.fs,\n stats: this._settings.stats,\n throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink,\n transform: this.entryTransformer.getTransformer()\n };\n }\n _getMicromatchOptions() {\n return {\n dot: this._settings.dot,\n matchBase: this._settings.baseNameMatch,\n nobrace: !this._settings.braceExpansion,\n nocase: !this._settings.caseSensitiveMatch,\n noext: !this._settings.extglob,\n noglobstar: !this._settings.globstar,\n posix: true,\n strictSlashes: false\n };\n }\n}\nexports.default = Provider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst async_1 = require(\"../readers/async\");\nconst provider_1 = require(\"./provider\");\nclass ProviderAsync extends provider_1.default {\n constructor() {\n super(...arguments);\n this._reader = new async_1.default(this._settings);\n }\n async read(task) {\n const root = this._getRootDirectory(task);\n const options = this._getReaderOptions(task);\n const entries = await this.api(root, task, options);\n return entries.map((entry) => options.transform(entry));\n }\n api(root, task, options) {\n if (task.dynamic) {\n return this._reader.dynamic(root, options);\n }\n return this._reader.static(task.patterns, options);\n }\n}\nexports.default = ProviderAsync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst stream_2 = require(\"../readers/stream\");\nconst provider_1 = require(\"./provider\");\nclass ProviderStream extends provider_1.default {\n constructor() {\n super(...arguments);\n this._reader = new stream_2.default(this._settings);\n }\n read(task) {\n const root = this._getRootDirectory(task);\n const options = this._getReaderOptions(task);\n const source = this.api(root, task, options);\n const destination = new stream_1.Readable({ objectMode: true, read: () => { } });\n source\n .once('error', (error) => destination.emit('error', error))\n .on('data', (entry) => destination.emit('data', options.transform(entry)))\n .once('end', () => destination.emit('end'));\n destination\n .once('close', () => source.destroy());\n return destination;\n }\n api(root, task, options) {\n if (task.dynamic) {\n return this._reader.dynamic(root, options);\n }\n return this._reader.static(task.patterns, options);\n }\n}\nexports.default = ProviderStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fsWalk = require(\"@nodelib/fs.walk\");\nconst reader_1 = require(\"./reader\");\nclass ReaderSync extends reader_1.default {\n constructor() {\n super(...arguments);\n this._walkSync = fsWalk.walkSync;\n this._statSync = fsStat.statSync;\n }\n dynamic(root, options) {\n return this._walkSync(root, options);\n }\n static(patterns, options) {\n const entries = [];\n for (const pattern of patterns) {\n const filepath = this._getFullEntryPath(pattern);\n const entry = this._getEntry(filepath, pattern, options);\n if (entry === null || !options.entryFilter(entry)) {\n continue;\n }\n entries.push(entry);\n }\n return entries;\n }\n _getEntry(filepath, pattern, options) {\n try {\n const stats = this._getStat(filepath);\n return this._makeEntry(stats, pattern);\n }\n catch (error) {\n if (options.errorFilter(error)) {\n return null;\n }\n throw error;\n }\n }\n _getStat(filepath) {\n return this._statSync(filepath, this._fsStatSettings);\n }\n}\nexports.default = ReaderSync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst sync_1 = require(\"../readers/sync\");\nconst provider_1 = require(\"./provider\");\nclass ProviderSync extends provider_1.default {\n constructor() {\n super(...arguments);\n this._reader = new sync_1.default(this._settings);\n }\n read(task) {\n const root = this._getRootDirectory(task);\n const options = this._getReaderOptions(task);\n const entries = this.api(root, task, options);\n return entries.map(options.transform);\n }\n api(root, task, options) {\n if (task.dynamic) {\n return this._reader.dynamic(root, options);\n }\n return this._reader.static(task.patterns, options);\n }\n}\nexports.default = ProviderSync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nconst os = require(\"os\");\n/**\n * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero.\n * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107\n */\nconst CPU_COUNT = Math.max(os.cpus().length, 1);\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n lstatSync: fs.lstatSync,\n stat: fs.stat,\n statSync: fs.statSync,\n readdir: fs.readdir,\n readdirSync: fs.readdirSync\n};\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.absolute = this._getValue(this._options.absolute, false);\n this.baseNameMatch = this._getValue(this._options.baseNameMatch, false);\n this.braceExpansion = this._getValue(this._options.braceExpansion, true);\n this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true);\n this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT);\n this.cwd = this._getValue(this._options.cwd, process.cwd());\n this.deep = this._getValue(this._options.deep, Infinity);\n this.dot = this._getValue(this._options.dot, false);\n this.extglob = this._getValue(this._options.extglob, true);\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true);\n this.fs = this._getFileSystemMethods(this._options.fs);\n this.globstar = this._getValue(this._options.globstar, true);\n this.ignore = this._getValue(this._options.ignore, []);\n this.markDirectories = this._getValue(this._options.markDirectories, false);\n this.objectMode = this._getValue(this._options.objectMode, false);\n this.onlyDirectories = this._getValue(this._options.onlyDirectories, false);\n this.onlyFiles = this._getValue(this._options.onlyFiles, true);\n this.stats = this._getValue(this._options.stats, false);\n this.suppressErrors = this._getValue(this._options.suppressErrors, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false);\n this.unique = this._getValue(this._options.unique, true);\n if (this.onlyDirectories) {\n this.onlyFiles = false;\n }\n if (this.stats) {\n this.objectMode = true;\n }\n // Remove the cast to the array in the next major (#404).\n this.ignore = [].concat(this.ignore);\n }\n _getValue(option, value) {\n return option === undefined ? value : option;\n }\n _getFileSystemMethods(methods = {}) {\n return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods);\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nconst taskManager = require(\"./managers/tasks\");\nconst async_1 = require(\"./providers/async\");\nconst stream_1 = require(\"./providers/stream\");\nconst sync_1 = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nconst utils = require(\"./utils\");\nasync function FastGlob(source, options) {\n assertPatternsInput(source);\n const works = getWorks(source, async_1.default, options);\n const result = await Promise.all(works);\n return utils.array.flatten(result);\n}\n// https://github.com/typescript-eslint/typescript-eslint/issues/60\n// eslint-disable-next-line no-redeclare\n(function (FastGlob) {\n FastGlob.glob = FastGlob;\n FastGlob.globSync = sync;\n FastGlob.globStream = stream;\n FastGlob.async = FastGlob;\n function sync(source, options) {\n assertPatternsInput(source);\n const works = getWorks(source, sync_1.default, options);\n return utils.array.flatten(works);\n }\n FastGlob.sync = sync;\n function stream(source, options) {\n assertPatternsInput(source);\n const works = getWorks(source, stream_1.default, options);\n /**\n * The stream returned by the provider cannot work with an asynchronous iterator.\n * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams.\n * This affects performance (+25%). I don't see best solution right now.\n */\n return utils.stream.merge(works);\n }\n FastGlob.stream = stream;\n function generateTasks(source, options) {\n assertPatternsInput(source);\n const patterns = [].concat(source);\n const settings = new settings_1.default(options);\n return taskManager.generate(patterns, settings);\n }\n FastGlob.generateTasks = generateTasks;\n function isDynamicPattern(source, options) {\n assertPatternsInput(source);\n const settings = new settings_1.default(options);\n return utils.pattern.isDynamicPattern(source, settings);\n }\n FastGlob.isDynamicPattern = isDynamicPattern;\n function escapePath(source) {\n assertPatternsInput(source);\n return utils.path.escape(source);\n }\n FastGlob.escapePath = escapePath;\n function convertPathToPattern(source) {\n assertPatternsInput(source);\n return utils.path.convertPathToPattern(source);\n }\n FastGlob.convertPathToPattern = convertPathToPattern;\n let posix;\n (function (posix) {\n function escapePath(source) {\n assertPatternsInput(source);\n return utils.path.escapePosixPath(source);\n }\n posix.escapePath = escapePath;\n function convertPathToPattern(source) {\n assertPatternsInput(source);\n return utils.path.convertPosixPathToPattern(source);\n }\n posix.convertPathToPattern = convertPathToPattern;\n })(posix = FastGlob.posix || (FastGlob.posix = {}));\n let win32;\n (function (win32) {\n function escapePath(source) {\n assertPatternsInput(source);\n return utils.path.escapeWindowsPath(source);\n }\n win32.escapePath = escapePath;\n function convertPathToPattern(source) {\n assertPatternsInput(source);\n return utils.path.convertWindowsPathToPattern(source);\n }\n win32.convertPathToPattern = convertPathToPattern;\n })(win32 = FastGlob.win32 || (FastGlob.win32 = {}));\n})(FastGlob || (FastGlob = {}));\nfunction getWorks(source, _Provider, options) {\n const patterns = [].concat(source);\n const settings = new settings_1.default(options);\n const tasks = taskManager.generate(patterns, settings);\n const provider = new _Provider(settings);\n return tasks.map(provider.read, provider);\n}\nfunction assertPatternsInput(input) {\n const source = [].concat(input);\n const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item));\n if (!isValidSource) {\n throw new TypeError('Patterns must be a string (non empty) or an array of strings');\n }\n}\nmodule.exports = FastGlob;\n", "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n", "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n", "/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n", "'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n", "'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n", "/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n", "/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n", null, null, null, "'use strict'\n\nconst NullObject = function NullObject () { }\nNullObject.prototype = Object.create(null)\n\n/**\n * RegExp to match *( \";\" parameter ) in RFC 7231 sec 3.1.1.1\n *\n * parameter = token \"=\" ( token / quoted-string )\n * token = 1*tchar\n * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" / \"*\"\n * / \"+\" / \"-\" / \".\" / \"^\" / \"_\" / \"`\" / \"|\" / \"~\"\n * / DIGIT / ALPHA\n * ; any VCHAR, except delimiters\n * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE\n * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text\n * obs-text = %x80-FF\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n */\nconst paramRE = /; *([!#$%&'*+.^\\w`|~-]+)=(\"(?:[\\v\\u0020\\u0021\\u0023-\\u005b\\u005d-\\u007e\\u0080-\\u00ff]|\\\\[\\v\\u0020-\\u00ff])*\"|[!#$%&'*+.^\\w`|~-]+) */gu\n\n/**\n * RegExp to match quoted-pair in RFC 7230 sec 3.2.6\n *\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n * obs-text = %x80-FF\n */\nconst quotedPairRE = /\\\\([\\v\\u0020-\\u00ff])/gu\n\n/**\n * RegExp to match type in RFC 7231 sec 3.1.1.1\n *\n * media-type = type \"/\" subtype\n * type = token\n * subtype = token\n */\nconst mediaTypeRE = /^[!#$%&'*+.^\\w|~-]+\\/[!#$%&'*+.^\\w|~-]+$/u\n\n// default ContentType to prevent repeated object creation\nconst defaultContentType = { type: '', parameters: new NullObject() }\nObject.freeze(defaultContentType.parameters)\nObject.freeze(defaultContentType)\n\n/**\n * Parse media type to object.\n *\n * @param {string|object} header\n * @return {Object}\n * @public\n */\n\nfunction parse (header) {\n if (typeof header !== 'string') {\n throw new TypeError('argument header is required and must be a string')\n }\n\n let index = header.indexOf(';')\n const type = index !== -1\n ? header.slice(0, index).trim()\n : header.trim()\n\n if (mediaTypeRE.test(type) === false) {\n throw new TypeError('invalid media type')\n }\n\n const result = {\n type: type.toLowerCase(),\n parameters: new NullObject()\n }\n\n // parse parameters\n if (index === -1) {\n return result\n }\n\n let key\n let match\n let value\n\n paramRE.lastIndex = index\n\n while ((match = paramRE.exec(header))) {\n if (match.index !== index) {\n throw new TypeError('invalid parameter format')\n }\n\n index += match[0].length\n key = match[1].toLowerCase()\n value = match[2]\n\n if (value[0] === '\"') {\n // remove quotes and escapes\n value = value\n .slice(1, value.length - 1)\n\n quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'))\n }\n\n result.parameters[key] = value\n }\n\n if (index !== header.length) {\n throw new TypeError('invalid parameter format')\n }\n\n return result\n}\n\nfunction safeParse (header) {\n if (typeof header !== 'string') {\n return defaultContentType\n }\n\n let index = header.indexOf(';')\n const type = index !== -1\n ? header.slice(0, index).trim()\n : header.trim()\n\n if (mediaTypeRE.test(type) === false) {\n return defaultContentType\n }\n\n const result = {\n type: type.toLowerCase(),\n parameters: new NullObject()\n }\n\n // parse parameters\n if (index === -1) {\n return result\n }\n\n let key\n let match\n let value\n\n paramRE.lastIndex = index\n\n while ((match = paramRE.exec(header))) {\n if (match.index !== index) {\n return defaultContentType\n }\n\n index += match[0].length\n key = match[1].toLowerCase()\n value = match[2]\n\n if (value[0] === '\"') {\n // remove quotes and escapes\n value = value\n .slice(1, value.length - 1)\n\n quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'))\n }\n\n result.parameters[key] = value\n }\n\n if (index !== header.length) {\n return defaultContentType\n }\n\n return result\n}\n\nmodule.exports.default = { parse, safeParse }\nmodule.exports.parse = parse\nmodule.exports.safeParse = safeParse\nmodule.exports.defaultContentType = defaultContentType\n", "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n", "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n", "/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n", "/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n", "/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n", null, null, null, "import * as vscode from \"vscode\";\nimport { analyzeCommand, getCachedAnalysis } from \"./commands/analyze.js\";\nimport { generateCommand } from \"./commands/generate.js\";\nimport { instructionsCommand } from \"./commands/instructions.js\";\nimport { readinessCommand } from \"./commands/readiness.js\";\nimport { evalCommand, evalInitCommand } from \"./commands/eval.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { prCommand } from \"./commands/pr.js\";\nimport { analysisTreeProvider, readinessTreeProvider } from \"./views/providers.js\";\n\nexport function activate(context: vscode.ExtensionContext): void {\n // Status bar\n const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0);\n statusBar.text = \"$(beaker) Primer\";\n statusBar.tooltip = \"Primer \u2014 click to analyze repository\";\n statusBar.command = \"primer.analyze\";\n statusBar.show();\n context.subscriptions.push(statusBar);\n\n // Tree views (createTreeView for description/badge support)\n const analysisView = vscode.window.createTreeView(\"primer.analysis\", {\n treeDataProvider: analysisTreeProvider,\n });\n const readinessView = vscode.window.createTreeView(\"primer.readiness\", {\n treeDataProvider: readinessTreeProvider,\n });\n context.subscriptions.push(analysisView, readinessView);\n\n function updateAnalysisView(): void {\n const analysis = getCachedAnalysis();\n if (analysis) {\n const parts = [...analysis.languages.slice(0, 3), ...analysis.frameworks.slice(0, 2)];\n analysisView.description = parts.join(\", \") || undefined;\n } else {\n analysisView.description = undefined;\n }\n }\n\n function updateReadinessView(): void {\n const report = readinessTreeProvider.getReport();\n if (report) {\n readinessView.description = `Level ${report.achievedLevel}`;\n } else {\n readinessView.description = undefined;\n }\n }\n\n function updateStatusBar(): void {\n const analysis = getCachedAnalysis();\n if (analysis) {\n const parts = analysis.languages.slice(0, 2);\n statusBar.text = `$(beaker) ${parts.join(\", \") || \"Primer\"}`;\n statusBar.tooltip = `Primer \u2014 ${analysis.languages.join(\", \")}${analysis.isMonorepo ? \" | monorepo\" : \"\"}`;\n } else {\n statusBar.text = \"$(beaker) Primer\";\n statusBar.tooltip = \"Primer \u2014 click to analyze repository\";\n }\n }\n\n // Commands\n context.subscriptions.push(\n vscode.commands.registerCommand(\"primer.analyze\", async () => {\n await analyzeCommand();\n analysisTreeProvider.refresh();\n updateAnalysisView();\n updateStatusBar();\n vscode.commands.executeCommand(\"primer.analysis.focus\");\n }),\n vscode.commands.registerCommand(\"primer.generate\", generateCommand),\n vscode.commands.registerCommand(\"primer.instructions\", instructionsCommand),\n vscode.commands.registerCommand(\"primer.readiness\", async () => {\n await readinessCommand();\n updateReadinessView();\n updateStatusBar();\n }),\n vscode.commands.registerCommand(\"primer.eval\", evalCommand),\n vscode.commands.registerCommand(\"primer.evalInit\", evalInitCommand),\n vscode.commands.registerCommand(\"primer.init\", async () => {\n await initCommand();\n analysisTreeProvider.refresh();\n updateAnalysisView();\n updateStatusBar();\n vscode.commands.executeCommand(\"primer.analysis.focus\");\n }),\n vscode.commands.registerCommand(\"primer.pr\", prCommand),\n );\n\n // Auto-analyze on activation if configured\n const config = vscode.workspace.getConfiguration(\"primer\");\n if (config.get(\"autoAnalyze\") && vscode.workspace.workspaceFolders?.length) {\n analyzeCommand()\n .then(() => {\n analysisTreeProvider.refresh();\n updateAnalysisView();\n updateStatusBar();\n })\n .catch(() => {});\n }\n}\n\nexport function deactivate(): void {}\n", "import * as vscode from \"vscode\";\nimport { analyzeRepo } from \"../services.js\";\nimport type { RepoAnalysis } from \"../types.js\";\n\nlet cachedAnalysis: RepoAnalysis | undefined;\n\nexport function getCachedAnalysis(): RepoAnalysis | undefined {\n return cachedAnalysis;\n}\n\nexport function setCachedAnalysis(analysis: RepoAnalysis | undefined): void {\n cachedAnalysis = analysis;\n vscode.commands.executeCommand(\"setContext\", \"primer.hasAnalysis\", !!analysis);\n}\n\nexport async function analyzeCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: \"Primer: Analyzing repository\u2026\" },\n async () => {\n try {\n const analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Analysis failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n\nexport function getWorkspacePath(): string | undefined {\n const folder = vscode.workspace.workspaceFolders?.[0];\n if (!folder) {\n vscode.window.showWarningMessage(\"Primer: No workspace folder open.\");\n return undefined;\n }\n return folder.uri.fsPath;\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport fg from \"fast-glob\";\n\nimport { fileExists, safeReadDir, readJson } from \"../utils/fs\";\n\nimport { isGitRepo } from \"./git\";\n\nexport type RepoApp = {\n name: string;\n path: string;\n ecosystem?: \"node\" | \"rust\" | \"go\" | \"dotnet\" | \"java\" | \"python\" | \"ruby\" | \"php\";\n manifestPath?: string;\n packageJsonPath: string;\n scripts: Record;\n hasTsConfig: boolean;\n};\n\nexport type Area = {\n name: string;\n description?: string;\n applyTo: string | string[];\n path?: string;\n ecosystem?: RepoApp[\"ecosystem\"];\n source: \"auto\" | \"config\";\n scripts?: Record;\n hasTsConfig?: boolean;\n};\n\nexport type RepoAnalysis = {\n path: string;\n isGitRepo: boolean;\n languages: string[];\n frameworks: string[];\n packageManager?: string;\n isMonorepo?: boolean;\n workspaceType?: \"npm\" | \"pnpm\" | \"yarn\" | \"cargo\" | \"go\" | \"dotnet\" | \"gradle\" | \"maven\";\n workspacePatterns?: string[];\n apps?: RepoApp[];\n areas?: Area[];\n};\n\nconst PACKAGE_MANAGERS: Array<{ file: string; name: string }> = [\n { file: \"pnpm-lock.yaml\", name: \"pnpm\" },\n { file: \"yarn.lock\", name: \"yarn\" },\n { file: \"package-lock.json\", name: \"npm\" },\n { file: \"bun.lockb\", name: \"bun\" }\n];\n\nexport async function analyzeRepo(repoPath: string): Promise {\n const files = await safeReadDir(repoPath);\n const analysis: RepoAnalysis = {\n path: repoPath,\n isGitRepo: await isGitRepo(repoPath),\n languages: [],\n frameworks: []\n };\n\n const hasPackageJson = files.includes(\"package.json\");\n const hasTsConfig = files.includes(\"tsconfig.json\");\n const hasPyProject = files.includes(\"pyproject.toml\");\n const hasRequirements = files.includes(\"requirements.txt\");\n const hasGoMod = files.includes(\"go.mod\");\n const hasCargo = files.includes(\"Cargo.toml\");\n const hasCsproj = files.some((f) => f.endsWith(\".csproj\") || f.endsWith(\".sln\"));\n const hasPomXml = files.includes(\"pom.xml\");\n const hasBuildGradle = files.includes(\"build.gradle\") || files.includes(\"build.gradle.kts\");\n const hasGemfile = files.includes(\"Gemfile\");\n const hasComposerJson = files.includes(\"composer.json\");\n\n if (hasPackageJson) analysis.languages.push(\"JavaScript\");\n if (hasTsConfig) analysis.languages.push(\"TypeScript\");\n if (hasPyProject || hasRequirements) analysis.languages.push(\"Python\");\n if (hasGoMod) analysis.languages.push(\"Go\");\n if (hasCargo) analysis.languages.push(\"Rust\");\n if (hasCsproj) analysis.languages.push(\"C#\");\n if (hasPomXml || hasBuildGradle) analysis.languages.push(\"Java\");\n if (hasGemfile) analysis.languages.push(\"Ruby\");\n if (hasComposerJson) analysis.languages.push(\"PHP\");\n\n analysis.packageManager = await detectPackageManager(repoPath, files);\n\n let rootPackageJson: Record | undefined;\n\n if (hasPackageJson) {\n rootPackageJson = await readJson(path.join(repoPath, \"package.json\"));\n const deps = Object.keys({\n ...(rootPackageJson?.dependencies ?? {}),\n ...(rootPackageJson?.devDependencies ?? {})\n });\n analysis.frameworks.push(...detectFrameworks(deps, files));\n }\n\n const workspace = await detectWorkspace(repoPath, files, rootPackageJson);\n if (workspace) {\n analysis.workspaceType = workspace.type;\n analysis.workspacePatterns = workspace.patterns;\n }\n\n let apps = await resolveWorkspaceApps(repoPath, workspace?.patterns ?? [], rootPackageJson);\n\n // If JS workspace didn't find multiple apps, try non-JS monorepo detection\n if (apps.length <= 1) {\n const nonJs = await detectNonJsMonorepo(repoPath, files);\n if (nonJs.apps.length > 1) {\n apps = nonJs.apps;\n if (nonJs.type) analysis.workspaceType = nonJs.type;\n if (nonJs.patterns) analysis.workspacePatterns = nonJs.patterns;\n }\n }\n\n analysis.apps = apps;\n analysis.isMonorepo = apps.length > 1;\n\n analysis.languages = unique(analysis.languages);\n analysis.frameworks = unique(analysis.frameworks);\n\n // Detect areas from apps and folder heuristics\n analysis.areas = await detectAreas(repoPath, analysis);\n\n return analysis;\n}\n\nasync function detectPackageManager(\n _repoPath: string,\n files: string[]\n): Promise {\n for (const manager of PACKAGE_MANAGERS) {\n if (files.includes(manager.file)) return manager.name;\n }\n\n if (files.includes(\"package.json\")) return \"npm\";\n if (files.includes(\"pyproject.toml\")) return \"pip\";\n if (files.includes(\"pom.xml\")) return \"maven\";\n if (files.includes(\"build.gradle\") || files.includes(\"build.gradle.kts\")) return \"gradle\";\n if (files.includes(\"Gemfile\")) return \"bundler\";\n if (files.includes(\"composer.json\")) return \"composer\";\n return undefined;\n}\n\nfunction detectFrameworks(deps: string[], files: string[]): string[] {\n const frameworks: string[] = [];\n const hasFile = (file: string): boolean => files.includes(file);\n\n if (deps.includes(\"next\") || hasFile(\"next.config.js\") || hasFile(\"next.config.mjs\"))\n frameworks.push(\"Next.js\");\n if (deps.includes(\"react\") || deps.includes(\"react-dom\")) frameworks.push(\"React\");\n if (deps.includes(\"vue\") || hasFile(\"vue.config.js\")) frameworks.push(\"Vue\");\n if (deps.includes(\"@angular/core\") || hasFile(\"angular.json\")) frameworks.push(\"Angular\");\n if (deps.includes(\"svelte\") || hasFile(\"svelte.config.js\")) frameworks.push(\"Svelte\");\n if (deps.includes(\"express\")) frameworks.push(\"Express\");\n if (deps.includes(\"@nestjs/core\")) frameworks.push(\"NestJS\");\n if (deps.includes(\"fastify\")) frameworks.push(\"Fastify\");\n\n return frameworks;\n}\n\nasync function safeReadFile(filePath: string): Promise {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\ntype WorkspaceConfig = {\n type: \"npm\" | \"pnpm\" | \"yarn\";\n patterns: string[];\n};\n\nasync function detectWorkspace(\n repoPath: string,\n files: string[],\n packageJson?: Record\n): Promise {\n if (files.includes(\"pnpm-workspace.yaml\")) {\n const patterns = await readPnpmWorkspace(path.join(repoPath, \"pnpm-workspace.yaml\"));\n if (patterns.length) return { type: \"pnpm\", patterns };\n }\n\n const workspaces = packageJson?.workspaces;\n if (Array.isArray(workspaces)) {\n return { type: files.includes(\"yarn.lock\") ? \"yarn\" : \"npm\", patterns: workspaces.map(String) };\n }\n\n if (workspaces && typeof workspaces === \"object\") {\n const packages = (workspaces as { packages?: unknown }).packages;\n if (Array.isArray(packages)) {\n return { type: files.includes(\"yarn.lock\") ? \"yarn\" : \"npm\", patterns: packages.map(String) };\n }\n }\n\n return undefined;\n}\n\nasync function readPnpmWorkspace(filePath: string): Promise {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const lines = raw.split(/\\r?\\n/u);\n const patterns: string[] = [];\n let inPackages = false;\n for (const line of lines) {\n // Skip comment-only lines\n if (/^\\s*#/u.test(line)) continue;\n if (!inPackages && /^\\s*packages\\s*:/u.test(line)) {\n // Handle inline array: packages: [\"apps/*\", \"libs/*\"]\n const inline = line.match(/packages\\s*:\\s*\\[([^\\]]+)\\]/u);\n if (inline) {\n const items = inline[1].split(\",\").map((s) => s.trim().replace(/^['\"]|['\"]$/gu, \"\"));\n return items.filter(Boolean);\n }\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = line.match(/^\\s*-\\s*(.+)$/u);\n if (match?.[1]) {\n // Strip trailing comments and quotes\n const value = match[1]\n .split(\"#\")[0]\n .trim()\n .replace(/^['\"]|['\"]$/gu, \"\");\n if (value) patterns.push(value);\n continue;\n }\n // Non-indented, non-empty line means a new top-level key\n if (/^\\S/u.test(line) && line.trim()) break;\n }\n }\n return patterns;\n } catch {\n return [];\n }\n}\n\nasync function resolveWorkspaceApps(\n repoPath: string,\n patterns: string[],\n rootPackageJson?: Record\n): Promise {\n const workspacePatterns = patterns\n .map((pattern) => pattern.replace(/\\\\/gu, \"/\"))\n .map((pattern) =>\n pattern.endsWith(\"package.json\") ? pattern : path.posix.join(pattern, \"package.json\")\n );\n\n const packageJsonPaths = workspacePatterns.length\n ? (\n await fg(workspacePatterns, { cwd: repoPath, absolute: true, onlyFiles: true, dot: false })\n ).map((p) => path.normalize(p))\n : [];\n\n if (!packageJsonPaths.length && rootPackageJson) {\n const rootPath = path.join(repoPath, \"package.json\");\n return [await buildRepoApp(repoPath, rootPath, rootPackageJson)];\n }\n\n const apps = await Promise.all(\n packageJsonPaths.map(async (pkgPath) => {\n const pkg = await readJson(pkgPath);\n return buildRepoApp(path.dirname(pkgPath), pkgPath, pkg);\n })\n );\n\n return apps.filter(Boolean) as RepoApp[];\n}\n\nasync function buildRepoApp(\n appPath: string,\n packageJsonPath: string,\n packageJson?: Record\n): Promise {\n const scripts = (packageJson?.scripts ?? {}) as Record;\n const name = typeof packageJson?.name === \"string\" ? packageJson.name : path.basename(appPath);\n const hasTsConfig = await fileExists(path.join(appPath, \"tsconfig.json\"));\n\n return {\n name,\n path: appPath,\n ecosystem: \"node\",\n manifestPath: packageJsonPath,\n packageJsonPath,\n scripts,\n hasTsConfig\n };\n}\n\nfunction buildNonJsApp(\n name: string,\n appPath: string,\n ecosystem: NonNullable,\n manifestPath: string\n): RepoApp {\n return {\n name,\n path: appPath,\n ecosystem,\n manifestPath,\n packageJsonPath: \"\",\n scripts: {},\n hasTsConfig: false\n };\n}\n\n// \u2500\u2500\u2500 Non-JS monorepo detection \u2500\u2500\u2500\n\ntype NonJsMonorepoResult = {\n type?: \"cargo\" | \"go\" | \"dotnet\" | \"gradle\" | \"maven\";\n patterns?: string[];\n apps: RepoApp[];\n};\n\nasync function detectNonJsMonorepo(\n repoPath: string,\n files: string[]\n): Promise {\n const cargoApps = await detectCargoWorkspace(repoPath);\n if (cargoApps.length > 1) return { type: \"cargo\", apps: cargoApps };\n\n const goApps = await detectGoWorkspace(repoPath);\n if (goApps.length > 1) return { type: \"go\", apps: goApps };\n\n const dotnetApps = await detectDotnetSolution(repoPath, files);\n if (dotnetApps.length > 1) return { type: \"dotnet\", apps: dotnetApps };\n\n const gradleApps = await detectGradleMultiProject(repoPath, files);\n if (gradleApps.length > 1) return { type: \"gradle\", apps: gradleApps };\n\n const mavenApps = await detectMavenMultiModule(repoPath);\n if (mavenApps.length > 1) return { type: \"maven\", apps: mavenApps };\n\n return { apps: [] };\n}\n\nasync function detectCargoWorkspace(repoPath: string): Promise {\n const content = await safeReadFile(path.join(repoPath, \"Cargo.toml\"));\n if (!content) return [];\n\n // Extract [workspace] section up to the next section header\n const workspaceSection = content.match(/\\[workspace\\]([\\s\\S]*?)(?:\\n\\[|$)/u);\n if (!workspaceSection) return [];\n\n const membersMatch = workspaceSection[1].match(/members\\s*=\\s*\\[([\\s\\S]*?)\\]/u);\n if (!membersMatch) return [];\n\n const patterns = [...membersMatch[1].matchAll(/\"([^\"]+)\"/gu)].map((m) => m[1]);\n if (!patterns.length) return [];\n\n const tomlPaths = (\n await fg(\n patterns.map((p) => path.posix.join(p, \"Cargo.toml\")),\n { cwd: repoPath, absolute: true, onlyFiles: true }\n )\n ).map((p) => path.normalize(p));\n\n return Promise.all(\n tomlPaths.map(async (tomlPath) => {\n const dir = path.dirname(tomlPath);\n const toml = await safeReadFile(tomlPath);\n const nameMatch = toml?.match(/^\\s*name\\s*=\\s*\"([^\"]+)\"/mu);\n return buildNonJsApp(nameMatch?.[1] ?? path.basename(dir), dir, \"rust\", tomlPath);\n })\n );\n}\n\nasync function detectGoWorkspace(repoPath: string): Promise {\n const content = await safeReadFile(path.join(repoPath, \"go.work\"));\n if (!content) return [];\n\n const modules: string[] = [];\n\n // Block form: use ( ./cmd/server \\n ./pkg/lib )\n const blockMatch = content.match(/use\\s*\\(([\\s\\S]*?)\\)/u);\n if (blockMatch) {\n for (const line of blockMatch[1].split(/\\r?\\n/u)) {\n const trimmed = line.replace(/\\/\\/.*$/u, \"\").trim();\n if (trimmed) modules.push(trimmed);\n }\n }\n\n // Single-line form: use ./cmd/server\n for (const match of content.matchAll(/^use\\s+(\\S+)\\s*$/gmu)) {\n modules.push(match[1]);\n }\n\n const apps: RepoApp[] = [];\n for (const mod of modules) {\n const modPath = path.resolve(repoPath, mod);\n const goModPath = path.join(modPath, \"go.mod\");\n if (!(await fileExists(goModPath))) continue;\n\n const goMod = await safeReadFile(goModPath);\n const nameMatch = goMod?.match(/^module\\s+(\\S+)/mu);\n const shortName = nameMatch?.[1]?.split(\"/\").pop() ?? path.basename(modPath);\n apps.push(buildNonJsApp(shortName, modPath, \"go\", goModPath));\n }\n\n return apps;\n}\n\nasync function detectDotnetSolution(repoPath: string, files: string[]): Promise {\n const slnFile = files.find((f) => f.endsWith(\".sln\"));\n if (!slnFile) return [];\n\n const content = await safeReadFile(path.join(repoPath, slnFile));\n if (!content) return [];\n\n // Match: Project(\"{guid}\") = \"Name\", \"path\\to\\Project.csproj\", \"{guid}\"\n const projectRegex = /Project\\(\"[^\"]*\"\\)\\s*=\\s*\"([^\"]+)\",\\s*\"([^\"]+\\.(?:cs|fs|vb)proj)\"/giu;\n const apps: RepoApp[] = [];\n\n for (const match of content.matchAll(projectRegex)) {\n const name = match[1];\n const projRelPath = match[2].replace(/\\\\/gu, \"/\");\n const projPath = path.resolve(repoPath, projRelPath);\n const appDir = path.dirname(projPath);\n\n if (await fileExists(projPath)) {\n apps.push(buildNonJsApp(name, appDir, \"dotnet\", projPath));\n }\n }\n\n return apps;\n}\n\nasync function detectGradleMultiProject(repoPath: string, files: string[]): Promise {\n const settingsFile = files.includes(\"settings.gradle.kts\")\n ? \"settings.gradle.kts\"\n : files.includes(\"settings.gradle\")\n ? \"settings.gradle\"\n : null;\n if (!settingsFile) return [];\n\n const content = await safeReadFile(path.join(repoPath, settingsFile));\n if (!content) return [];\n\n // Extract all Gradle project references (':app', ':lib:core') from the file\n const projectNames: string[] = [];\n for (const match of content.matchAll(/['\"](:(?:[\\w.-]+:)*[\\w.-]+)['\"]/gu)) {\n projectNames.push(match[1].replace(/^:/u, \"\").replace(/:/gu, \"/\"));\n }\n\n const uniqueProjects = [...new Set(projectNames)];\n const apps: RepoApp[] = [];\n\n for (const project of uniqueProjects) {\n const projectDir = path.resolve(repoPath, project);\n const ktsPath = path.join(projectDir, \"build.gradle.kts\");\n const groovyPath = path.join(projectDir, \"build.gradle\");\n\n const buildFile = (await fileExists(ktsPath))\n ? ktsPath\n : (await fileExists(groovyPath))\n ? groovyPath\n : null;\n\n if (buildFile) {\n apps.push(buildNonJsApp(path.basename(project), projectDir, \"java\", buildFile));\n }\n }\n\n return apps;\n}\n\nasync function detectMavenMultiModule(repoPath: string): Promise {\n const content = await safeReadFile(path.join(repoPath, \"pom.xml\"));\n if (!content) return [];\n\n const apps: RepoApp[] = [];\n for (const match of content.matchAll(/([^<]+)<\\/module>/gu)) {\n const modName = match[1].trim();\n const modDir = path.resolve(repoPath, modName);\n const pomPath = path.join(modDir, \"pom.xml\");\n\n if (await fileExists(pomPath)) {\n apps.push(buildNonJsApp(path.basename(modName), modDir, \"java\", pomPath));\n }\n }\n\n return apps;\n}\n\nfunction unique(items: T[]): T[] {\n return Array.from(new Set(items));\n}\n\n// \u2500\u2500\u2500 Area detection \u2500\u2500\u2500\n\nconst AREA_HEURISTIC_DIRS = [\n \"frontend\",\n \"backend\",\n \"api\",\n \"web\",\n \"mobile\",\n \"app\",\n \"server\",\n \"client\",\n \"infra\",\n \"infrastructure\",\n \"shared\",\n \"common\",\n \"lib\",\n \"libs\",\n \"packages\",\n \"services\",\n \"docs\",\n \"scripts\",\n \"tools\",\n \"cli\",\n \"sdk\",\n \"core\",\n \"admin\",\n \"portal\",\n \"dashboard\",\n \"worker\",\n \"functions\"\n];\n\nconst MANIFEST_FILES = [\n \"package.json\",\n \"pyproject.toml\",\n \"requirements.txt\",\n \"go.mod\",\n \"Cargo.toml\",\n \"pom.xml\",\n \"build.gradle\",\n \"build.gradle.kts\",\n \"Gemfile\",\n \"composer.json\",\n \"setup.py\",\n \"setup.cfg\"\n];\n\nfunction areasFromApps(repoPath: string, apps: RepoApp[]): Area[] {\n return apps.map((app) => {\n const rel = path.relative(repoPath, app.path).replace(/\\\\/gu, \"/\");\n return {\n name: app.name,\n applyTo: `${rel}/**`,\n path: app.path,\n ecosystem: app.ecosystem,\n source: \"auto\" as const,\n scripts: Object.keys(app.scripts).length > 0 ? app.scripts : undefined,\n hasTsConfig: app.hasTsConfig || undefined\n };\n });\n}\n\nasync function areasFromHeuristics(repoPath: string): Promise {\n const entries = await safeReadDir(repoPath);\n const areas: Area[] = [];\n\n for (const entry of entries) {\n const lower = entry.toLowerCase();\n if (!AREA_HEURISTIC_DIRS.includes(lower)) continue;\n\n const fullPath = path.join(repoPath, entry);\n try {\n const stat = await fs.stat(fullPath);\n if (!stat.isDirectory()) continue;\n } catch {\n continue;\n }\n\n // Check if the directory has meaningful content (manifest or code files)\n const children = await safeReadDir(fullPath);\n const hasManifest = children.some((c) => MANIFEST_FILES.includes(c));\n const hasCode = children.some(\n (c) =>\n c.endsWith(\".ts\") ||\n c.endsWith(\".js\") ||\n c.endsWith(\".py\") ||\n c.endsWith(\".go\") ||\n c.endsWith(\".rs\") ||\n c.endsWith(\".java\") ||\n c.endsWith(\".cs\") ||\n c.endsWith(\".rb\") ||\n c.endsWith(\".php\")\n );\n const hasSrcDir = children.includes(\"src\");\n\n if (!hasManifest && !hasCode && !hasSrcDir) continue;\n\n // Read scripts from manifest if present\n let scripts: Record | undefined;\n let hasTsConfig: boolean | undefined;\n if (children.includes(\"package.json\")) {\n const pkg = await readJson(path.join(fullPath, \"package.json\"));\n const pkgScripts = (pkg?.scripts ?? {}) as Record;\n if (Object.keys(pkgScripts).length > 0) scripts = pkgScripts;\n }\n if (children.includes(\"tsconfig.json\")) {\n hasTsConfig = true;\n }\n\n areas.push({\n name: entry,\n applyTo: `${entry}/**`,\n path: fullPath,\n source: \"auto\",\n scripts,\n hasTsConfig\n });\n }\n\n return areas;\n}\n\nasync function detectAreas(repoPath: string, analysis: RepoAnalysis): Promise {\n let autoAreas: Area[];\n\n if (analysis.isMonorepo && analysis.apps && analysis.apps.length > 1) {\n const appAreas = areasFromApps(repoPath, analysis.apps);\n // Also run heuristics to catch non-app directories (docs, infra, etc.)\n const heuristicAreas = await areasFromHeuristics(repoPath);\n // Merge: app areas take precedence by name\n const byName = new Map(heuristicAreas.map((a) => [a.name.toLowerCase(), a]));\n for (const a of appAreas) {\n byName.set(a.name.toLowerCase(), a);\n }\n autoAreas = Array.from(byName.values());\n } else {\n autoAreas = await areasFromHeuristics(repoPath);\n }\n\n // Merge with config areas\n const config = await loadPrimerConfig(repoPath);\n if (!config?.areas?.length) return autoAreas;\n\n const resolvedRoot = path.resolve(repoPath);\n const configAreas: Area[] = [];\n for (const ca of config.areas) {\n // Derive path: extract leading directory from first applyTo pattern, ignoring glob-only patterns\n const patterns = Array.isArray(ca.applyTo) ? ca.applyTo : [ca.applyTo];\n const firstSegment = patterns[0].split(\"/\")[0];\n const basePath =\n firstSegment.includes(\"*\") || firstSegment.includes(\"?\")\n ? repoPath\n : path.join(repoPath, firstSegment);\n\n // Prevent path traversal \u2014 config areas must stay inside the repo\n const resolved = path.resolve(basePath);\n if (resolved !== resolvedRoot && !resolved.startsWith(resolvedRoot + path.sep)) continue;\n\n // Enrich config areas with scripts/hasTsConfig\n let scripts: Record | undefined;\n let hasTsConfig: boolean | undefined;\n try {\n const children = await safeReadDir(basePath);\n if (children.includes(\"package.json\")) {\n const pkg = await readJson(path.join(basePath, \"package.json\"));\n const pkgScripts = (pkg?.scripts ?? {}) as Record;\n if (Object.keys(pkgScripts).length > 0) scripts = pkgScripts;\n }\n if (children.includes(\"tsconfig.json\")) hasTsConfig = true;\n } catch {\n // Directory may not exist yet for config areas\n }\n\n configAreas.push({\n name: ca.name,\n description: ca.description,\n applyTo: ca.applyTo,\n path: basePath,\n source: \"config\" as const,\n scripts,\n hasTsConfig\n });\n }\n\n // Config areas override auto-detected by name (case-insensitive)\n const autoByName = new Map(autoAreas.map((a) => [a.name.toLowerCase(), a]));\n for (const ca of configAreas) {\n autoByName.set(ca.name.toLowerCase(), ca);\n }\n\n return Array.from(autoByName.values());\n}\n\n// \u2500\u2500\u2500 Primer config \u2500\u2500\u2500\n\nexport type PrimerConfigArea = {\n name: string;\n applyTo: string | string[];\n description?: string;\n};\n\nexport type PrimerConfig = {\n areas?: PrimerConfigArea[];\n policies?: string[];\n};\n\nexport async function loadPrimerConfig(repoPath: string): Promise {\n // Try repo root first, then .github/\n const candidates = [\n path.join(repoPath, \"primer.config.json\"),\n path.join(repoPath, \".github\", \"primer.config.json\")\n ];\n\n for (const candidate of candidates) {\n const json = await readJson(candidate);\n if (!json) continue;\n\n // Validate shape\n if (json.areas !== undefined && !Array.isArray(json.areas)) {\n return undefined;\n }\n const areas: PrimerConfigArea[] = [];\n if (Array.isArray(json.areas)) {\n for (const entry of json.areas) {\n if (\n typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as Record).name === \"string\" &&\n (entry as Record).applyTo !== undefined\n ) {\n const e = entry as Record;\n if (!(e.name as string).trim()) continue;\n const rawApplyTo = e.applyTo;\n // Validate applyTo is a string or array of strings\n let applyTo: string | string[];\n if (typeof rawApplyTo === \"string\") {\n applyTo = rawApplyTo;\n } else if (Array.isArray(rawApplyTo) && rawApplyTo.every((v) => typeof v === \"string\")) {\n applyTo = rawApplyTo as string[];\n } else {\n continue;\n }\n if (\n (typeof applyTo === \"string\" && !applyTo.trim()) ||\n (Array.isArray(applyTo) && applyTo.length === 0)\n )\n continue;\n // Reject patterns with path traversal segments\n const allPatterns = Array.isArray(applyTo) ? applyTo : [applyTo];\n if (allPatterns.some((p) => p.split(\"/\").includes(\"..\"))) continue;\n areas.push({\n name: e.name as string,\n applyTo,\n description: typeof e.description === \"string\" ? e.description : undefined\n });\n }\n }\n }\n\n // Parse policies array\n let policies: string[] | undefined;\n if (Array.isArray(json.policies)) {\n policies = json.policies.filter((p): p is string => typeof p === \"string\" && p.trim() !== \"\");\n }\n\n return { areas, policies: policies?.length ? policies : undefined };\n }\n\n return undefined;\n}\n\nexport function sanitizeAreaName(name: string): string {\n const sanitized = name\n .toLowerCase()\n .replace(/[^a-z0-9-]/gu, \"-\")\n .replace(/-+/gu, \"-\")\n .replace(/^-|-$/gu, \"\");\n return sanitized || \"unnamed\";\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nexport async function ensureDir(dirPath: string): Promise {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport type WriteResult = { wrote: boolean; reason?: \"symlink\" | \"exists\" };\n\nexport async function safeWriteFile(\n filePath: string,\n content: string,\n force: boolean\n): Promise {\n const resolved = path.resolve(filePath);\n\n // Reject symlinks to prevent writing through them to unintended locations\n try {\n const stat = await fs.lstat(resolved);\n if (stat.isSymbolicLink()) {\n return { wrote: false, reason: \"symlink\" };\n }\n if (!force) {\n return { wrote: false, reason: \"exists\" };\n }\n } catch {\n // File does not exist \u2014 safe to create\n }\n\n await fs.writeFile(resolved, content, \"utf8\");\n return { wrote: true };\n}\n\n/**\n * Validate that a constructed path stays within the expected root directory.\n * Prevents path traversal via malicious repo names or owner slugs.\n */\nexport function validateCachePath(cacheRoot: string, ...segments: string[]): string {\n const resolvedRoot = path.resolve(cacheRoot);\n const resolved = path.resolve(cacheRoot, ...segments);\n if (!resolved.startsWith(resolvedRoot + path.sep) && resolved !== resolvedRoot) {\n throw new Error(`Invalid path: escapes cache directory (${resolved})`);\n }\n return resolved;\n}\n\nexport async function fileExists(filePath: string): Promise {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function safeReadDir(dirPath: string): Promise {\n try {\n return await fs.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nexport async function readJson(filePath: string): Promise | undefined> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as Record;\n } catch {\n return undefined;\n }\n}\n\nexport function buildTimestampedName(baseName: string, extension = \".json\"): string {\n const stamp = new Date().toISOString().replace(/[:.]/gu, \"-\");\n return `${baseName}-${stamp}${extension}`;\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport type { SimpleGitProgressEvent } from \"simple-git\";\nimport simpleGit from \"simple-git\";\n\nexport async function isGitRepo(repoPath: string): Promise {\n try {\n await fs.access(path.join(repoPath, \".git\"));\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getRepoRoot(repoPath: string): Promise {\n const git = simpleGit(repoPath);\n const root = await git.revparse([\"--show-toplevel\"]);\n return root.trim();\n}\n\nexport type CloneOptions = {\n shallow?: boolean;\n timeoutMs?: number;\n onProgress?: (stage: string, progress: number) => void;\n};\n\nexport async function cloneRepo(\n repoUrl: string,\n destination: string,\n options: CloneOptions = {}\n): Promise {\n const { shallow = true, timeoutMs = 60000, onProgress } = options;\n\n const git = simpleGit({\n progress: onProgress\n ? ({ stage, progress }: SimpleGitProgressEvent) => {\n onProgress(stage, progress);\n }\n : undefined,\n timeout: {\n block: timeoutMs\n }\n });\n\n const cloneArgs: string[] = [];\n if (shallow) {\n cloneArgs.push(\"--depth\", \"1\");\n }\n\n await git.clone(repoUrl, destination, cloneArgs);\n}\n\n/**\n * Replace the remote origin URL, typically to strip embedded credentials\n * after cloning with an authenticated URL.\n */\nexport async function setRemoteUrl(repoPath: string, url: string): Promise {\n const git = simpleGit(repoPath);\n await git.remote([\"set-url\", \"origin\", url]);\n}\n\nexport async function checkoutBranch(repoPath: string, branch: string): Promise {\n const git = simpleGit(repoPath);\n const branches = await git.branchLocal();\n if (!branches.all.includes(branch)) {\n await git.checkoutLocalBranch(branch);\n return;\n }\n await git.checkout(branch);\n}\n\nexport async function commitAll(repoPath: string, message: string): Promise {\n const git = simpleGit(repoPath);\n await git.add([\"-A\"]);\n const status = await git.status();\n if (status.files.length === 0) return;\n await git.commit(message);\n}\n\nexport type AuthProvider = \"github\" | \"azure\";\n\n/** Normalize a git URL by removing trailing slashes and any existing auth */\nfunction normalizeGitUrl(url: string): string {\n let normalized = url.trim();\n // Remove trailing slashes\n while (normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n // Remove any existing x-access-token auth\n normalized = normalized.replace(/https:\\/\\/x-access-token:[^@]+@/, \"https://\");\n // Remove any existing PAT auth\n normalized = normalized.replace(/https:\\/\\/pat:[^@]+@/, \"https://\");\n return normalized;\n}\n\nexport function buildAuthedUrl(url: string, token: string, provider: AuthProvider): string {\n const normalizedUrl = normalizeGitUrl(url);\n if (!normalizedUrl.startsWith(\"https://\")) return normalizedUrl;\n if (provider === \"azure\") {\n return normalizedUrl.replace(\"https://\", `https://pat:${token}@`);\n }\n return normalizedUrl.replace(\"https://\", `https://x-access-token:${token}@`);\n}\n\nexport async function pushBranch(\n repoPath: string,\n branch: string,\n token?: string,\n provider: AuthProvider = \"github\"\n): Promise {\n const git = simpleGit(repoPath);\n\n if (token) {\n // Set up credentials for this push\n const remoteUrl = (await git.remote([\"get-url\", \"origin\"])) ?? \"\";\n const normalizedUrl = normalizeGitUrl(remoteUrl);\n if (normalizedUrl.startsWith(\"https://\")) {\n const authedUrl = buildAuthedUrl(normalizedUrl, token, provider);\n await git.remote([\"set-url\", \"origin\", authedUrl]);\n try {\n await git.push([\"-u\", \"origin\", branch]);\n } catch (err) {\n // Strip embedded credentials from error messages to avoid leaking tokens\n const sanitized =\n err instanceof Error\n ? new Error(err.message.replace(/https:\\/\\/[^@]+@/g, \"https://***@\"))\n : err;\n throw sanitized;\n } finally {\n // Restore original URL to avoid leaking token\n await git.remote([\"set-url\", \"origin\", normalizedUrl]);\n }\n return;\n }\n }\n\n await git.push([\"-u\", \"origin\", branch]);\n}\n", "const cache = new WeakMap();\n\nexport function pathspec(...paths: string[]) {\n const key = new String(paths);\n cache.set(key, paths);\n\n return key as string;\n}\n\nexport function isPathSpec(path: string | unknown): path is string {\n return path instanceof String && cache.has(path);\n}\n\nexport function toPaths(pathSpec: string): string[] {\n return cache.get(pathSpec) || [];\n}\n", "import type { SimpleGitTask } from '../types';\n\n/**\n * The `GitError` is thrown when the underlying `git` process throws a\n * fatal exception (eg an `ENOENT` exception when attempting to use a\n * non-writable directory as the root for your repo), and acts as the\n * base class for more specific errors thrown by the parsing of the\n * git response or errors in the configuration of the task about to\n * be run.\n *\n * When an exception is thrown, pending tasks in the same instance will\n * not be executed. The recommended way to run a series of tasks that\n * can independently fail without needing to prevent future tasks from\n * running is to catch them individually:\n *\n * ```typescript\n import { gitP, SimpleGit, GitError, PullResult } from 'simple-git';\n\n function catchTask (e: GitError) {\n return e.\n }\n\n const git = gitP(repoWorkingDir);\n const pulled: PullResult | GitError = await git.pull().catch(catchTask);\n const pushed: string | GitError = await git.pushTags().catch(catchTask);\n ```\n */\nexport class GitError extends Error {\n constructor(\n public task?: SimpleGitTask,\n message?: string\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n", "import { GitError } from './git-error';\n\n/**\n * The `GitResponseError` is the wrapper for a parsed response that is treated as\n * a fatal error, for example attempting a `merge` can leave the repo in a corrupted\n * state when there are conflicts so the task will reject rather than resolve.\n *\n * For example, catching the merge conflict exception:\n *\n * ```typescript\n import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git';\n\n const git = gitP(repoRoot);\n const mergeOptions: string[] = ['--no-ff', 'other-branch'];\n const mergeSummary: MergeSummary = await git.merge(mergeOptions)\n .catch((e: GitResponseError) => e.git);\n\n if (mergeSummary.failed) {\n // deal with the error\n }\n ```\n */\nexport class GitResponseError extends GitError {\n constructor(\n /**\n * `.git` access the parsed response that is treated as being an error\n */\n public readonly git: T,\n message?: string\n ) {\n super(undefined, message || String(git));\n }\n}\n", "import { GitError } from './git-error';\n\n/**\n * The `TaskConfigurationError` is thrown when a command was incorrectly\n * configured. An error of this kind means that no attempt was made to\n * run your command through the underlying `git` binary.\n *\n * Check the `.message` property for more detail on why your configuration\n * resulted in an error.\n */\nexport class TaskConfigurationError extends GitError {\n constructor(message?: string) {\n super(undefined, message);\n }\n}\n", "import { Buffer } from 'node:buffer';\nimport { exists, FOLDER } from '@kwsites/file-exists';\nimport type { Maybe } from '../types';\nimport { filterHasLength } from './argument-filters';\n\ntype Callable = (...args: unknown[]) => unknown;\n\nexport const NULL = '\\0';\n\nexport const NOOP: Callable = () => {};\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function asFunction(source: T | unknown): Callable {\n if (typeof source !== 'function') {\n return NOOP;\n }\n return source as Callable;\n}\n\n/**\n * Determines whether the supplied argument is both a function, and is not\n * the `NOOP` function.\n */\nexport function isUserFunction(source: T | unknown): source is T {\n return typeof source === 'function' && source !== NOOP;\n}\n\nexport function splitOn(input: string, char: string): [string, string] {\n const index = input.indexOf(char);\n if (index <= 0) {\n return [input, ''];\n }\n\n return [input.substr(0, index), input.substr(index + 1)];\n}\n\nexport function first(input: T, offset?: number): Maybe;\nexport function first(input: T, offset?: number): Maybe;\nexport function first(input: unknown[] | IArguments, offset = 0): Maybe {\n return isArrayLike(input) && input.length > offset ? input[offset] : undefined;\n}\n\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: unknown, offset = 0) {\n if (isArrayLike(input) && input.length > offset) {\n return input[input.length - 1 - offset];\n }\n}\n\ntype ArrayLike = T[] | IArguments | { [index: number]: T; length: number };\n\nfunction isArrayLike(input: unknown): input is ArrayLike {\n return filterHasLength(input);\n}\n\nexport function toLinesWithContent(input = '', trimmed = true, separator = '\\n'): string[] {\n return input.split(separator).reduce((output, line) => {\n const lineContent = trimmed ? line.trim() : line;\n if (lineContent) {\n output.push(lineContent);\n }\n return output;\n }, [] as string[]);\n}\n\ntype LineWithContentCallback = (line: string) => T;\n\nexport function forEachLineWithContent(\n input: string,\n callback: LineWithContentCallback\n): T[] {\n return toLinesWithContent(input, true).map((line) => callback(line));\n}\n\nexport function folderExists(path: string): boolean {\n return exists(path, FOLDER);\n}\n\n/**\n * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`.\n */\nexport function append(target: T[] | Set, item: T): typeof item {\n if (Array.isArray(target)) {\n if (!target.includes(item)) {\n target.push(item);\n }\n } else {\n target.add(item);\n }\n return item;\n}\n\n/**\n * Adds `item` into the `target` `Array` when it is not already present and returns the `target`.\n */\nexport function including(target: T[], item: T): typeof target {\n if (Array.isArray(target) && !target.includes(item)) {\n target.push(item);\n }\n\n return target;\n}\n\nexport function remove(target: Set | T[], item: T): T {\n if (Array.isArray(target)) {\n const index = target.indexOf(item);\n if (index >= 0) {\n target.splice(index, 1);\n }\n } else {\n target.delete(item);\n }\n return item;\n}\n\nexport const objectToString = Object.prototype.toString.call.bind(Object.prototype.toString) as (\n input: unknown\n) => string;\n\nexport function asArray(source: T | T[]): T[] {\n return Array.isArray(source) ? source : [source];\n}\n\nexport function asCamelCase(str: string) {\n return str.replace(/[\\s-]+(.)/g, (_all, chr) => {\n return chr.toUpperCase();\n });\n}\n\nexport function asStringArray(source: T | T[]): string[] {\n return asArray(source).map((item) => {\n return item instanceof String ? (item as string) : String(item);\n });\n}\n\nexport function asNumber(source: string | null | undefined, onNaN = 0) {\n if (source == null) {\n return onNaN;\n }\n\n const num = parseInt(source, 10);\n return Number.isNaN(num) ? onNaN : num;\n}\n\nexport function prefixedArray(input: T[], prefix: T): T[] {\n const output: T[] = [];\n for (let i = 0, max = input.length; i < max; i++) {\n output.push(prefix, input[i]);\n }\n return output;\n}\n\nexport function bufferToString(input: Buffer | Buffer[]): string {\n return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8');\n}\n\n/**\n * Get a new object from a source object with only the listed properties.\n */\nexport function pick(source: T, properties: readonly K[]) {\n const out: Partial> = {};\n\n properties.forEach((key) => {\n if (source[key] !== undefined) {\n out[key] = source[key];\n }\n });\n\n return out;\n}\n\nexport function delay(duration = 0): Promise {\n return new Promise((done) => setTimeout(done, duration));\n}\n\nexport function orVoid(input: T | false) {\n if (input === false) {\n return undefined;\n }\n return input;\n}\n", "import { isPathSpec } from '../args/pathspec';\nimport type { Maybe, Options, Primitives } from '../types';\nimport { objectToString } from './util';\n\nexport type ArgumentFilterPredicate = (input: T | unknown) => input is T;\n\nexport function filterType(\n input: K,\n filter: ArgumentFilterPredicate\n): K extends T ? T : undefined;\nexport function filterType(input: K, filter: ArgumentFilterPredicate, def: T): T;\nexport function filterType(input: K, filter: ArgumentFilterPredicate, def?: T): Maybe {\n if (filter(input)) {\n return input;\n }\n return arguments.length > 2 ? def : undefined;\n}\n\nexport const filterArray: ArgumentFilterPredicate> = (\n input\n): input is Array => {\n return Array.isArray(input);\n};\n\nexport function filterPrimitives(\n input: unknown,\n omit?: Array<'boolean' | 'string' | 'number'>\n): input is Primitives {\n const type = isPathSpec(input) ? 'string' : typeof input;\n\n return (\n /number|string|boolean/.test(type) &&\n (!omit || !omit.includes(type as 'boolean' | 'string' | 'number'))\n );\n}\n\nexport const filterNumber: ArgumentFilterPredicate = (input: unknown): input is number => {\n return typeof input === 'number';\n};\n\nexport const filterString: ArgumentFilterPredicate = (input: unknown): input is string => {\n return typeof input === 'string';\n};\n\nexport const filterStringOrStringArray: ArgumentFilterPredicate = (\n input\n): input is string | string[] => {\n return filterString(input) || (Array.isArray(input) && input.every(filterString));\n};\n\nexport function filterPlainObject(input: T | unknown): input is T;\nexport function filterPlainObject>(\n input: T | unknown\n): input is T {\n return !!input && objectToString(input) === '[object Object]';\n}\n\nexport function filterFunction(input: unknown): input is (...args: unknown[]) => unknown {\n return typeof input === 'function';\n}\n\nexport const filterHasLength: ArgumentFilterPredicate<{ length: number }> = (\n input\n): input is { length: number } => {\n if (input == null || 'number|boolean|function'.includes(typeof input)) {\n return false;\n }\n\n return typeof (input as { length?: number }).length === 'number';\n};\n", "/**\n * Known process exit codes used by the task parsers to determine whether an error\n * was one they can automatically handle\n */\nexport enum ExitCodes {\n SUCCESS,\n ERROR,\n NOT_FOUND = -2,\n UNCLEAN = 128,\n}\n", "import { TaskResponseFormat } from '../types';\n\nexport class GitOutputStreams {\n constructor(\n public readonly stdOut: T,\n public readonly stdErr: T\n ) {}\n\n asStrings(): GitOutputStreams {\n return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8'));\n }\n}\n", "function useMatchesDefault() {\n throw new Error(`LineParser:useMatches not implemented`);\n}\n\nexport class LineParser {\n protected matches: string[] = [];\n protected useMatches: (target: T, match: string[]) => boolean | void = useMatchesDefault;\n\n private _regExp: RegExp[];\n\n constructor(\n regExp: RegExp | RegExp[],\n useMatches?: (target: T, match: string[]) => boolean | void\n ) {\n this._regExp = Array.isArray(regExp) ? regExp : [regExp];\n if (useMatches) {\n this.useMatches = useMatches;\n }\n }\n\n parse = (line: (offset: number) => string | undefined, target: T): boolean => {\n this.resetMatches();\n\n if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) {\n return false;\n }\n\n return this.useMatches(target, this.prepareMatches()) !== false;\n };\n\n protected resetMatches() {\n this.matches.length = 0;\n }\n\n protected prepareMatches() {\n return this.matches;\n }\n\n protected addMatch(reg: RegExp, index: number, line?: string) {\n const matched = line && reg.exec(line);\n if (matched) {\n this.pushMatch(index, matched);\n }\n\n return !!matched;\n }\n\n protected pushMatch(_index: number, matched: string[]) {\n this.matches.push(...matched.slice(1));\n }\n}\n\nexport class RemoteLineParser extends LineParser {\n protected addMatch(reg: RegExp, index: number, line?: string): boolean {\n return /^remote:\\s/.test(String(line)) && super.addMatch(reg, index, line);\n }\n\n protected pushMatch(index: number, matched: string[]) {\n if (index > 0 || matched.length > 1) {\n super.pushMatch(index, matched);\n }\n }\n}\n", "import { SimpleGitOptions } from '../types';\n\nconst defaultOptions: Omit = {\n binary: 'git',\n maxConcurrentProcesses: 5,\n config: [],\n trimmed: false,\n};\n\nexport function createInstanceConfig(\n ...options: Array | undefined>\n): SimpleGitOptions {\n const baseDir = process.cwd();\n const config: SimpleGitOptions = Object.assign(\n { baseDir, ...defaultOptions },\n ...options.filter((o) => typeof o === 'object' && o)\n );\n\n config.baseDir = config.baseDir || baseDir;\n config.trimmed = config.trimmed === true;\n\n return config;\n}\n", "import {\n filterArray,\n filterFunction,\n filterPlainObject,\n filterPrimitives,\n filterType,\n} from './argument-filters';\nimport { asFunction, asStringArray, isUserFunction, last } from './util';\nimport { Maybe, Options } from '../types';\nimport { isPathSpec } from '../args/pathspec';\n\nexport function appendTaskOptions(\n options: Maybe,\n commands: string[] = []\n): string[] {\n if (!filterPlainObject(options)) {\n return commands;\n }\n\n return Object.keys(options).reduce((commands: string[], key: string) => {\n const value = options[key];\n\n if (isPathSpec(value)) {\n commands.push(value);\n } else if (filterPrimitives(value, ['boolean'])) {\n commands.push(key + '=' + value);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n if (!filterPrimitives(v, ['string', 'number'])) {\n commands.push(key + '=' + v);\n }\n }\n } else {\n commands.push(key);\n }\n\n return commands;\n }, commands);\n}\n\nexport function getTrailingOptions(\n args: IArguments,\n initialPrimitive = 0,\n objectOnly = false\n): string[] {\n const command: string[] = [];\n\n for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) {\n if ('string|number'.includes(typeof args[i])) {\n command.push(String(args[i]));\n }\n }\n\n appendTaskOptions(trailingOptionsArgument(args), command);\n if (!objectOnly) {\n command.push(...trailingArrayArgument(args));\n }\n\n return command;\n}\n\nfunction trailingArrayArgument(args: IArguments) {\n const hasTrailingCallback = typeof last(args) === 'function';\n return asStringArray(filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, []));\n}\n\n/**\n * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument\n * if there is one. When not found, the return value is null.\n */\nexport function trailingOptionsArgument(args: IArguments): Maybe {\n const hasTrailingCallback = filterFunction(last(args));\n return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject);\n}\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function trailingFunctionArgument(\n args: unknown[] | IArguments | unknown,\n includeNoop = true\n): Maybe<(...args: unknown[]) => unknown> {\n const callback = asFunction(last(args));\n return includeNoop || isUserFunction(callback) ? callback : undefined;\n}\n", "import type { MaybeArray, TaskParser, TaskResponseFormat } from '../types';\nimport { GitOutputStreams } from './git-output-streams';\nimport { LineParser } from './line-parser';\nimport { asArray, toLinesWithContent } from './util';\n\nexport function callTaskParser(\n parser: TaskParser,\n streams: GitOutputStreams\n) {\n return parser(streams.stdOut, streams.stdErr);\n}\n\nexport function parseStringResponse(\n result: T,\n parsers: LineParser[],\n texts: MaybeArray,\n trim = true\n): T {\n asArray(texts).forEach((text) => {\n for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) {\n const line = (offset = 0) => {\n if (i + offset >= max) {\n return;\n }\n return lines[i + offset];\n };\n\n parsers.some(({ parse }) => parse(line, result));\n }\n });\n\n return result;\n}\n", "export * from './argument-filters';\nexport * from './exit-codes';\nexport * from './git-output-streams';\nexport * from './line-parser';\nexport * from './simple-git-options';\nexport * from './task-options';\nexport * from './task-parser';\nexport * from './util';\n", "import { ExitCodes } from '../utils';\nimport { Maybe, StringTask } from '../types';\n\nexport enum CheckRepoActions {\n BARE = 'bare',\n IN_TREE = 'tree',\n IS_REPO_ROOT = 'root',\n}\n\nconst onError: StringTask['onError'] = ({ exitCode }, error, done, fail) => {\n if (exitCode === ExitCodes.UNCLEAN && isNotRepoMessage(error)) {\n return done(Buffer.from('false'));\n }\n\n fail(error);\n};\n\nconst parser: StringTask['parser'] = (text) => {\n return text.trim() === 'true';\n};\n\nexport function checkIsRepoTask(action: Maybe): StringTask {\n switch (action) {\n case CheckRepoActions.BARE:\n return checkIsBareRepoTask();\n case CheckRepoActions.IS_REPO_ROOT:\n return checkIsRepoRootTask();\n }\n\n const commands = ['rev-parse', '--is-inside-work-tree'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nexport function checkIsRepoRootTask(): StringTask {\n const commands = ['rev-parse', '--git-dir'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser(path) {\n return /^\\.(git)?$/.test(path.trim());\n },\n };\n}\n\nexport function checkIsBareRepoTask(): StringTask {\n const commands = ['rev-parse', '--is-bare-repository'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nfunction isNotRepoMessage(error: Error): boolean {\n return /(Not a git repository|Kein Git-Repository)/i.test(String(error));\n}\n", "import { CleanSummary } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\n\nexport class CleanResponse implements CleanSummary {\n public paths: string[] = [];\n public files: string[] = [];\n public folders: string[] = [];\n\n constructor(public readonly dryRun: boolean) {}\n}\n\nconst removalRegexp = /^[a-z]+\\s*/i;\nconst dryRunRemovalRegexp = /^[a-z]+\\s+[a-z]+\\s*/i;\nconst isFolderRegexp = /\\/$/;\n\nexport function cleanSummaryParser(dryRun: boolean, text: string): CleanSummary {\n const summary = new CleanResponse(dryRun);\n const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp;\n\n toLinesWithContent(text).forEach((line) => {\n const removed = line.replace(regexp, '');\n\n summary.paths.push(removed);\n (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed);\n });\n\n return summary;\n}\n", "import { TaskConfigurationError } from '../errors/task-configuration-error';\nimport type { BufferTask, EmptyTaskParser, SimpleGitTask, StringTask } from '../types';\n\nexport const EMPTY_COMMANDS: [] = [];\n\nexport type EmptyTask = {\n commands: typeof EMPTY_COMMANDS;\n format: 'empty';\n parser: EmptyTaskParser;\n onError?: undefined;\n};\n\nexport function adhocExecTask(parser: EmptyTaskParser): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser,\n };\n}\n\nexport function configurationErrorTask(error: Error | string): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser() {\n throw typeof error === 'string' ? new TaskConfigurationError(error) : error;\n },\n };\n}\n\nexport function straightThroughStringTask(commands: string[], trimmed = false): StringTask {\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return trimmed ? String(text).trim() : text;\n },\n };\n}\n\nexport function straightThroughBufferTask(commands: string[]): BufferTask {\n return {\n commands,\n format: 'buffer',\n parser(buffer) {\n return buffer;\n },\n };\n}\n\nexport function isBufferTask(task: SimpleGitTask): task is BufferTask {\n return task.format === 'buffer';\n}\n\nexport function isEmptyTask(task: SimpleGitTask): task is EmptyTask {\n return task.format === 'empty' || !task.commands.length;\n}\n", "import { CleanSummary } from '../../../typings';\nimport { cleanSummaryParser } from '../responses/CleanSummary';\nimport { Maybe, StringTask } from '../types';\nimport { asStringArray } from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport const CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported';\nexport const CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter (\"n\" or \"f\") is required';\nexport const CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: ';\n\n/**\n * All supported option switches available for use in a `git.clean` operation\n */\nexport enum CleanOptions {\n DRY_RUN = 'n',\n FORCE = 'f',\n IGNORED_INCLUDED = 'x',\n IGNORED_ONLY = 'X',\n EXCLUDING = 'e',\n QUIET = 'q',\n RECURSIVE = 'd',\n}\n\n/**\n * The two modes `git.clean` can run in - one of these must be supplied in order\n * for the command to not throw a `TaskConfigurationError`\n */\nexport type CleanMode = CleanOptions.FORCE | CleanOptions.DRY_RUN;\n\nconst CleanOptionValues: Set = new Set([\n 'i',\n ...asStringArray(Object.values(CleanOptions as any)),\n]);\n\nexport function cleanWithOptionsTask(mode: CleanMode | string, customArgs: string[]) {\n const { cleanMode, options, valid } = getCleanOptions(mode);\n\n if (!cleanMode) {\n return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED);\n }\n\n if (!valid.options) {\n return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode));\n }\n\n options.push(...customArgs);\n\n if (options.some(isInteractiveMode)) {\n return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE);\n }\n\n return cleanTask(cleanMode, options);\n}\n\nexport function cleanTask(mode: CleanMode, customArgs: string[]): StringTask {\n const commands: string[] = ['clean', `-${mode}`, ...customArgs];\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): CleanSummary {\n return cleanSummaryParser(mode === CleanOptions.DRY_RUN, text);\n },\n };\n}\n\nexport function isCleanOptionsArray(input: string[]): input is CleanOptions[] {\n return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test));\n}\n\nfunction getCleanOptions(input: string) {\n let cleanMode: Maybe;\n let options: string[] = [];\n let valid = { cleanMode: false, options: true };\n\n input\n .replace(/[^a-z]i/g, '')\n .split('')\n .forEach((char) => {\n if (isCleanMode(char)) {\n cleanMode = char;\n valid.cleanMode = true;\n } else {\n valid.options = valid.options && isKnownOption((options[options.length] = `-${char}`));\n }\n });\n\n return {\n cleanMode,\n options,\n valid,\n };\n}\n\nfunction isCleanMode(cleanMode?: string): cleanMode is CleanMode {\n return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN;\n}\n\nfunction isKnownOption(option: string): boolean {\n return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1));\n}\n\nfunction isInteractiveMode(option: string): boolean {\n if (/^-[^\\-]/.test(option)) {\n return option.indexOf('i') > 0;\n }\n\n return option === '--interactive';\n}\n", "import { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings';\nimport { last, splitOn } from '../utils';\n\nexport class ConfigList implements ConfigListSummary {\n public files: string[] = [];\n public values: { [fileName: string]: ConfigValues } = Object.create(null);\n\n private _all: ConfigValues | undefined;\n\n public get all(): ConfigValues {\n if (!this._all) {\n this._all = this.files.reduce((all: ConfigValues, file: string) => {\n return Object.assign(all, this.values[file]);\n }, {});\n }\n\n return this._all;\n }\n\n public addFile(file: string): ConfigValues {\n if (!(file in this.values)) {\n const latest = last(this.files);\n this.values[file] = latest ? Object.create(this.values[latest]) : {};\n\n this.files.push(file);\n }\n\n return this.values[file];\n }\n\n public addValue(file: string, key: string, value: string) {\n const values = this.addFile(file);\n\n if (!Object.hasOwn(values, key)) {\n values[key] = value;\n } else if (Array.isArray(values[key])) {\n (values[key] as string[]).push(value);\n } else {\n values[key] = [values[key] as string, value];\n }\n\n this._all = undefined;\n }\n}\n\nexport function configListParser(text: string): ConfigList {\n const config = new ConfigList();\n\n for (const item of configParser(text)) {\n config.addValue(item.file, String(item.key), item.value);\n }\n\n return config;\n}\n\nexport function configGetParser(text: string, key: string): ConfigGetResult {\n let value: string | null = null;\n const values: string[] = [];\n const scopes: Map = new Map();\n\n for (const item of configParser(text, key)) {\n if (item.key !== key) {\n continue;\n }\n\n values.push((value = item.value));\n\n if (!scopes.has(item.file)) {\n scopes.set(item.file, []);\n }\n\n scopes.get(item.file)!.push(value);\n }\n\n return {\n key,\n paths: Array.from(scopes.keys()),\n scopes,\n value,\n values,\n };\n}\n\nfunction configFilePath(filePath: string): string {\n return filePath.replace(/^(file):/, '');\n}\n\nfunction* configParser(text: string, requestedKey: string | null = null) {\n const lines = text.split('\\0');\n\n for (let i = 0, max = lines.length - 1; i < max; ) {\n const file = configFilePath(lines[i++]);\n\n let value = lines[i++];\n let key = requestedKey;\n\n if (value.includes('\\n')) {\n const line = splitOn(value, '\\n');\n key = line[0];\n value = line[1];\n }\n\n yield { file, key, value };\n }\n}\n", "import type { ConfigGetResult, ConfigListSummary, SimpleGit } from '../../../typings';\nimport { configGetParser, configListParser } from '../responses/ConfigList';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { trailingFunctionArgument } from '../utils';\n\nexport enum GitConfigScope {\n system = 'system',\n global = 'global',\n local = 'local',\n worktree = 'worktree',\n}\n\nfunction asConfigScope(\n scope: GitConfigScope | unknown,\n fallback: T\n): GitConfigScope | T {\n if (typeof scope === 'string' && Object.hasOwn(GitConfigScope, scope)) {\n return scope as GitConfigScope;\n }\n return fallback;\n}\n\nfunction addConfigTask(\n key: string,\n value: string,\n append: boolean,\n scope: GitConfigScope\n): StringTask {\n const commands: string[] = ['config', `--${scope}`];\n\n if (append) {\n commands.push('--add');\n }\n\n commands.push(key, value);\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): string {\n return text;\n },\n };\n}\n\nfunction getConfigTask(key: string, scope?: GitConfigScope): StringTask {\n const commands: string[] = ['config', '--null', '--show-origin', '--get-all', key];\n\n if (scope) {\n commands.splice(1, 0, `--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return configGetParser(text, key);\n },\n };\n}\n\nfunction listConfigTask(scope?: GitConfigScope): StringTask {\n const commands = ['config', '--list', '--show-origin', '--null'];\n\n if (scope) {\n commands.push(`--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string) {\n return configListParser(text);\n },\n };\n}\n\nexport default function (): Pick {\n return {\n addConfig(this: SimpleGitApi, key: string, value: string, ...rest: unknown[]) {\n return this._runTask(\n addConfigTask(\n key,\n value,\n rest[0] === true,\n asConfigScope(rest[1], GitConfigScope.local)\n ),\n trailingFunctionArgument(arguments)\n );\n },\n\n getConfig(this: SimpleGitApi, key: string, scope?: GitConfigScope) {\n return this._runTask(\n getConfigTask(key, asConfigScope(scope, undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n\n listConfig(this: SimpleGitApi, ...rest: unknown[]) {\n return this._runTask(\n listConfigTask(asConfigScope(rest[0], undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "export enum DiffNameStatus {\n ADDED = 'A',\n COPIED = 'C',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n CHANGED = 'T',\n UNMERGED = 'U',\n UNKNOWN = 'X',\n BROKEN = 'B',\n}\n\nconst diffNameStatus = new Set(Object.values(DiffNameStatus));\n\nexport function isDiffNameStatus(input: string): input is DiffNameStatus {\n return diffNameStatus.has(input as DiffNameStatus);\n}\n", "import { GrepResult, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport {\n asNumber,\n forEachLineWithContent,\n getTrailingOptions,\n NULL,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\n\nimport { configurationErrorTask } from './task';\n\nconst disallowedOptions = ['-h'];\n\nconst Query = Symbol('grepQuery');\n\nexport interface GitGrepQuery extends Iterable {\n /** Adds one or more terms to be grouped as an \"and\" to any other terms */\n and(...and: string[]): this;\n\n /** Adds one or more search terms - git.grep will \"or\" this to other terms */\n param(...param: string[]): this;\n}\n\nclass GrepQuery implements GitGrepQuery {\n private [Query]: string[] = [];\n\n *[Symbol.iterator]() {\n for (const query of this[Query]) {\n yield query;\n }\n }\n\n and(...and: string[]) {\n and.length && this[Query].push('--and', '(', ...prefixedArray(and, '-e'), ')');\n return this;\n }\n\n param(...param: string[]) {\n this[Query].push(...prefixedArray(param, '-e'));\n return this;\n }\n}\n\n/**\n * Creates a new builder for a `git.grep` query with optional params\n */\nexport function grepQueryBuilder(...params: string[]): GitGrepQuery {\n return new GrepQuery().param(...params);\n}\n\nfunction parseGrep(grep: string): GrepResult {\n const paths: GrepResult['paths'] = new Set();\n const results: GrepResult['results'] = {};\n\n forEachLineWithContent(grep, (input) => {\n const [path, line, preview] = input.split(NULL);\n paths.add(path);\n (results[path] = results[path] || []).push({\n line: asNumber(line),\n path,\n preview,\n });\n });\n\n return {\n paths,\n results,\n };\n}\n\nexport default function (): Pick {\n return {\n grep(this: SimpleGitApi, searchTerm: string | GitGrepQuery) {\n const then = trailingFunctionArgument(arguments);\n const options = getTrailingOptions(arguments);\n\n for (const option of disallowedOptions) {\n if (options.includes(option)) {\n return this._runTask(\n configurationErrorTask(`git.grep: use of \"${option}\" is not supported.`),\n then\n );\n }\n }\n\n if (typeof searchTerm === 'string') {\n searchTerm = grepQueryBuilder().param(searchTerm);\n }\n\n const commands = ['grep', '--null', '-n', '--full-name', ...options, ...searchTerm];\n\n return this._runTask(\n {\n commands,\n format: 'utf-8',\n parser(stdOut) {\n return parseGrep(stdOut);\n },\n },\n then\n );\n },\n };\n}\n", "import type { Maybe, OptionFlags, Options } from '../types';\nimport { asStringArray } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport enum ResetMode {\n MIXED = 'mixed',\n SOFT = 'soft',\n HARD = 'hard',\n MERGE = 'merge',\n KEEP = 'keep',\n}\n\nconst validResetModes = asStringArray(Object.values(ResetMode));\n\nexport type ResetOptions = Options &\n OptionFlags<'-q' | '--quiet' | '--no-quiet' | '--pathspec-from-nul'> &\n OptionFlags<'--pathspec-from-file', string>;\n\nexport function resetTask(mode: Maybe, customArgs: string[]) {\n const commands: string[] = ['reset'];\n if (isValidResetMode(mode)) {\n commands.push(`--${mode}`);\n }\n commands.push(...customArgs);\n\n return straightThroughStringTask(commands);\n}\n\nexport function getResetMode(mode: ResetMode | unknown): Maybe {\n if (isValidResetMode(mode)) {\n return mode;\n }\n\n switch (typeof mode) {\n case 'string':\n case 'undefined':\n return ResetMode.SOFT;\n }\n\n return;\n}\n\nfunction isValidResetMode(mode: ResetMode | unknown): mode is ResetMode {\n return typeof mode === 'string' && validResetModes.includes(mode);\n}\n", "import debug, { Debugger } from 'debug';\nimport {\n append,\n filterHasLength,\n filterString,\n filterType,\n NOOP,\n objectToString,\n remove,\n} from './utils';\nimport { Maybe } from './types';\n\ndebug.formatters.L = (value: any) => String(filterHasLength(value) ? value.length : '-');\ndebug.formatters.B = (value: Buffer) => {\n if (Buffer.isBuffer(value)) {\n return value.toString('utf8');\n }\n return objectToString(value);\n};\n\ntype OutputLoggingHandler = (message: string, ...args: any[]) => void;\n\nfunction createLog() {\n return debug('simple-git');\n}\n\nexport interface OutputLogger extends OutputLoggingHandler {\n readonly label: string;\n\n info: OutputLoggingHandler;\n step(nextStep?: string): OutputLogger;\n sibling(name: string): OutputLogger;\n}\n\nfunction prefixedLogger(\n to: Debugger,\n prefix: string,\n forward?: OutputLoggingHandler\n): OutputLoggingHandler {\n if (!prefix || !String(prefix).replace(/\\s*/, '')) {\n return !forward\n ? to\n : (message, ...args) => {\n to(message, ...args);\n forward(message, ...args);\n };\n }\n\n return (message, ...args) => {\n to(`%s ${message}`, prefix, ...args);\n if (forward) {\n forward(message, ...args);\n }\n };\n}\n\nfunction childLoggerName(\n name: Maybe,\n childDebugger: Maybe,\n { namespace: parentNamespace }: Debugger\n): string {\n if (typeof name === 'string') {\n return name;\n }\n const childNamespace = (childDebugger && childDebugger.namespace) || '';\n\n if (childNamespace.startsWith(parentNamespace)) {\n return childNamespace.substr(parentNamespace.length + 1);\n }\n\n return childNamespace || parentNamespace;\n}\n\nexport function createLogger(\n label: string,\n verbose?: string | Debugger,\n initialStep?: string,\n infoDebugger = createLog()\n): OutputLogger {\n const labelPrefix = (label && `[${label}]`) || '';\n\n const spawned: OutputLogger[] = [];\n const debugDebugger: Maybe =\n typeof verbose === 'string' ? infoDebugger.extend(verbose) : verbose;\n const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger);\n\n return step(initialStep);\n\n function sibling(name: string, initial?: string) {\n return append(\n spawned,\n createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)\n );\n }\n\n function step(phase?: string) {\n const stepPrefix = (phase && `[${phase}]`) || '';\n const debug = (debugDebugger && prefixedLogger(debugDebugger, stepPrefix)) || NOOP;\n const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug);\n\n return Object.assign(debugDebugger ? debug : info, {\n label,\n sibling,\n info,\n step,\n });\n }\n}\n\n/**\n * The `GitLogger` is used by the main `SimpleGit` runner to handle logging\n * any warnings or errors.\n */\nexport class GitLogger {\n public error: OutputLoggingHandler;\n\n public warn: OutputLoggingHandler;\n\n constructor(private _out: Debugger = createLog()) {\n this.error = prefixedLogger(_out, '[ERROR]');\n this.warn = prefixedLogger(_out, '[WARN]');\n }\n\n silent(silence = false) {\n if (silence !== this._out.enabled) {\n return;\n }\n\n const { namespace } = this._out;\n const env = (process.env.DEBUG || '').split(',').filter((s) => !!s);\n const hasOn = env.includes(namespace);\n const hasOff = env.includes(`-${namespace}`);\n\n // enabling the log\n if (!silence) {\n if (hasOff) {\n remove(env, `-${namespace}`);\n } else {\n env.push(namespace);\n }\n } else {\n if (hasOn) {\n remove(env, namespace);\n } else {\n env.push(`-${namespace}`);\n }\n }\n\n debug.enable(env.join(','));\n }\n}\n", "import { SimpleGitTask } from '../types';\nimport { GitError } from '../errors/git-error';\nimport { createLogger, OutputLogger } from '../git-logger';\n\ntype AnySimpleGitTask = SimpleGitTask;\n\ntype TaskInProgress = {\n name: string;\n logger: OutputLogger;\n task: AnySimpleGitTask;\n};\n\nexport class TasksPendingQueue {\n private _queue: Map = new Map();\n\n constructor(private logLabel = 'GitExecutor') {}\n\n private withProgress(task: AnySimpleGitTask) {\n return this._queue.get(task);\n }\n\n private createProgress(task: AnySimpleGitTask): TaskInProgress {\n const name = TasksPendingQueue.getName(task.commands[0]);\n const logger = createLogger(this.logLabel, name);\n\n return {\n task,\n logger,\n name,\n };\n }\n\n push(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.createProgress(task);\n progress.logger('Adding task to the queue, commands = %o', task.commands);\n\n this._queue.set(task, progress);\n\n return progress;\n }\n\n fatal(err: GitError) {\n for (const [task, { logger }] of Array.from(this._queue.entries())) {\n if (task === err.task) {\n logger.info(`Failed %o`, err);\n logger(\n `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`\n );\n } else {\n logger.info(\n `A fatal exception occurred in a previous task, the queue has been purged: %o`,\n err.message\n );\n }\n\n this.complete(task);\n }\n\n if (this._queue.size !== 0) {\n throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`);\n }\n }\n\n complete(task: AnySimpleGitTask) {\n const progress = this.withProgress(task);\n if (progress) {\n this._queue.delete(task);\n }\n }\n\n attempt(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.withProgress(task);\n if (!progress) {\n throw new GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task');\n }\n progress.logger('Starting task');\n\n return progress;\n }\n\n static getName(name = 'empty') {\n return `task:${name}:${++TasksPendingQueue.counter}`;\n }\n\n private static counter = 0;\n}\n", "import { spawn, SpawnOptions } from 'child_process';\nimport { GitError } from '../errors/git-error';\nimport { OutputLogger } from '../git-logger';\nimport { PluginStore } from '../plugins';\nimport { EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task';\nimport {\n GitExecutorResult,\n Maybe,\n outputHandler,\n RunnableTask,\n SimpleGitExecutor,\n SimpleGitTask,\n} from '../types';\nimport { callTaskParser, first, GitOutputStreams, objectToString } from '../utils';\nimport { Scheduler } from './scheduler';\nimport { TasksPendingQueue } from './tasks-pending-queue';\n\nexport class GitExecutorChain implements SimpleGitExecutor {\n private _chain: Promise = Promise.resolve();\n private _queue = new TasksPendingQueue();\n private _cwd: string | undefined;\n\n public get cwd() {\n return this._cwd || this._executor.cwd;\n }\n\n public set cwd(cwd: string) {\n this._cwd = cwd;\n }\n\n public get env() {\n return this._executor.env;\n }\n\n public get outputHandler() {\n return this._executor.outputHandler;\n }\n\n constructor(\n private _executor: SimpleGitExecutor,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n public chain() {\n return this;\n }\n\n public push(task: SimpleGitTask): Promise {\n this._queue.push(task);\n\n return (this._chain = this._chain.then(() => this.attemptTask(task)));\n }\n\n private async attemptTask(task: SimpleGitTask): Promise {\n const onScheduleComplete = await this._scheduler.next();\n const onQueueComplete = () => this._queue.complete(task);\n\n try {\n const { logger } = this._queue.attempt(task);\n return (await (isEmptyTask(task)\n ? this.attemptEmptyTask(task, logger)\n : this.attemptRemoteTask(task, logger))) as R;\n } catch (e) {\n throw this.onFatalException(task, e as Error);\n } finally {\n onQueueComplete();\n onScheduleComplete();\n }\n }\n\n private onFatalException(task: SimpleGitTask, e: Error) {\n const gitError =\n e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e));\n\n this._chain = Promise.resolve();\n this._queue.fatal(gitError);\n\n return gitError;\n }\n\n private async attemptRemoteTask(task: RunnableTask, logger: OutputLogger) {\n const binary = this._plugins.exec('spawn.binary', '', pluginContext(task, task.commands));\n const args = this._plugins.exec(\n 'spawn.args',\n [...task.commands],\n pluginContext(task, task.commands)\n );\n\n const raw = await this.gitResponse(\n task,\n binary,\n args,\n this.outputHandler,\n logger.step('SPAWN')\n );\n const outputStreams = await this.handleTaskData(task, args, raw, logger.step('HANDLE'));\n\n logger(`passing response to task's parser as a %s`, task.format);\n\n if (isBufferTask(task)) {\n return callTaskParser(task.parser, outputStreams);\n }\n\n return callTaskParser(task.parser, outputStreams.asStrings());\n }\n\n private async attemptEmptyTask(task: EmptyTask, logger: OutputLogger) {\n logger(`empty task bypassing child process to call to task's parser`);\n return task.parser(this);\n }\n\n private handleTaskData(\n task: SimpleGitTask,\n args: string[],\n result: GitExecutorResult,\n logger: OutputLogger\n ): Promise {\n const { exitCode, rejection, stdOut, stdErr } = result;\n\n return new Promise((done, fail) => {\n logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode);\n\n const { error } = this._plugins.exec(\n 'task.error',\n { error: rejection },\n {\n ...pluginContext(task, args),\n ...result,\n }\n );\n\n if (error && task.onError) {\n logger.info(`exitCode=%s handling with custom error handler`);\n\n return task.onError(\n result,\n error,\n (newStdOut) => {\n logger.info(`custom error handler treated as success`);\n logger(`custom error returned a %s`, objectToString(newStdOut));\n\n done(\n new GitOutputStreams(\n Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut,\n Buffer.concat(stdErr)\n )\n );\n },\n fail\n );\n }\n\n if (error) {\n logger.info(\n `handling as error: exitCode=%s stdErr=%s rejection=%o`,\n exitCode,\n stdErr.length,\n rejection\n );\n return fail(error);\n }\n\n logger.info(`retrieving task output complete`);\n done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr)));\n });\n }\n\n private async gitResponse(\n task: SimpleGitTask,\n command: string,\n args: string[],\n outputHandler: Maybe,\n logger: OutputLogger\n ): Promise {\n const outputLogger = logger.sibling('output');\n const spawnOptions: SpawnOptions = this._plugins.exec(\n 'spawn.options',\n {\n cwd: this.cwd,\n env: this.env,\n windowsHide: true,\n },\n pluginContext(task, task.commands)\n );\n\n return new Promise((done) => {\n const stdOut: Buffer[] = [];\n const stdErr: Buffer[] = [];\n\n logger.info(`%s %o`, command, args);\n logger('%O', spawnOptions);\n\n let rejection = this._beforeSpawn(task, args);\n if (rejection) {\n return done({\n stdOut,\n stdErr,\n exitCode: 9901,\n rejection,\n });\n }\n\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n const spawned = spawn(command, args, spawnOptions);\n\n spawned.stdout!.on(\n 'data',\n onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))\n );\n spawned.stderr!.on(\n 'data',\n onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))\n );\n\n spawned.on('error', onErrorReceived(stdErr, logger));\n\n if (outputHandler) {\n logger(`Passing child process stdOut/stdErr to custom outputHandler`);\n outputHandler(command, spawned.stdout!, spawned.stderr!, [...args]);\n }\n\n this._plugins.exec('spawn.after', undefined, {\n ...pluginContext(task, args),\n spawned,\n close(exitCode: number, reason?: Error) {\n done({\n stdOut,\n stdErr,\n exitCode,\n rejection: rejection || reason,\n });\n },\n kill(reason: Error) {\n if (spawned.killed) {\n return;\n }\n\n rejection = reason;\n spawned.kill('SIGINT');\n },\n });\n });\n }\n\n private _beforeSpawn(task: SimpleGitTask, args: string[]) {\n let rejection: Maybe;\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n return rejection;\n }\n}\n\nfunction pluginContext(task: SimpleGitTask, commands: string[]) {\n return {\n method: first(task.commands) || '',\n commands,\n };\n}\n\nfunction onErrorReceived(target: Buffer[], logger: OutputLogger) {\n return (err: Error) => {\n logger(`[ERROR] child process exception %o`, err);\n target.push(Buffer.from(String(err.stack), 'ascii'));\n };\n}\n\nfunction onDataReceived(\n target: Buffer[],\n name: string,\n logger: OutputLogger,\n output: OutputLogger\n) {\n return (buffer: Buffer) => {\n logger(`%s received %L bytes`, name, buffer);\n output(`%B`, buffer);\n target.push(buffer);\n };\n}\n", "import type { PluginStore } from '../plugins';\nimport type { GitExecutorEnv, outputHandler, SimpleGitExecutor, SimpleGitTask } from '../types';\n\nimport { GitExecutorChain } from './git-executor-chain';\nimport { Scheduler } from './scheduler';\n\nexport class GitExecutor implements SimpleGitExecutor {\n private _chain = new GitExecutorChain(this, this._scheduler, this._plugins);\n\n public env: GitExecutorEnv;\n public outputHandler?: outputHandler;\n\n constructor(\n public cwd: string,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n chain(): SimpleGitExecutor {\n return new GitExecutorChain(this, this._scheduler, this._plugins);\n }\n\n push(task: SimpleGitTask): Promise {\n return this._chain.push(task);\n }\n}\n", "import { GitError } from './errors/git-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport { NOOP } from './utils';\n\nexport function taskCallback(\n task: SimpleGitTask,\n response: Promise,\n callback: SimpleGitTaskCallback = NOOP\n) {\n const onSuccess = (data: R) => {\n callback(null, data);\n };\n\n const onError = (err: GitError | GitResponseError) => {\n if (err?.task === task) {\n callback(\n err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err,\n undefined as any\n );\n }\n };\n\n response.then(onSuccess, onError);\n}\n\nfunction addDeprecationNoticeToError(err: GitResponseError) {\n let log = (name: string) => {\n console.warn(\n `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`\n );\n log = NOOP;\n };\n\n return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {}));\n\n function descriptorReducer(all: PropertyDescriptorMap, name: string): typeof all {\n if (name in err) {\n return all;\n }\n\n all[name] = {\n enumerable: false,\n configurable: false,\n get() {\n log(name);\n return err.git[name];\n },\n };\n\n return all;\n }\n}\n", "import { folderExists } from '../utils';\nimport { SimpleGitExecutor } from '../types';\nimport { adhocExecTask } from './task';\n\nexport function changeWorkingDirectoryTask(directory: string, root?: SimpleGitExecutor) {\n return adhocExecTask((instance: SimpleGitExecutor) => {\n if (!folderExists(directory)) {\n throw new Error(`Git.cwd: cannot change to non-directory \"${directory}\"`);\n }\n\n return ((root || instance).cwd = directory);\n });\n}\n", "import type { SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, remove, trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nfunction checkoutTask(args: string[]) {\n const commands = ['checkout', ...args];\n if (commands[1] === '-b' && commands.includes('-B')) {\n commands[1] = remove(commands, '-B');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport default function (): Pick {\n return {\n checkout(this: SimpleGitApi) {\n return this._runTask(\n checkoutTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutBranch(this: SimpleGitApi, branchName, startPoint) {\n return this._runTask(\n checkoutTask(['-b', branchName, startPoint, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutLocalBranch(this: SimpleGitApi, branchName) {\n return this._runTask(\n checkoutTask(['-b', branchName, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asCamelCase, asNumber, LineParser, parseStringResponse } from '../utils';\n\nexport interface CountObjectsResult {\n count: number;\n size: number;\n inPack: number;\n packs: number;\n sizePack: number;\n prunePackable: number;\n garbage: number;\n sizeGarbage: number;\n}\n\nfunction countObjectsResponse(): CountObjectsResult {\n return {\n count: 0,\n garbage: 0,\n inPack: 0,\n packs: 0,\n prunePackable: 0,\n size: 0,\n sizeGarbage: 0,\n sizePack: 0,\n };\n}\n\nconst parser: LineParser = new LineParser(\n /([a-z-]+): (\\d+)$/,\n (result, [key, value]) => {\n const property = asCamelCase(key);\n if (Object.hasOwn(result, property)) {\n result[property as keyof typeof result] = asNumber(value);\n }\n }\n);\n\nexport default function (): Pick {\n return {\n countObjects(this: SimpleGitApi) {\n return this._runTask({\n commands: ['count-objects', '--verbose'],\n format: 'utf-8',\n parser(stdOut: string) {\n return parseStringResponse(countObjectsResponse(), [parser], stdOut);\n },\n });\n },\n };\n}\n", "import { CommitResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/^\\[([^\\s]+)( \\([^)]+\\))? ([^\\]]+)/, (result, [branch, root, commit]) => {\n result.branch = branch;\n result.commit = commit;\n result.root = !!root;\n }),\n new LineParser(/\\s*Author:\\s(.+)/i, (result, [author]) => {\n const parts = author.split('<');\n const email = parts.pop();\n\n if (!email || !email.includes('@')) {\n return;\n }\n\n result.author = {\n email: email.substr(0, email.length - 1),\n name: parts.join('<').trim(),\n };\n }),\n new LineParser(\n /(\\d+)[^,]*(?:,\\s*(\\d+)[^,]*)(?:,\\s*(\\d+))/g,\n (result, [changes, insertions, deletions]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n result.summary.insertions = parseInt(insertions, 10) || 0;\n result.summary.deletions = parseInt(deletions, 10) || 0;\n }\n ),\n new LineParser(\n /^(\\d+)[^,]*(?:,\\s*(\\d+)[^(]+\\(([+-]))?/,\n (result, [changes, lines, direction]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n const count = parseInt(lines, 10) || 0;\n if (direction === '-') {\n result.summary.deletions = count;\n } else if (direction === '+') {\n result.summary.insertions = count;\n }\n }\n ),\n];\n\nexport function parseCommitResult(stdOut: string): CommitResult {\n const result: CommitResult = {\n author: null,\n branch: '',\n commit: '',\n root: false,\n summary: {\n changes: 0,\n insertions: 0,\n deletions: 0,\n },\n };\n return parseStringResponse(result, parsers, stdOut);\n}\n", "import type { CommitResult, SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { parseCommitResult } from '../parsers/parse-commit';\nimport {\n asArray,\n asStringArray,\n filterArray,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport function commitTask(\n message: string[],\n files: string[],\n customArgs: string[]\n): StringTask {\n const commands: string[] = [\n '-c',\n 'core.abbrev=40',\n 'commit',\n ...prefixedArray(message, '-m'),\n ...files,\n ...customArgs,\n ];\n\n return {\n commands,\n format: 'utf-8',\n parser: parseCommitResult,\n };\n}\n\nexport default function (): Pick {\n return {\n commit(this: SimpleGitApi, message: string | string[], ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const task =\n rejectDeprecatedSignatures(message) ||\n commitTask(\n asArray(message),\n asArray(filterType(rest[0], filterStringOrStringArray, [])),\n [\n ...asStringArray(filterType(rest[1], filterArray, [])),\n ...getTrailingOptions(arguments, 0, true),\n ]\n );\n\n return this._runTask(task, next);\n },\n };\n\n function rejectDeprecatedSignatures(message?: unknown) {\n return (\n !filterStringOrStringArray(message) &&\n configurationErrorTask(\n `git.commit: requires the commit message to be supplied as a string/string[]`\n )\n );\n }\n}\n", "import { Response, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport default function (): Pick {\n return {\n firstCommit(this: SimpleGitApi): Response {\n return this._runTask(\n straightThroughStringTask(['rev-list', '--max-parents=0', 'HEAD'], true),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import { straightThroughStringTask } from './task';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.hashObject`\n */\nexport function hashObjectTask(filePath: string, write: boolean): StringTask {\n const commands = ['hash-object', filePath];\n if (write) {\n commands.push('-w');\n }\n\n return straightThroughStringTask(commands, true);\n}\n", "import { InitResult } from '../../../typings';\n\nexport class InitSummary implements InitResult {\n constructor(\n public readonly bare: boolean,\n public readonly path: string,\n public readonly existing: boolean,\n public readonly gitDir: string\n ) {}\n}\n\nconst initResponseRegex = /^Init.+ repository in (.+)$/;\nconst reInitResponseRegex = /^Rein.+ in (.+)$/;\n\nexport function parseInit(bare: boolean, path: string, text: string) {\n const response = String(text).trim();\n let result;\n\n if ((result = initResponseRegex.exec(response))) {\n return new InitSummary(bare, path, false, result[1]);\n }\n\n if ((result = reInitResponseRegex.exec(response))) {\n return new InitSummary(bare, path, true, result[1]);\n }\n\n let gitDir = '';\n const tokens = response.split(' ');\n while (tokens.length) {\n const token = tokens.shift();\n if (token === 'in') {\n gitDir = tokens.join(' ');\n break;\n }\n }\n\n return new InitSummary(bare, path, /^re/i.test(response), gitDir);\n}\n", "import { InitResult } from '../../../typings';\nimport { parseInit } from '../responses/InitSummary';\nimport { StringTask } from '../types';\n\nconst bareCommand = '--bare';\n\nfunction hasBareCommand(command: string[]) {\n return command.includes(bareCommand);\n}\n\nexport function initTask(bare = false, path: string, customArgs: string[]): StringTask {\n const commands = ['init', ...customArgs];\n if (bare && !hasBareCommand(commands)) {\n commands.splice(1, 0, bareCommand);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): InitResult {\n return parseInit(commands.includes('--bare'), path, text);\n },\n };\n}\n", "export enum LogFormat {\n NONE = '',\n STAT = '--stat',\n NUM_STAT = '--numstat',\n NAME_ONLY = '--name-only',\n NAME_STATUS = '--name-status',\n}\n\nconst logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/;\n\nexport function logFormatFromCommand(customArgs: string[]) {\n for (let i = 0; i < customArgs.length; i++) {\n const format = logFormatRegex.exec(customArgs[i]);\n if (format) {\n return `--${format[1]}` as LogFormat;\n }\n }\n\n return LogFormat.NONE;\n}\n\nexport function isLogFormat(customArg: string | unknown) {\n return logFormatRegex.test(customArg as string);\n}\n", "import { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings';\n\n/***\n * The DiffSummary is returned as a response to getting `git().status()`\n */\nexport class DiffSummary implements DiffResult {\n changed = 0;\n deletions = 0;\n insertions = 0;\n\n files: Array = [];\n}\n", "import { DiffResult } from '../../../typings';\nimport { LogFormat } from '../args/log-format';\nimport { DiffSummary } from '../responses/DiffSummary';\nimport { isDiffNameStatus } from '../tasks/diff-name-status';\nimport { asNumber, LineParser, orVoid, parseStringResponse } from '../utils';\n\nconst statParser = [\n new LineParser(\n /^(.+)\\s+\\|\\s+(\\d+)(\\s+[+\\-]+)?$/,\n (result, [file, changes, alterations = '']) => {\n result.files.push({\n file: file.trim(),\n changes: asNumber(changes),\n insertions: alterations.replace(/[^+]/g, '').length,\n deletions: alterations.replace(/[^-]/g, '').length,\n binary: false,\n });\n }\n ),\n new LineParser(\n /^(.+) \\|\\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/,\n (result, [file, before, after]) => {\n result.files.push({\n file: file.trim(),\n before: asNumber(before),\n after: asNumber(after),\n binary: true,\n });\n }\n ),\n new LineParser(\n /(\\d+) files? changed\\s*((?:, \\d+ [^,]+){0,2})/,\n (result, [changed, summary]) => {\n const inserted = /(\\d+) i/.exec(summary);\n const deleted = /(\\d+) d/.exec(summary);\n\n result.changed = asNumber(changed);\n result.insertions = asNumber(inserted?.[1]);\n result.deletions = asNumber(deleted?.[1]);\n }\n ),\n];\n\nconst numStatParser = [\n new LineParser(\n /(\\d+)\\t(\\d+)\\t(.+)$/,\n (result, [changesInsert, changesDelete, file]) => {\n const insertions = asNumber(changesInsert);\n const deletions = asNumber(changesDelete);\n\n result.changed++;\n result.insertions += insertions;\n result.deletions += deletions;\n\n result.files.push({\n file,\n changes: insertions + deletions,\n insertions,\n deletions,\n binary: false,\n });\n }\n ),\n new LineParser(/-\\t-\\t(.+)$/, (result, [file]) => {\n result.changed++;\n\n result.files.push({\n file,\n after: 0,\n before: 0,\n binary: true,\n });\n }),\n];\n\nconst nameOnlyParser = [\n new LineParser(/(.+)$/, (result, [file]) => {\n result.changed++;\n result.files.push({\n file,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n });\n }),\n];\n\nconst nameStatusParser = [\n new LineParser(\n /([ACDMRTUXB])([0-9]{0,3})\\t(.[^\\t]*)(\\t(.[^\\t]*))?$/,\n (result, [status, similarity, from, _to, to]) => {\n result.changed++;\n result.files.push({\n file: to ?? from,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n status: orVoid(isDiffNameStatus(status) && status),\n from: orVoid(!!to && from !== to && from),\n similarity: asNumber(similarity),\n });\n }\n ),\n];\n\nconst diffSummaryParsers: Record[]> = {\n [LogFormat.NONE]: statParser,\n [LogFormat.STAT]: statParser,\n [LogFormat.NUM_STAT]: numStatParser,\n [LogFormat.NAME_STATUS]: nameStatusParser,\n [LogFormat.NAME_ONLY]: nameOnlyParser,\n};\n\nexport function getDiffParser(format = LogFormat.NONE) {\n const parser = diffSummaryParsers[format];\n\n return (stdOut: string) => parseStringResponse(new DiffSummary(), parser, stdOut, false);\n}\n", "import { ListLogLine, LogResult } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\nimport { getDiffParser } from './parse-diff-summary';\nimport { LogFormat } from '../args/log-format';\n\nexport const START_BOUNDARY = '\u00F2\u00F2\u00F2\u00F2\u00F2\u00F2 ';\n\nexport const COMMIT_BOUNDARY = ' \u00F2\u00F2';\n\nexport const SPLITTER = ' \u00F2 ';\n\nconst defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email'];\n\nfunction lineBuilder(tokens: string[], fields: string[]): any {\n return fields.reduce(\n (line, field, index) => {\n line[field] = tokens[index] || '';\n return line;\n },\n Object.create({ diff: null }) as any\n );\n}\n\nexport function createListLogSummaryParser(\n splitter = SPLITTER,\n fields = defaultFieldNames,\n logFormat = LogFormat.NONE\n) {\n const parseDiffResult = getDiffParser(logFormat);\n\n return function (stdOut: string): LogResult {\n const all: ReadonlyArray = toLinesWithContent(\n stdOut.trim(),\n false,\n START_BOUNDARY\n ).map(function (item) {\n const lineDetail = item.split(COMMIT_BOUNDARY);\n const listLogLine: T & ListLogLine = lineBuilder(lineDetail[0].split(splitter), fields);\n\n if (lineDetail.length > 1 && !!lineDetail[1].trim()) {\n listLogLine.diff = parseDiffResult(lineDetail[1]);\n }\n\n return listLogLine;\n });\n\n return {\n all,\n latest: (all.length && all[0]) || null,\n total: all.length,\n };\n };\n}\n", "import { StringTask } from '../types';\nimport { DiffResult } from '../../../typings';\nimport { isLogFormat, LogFormat, logFormatFromCommand } from '../args/log-format';\nimport { getDiffParser } from '../parsers/parse-diff-summary';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function diffSummaryTask(customArgs: string[]): StringTask | EmptyTask {\n let logFormat = logFormatFromCommand(customArgs);\n\n const commands = ['diff'];\n\n if (logFormat === LogFormat.NONE) {\n logFormat = LogFormat.STAT;\n commands.push('--stat=4096');\n }\n\n commands.push(...customArgs);\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser: getDiffParser(logFormat),\n }\n );\n}\n\nexport function validateLogFormatConfig(customArgs: unknown[]): EmptyTask | void {\n const flags = customArgs.filter(isLogFormat);\n\n if (flags.length > 1) {\n return configurationErrorTask(\n `Summary flags are mutually exclusive - pick one of ${flags.join(',')}`\n );\n }\n\n if (flags.length && customArgs.includes('-z')) {\n return configurationErrorTask(\n `Summary flag ${flags} parsing is not compatible with null termination option '-z'`\n );\n }\n}\n", "import type { LogResult, Options, SimpleGit } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { pathspec } from '../args/pathspec';\nimport {\n COMMIT_BOUNDARY,\n createListLogSummaryParser,\n SPLITTER,\n START_BOUNDARY,\n} from '../parsers/parse-list-log-summary';\nimport {\n appendTaskOptions,\n asStringArray,\n filterArray,\n filterPlainObject,\n filterString,\n filterType,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} from '../utils';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { configurationErrorTask } from './task';\nimport { validateLogFormatConfig } from './diff';\nimport { StringTask } from '../types';\n\nenum excludeOptions {\n '--pretty',\n 'max-count',\n 'maxCount',\n 'n',\n 'file',\n 'format',\n 'from',\n 'to',\n 'splitter',\n 'symmetric',\n 'mailMap',\n 'multiLine',\n 'strictDate',\n}\n\nexport interface DefaultLogFields {\n hash: string;\n date: string;\n message: string;\n refs: string;\n body: string;\n author_name: string;\n author_email: string;\n}\n\nexport type LogOptions = {\n file?: string;\n format?: T;\n from?: string;\n mailMap?: boolean;\n maxCount?: number;\n multiLine?: boolean;\n splitter?: string;\n strictDate?: boolean;\n symmetric?: boolean;\n to?: string;\n};\n\ninterface ParsedLogOptions {\n fields: string[];\n splitter: string;\n commands: string[];\n}\n\nfunction prettyFormat(\n format: Record,\n splitter: string\n): [string[], string] {\n const fields: string[] = [];\n const formatStr: string[] = [];\n\n Object.keys(format).forEach((field) => {\n fields.push(field);\n formatStr.push(String(format[field]));\n });\n\n return [fields, formatStr.join(splitter)];\n}\n\nfunction userOptions(input: T): Options {\n return Object.keys(input).reduce((out, key) => {\n if (!(key in excludeOptions)) {\n out[key] = input[key];\n }\n return out;\n }, {} as Options);\n}\n\nexport function parseLogOptions(\n opt: Options | LogOptions = {},\n customArgs: string[] = []\n): ParsedLogOptions {\n const splitter = filterType(opt.splitter, filterString, SPLITTER);\n const format = filterPlainObject(opt.format)\n ? opt.format\n : {\n hash: '%H',\n date: opt.strictDate === false ? '%ai' : '%aI',\n message: '%s',\n refs: '%D',\n body: opt.multiLine ? '%B' : '%b',\n author_name: opt.mailMap !== false ? '%aN' : '%an',\n author_email: opt.mailMap !== false ? '%aE' : '%ae',\n };\n\n const [fields, formatStr] = prettyFormat(format, splitter);\n\n const suffix: string[] = [];\n const command: string[] = [\n `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`,\n ...customArgs,\n ];\n\n const maxCount: number | undefined = (opt as any).n || (opt as any)['max-count'] || opt.maxCount;\n if (maxCount) {\n command.push(`--max-count=${maxCount}`);\n }\n\n if (opt.from || opt.to) {\n const rangeOperator = opt.symmetric !== false ? '...' : '..';\n suffix.push(`${opt.from || ''}${rangeOperator}${opt.to || ''}`);\n }\n\n if (filterString(opt.file)) {\n command.push('--follow', pathspec(opt.file));\n }\n\n appendTaskOptions(userOptions(opt as Options), command);\n\n return {\n fields,\n splitter,\n commands: [...command, ...suffix],\n };\n}\n\nexport function logTask(\n splitter: string,\n fields: string[],\n customArgs: string[]\n): StringTask> {\n const parser = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs));\n\n return {\n commands: ['log', ...customArgs],\n format: 'utf-8',\n parser,\n };\n}\n\nexport default function (): Pick {\n return {\n log(this: SimpleGitApi, ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const options = parseLogOptions(\n trailingOptionsArgument(arguments),\n asStringArray(filterType(arguments[0], filterArray, []))\n );\n const task =\n rejectDeprecatedSignatures(...rest) ||\n validateLogFormatConfig(options.commands) ||\n createLogTask(options);\n\n return this._runTask(task, next);\n },\n };\n\n function createLogTask(options: ParsedLogOptions) {\n return logTask(options.splitter, options.fields, options.commands);\n }\n\n function rejectDeprecatedSignatures(from?: unknown, to?: unknown) {\n return (\n filterString(from) &&\n filterString(to) &&\n configurationErrorTask(\n `git.log(string, string) should be replaced with git.log({ from: string, to: string })`\n )\n );\n }\n}\n", "import {\n MergeConflict,\n MergeConflictDeletion,\n MergeDetail,\n MergeResultStatus,\n} from '../../../typings';\n\nexport class MergeSummaryConflict implements MergeConflict {\n constructor(\n public readonly reason: string,\n public readonly file: string | null = null,\n public readonly meta?: MergeConflictDeletion\n ) {}\n\n toString() {\n return `${this.file}:${this.reason}`;\n }\n}\n\nexport class MergeSummaryDetail implements MergeDetail {\n public conflicts: MergeConflict[] = [];\n public merges: string[] = [];\n public result: MergeResultStatus = 'success';\n\n get failed() {\n return this.conflicts.length > 0;\n }\n\n get reason() {\n return this.result;\n }\n\n toString() {\n if (this.conflicts.length) {\n return `CONFLICTS: ${this.conflicts.join(', ')}`;\n }\n\n return 'OK';\n }\n}\n", "import {\n PullDetailFileChanges,\n PullDetailSummary,\n PullFailedResult,\n PullResult,\n} from '../../../typings';\n\nexport class PullSummary implements PullResult {\n public remoteMessages = {\n all: [],\n };\n public created = [];\n public deleted: string[] = [];\n public files: string[] = [];\n public deletions: PullDetailFileChanges = {};\n public insertions: PullDetailFileChanges = {};\n public summary: PullDetailSummary = {\n changes: 0,\n deletions: 0,\n insertions: 0,\n };\n}\n\nexport class PullFailedSummary implements PullFailedResult {\n remote = '';\n hash = {\n local: '',\n remote: '',\n };\n branch = {\n local: '',\n remote: '',\n };\n message = '';\n\n toString() {\n return this.message;\n }\n}\n", "import {\n RemoteMessageResult,\n RemoteMessages,\n RemoteMessagesObjectEnumeration,\n} from '../../../typings';\nimport { asNumber, RemoteLineParser } from '../utils';\n\nfunction objectEnumerationResult(\n remoteMessages: T\n): RemoteMessagesObjectEnumeration {\n return (remoteMessages.objects = remoteMessages.objects || {\n compressing: 0,\n counting: 0,\n enumerating: 0,\n packReused: 0,\n reused: { count: 0, delta: 0 },\n total: { count: 0, delta: 0 },\n });\n}\n\nfunction asObjectCount(source: string) {\n const count = /^\\s*(\\d+)/.exec(source);\n const delta = /delta (\\d+)/i.exec(source);\n\n return {\n count: asNumber((count && count[1]) || '0'),\n delta: asNumber((delta && delta[1]) || '0'),\n };\n}\n\nexport const remoteMessagesObjectParsers: RemoteLineParser>[] =\n [\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: (\\d+),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: \\d+% \\(\\d+\\/(\\d+)\\),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /total ([^,]+), reused ([^,]+), pack-reused (\\d+)/i,\n (result, [total, reused, packReused]) => {\n const objects = objectEnumerationResult(result.remoteMessages);\n objects.total = asObjectCount(total);\n objects.reused = asObjectCount(reused);\n objects.packReused = asNumber(packReused);\n }\n ),\n ];\n", "import { PushResultRemoteMessages, RemoteMessageResult, RemoteMessages } from '../../../typings';\nimport { asNumber, parseStringResponse, RemoteLineParser } from '../utils';\nimport { remoteMessagesObjectParsers } from './parse-remote-objects';\n\nconst parsers: RemoteLineParser>[] =\n [\n new RemoteLineParser(/^remote:\\s*(.+)$/, (result, [text]) => {\n result.remoteMessages.all.push(text.trim());\n return false;\n }),\n ...remoteMessagesObjectParsers,\n new RemoteLineParser(\n [/create a (?:pull|merge) request/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [pullRequestUrl]) => {\n (result.remoteMessages as PushResultRemoteMessages).pullRequestUrl = pullRequestUrl;\n }\n ),\n new RemoteLineParser(\n [/found (\\d+) vulnerabilities.+\\(([^)]+)\\)/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [count, summary, url]) => {\n (result.remoteMessages as PushResultRemoteMessages).vulnerabilities = {\n count: asNumber(count),\n summary,\n url,\n };\n }\n ),\n ];\n\nexport function parseRemoteMessages(\n _stdOut: string,\n stdErr: string\n): RemoteMessageResult {\n return parseStringResponse({ remoteMessages: new RemoteMessageSummary() as T }, parsers, stdErr);\n}\n\nexport class RemoteMessageSummary implements RemoteMessages {\n public readonly all: string[] = [];\n}\n", "import { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings';\nimport { PullFailedSummary, PullSummary } from '../responses/PullSummary';\nimport { TaskParser } from '../types';\nimport { append, LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nconst FILE_UPDATE_REGEX = /^\\s*(.+?)\\s+\\|\\s+\\d+\\s*(\\+*)(-*)/;\nconst SUMMARY_REGEX = /(\\d+)\\D+((\\d+)\\D+\\(\\+\\))?(\\D+(\\d+)\\D+\\(-\\))?/;\nconst ACTION_REGEX = /^(create|delete) mode \\d+ (.+)/;\n\nconst parsers: LineParser[] = [\n new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => {\n result.files.push(file);\n\n if (insertions) {\n result.insertions[file] = insertions.length;\n }\n\n if (deletions) {\n result.deletions[file] = deletions.length;\n }\n }),\n new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => {\n if (insertions !== undefined || deletions !== undefined) {\n result.summary.changes = +changes || 0;\n result.summary.insertions = +insertions || 0;\n result.summary.deletions = +deletions || 0;\n return true;\n }\n return false;\n }),\n new LineParser(ACTION_REGEX, (result, [action, file]) => {\n append(result.files, file);\n append(action === 'create' ? result.created : result.deleted, file);\n }),\n];\n\nconst errorParsers: LineParser[] = [\n new LineParser(/^from\\s(.+)$/i, (result, [remote]) => void (result.remote = remote)),\n new LineParser(/^fatal:\\s(.+)$/, (result, [message]) => void (result.message = message)),\n new LineParser(\n /([a-z0-9]+)\\.\\.([a-z0-9]+)\\s+(\\S+)\\s+->\\s+(\\S+)$/,\n (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => {\n result.branch.local = branchLocal;\n result.hash.local = hashLocal;\n result.branch.remote = branchRemote;\n result.hash.remote = hashRemote;\n }\n ),\n];\n\nexport const parsePullDetail: TaskParser = (stdOut, stdErr) => {\n return parseStringResponse(new PullSummary(), parsers, [stdOut, stdErr]);\n};\n\nexport const parsePullResult: TaskParser = (stdOut, stdErr) => {\n return Object.assign(\n new PullSummary(),\n parsePullDetail(stdOut, stdErr),\n parseRemoteMessages(stdOut, stdErr)\n );\n};\n\nexport function parsePullErrorResult(stdOut: string, stdErr: string) {\n const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]);\n\n return pullError.message && pullError;\n}\n", "import { MergeDetail, MergeResult } from '../../../typings';\nimport { MergeSummaryConflict, MergeSummaryDetail } from '../responses/MergeSummary';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parsePullResult } from './parse-pull';\n\nconst parsers: LineParser[] = [\n new LineParser(/^Auto-merging\\s+(.+)$/, (summary, [autoMerge]) => {\n summary.merges.push(autoMerge);\n }),\n new LineParser(/^CONFLICT\\s+\\((.+)\\): Merge conflict in (.+)$/, (summary, [reason, file]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file));\n }),\n new LineParser(\n /^CONFLICT\\s+\\((.+\\/delete)\\): (.+) deleted in (.+) and/,\n (summary, [reason, file, deleteRef]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef }));\n }\n ),\n new LineParser(/^CONFLICT\\s+\\((.+)\\):/, (summary, [reason]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, null));\n }),\n new LineParser(/^Automatic merge failed;\\s+(.+)$/, (summary, [result]) => {\n summary.result = result;\n }),\n];\n\n/**\n * Parse the complete response from `git.merge`\n */\nexport const parseMergeResult: TaskParser = (stdOut, stdErr) => {\n return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr));\n};\n\n/**\n * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge`\n * @param stdOut\n */\nexport const parseMergeDetail: TaskParser = (stdOut) => {\n return parseStringResponse(new MergeSummaryDetail(), parsers, stdOut);\n};\n", "import { MergeResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parseMergeResult } from '../parsers/parse-merge';\nimport { StringTask } from '../types';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function mergeTask(customArgs: string[]): EmptyTask | StringTask {\n if (!customArgs.length) {\n return configurationErrorTask('Git.merge requires at least one option');\n }\n\n return {\n commands: ['merge', ...customArgs],\n format: 'utf-8',\n parser(stdOut, stdErr): MergeResult {\n const merge = parseMergeResult(stdOut, stdErr);\n if (merge.failed) {\n throw new GitResponseError(merge);\n }\n\n return merge;\n },\n };\n}\n", "import {\n PushDetail,\n PushResult,\n PushResultPushedItem,\n PushResultRemoteMessages,\n} from '../../../typings';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nfunction pushResultPushedItem(local: string, remote: string, status: string): PushResultPushedItem {\n const deleted = status.includes('deleted');\n const tag = status.includes('tag') || /^refs\\/tags/.test(local);\n const alreadyUpdated = !status.includes('new');\n\n return {\n deleted,\n tag,\n branch: !tag,\n new: !alreadyUpdated,\n alreadyUpdated,\n local,\n remote,\n };\n}\n\nconst parsers: LineParser[] = [\n new LineParser(/^Pushing to (.+)$/, (result, [repo]) => {\n result.repo = repo;\n }),\n new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => {\n result.ref = {\n ...(result.ref || {}),\n local,\n };\n }),\n new LineParser(/^[=*-]\\s+([^:]+):(\\S+)\\s+\\[(.+)]$/, (result, [local, remote, type]) => {\n result.pushed.push(pushResultPushedItem(local, remote, type));\n }),\n new LineParser(\n /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/,\n (result, [local, remote, remoteName]) => {\n result.branch = {\n ...(result.branch || {}),\n local,\n remote,\n remoteName,\n };\n }\n ),\n new LineParser(\n /^([^:]+):(\\S+)\\s+([a-z0-9]+)\\.\\.([a-z0-9]+)$/,\n (result, [local, remote, from, to]) => {\n result.update = {\n head: {\n local,\n remote,\n },\n hash: {\n from,\n to,\n },\n };\n }\n ),\n];\n\nexport const parsePushResult: TaskParser = (stdOut, stdErr) => {\n const pushDetail = parsePushDetail(stdOut, stdErr);\n const responseDetail = parseRemoteMessages(stdOut, stdErr);\n\n return {\n ...pushDetail,\n ...responseDetail,\n };\n};\n\nexport const parsePushDetail: TaskParser = (stdOut, stdErr) => {\n return parseStringResponse({ pushed: [] }, parsers, [stdOut, stdErr]);\n};\n", "import { PushResult } from '../../../typings';\nimport { parsePushResult as parser } from '../parsers/parse-push';\nimport { StringTask } from '../types';\nimport { append, remove } from '../utils';\n\ntype PushRef = { remote?: string; branch?: string };\n\nexport function pushTagsTask(ref: PushRef = {}, customArgs: string[]): StringTask {\n append(customArgs, '--tags');\n return pushTask(ref, customArgs);\n}\n\nexport function pushTask(ref: PushRef = {}, customArgs: string[]): StringTask {\n const commands = ['push', ...customArgs];\n if (ref.branch) {\n commands.splice(1, 0, ref.branch);\n }\n if (ref.remote) {\n commands.splice(1, 0, ref.remote);\n }\n\n remove(commands, '-v');\n append(commands, '--verbose');\n append(commands, '--porcelain');\n\n return {\n commands,\n format: 'utf-8',\n parser,\n };\n}\n", "import { SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, trailingFunctionArgument } from '../utils';\nimport { straightThroughBufferTask, straightThroughStringTask } from './task';\n\nexport default function (): Pick {\n return {\n showBuffer(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n if (!commands.includes('--binary')) {\n commands.splice(1, 0, '--binary');\n }\n\n return this._runTask(\n straightThroughBufferTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n\n show(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n return this._runTask(\n straightThroughStringTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import { FileStatusResult } from '../../../typings';\n\nexport const fromPathRegex = /^(.+)\\0(.+)$/;\n\nexport class FileStatusSummary implements FileStatusResult {\n public readonly from: string | undefined;\n\n constructor(\n public path: string,\n public index: string,\n public working_dir: string\n ) {\n if (index === 'R' || working_dir === 'R') {\n const detail = fromPathRegex.exec(path) || [null, path, path];\n this.from = detail[2] || '';\n this.path = detail[1] || '';\n }\n }\n}\n", "import { StatusResult } from '../../../typings';\nimport { filterString, filterType, NULL } from '../utils';\nimport { FileStatusSummary } from './FileStatusSummary';\n\ntype StatusLineParser = (result: StatusResult, file: string) => void;\n\nexport class StatusSummary implements StatusResult {\n public not_added = [];\n public conflicted = [];\n public created = [];\n public deleted = [];\n public ignored = undefined;\n public modified = [];\n public renamed = [];\n public files = [];\n public staged = [];\n public ahead = 0;\n public behind = 0;\n public current = null;\n public tracking = null;\n public detached = false;\n\n public isClean = () => {\n return !this.files.length;\n };\n}\n\nenum PorcelainFileStatus {\n ADDED = 'A',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n COPIED = 'C',\n UNMERGED = 'U',\n UNTRACKED = '?',\n IGNORED = '!',\n NONE = ' ',\n}\n\nfunction renamedFile(line: string) {\n const [to, from] = line.split(NULL);\n\n return {\n from: from || to,\n to,\n };\n}\n\nfunction parser(\n indexX: PorcelainFileStatus,\n indexY: PorcelainFileStatus,\n handler: StatusLineParser\n): [string, StatusLineParser] {\n return [`${indexX}${indexY}`, handler];\n}\n\nfunction conflicts(indexX: PorcelainFileStatus, ...indexY: PorcelainFileStatus[]) {\n return indexY.map((y) => parser(indexX, y, (result, file) => result.conflicted.push(file)));\n}\n\nconst parsers: Map = new Map([\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) =>\n result.created.push(file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) =>\n result.deleted.push(file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) =>\n result.modified.push(file)\n ),\n\n parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.NONE, (result, file) => {\n result.created.push(file);\n result.staged.push(file);\n }),\n parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.MODIFIED, (result, file) => {\n result.created.push(file);\n result.staged.push(file);\n result.modified.push(file);\n }),\n\n parser(PorcelainFileStatus.DELETED, PorcelainFileStatus.NONE, (result, file) => {\n result.deleted.push(file);\n result.staged.push(file);\n }),\n\n parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.NONE, (result, file) => {\n result.modified.push(file);\n result.staged.push(file);\n }),\n parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.MODIFIED, (result, file) => {\n result.modified.push(file);\n result.staged.push(file);\n }),\n\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => {\n result.renamed.push(renamedFile(file));\n }),\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => {\n const renamed = renamedFile(file);\n result.renamed.push(renamed);\n result.modified.push(renamed.to);\n }),\n parser(PorcelainFileStatus.IGNORED, PorcelainFileStatus.IGNORED, (_result, _file) => {\n (_result.ignored = _result.ignored || []).push(_file);\n }),\n\n parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) =>\n result.not_added.push(file)\n ),\n\n ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED),\n ...conflicts(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n ...conflicts(\n PorcelainFileStatus.UNMERGED,\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n\n [\n '##',\n (result, line) => {\n const aheadReg = /ahead (\\d+)/;\n const behindReg = /behind (\\d+)/;\n const currentReg = /^(.+?(?=(?:\\.{3}|\\s|$)))/;\n const trackingReg = /\\.{3}(\\S*)/;\n const onEmptyBranchReg = /\\son\\s(\\S+?)(?=\\.{3}|$)/;\n\n let regexResult = aheadReg.exec(line);\n result.ahead = (regexResult && +regexResult[1]) || 0;\n\n regexResult = behindReg.exec(line);\n result.behind = (regexResult && +regexResult[1]) || 0;\n\n regexResult = currentReg.exec(line);\n result.current = filterType(regexResult?.[1], filterString, null);\n\n regexResult = trackingReg.exec(line);\n result.tracking = filterType(regexResult?.[1], filterString, null);\n\n regexResult = onEmptyBranchReg.exec(line);\n if (regexResult) {\n result.current = filterType(regexResult?.[1], filterString, result.current);\n }\n\n result.detached = /\\(no branch\\)/.test(line);\n },\n ],\n]);\n\nexport const parseStatusSummary = function (text: string): StatusResult {\n const lines = text.split(NULL);\n const status = new StatusSummary();\n\n for (let i = 0, l = lines.length; i < l; ) {\n let line = lines[i++].trim();\n\n if (!line) {\n continue;\n }\n\n if (line.charAt(0) === PorcelainFileStatus.RENAMED) {\n line += NULL + (lines[i++] || '');\n }\n\n splitLine(status, line);\n }\n\n return status;\n};\n\nfunction splitLine(result: StatusResult, lineStr: string) {\n const trimmed = lineStr.trim();\n switch (' ') {\n case trimmed.charAt(2):\n return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.slice(3));\n case trimmed.charAt(1):\n return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.slice(2));\n default:\n return;\n }\n\n function data(index: string, workingDir: string, path: string) {\n const raw = `${index}${workingDir}`;\n const handler = parsers.get(raw);\n\n if (handler) {\n handler(result, path);\n }\n\n if (raw !== '##' && raw !== '!!') {\n result.files.push(new FileStatusSummary(path, index, workingDir));\n }\n }\n}\n", "import { StatusResult } from '../../../typings';\nimport { parseStatusSummary } from '../responses/StatusSummary';\nimport { StringTask } from '../types';\n\nconst ignoredOptions = ['--null', '-z'];\n\nexport function statusTask(customArgs: string[]): StringTask {\n const commands = [\n 'status',\n '--porcelain',\n '-b',\n '-u',\n '--null',\n ...customArgs.filter((arg) => !ignoredOptions.includes(arg)),\n ];\n\n return {\n format: 'utf-8',\n commands,\n parser(text: string) {\n return parseStatusSummary(text);\n },\n };\n}\n", "import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asNumber, ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nexport interface VersionResult {\n major: number;\n minor: number;\n patch: number | string;\n agent: string;\n installed: boolean;\n}\n\nconst NOT_INSTALLED = 'installed=false';\n\nfunction versionResponse(\n major = 0,\n minor = 0,\n patch: string | number = 0,\n agent = '',\n installed = true\n): VersionResult {\n return Object.defineProperty(\n {\n major,\n minor,\n patch,\n agent,\n installed,\n },\n 'toString',\n {\n value() {\n return `${this.major}.${this.minor}.${this.patch}`;\n },\n configurable: false,\n enumerable: false,\n }\n );\n}\n\nfunction notInstalledResponse() {\n return versionResponse(0, 0, 0, '', false);\n}\n\nexport default function (): Pick {\n return {\n version(this: SimpleGitApi) {\n return this._runTask({\n commands: ['--version'],\n format: 'utf-8',\n parser: versionParser,\n onError(result, error, done, fail) {\n if (result.exitCode === ExitCodes.NOT_FOUND) {\n return done(Buffer.from(NOT_INSTALLED));\n }\n\n fail(error);\n },\n });\n },\n };\n}\n\nconst parsers: LineParser[] = [\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*\\((.+)\\))?/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(\n result,\n versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)\n );\n }\n ),\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\D+)(.+)?$/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent));\n }\n ),\n];\n\nfunction versionParser(stdOut: string) {\n if (stdOut === NOT_INSTALLED) {\n return notInstalledResponse();\n }\n\n return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers, stdOut);\n}\n", "import { SimpleGitBase } from '../../typings';\nimport { taskCallback } from './task-callback';\nimport { changeWorkingDirectoryTask } from './tasks/change-working-directory';\nimport checkout from './tasks/checkout';\nimport countObjects from './tasks/count-objects';\nimport commit from './tasks/commit';\nimport config from './tasks/config';\nimport firstCommit from './tasks/first-commit';\nimport grep from './tasks/grep';\nimport { hashObjectTask } from './tasks/hash-object';\nimport { initTask } from './tasks/init';\nimport log from './tasks/log';\nimport { mergeTask } from './tasks/merge';\nimport { pushTask } from './tasks/push';\nimport show from './tasks/show';\nimport { statusTask } from './tasks/status';\nimport { configurationErrorTask, straightThroughStringTask } from './tasks/task';\nimport version from './tasks/version';\nimport { outputHandler, SimpleGitExecutor, SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport {\n asArray,\n filterString,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n} from './utils';\n\nexport class SimpleGitApi implements SimpleGitBase {\n constructor(private _executor: SimpleGitExecutor) {}\n\n protected _runTask(task: SimpleGitTask, then?: SimpleGitTaskCallback) {\n const chain = this._executor.chain();\n const promise = chain.push(task);\n\n if (then) {\n taskCallback(task, promise, then);\n }\n\n return Object.create(this, {\n then: { value: promise.then.bind(promise) },\n catch: { value: promise.catch.bind(promise) },\n _executor: { value: chain },\n });\n }\n\n add(files: string | string[]) {\n return this._runTask(\n straightThroughStringTask(['add', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n cwd(directory: string | { path: string; root?: boolean }) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof directory === 'string') {\n return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next);\n }\n\n if (typeof directory?.path === 'string') {\n return this._runTask(\n changeWorkingDirectoryTask(\n directory.path,\n (directory.root && this._executor) || undefined\n ),\n next\n );\n }\n\n return this._runTask(\n configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string'),\n next\n );\n }\n\n hashObject(path: string, write: boolean | unknown) {\n return this._runTask(\n hashObjectTask(path, write === true),\n trailingFunctionArgument(arguments)\n );\n }\n\n init(bare?: boolean | unknown) {\n return this._runTask(\n initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n merge() {\n return this._runTask(\n mergeTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n mergeFromTo(remote: string, branch: string) {\n if (!(filterString(remote) && filterString(branch))) {\n return this._runTask(\n configurationErrorTask(\n `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`\n )\n );\n }\n\n return this._runTask(\n mergeTask([remote, branch, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments, false)\n );\n }\n\n outputHandler(handler: outputHandler) {\n this._executor.outputHandler = handler;\n return this;\n }\n\n push() {\n const task = pushTask(\n {\n remote: filterType(arguments[0], filterString),\n branch: filterType(arguments[1], filterString),\n },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n }\n\n stash() {\n return this._runTask(\n straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n status() {\n return this._runTask(\n statusTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n}\n\nObject.assign(\n SimpleGitApi.prototype,\n checkout(),\n commit(),\n config(),\n countObjects(),\n firstCommit(),\n grep(),\n log(),\n show(),\n version()\n);\n", "import { append, remove } from '../utils';\nimport { createDeferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { createLogger } from '../git-logger';\n\ntype ScheduleCompleteCallback = () => void;\ntype ScheduledTask = Pick, 'promise' | 'done'> & {\n id: number;\n};\n\nconst createScheduledTask: () => ScheduledTask = (() => {\n let id = 0;\n return () => {\n id++;\n const { promise, done } = createDeferred();\n\n return {\n promise,\n done,\n id,\n };\n };\n})();\n\nexport class Scheduler {\n private logger = createLogger('', 'scheduler');\n private pending: ScheduledTask[] = [];\n private running: ScheduledTask[] = [];\n\n constructor(private concurrency = 2) {\n this.logger(`Constructed, concurrency=%s`, concurrency);\n }\n\n private schedule() {\n if (!this.pending.length || this.running.length >= this.concurrency) {\n this.logger(\n `Schedule attempt ignored, pending=%s running=%s concurrency=%s`,\n this.pending.length,\n this.running.length,\n this.concurrency\n );\n return;\n }\n\n const task = append(this.running, this.pending.shift()!);\n this.logger(`Attempting id=%s`, task.id);\n task.done(() => {\n this.logger(`Completing id=`, task.id);\n remove(this.running, task);\n this.schedule();\n });\n }\n\n next(): Promise {\n const { promise, id } = append(this.pending, createScheduledTask());\n this.logger(`Scheduling id=%s`, id);\n\n this.schedule();\n\n return promise;\n }\n}\n", "import { straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\n\nexport type ApplyOptions = Options &\n OptionFlags<\n | '--stat'\n | '--numstat'\n | '--summary'\n | '--check'\n | '--index'\n | '--intent-to-add'\n | '--3way'\n | '--apply'\n | '--no-add'\n | '-R'\n | '--reverse'\n | '--allow-binary-replacement'\n | '--binary'\n | '--reject'\n | '-z'\n | '--inaccurate-eof'\n | '--recount'\n | '--cached'\n | '--ignore-space-change'\n | '--ignore-whitespace'\n | '--verbose'\n | '--unsafe-paths'\n > &\n OptionFlags<'--whitespace', 'nowarn' | 'warn' | 'fix' | 'error' | 'error-all'> &\n OptionFlags<'--build-fake-ancestor' | '--exclude' | '--include' | '--directory', string> &\n OptionFlags<'-p' | '-C', number>;\n\nexport function applyPatchTask(patches: string[], customArgs: string[]): StringTask {\n return straightThroughStringTask(['apply', ...customArgs, ...patches]);\n}\n", "import {\n BranchMultiDeleteResult,\n BranchSingleDeleteFailure,\n BranchSingleDeleteResult,\n BranchSingleDeleteSuccess,\n} from '../../../typings';\n\nexport class BranchDeletionBatch implements BranchMultiDeleteResult {\n all: BranchSingleDeleteResult[] = [];\n branches: { [branchName: string]: BranchSingleDeleteResult } = {};\n errors: BranchSingleDeleteResult[] = [];\n\n get success(): boolean {\n return !this.errors.length;\n }\n}\n\nexport function branchDeletionSuccess(branch: string, hash: string): BranchSingleDeleteSuccess {\n return {\n branch,\n hash,\n success: true,\n };\n}\n\nexport function branchDeletionFailure(branch: string): BranchSingleDeleteFailure {\n return {\n branch,\n hash: null,\n success: false,\n };\n}\n\nexport function isSingleBranchDeleteFailure(\n test: BranchSingleDeleteResult\n): test is BranchSingleDeleteSuccess {\n return test.success;\n}\n", "import { BranchMultiDeleteResult } from '../../../typings';\nimport {\n BranchDeletionBatch,\n branchDeletionFailure,\n branchDeletionSuccess,\n} from '../responses/BranchDeleteSummary';\nimport { TaskParser } from '../types';\nimport { ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nconst deleteSuccessRegex = /(\\S+)\\s+\\(\\S+\\s([^)]+)\\)/;\nconst deleteErrorRegex = /^error[^']+'([^']+)'/m;\n\nconst parsers: LineParser[] = [\n new LineParser(deleteSuccessRegex, (result, [branch, hash]) => {\n const deletion = branchDeletionSuccess(branch, hash);\n\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n new LineParser(deleteErrorRegex, (result, [branch]) => {\n const deletion = branchDeletionFailure(branch);\n\n result.errors.push(deletion);\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n];\n\nexport const parseBranchDeletions: TaskParser = (\n stdOut,\n stdErr\n) => {\n return parseStringResponse(new BranchDeletionBatch(), parsers, [stdOut, stdErr]);\n};\n\nexport function hasBranchDeletionError(data: string, processExitCode: ExitCodes): boolean {\n return processExitCode === ExitCodes.ERROR && deleteErrorRegex.test(data);\n}\n", "import type { BranchSummary, BranchSummaryBranch } from '../../../typings';\n\nexport enum BranchStatusIdentifier {\n CURRENT = '*',\n LINKED = '+',\n}\n\nexport class BranchSummaryResult implements BranchSummary {\n public all: string[] = [];\n public branches: { [p: string]: BranchSummaryBranch } = {};\n public current: string = '';\n public detached: boolean = false;\n\n push(\n status: BranchStatusIdentifier | unknown,\n detached: boolean,\n name: string,\n commit: string,\n label: string\n ) {\n if (status === BranchStatusIdentifier.CURRENT) {\n this.detached = detached;\n this.current = name;\n }\n\n this.all.push(name);\n this.branches[name] = {\n current: status === BranchStatusIdentifier.CURRENT,\n linkedWorkTree: status === BranchStatusIdentifier.LINKED,\n name,\n commit,\n label,\n };\n }\n}\n", "import type { BranchSummary } from '../../../typings';\nimport { BranchStatusIdentifier, BranchSummaryResult } from '../responses/BranchSummary';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(\n /^([*+]\\s)?\\((?:HEAD )?detached (?:from|at) (\\S+)\\)\\s+([a-z0-9]+)\\s(.*)$/,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), true, name, commit, label);\n }\n ),\n new LineParser(\n /^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$/s,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), false, name, commit, label);\n }\n ),\n];\n\nconst currentBranchParser = new LineParser(/^(\\S+)$/s, (result, [name]) => {\n result.push(BranchStatusIdentifier.CURRENT, false, name, '', '');\n});\n\nfunction branchStatus(input?: string) {\n return input ? input.charAt(0) : '';\n}\n\nexport function parseBranchSummary(stdOut: string, currentOnly = false): BranchSummary {\n return parseStringResponse(\n new BranchSummaryResult(),\n currentOnly ? [currentBranchParser] : parsers,\n stdOut\n );\n}\n", "import { BranchMultiDeleteResult, BranchSingleDeleteResult, BranchSummary } from '../../../typings';\nimport { StringTask } from '../types';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete';\nimport { parseBranchSummary } from '../parsers/parse-branch';\nimport { bufferToString } from '../utils';\n\nexport function containsDeleteBranchCommand(commands: string[]) {\n const deleteCommands = ['-d', '-D', '--delete'];\n return commands.some((command) => deleteCommands.includes(command));\n}\n\nexport function branchTask(\n customArgs: string[]\n): StringTask {\n const isDelete = containsDeleteBranchCommand(customArgs);\n const isCurrentOnly = customArgs.includes('--show-current');\n\n const commands = ['branch', ...customArgs];\n\n if (commands.length === 1) {\n commands.push('-a');\n }\n\n if (!commands.includes('-v')) {\n commands.splice(1, 0, '-v');\n }\n\n return {\n format: 'utf-8',\n commands,\n parser(stdOut, stdErr) {\n if (isDelete) {\n return parseBranchDeletions(stdOut, stdErr).all[0];\n }\n\n return parseBranchSummary(stdOut, isCurrentOnly);\n },\n };\n}\n\nexport function branchLocalTask(): StringTask {\n return {\n format: 'utf-8',\n commands: ['branch', '-v'],\n parser(stdOut) {\n return parseBranchSummary(stdOut);\n },\n };\n}\n\nexport function deleteBranchesTask(\n branches: string[],\n forceDelete = false\n): StringTask {\n return {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr);\n },\n onError({ exitCode, stdOut }, error, done, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n done(stdOut);\n },\n };\n}\n\nexport function deleteBranchTask(\n branch: string,\n forceDelete = false\n): StringTask {\n const task: StringTask = {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr).branches[branch]!;\n },\n onError({ exitCode, stdErr, stdOut }, error, _, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n throw new GitResponseError(\n task.parser(bufferToString(stdOut), bufferToString(stdErr)),\n String(error)\n );\n },\n };\n\n return task;\n}\n", "import { normalize } from 'node:path';\n\n/**\n * Parser for the `check-ignore` command - returns each file as a string array\n */\nexport const parseCheckIgnore = (text: string): string[] => {\n return text.split(/\\n/g).map(toPath).filter(Boolean);\n};\n\nfunction toPath(input: string) {\n const path = input.trim().replace(/^[\"']|[\"']$/g, '');\n return path && normalize(path);\n}\n", "import { StringTask } from '../types';\nimport { parseCheckIgnore } from '../responses/CheckIgnore';\n\nexport function checkIgnoreTask(paths: string[]): StringTask {\n return {\n commands: ['check-ignore', ...paths],\n format: 'utf-8',\n parser: parseCheckIgnore,\n };\n}\n", "import { configurationErrorTask, EmptyTask, straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\nimport { append, filterString } from '../utils';\n\nexport type CloneOptions = Options &\n OptionFlags<\n | '--bare'\n | '--dissociate'\n | '--mirror'\n | '--no-checkout'\n | '--no-remote-submodules'\n | '--no-shallow-submodules'\n | '--no-single-branch'\n | '--no-tags'\n | '--remote-submodules'\n | '--single-branch'\n | '--shallow-submodules'\n | '--verbose'\n > &\n OptionFlags<'--depth' | '-j' | '--jobs', number> &\n OptionFlags<\n | '--branch'\n | '--origin'\n | '--recurse-submodules'\n | '--separate-git-dir'\n | '--shallow-exclude'\n | '--shallow-since'\n | '--template',\n string\n >;\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function cloneTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n): StringTask | EmptyTask {\n const commands = ['clone', ...customArgs];\n\n filterString(repo) && commands.push(repo);\n filterString(directory) && commands.push(directory);\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function cloneMirrorTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n) {\n append(customArgs, '--mirror');\n\n return cloneTask(repo, directory, customArgs);\n}\n", "import { FetchResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/From (.+)$/, (result, [remote]) => {\n result.remote = remote;\n }),\n new LineParser(/\\* \\[new branch]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.branches.push({\n name,\n tracking,\n });\n }),\n new LineParser(/\\* \\[new tag]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.tags.push({\n name,\n tracking,\n });\n }),\n new LineParser(/- \\[deleted]\\s+\\S+\\s*-> (.+)$/, (result, [tracking]) => {\n result.deleted.push({\n tracking,\n });\n }),\n new LineParser(\n /\\s*([^.]+)\\.\\.(\\S+)\\s+(\\S+)\\s*-> (.+)$/,\n (result, [from, to, name, tracking]) => {\n result.updated.push({\n name,\n tracking,\n to,\n from,\n });\n }\n ),\n];\n\nexport function parseFetchResult(stdOut: string, stdErr: string): FetchResult {\n const result: FetchResult = {\n raw: stdOut,\n remote: null,\n branches: [],\n tags: [],\n updated: [],\n deleted: [],\n };\n return parseStringResponse(result, parsers, [stdOut, stdErr]);\n}\n", "import { FetchResult } from '../../../typings';\nimport { parseFetchResult } from '../parsers/parse-fetch';\nimport { StringTask } from '../types';\n\nimport { configurationErrorTask, EmptyTask } from './task';\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function fetchTask(\n remote: string,\n branch: string,\n customArgs: string[]\n): StringTask | EmptyTask {\n const commands = ['fetch', ...customArgs];\n if (remote && branch) {\n commands.push(remote, branch);\n }\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: parseFetchResult,\n };\n}\n", "import { MoveResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => {\n result.moves.push({ from, to });\n }),\n];\n\nexport function parseMoveResult(stdOut: string): MoveResult {\n return parseStringResponse({ moves: [] }, parsers, stdOut);\n}\n", "import { MoveResult } from '../../../typings';\nimport { parseMoveResult } from '../parsers/parse-move';\nimport { StringTask } from '../types';\nimport { asArray } from '../utils';\n\nexport function moveTask(from: string | string[], to: string): StringTask {\n return {\n commands: ['mv', '-v', ...asArray(from), to],\n format: 'utf-8',\n parser: parseMoveResult,\n };\n}\n", "import { PullResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parsePullErrorResult, parsePullResult } from '../parsers/parse-pull';\nimport { Maybe, StringTask } from '../types';\nimport { bufferToString } from '../utils';\n\nexport function pullTask(\n remote: Maybe,\n branch: Maybe,\n customArgs: string[]\n): StringTask {\n const commands: string[] = ['pull', ...customArgs];\n if (remote && branch) {\n commands.splice(1, 0, remote, branch);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(stdOut, stdErr): PullResult {\n return parsePullResult(stdOut, stdErr);\n },\n onError(result, _error, _done, fail) {\n const pullError = parsePullErrorResult(\n bufferToString(result.stdOut),\n bufferToString(result.stdErr)\n );\n if (pullError) {\n return fail(new GitResponseError(pullError));\n }\n\n fail(_error);\n },\n };\n}\n", "import { forEachLineWithContent } from '../utils';\n\nexport interface RemoteWithoutRefs {\n name: string;\n}\n\nexport interface RemoteWithRefs extends RemoteWithoutRefs {\n refs: {\n fetch: string;\n push: string;\n };\n}\n\nexport function parseGetRemotes(text: string): RemoteWithoutRefs[] {\n const remotes: { [name: string]: RemoteWithoutRefs } = {};\n\n forEach(text, ([name]) => (remotes[name] = { name }));\n\n return Object.values(remotes);\n}\n\nexport function parseGetRemotesVerbose(text: string): RemoteWithRefs[] {\n const remotes: { [name: string]: RemoteWithRefs } = {};\n\n forEach(text, ([name, url, purpose]) => {\n if (!Object.hasOwn(remotes, name)) {\n remotes[name] = {\n name: name,\n refs: { fetch: '', push: '' },\n };\n }\n\n if (purpose && url) {\n remotes[name].refs[purpose.replace(/[^a-z]/g, '') as keyof RemoteWithRefs['refs']] = url;\n }\n });\n\n return Object.values(remotes);\n}\n\nfunction forEach(text: string, handler: (line: string[]) => void) {\n forEachLineWithContent(text, (line) => handler(line.split(/\\s+/)));\n}\n", "import {\n parseGetRemotes,\n parseGetRemotesVerbose,\n type RemoteWithoutRefs,\n type RemoteWithRefs,\n} from '../responses/GetRemoteSummary';\nimport type { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addRemoteTask(\n remoteName: string,\n remoteRepo: string,\n customArgs: string[]\n): StringTask {\n return straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]);\n}\n\nexport function getRemotesTask(verbose: true): StringTask;\nexport function getRemotesTask(verbose: false): StringTask;\nexport function getRemotesTask(\n verbose: boolean\n): StringTask {\n const commands = ['remote'];\n if (verbose) {\n commands.push('-v');\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: verbose ? parseGetRemotesVerbose : parseGetRemotes,\n };\n}\n\nexport function listRemotesTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'ls-remote') {\n commands.unshift('ls-remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function remoteTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'remote') {\n commands.unshift('remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function removeRemoteTask(remoteName: string) {\n return straightThroughStringTask(['remote', 'remove', remoteName]);\n}\n", "import { LogOptions, LogResult } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { createListLogSummaryParser } from '../parsers/parse-list-log-summary';\nimport type { StringTask } from '../types';\nimport { validateLogFormatConfig } from './diff';\nimport { parseLogOptions } from './log';\nimport type { EmptyTask } from './task';\n\nexport function stashListTask(\n opt: LogOptions = {},\n customArgs: string[]\n): EmptyTask | StringTask {\n const options = parseLogOptions(opt);\n const commands = ['stash', 'list', ...options.commands, ...customArgs];\n const parser = createListLogSummaryParser(\n options.splitter,\n options.fields,\n logFormatFromCommand(commands)\n );\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser,\n }\n );\n}\n", "import { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addSubModuleTask(repo: string, path: string): StringTask {\n return subModuleTask(['add', repo, path]);\n}\n\nexport function initSubModuleTask(customArgs: string[]): StringTask {\n return subModuleTask(['init', ...customArgs]);\n}\n\nexport function subModuleTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'submodule') {\n commands.unshift('submodule');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function updateSubModuleTask(customArgs: string[]): StringTask {\n return subModuleTask(['update', ...customArgs]);\n}\n", "import { TagResult } from '../../../typings';\n\nexport class TagList implements TagResult {\n constructor(\n public readonly all: string[],\n public readonly latest: string | undefined\n ) {}\n}\n\nexport const parseTagList = function (data: string, customSort = false) {\n const tags = data.split('\\n').map(trimmed).filter(Boolean);\n\n if (!customSort) {\n tags.sort(function (tagA, tagB) {\n const partsA = tagA.split('.');\n const partsB = tagB.split('.');\n\n if (partsA.length === 1 || partsB.length === 1) {\n return singleSorted(toNumber(partsA[0]), toNumber(partsB[0]));\n }\n\n for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) {\n const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i]));\n\n if (diff) {\n return diff;\n }\n }\n\n return 0;\n });\n }\n\n const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0);\n\n return new TagList(tags, latest);\n};\n\nfunction singleSorted(a: number, b: number): number {\n const aIsNum = Number.isNaN(a);\n const bIsNum = Number.isNaN(b);\n\n if (aIsNum !== bIsNum) {\n return aIsNum ? 1 : -1;\n }\n\n return aIsNum ? sorted(a, b) : 0;\n}\n\nfunction sorted(a: number, b: number) {\n return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction trimmed(input: string) {\n return input.trim();\n}\n\nfunction toNumber(input: string | undefined) {\n if (typeof input === 'string') {\n return parseInt(input.replace(/^\\D+/g, ''), 10) || 0;\n }\n\n return 0;\n}\n", "import { TagResult } from '../../../typings';\nimport { parseTagList } from '../responses/TagList';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.tags`\n */\nexport function tagListTask(customArgs: string[] = []): StringTask {\n const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option));\n\n return {\n format: 'utf-8',\n commands: ['tag', '-l', ...customArgs],\n parser(text: string) {\n return parseTagList(text, hasCustomSort);\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addTagTask(name: string): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', name],\n parser() {\n return { name };\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addAnnotatedTagTask(\n name: string,\n tagMessage: string\n): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', '-a', '-m', tagMessage, name],\n parser() {\n return { name };\n },\n };\n}\n", "const { GitExecutor } = require('./lib/runners/git-executor');\nconst { SimpleGitApi } = require('./lib/simple-git-api');\n\nconst { Scheduler } = require('./lib/runners/scheduler');\nconst { configurationErrorTask } = require('./lib/tasks/task');\nconst {\n asArray,\n filterArray,\n filterPrimitives,\n filterString,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} = require('./lib/utils');\nconst { applyPatchTask } = require('./lib/tasks/apply-patch');\nconst {\n branchTask,\n branchLocalTask,\n deleteBranchesTask,\n deleteBranchTask,\n} = require('./lib/tasks/branch');\nconst { checkIgnoreTask } = require('./lib/tasks/check-ignore');\nconst { checkIsRepoTask } = require('./lib/tasks/check-is-repo');\nconst { cloneTask, cloneMirrorTask } = require('./lib/tasks/clone');\nconst { cleanWithOptionsTask, isCleanOptionsArray } = require('./lib/tasks/clean');\nconst { diffSummaryTask } = require('./lib/tasks/diff');\nconst { fetchTask } = require('./lib/tasks/fetch');\nconst { moveTask } = require('./lib/tasks/move');\nconst { pullTask } = require('./lib/tasks/pull');\nconst { pushTagsTask } = require('./lib/tasks/push');\nconst {\n addRemoteTask,\n getRemotesTask,\n listRemotesTask,\n remoteTask,\n removeRemoteTask,\n} = require('./lib/tasks/remote');\nconst { getResetMode, resetTask } = require('./lib/tasks/reset');\nconst { stashListTask } = require('./lib/tasks/stash-list');\nconst {\n addSubModuleTask,\n initSubModuleTask,\n subModuleTask,\n updateSubModuleTask,\n} = require('./lib/tasks/sub-module');\nconst { addAnnotatedTagTask, addTagTask, tagListTask } = require('./lib/tasks/tag');\nconst { straightThroughBufferTask, straightThroughStringTask } = require('./lib/tasks/task');\n\nfunction Git(options, plugins) {\n this._plugins = plugins;\n this._executor = new GitExecutor(\n options.baseDir,\n new Scheduler(options.maxConcurrentProcesses),\n plugins\n );\n\n this._trimmed = options.trimmed;\n}\n\n(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git;\n\n/**\n * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on\n * the system path, or a fully qualified path to the executable.\n */\nGit.prototype.customBinary = function (command) {\n this._plugins.reconfigure('binary', command);\n return this;\n};\n\n/**\n * Sets an environment variable for the spawned child process, either supply both a name and value as strings or\n * a single object to entirely replace the current environment variables.\n *\n * @param {string|Object} name\n * @param {string} [value]\n * @returns {Git}\n */\nGit.prototype.env = function (name, value) {\n if (arguments.length === 1 && typeof name === 'object') {\n this._executor.env = name;\n } else {\n (this._executor.env = this._executor.env || {})[name] = value;\n }\n\n return this;\n};\n\n/**\n * List the stash(s) of the local repo\n */\nGit.prototype.stashList = function (options) {\n return this._runTask(\n stashListTask(\n trailingOptionsArgument(arguments) || {},\n (filterArray(options) && options) || []\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\nfunction createCloneTask(api, task, repoPath, localPath) {\n if (typeof repoPath !== 'string') {\n return configurationErrorTask(`git.${api}() requires a string 'repoPath'`);\n }\n\n return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments));\n}\n\n/**\n * Clone a git repo\n */\nGit.prototype.clone = function () {\n return this._runTask(\n createCloneTask('clone', cloneTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Mirror a git repo\n */\nGit.prototype.mirror = function () {\n return this._runTask(\n createCloneTask('mirror', cloneMirrorTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Moves one or more files to a new destination.\n *\n * @see https://git-scm.com/docs/git-mv\n *\n * @param {string|string[]} from\n * @param {string} to\n */\nGit.prototype.mv = function (from, to) {\n return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments));\n};\n\n/**\n * Internally uses pull and tags to get the list of tags then checks out the latest tag.\n *\n * @param {Function} [then]\n */\nGit.prototype.checkoutLatestTag = function (then) {\n var git = this;\n return this.pull(function () {\n git.tags(function (err, tags) {\n git.checkout(tags.latest, then);\n });\n });\n};\n\n/**\n * Pull the updated contents of the current repo\n */\nGit.prototype.pull = function (remote, branch, options, then) {\n return this._runTask(\n pullTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Fetch the updated contents of the current repo.\n *\n * @example\n * .fetch('upstream', 'master') // fetches from master on remote named upstream\n * .fetch(function () {}) // runs fetch against default remote and branch and calls function\n *\n * @param {string} [remote]\n * @param {string} [branch]\n */\nGit.prototype.fetch = function (remote, branch) {\n return this._runTask(\n fetchTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in\n * a production environment.\n *\n * @param {boolean} silence\n * @returns {Git}\n */\nGit.prototype.silent = function (silence) {\n console.warn(\n 'simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'\n );\n return this;\n};\n\n/**\n * List all tags. When using git 2.7.0 or above, include an options object with `\"--sort\": \"property-name\"` to\n * sort the tags by that property instead of using the default semantic versioning sort.\n *\n * Note, supplying this option when it is not supported by your Git version will cause the operation to fail.\n *\n * @param {Object} [options]\n * @param {Function} [then]\n */\nGit.prototype.tags = function (options, then) {\n return this._runTask(\n tagListTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Rebases the current working copy. Options can be supplied either as an array of string parameters\n * to be sent to the `git rebase` command, or a standard options object.\n */\nGit.prototype.rebase = function () {\n return this._runTask(\n straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Reset a repo\n */\nGit.prototype.reset = function (mode) {\n return this._runTask(\n resetTask(getResetMode(mode), getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Revert one or more commits in the local working copy\n */\nGit.prototype.revert = function (commit) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof commit !== 'string') {\n return this._runTask(configurationErrorTask('Commit must be a string'), next);\n }\n\n return this._runTask(\n straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]),\n next\n );\n};\n\n/**\n * Add a lightweight tag to the head of the current branch\n */\nGit.prototype.addTag = function (name) {\n const task =\n typeof name === 'string'\n ? addTagTask(name)\n : configurationErrorTask('Git.addTag requires a tag name');\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Add an annotated tag to the head of the current branch\n */\nGit.prototype.addAnnotatedTag = function (tagName, tagMessage) {\n return this._runTask(\n addAnnotatedTagTask(tagName, tagMessage),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete a local branch\n */\nGit.prototype.deleteLocalBranch = function (branchName, forceDelete, then) {\n return this._runTask(\n deleteBranchTask(branchName, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete one or more local branches\n */\nGit.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) {\n return this._runTask(\n deleteBranchesTask(branchNames, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * List all branches\n *\n * @param {Object | string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.branch = function (options, then) {\n return this._runTask(\n branchTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Return list of local branches\n *\n * @param {Function} [then]\n */\nGit.prototype.branchLocal = function (then) {\n return this._runTask(branchLocalTask(), trailingFunctionArgument(arguments));\n};\n\n/**\n * Executes any command against the git binary.\n */\nGit.prototype.raw = function (commands) {\n const createRestCommands = !Array.isArray(commands);\n const command = [].slice.call(createRestCommands ? arguments : commands, 0);\n\n for (let i = 0; i < command.length && createRestCommands; i++) {\n if (!filterPrimitives(command[i])) {\n command.splice(i, command.length - i);\n break;\n }\n }\n\n command.push(...getTrailingOptions(arguments, 0, true));\n\n var next = trailingFunctionArgument(arguments);\n\n if (!command.length) {\n return this._runTask(\n configurationErrorTask('Raw: must supply one or more command to execute'),\n next\n );\n }\n\n return this._runTask(straightThroughStringTask(command, this._trimmed), next);\n};\n\nGit.prototype.submoduleAdd = function (repo, path, then) {\n return this._runTask(addSubModuleTask(repo, path), trailingFunctionArgument(arguments));\n};\n\nGit.prototype.submoduleUpdate = function (args, then) {\n return this._runTask(\n updateSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.submoduleInit = function (args, then) {\n return this._runTask(\n initSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.subModule = function (options, then) {\n return this._runTask(\n subModuleTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.listRemote = function () {\n return this._runTask(\n listRemotesTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Adds a remote to the list of remotes.\n */\nGit.prototype.addRemote = function (remoteName, remoteRepo, then) {\n return this._runTask(\n addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes an entry by name from the list of remotes.\n */\nGit.prototype.removeRemote = function (remoteName, then) {\n return this._runTask(removeRemoteTask(remoteName), trailingFunctionArgument(arguments));\n};\n\n/**\n * Gets the currently available remotes, setting the optional verbose argument to true includes additional\n * detail on the remotes themselves.\n */\nGit.prototype.getRemotes = function (verbose, then) {\n return this._runTask(getRemotesTask(verbose === true), trailingFunctionArgument(arguments));\n};\n\n/**\n * Call any `git remote` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.remote = function (options, then) {\n return this._runTask(\n remoteTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Call any `git tag` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.tag = function (options, then) {\n const command = getTrailingOptions(arguments);\n\n if (command[0] !== 'tag') {\n command.unshift('tag');\n }\n\n return this._runTask(straightThroughStringTask(command), trailingFunctionArgument(arguments));\n};\n\n/**\n * Updates repository server info\n *\n * @param {Function} [then]\n */\nGit.prototype.updateServerInfo = function (then) {\n return this._runTask(\n straightThroughStringTask(['update-server-info']),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the\n * default configured remote spec.\n *\n * @param {string} [remote]\n * @param {Function} [then]\n */\nGit.prototype.pushTags = function (remote, then) {\n const task = pushTagsTask(\n { remote: filterType(remote, filterString) },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Removes the named files from source control.\n */\nGit.prototype.rm = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '-f', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To\n * completely remove the files, use `rm`.\n *\n * @param {string|string[]} files\n */\nGit.prototype.rmKeepLocal = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '--cached', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content,\n * size, and type.\n *\n * Passing \"-p\" will instruct cat-file to determine the object type, and display its formatted contents.\n *\n * @param {string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.catFile = function (options, then) {\n return this._catFile('utf-8', arguments);\n};\n\nGit.prototype.binaryCatFile = function () {\n return this._catFile('buffer', arguments);\n};\n\nGit.prototype._catFile = function (format, args) {\n var handler = trailingFunctionArgument(args);\n var command = ['cat-file'];\n var options = args[0];\n\n if (typeof options === 'string') {\n return this._runTask(\n configurationErrorTask('Git.catFile: options must be supplied as an array of strings'),\n handler\n );\n }\n\n if (Array.isArray(options)) {\n command.push.apply(command, options);\n }\n\n const task =\n format === 'buffer' ? straightThroughBufferTask(command) : straightThroughStringTask(command);\n\n return this._runTask(task, handler);\n};\n\nGit.prototype.diff = function (options, then) {\n const task = filterString(options)\n ? configurationErrorTask(\n 'git.diff: supplying options as a single string is no longer supported, switch to an array of strings'\n )\n : straightThroughStringTask(['diff', ...getTrailingOptions(arguments)]);\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.diffSummary = function () {\n return this._runTask(\n diffSummaryTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.applyPatch = function (patches) {\n const task = !filterStringOrStringArray(patches)\n ? configurationErrorTask(\n `git.applyPatch requires one or more string patches as the first argument`\n )\n : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1)));\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.revparse = function () {\n const commands = ['rev-parse', ...getTrailingOptions(arguments, true)];\n return this._runTask(\n straightThroughStringTask(commands, true),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n */\nGit.prototype.clean = function (mode, options, then) {\n const usingCleanOptionsArray = isCleanOptionsArray(mode);\n const cleanMode =\n (usingCleanOptionsArray && mode.join('')) || filterType(mode, filterString) || '';\n const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0));\n\n return this._runTask(\n cleanWithOptionsTask(cleanMode, customArgs),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.exec = function (then) {\n const task = {\n commands: [],\n format: 'utf-8',\n parser() {\n if (typeof then === 'function') {\n then();\n }\n },\n };\n\n return this._runTask(task);\n};\n\n/**\n * Clears the queue of pending commands and returns the wrapper instance for chaining.\n *\n * @returns {Git}\n */\nGit.prototype.clearQueue = function () {\n // TODO:\n // this._executor.clear();\n return this;\n};\n\n/**\n * Check if a pathname or pathnames are excluded by .gitignore\n *\n * @param {string|string[]} pathnames\n * @param {Function} [then]\n */\nGit.prototype.checkIgnore = function (pathnames, then) {\n return this._runTask(\n checkIgnoreTask(asArray(filterType(pathnames, filterStringOrStringArray, []))),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.checkIsRepo = function (checkType, then) {\n return this._runTask(\n checkIsRepoTask(filterType(checkType, filterString)),\n trailingFunctionArgument(arguments)\n );\n};\n\nmodule.exports = Git;\n", "import { pathspec } from './args/pathspec';\nimport { GitConstructError } from './errors/git-construct-error';\nimport { GitError } from './errors/git-error';\nimport { GitPluginError } from './errors/git-plugin-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { TaskConfigurationError } from './errors/task-configuration-error';\nimport { CheckRepoActions } from './tasks/check-is-repo';\nimport { CleanOptions } from './tasks/clean';\nimport { GitConfigScope } from './tasks/config';\nimport { DiffNameStatus } from './tasks/diff-name-status';\nimport { grepQueryBuilder } from './tasks/grep';\nimport { ResetMode } from './tasks/reset';\n\nexport {\n CheckRepoActions,\n CleanOptions,\n DiffNameStatus,\n GitConfigScope,\n GitConstructError,\n GitError,\n GitPluginError,\n GitResponseError,\n ResetMode,\n TaskConfigurationError,\n grepQueryBuilder,\n pathspec,\n};\n", "import { GitError } from './git-error';\nimport { SimpleGitOptions } from '../types';\n\n/**\n * The `GitConstructError` is thrown when an error occurs in the constructor\n * of the `simple-git` instance itself. Most commonly as a result of using\n * a `baseDir` option that points to a folder that either does not exist,\n * or cannot be read by the user the node script is running as.\n *\n * Check the `.message` property for more detail including the properties\n * passed to the constructor.\n */\nexport class GitConstructError extends GitError {\n constructor(\n public readonly config: SimpleGitOptions,\n message: string\n ) {\n super(undefined, message);\n }\n}\n", "import { SimpleGitOptions, SimpleGitTask } from '../types';\nimport { GitError } from './git-error';\n\nexport class GitPluginError extends GitError {\n constructor(\n public task?: SimpleGitTask,\n public readonly plugin?: keyof SimpleGitOptions,\n message?: string\n ) {\n super(task, message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n", "import { SimpleGitOptions } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function abortPlugin(signal: SimpleGitOptions['abort']) {\n if (!signal) {\n return;\n }\n\n const onSpawnAfter: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n function kill() {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort signal received'));\n }\n\n signal.addEventListener('abort', kill);\n\n context.spawned.on('close', () => signal.removeEventListener('abort', kill));\n },\n };\n\n const onSpawnBefore: SimpleGitPlugin<'spawn.before'> = {\n type: 'spawn.before',\n action(_data, context) {\n if (signal.aborted) {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort already signaled'));\n }\n },\n };\n\n return [onSpawnBefore, onSpawnAfter];\n}\n", "import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport type { SimpleGitPluginConfig } from '../types';\n\nfunction isConfigSwitch(arg: string | unknown) {\n return typeof arg === 'string' && arg.trim().toLowerCase() === '-c';\n}\n\nfunction preventProtocolOverride(arg: string, next: string) {\n if (!isConfigSwitch(arg)) {\n return;\n }\n\n if (!/^\\s*protocol(.[a-z]+)?.allow/.test(next)) {\n return;\n }\n\n throw new GitPluginError(\n undefined,\n 'unsafe',\n 'Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol'\n );\n}\n\nfunction preventUploadPack(arg: string, method: string) {\n if (/^\\s*--(upload|receive)-pack/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'clone' && /^\\s*-u\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of clone with option -u is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'push' && /^\\s*--exec\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of push with option --exec is not permitted without enabling allowUnsafePack`\n );\n }\n}\n\nexport function blockUnsafeOperationsPlugin({\n allowUnsafeProtocolOverride = false,\n allowUnsafePack = false,\n}: SimpleGitPluginConfig['unsafe'] = {}): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(args, context) {\n args.forEach((current, index) => {\n const next = index < args.length ? args[index + 1] : '';\n\n allowUnsafeProtocolOverride || preventProtocolOverride(current, next);\n allowUnsafePack || preventUploadPack(current, context.method);\n });\n\n return args;\n },\n };\n}\n", "import { prefixedArray } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function commandConfigPrefixingPlugin(\n configuration: string[]\n): SimpleGitPlugin<'spawn.args'> {\n const prefix = prefixedArray(configuration, '-c');\n\n return {\n type: 'spawn.args',\n action(data) {\n return [...prefix, ...data];\n },\n };\n}\n", "import { deferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { SimpleGitPluginConfig } from '../types';\nimport { delay } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nconst never = deferred().promise;\n\nexport function completionDetectionPlugin({\n onClose = true,\n onExit = 50,\n}: SimpleGitPluginConfig['completion'] = {}): SimpleGitPlugin<'spawn.after'> {\n function createEvents() {\n let exitCode = -1;\n const events = {\n close: deferred(),\n closeTimeout: deferred(),\n exit: deferred(),\n exitTimeout: deferred(),\n };\n\n const result = Promise.race([\n onClose === false ? never : events.closeTimeout.promise,\n onExit === false ? never : events.exitTimeout.promise,\n ]);\n\n configureTimeout(onClose, events.close, events.closeTimeout);\n configureTimeout(onExit, events.exit, events.exitTimeout);\n\n return {\n close(code: number) {\n exitCode = code;\n events.close.done();\n },\n exit(code: number) {\n exitCode = code;\n events.exit.done();\n },\n get exitCode() {\n return exitCode;\n },\n result,\n };\n }\n\n function configureTimeout(\n flag: boolean | number,\n event: DeferredPromise,\n timeout: DeferredPromise\n ) {\n if (flag === false) {\n return;\n }\n\n (flag === true ? event.promise : event.promise.then(() => delay(flag))).then(timeout.done);\n }\n\n return {\n type: 'spawn.after',\n async action(_data, { spawned, close }) {\n const events = createEvents();\n\n let deferClose = true;\n let quickClose = () => void (deferClose = false);\n\n spawned.stdout?.on('data', quickClose);\n spawned.stderr?.on('data', quickClose);\n spawned.on('error', quickClose);\n\n spawned.on('close', (code: number) => events.close(code));\n spawned.on('exit', (code: number) => events.exit(code));\n\n try {\n await events.result;\n if (deferClose) {\n await delay(50);\n }\n close(events.exitCode);\n } catch (err) {\n close(events.exitCode, err as Error);\n }\n },\n };\n}\n", "import type { SimpleGitOptions } from '../types';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport { asArray } from '../utils';\nimport { PluginStore } from './plugin-store';\n\nconst WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`;\nconst WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`;\n\nfunction isBadArgument(arg: string) {\n return !arg || !/^([a-z]:)?([a-z0-9/.\\\\_~-]+)$/i.test(arg);\n}\n\nfunction toBinaryConfig(\n input: string[],\n allowUnsafe: boolean\n): { binary: string; prefix?: string } {\n if (input.length < 1 || input.length > 2) {\n throw new GitPluginError(undefined, 'binary', WRONG_NUMBER_ERR);\n }\n\n const isBad = input.some(isBadArgument);\n if (isBad) {\n if (allowUnsafe) {\n console.warn(WRONG_CHARS_ERR);\n } else {\n throw new GitPluginError(undefined, 'binary', WRONG_CHARS_ERR);\n }\n }\n\n const [binary, prefix] = input;\n return {\n binary,\n prefix,\n };\n}\n\nexport function customBinaryPlugin(\n plugins: PluginStore,\n input: SimpleGitOptions['binary'] = ['git'],\n allowUnsafe = false\n) {\n let config = toBinaryConfig(asArray(input), allowUnsafe);\n\n plugins.on('binary', (input) => {\n config = toBinaryConfig(asArray(input), allowUnsafe);\n });\n\n plugins.append('spawn.binary', () => {\n return config.binary;\n });\n\n plugins.append('spawn.args', (data) => {\n return config.prefix ? [config.prefix, ...data] : data;\n });\n}\n", "import { GitError } from '../errors/git-error';\nimport { GitExecutorResult, SimpleGitPluginConfig } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\ntype TaskResult = Omit;\n\nfunction isTaskError(result: TaskResult) {\n return !!(result.exitCode && result.stdErr.length);\n}\n\nfunction getErrorMessage(result: TaskResult) {\n return Buffer.concat([...result.stdOut, ...result.stdErr]);\n}\n\nexport function errorDetectionHandler(\n overwrite = false,\n isError = isTaskError,\n errorMessage: (result: TaskResult) => Buffer | Error = getErrorMessage\n) {\n return (error: Buffer | Error | undefined, result: TaskResult) => {\n if ((!overwrite && error) || !isError(result)) {\n return error;\n }\n\n return errorMessage(result);\n };\n}\n\nexport function errorDetectionPlugin(\n config: SimpleGitPluginConfig['errors']\n): SimpleGitPlugin<'task.error'> {\n return {\n type: 'task.error',\n action(data, context) {\n const error = config(data.error, {\n stdErr: context.stdErr,\n stdOut: context.stdOut,\n exitCode: context.exitCode,\n });\n\n if (Buffer.isBuffer(error)) {\n return { error: new GitError(undefined, error.toString('utf-8')) };\n }\n\n return {\n error,\n };\n },\n };\n}\n", "import { EventEmitter } from 'node:events';\n\nimport type {\n SimpleGitPlugin,\n SimpleGitPluginType,\n SimpleGitPluginTypes,\n} from './simple-git-plugin';\nimport { append, asArray } from '../utils';\nimport type { SimpleGitPluginConfig } from '../types';\n\nexport class PluginStore {\n private plugins: Set> = new Set();\n private events = new EventEmitter();\n\n on(\n type: K,\n listener: (data: SimpleGitPluginConfig[K]) => void\n ) {\n this.events.on(type, listener);\n }\n\n reconfigure(type: K, data: SimpleGitPluginConfig[K]) {\n this.events.emit(type, data);\n }\n\n public append(type: T, action: SimpleGitPlugin['action']) {\n const plugin = append(this.plugins, { type, action });\n\n return () => this.plugins.delete(plugin);\n }\n\n public add(\n plugin: void | SimpleGitPlugin | SimpleGitPlugin[]\n ) {\n const plugins: SimpleGitPlugin[] = [];\n\n asArray(plugin).forEach((plugin) => plugin && this.plugins.add(append(plugins, plugin)));\n\n return () => {\n plugins.forEach((plugin) => this.plugins.delete(plugin));\n };\n }\n\n public exec(\n type: T,\n data: SimpleGitPluginTypes[T]['data'],\n context: SimpleGitPluginTypes[T]['context']\n ): typeof data {\n let output = data;\n const contextual = Object.freeze(Object.create(context));\n\n for (const plugin of this.plugins) {\n if (plugin.type === type) {\n output = plugin.action(output, contextual);\n }\n }\n\n return output;\n }\n}\n", "import { SimpleGitOptions } from '../types';\nimport { asNumber, including } from '../utils';\n\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function progressMonitorPlugin(progress: Exclude) {\n const progressCommand = '--progress';\n const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push'];\n\n const onProgress: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n if (!context.commands.includes(progressCommand)) {\n return;\n }\n\n context.spawned.stderr?.on('data', (chunk: Buffer) => {\n const message = /^([\\s\\S]+?):\\s*(\\d+)% \\((\\d+)\\/(\\d+)\\)/.exec(chunk.toString('utf8'));\n if (!message) {\n return;\n }\n\n progress({\n method: context.method,\n stage: progressEventStage(message[1]),\n progress: asNumber(message[2]),\n processed: asNumber(message[3]),\n total: asNumber(message[4]),\n });\n });\n },\n };\n\n const onArgs: SimpleGitPlugin<'spawn.args'> = {\n type: 'spawn.args',\n action(args, context) {\n if (!progressMethods.includes(context.method)) {\n return args;\n }\n\n return including(args, progressCommand);\n },\n };\n\n return [onArgs, onProgress];\n}\n\nfunction progressEventStage(input: string) {\n return String(input.toLowerCase().split(' ', 1)) || 'unknown';\n}\n", "import { SpawnOptions } from 'child_process';\nimport { pick } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function spawnOptionsPlugin(\n spawnOptions: Partial\n): SimpleGitPlugin<'spawn.options'> {\n const options = pick(spawnOptions, ['uid', 'gid']);\n\n return {\n type: 'spawn.options',\n action(data) {\n return { ...options, ...data };\n },\n };\n}\n", "import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport type { SimpleGitOptions } from '../types';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function timeoutPlugin({\n block,\n stdErr = true,\n stdOut = true,\n}: Exclude): SimpleGitPlugin<'spawn.after'> | void {\n if (block > 0) {\n return {\n type: 'spawn.after',\n action(_data, context) {\n let timeout: NodeJS.Timeout;\n\n function wait() {\n timeout && clearTimeout(timeout);\n timeout = setTimeout(kill, block);\n }\n\n function stop() {\n context.spawned.stdout?.off('data', wait);\n context.spawned.stderr?.off('data', wait);\n context.spawned.off('exit', stop);\n context.spawned.off('close', stop);\n timeout && clearTimeout(timeout);\n }\n\n function kill() {\n stop();\n context.kill(new GitPluginError(undefined, 'timeout', `block timeout reached`));\n }\n\n stdOut && context.spawned.stdout?.on('data', wait);\n stdErr && context.spawned.stderr?.on('data', wait);\n context.spawned.on('exit', stop);\n context.spawned.on('close', stop);\n\n wait();\n },\n };\n }\n}\n", "import { SimpleGitPlugin } from './simple-git-plugin';\nimport { isPathSpec, toPaths } from '../args/pathspec';\n\nexport function suffixPathsPlugin(): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(data) {\n const prefix: string[] = [];\n let suffix: undefined | string[];\n function append(args: string[]) {\n (suffix = suffix || []).push(...args);\n }\n\n for (let i = 0; i < data.length; i++) {\n const param = data[i];\n\n if (isPathSpec(param)) {\n append(toPaths(param));\n continue;\n }\n\n if (param === '--') {\n append(\n data.slice(i + 1).flatMap((item) => (isPathSpec(item) && toPaths(item)) || item)\n );\n break;\n }\n\n prefix.push(param);\n }\n\n return !suffix ? prefix : [...prefix, '--', ...suffix.map(String)];\n },\n };\n}\n", "import { SimpleGitFactory } from '../../typings';\n\nimport * as api from './api';\nimport {\n abortPlugin,\n blockUnsafeOperationsPlugin,\n commandConfigPrefixingPlugin,\n completionDetectionPlugin,\n customBinaryPlugin,\n errorDetectionHandler,\n errorDetectionPlugin,\n PluginStore,\n progressMonitorPlugin,\n spawnOptionsPlugin,\n timeoutPlugin,\n} from './plugins';\nimport { suffixPathsPlugin } from './plugins/suffix-paths.plugin';\nimport { createInstanceConfig, folderExists } from './utils';\nimport { SimpleGitOptions } from './types';\n\nconst Git = require('../git');\n\n/**\n * Adds the necessary properties to the supplied object to enable it for use as\n * the default export of a module.\n *\n * Eg: `module.exports = esModuleFactory({ something () {} })`\n */\nexport function esModuleFactory(defaultExport: T) {\n return Object.defineProperties(defaultExport, {\n __esModule: { value: true },\n default: { value: defaultExport },\n }) as T & { __esModule: true; default: T };\n}\n\nexport function gitExportFactory(factory: SimpleGitFactory) {\n return Object.assign(factory.bind(null), api);\n}\n\nexport function gitInstanceFactory(\n baseDir?: string | Partial,\n options?: Partial\n) {\n const plugins = new PluginStore();\n const config = createInstanceConfig(\n (baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir)) || {},\n options\n );\n\n if (!folderExists(config.baseDir)) {\n throw new api.GitConstructError(\n config,\n `Cannot use simple-git on a directory that does not exist`\n );\n }\n\n if (Array.isArray(config.config)) {\n plugins.add(commandConfigPrefixingPlugin(config.config));\n }\n\n plugins.add(blockUnsafeOperationsPlugin(config.unsafe));\n plugins.add(suffixPathsPlugin());\n plugins.add(completionDetectionPlugin(config.completion));\n config.abort && plugins.add(abortPlugin(config.abort));\n config.progress && plugins.add(progressMonitorPlugin(config.progress));\n config.timeout && plugins.add(timeoutPlugin(config.timeout));\n config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions));\n\n plugins.add(errorDetectionPlugin(errorDetectionHandler(true)));\n config.errors && plugins.add(errorDetectionPlugin(config.errors));\n\n customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary);\n\n return new Git(config, plugins);\n}\n", "import { SimpleGit, SimpleGitOptions } from '../../../typings';\n\nimport { GitResponseError } from '../errors/git-response-error';\nimport { gitInstanceFactory } from '../git-factory';\nimport { SimpleGitTaskCallback } from '../types';\n\nconst functionNamesBuilderApi = ['customBinary', 'env', 'outputHandler', 'silent'];\n\nconst functionNamesPromiseApi = [\n 'add',\n 'addAnnotatedTag',\n 'addConfig',\n 'addRemote',\n 'addTag',\n 'applyPatch',\n 'binaryCatFile',\n 'branch',\n 'branchLocal',\n 'catFile',\n 'checkIgnore',\n 'checkIsRepo',\n 'checkout',\n 'checkoutBranch',\n 'checkoutLatestTag',\n 'checkoutLocalBranch',\n 'clean',\n 'clone',\n 'commit',\n 'cwd',\n 'deleteLocalBranch',\n 'deleteLocalBranches',\n 'diff',\n 'diffSummary',\n 'exec',\n 'fetch',\n 'getRemotes',\n 'init',\n 'listConfig',\n 'listRemote',\n 'log',\n 'merge',\n 'mergeFromTo',\n 'mirror',\n 'mv',\n 'pull',\n 'push',\n 'pushTags',\n 'raw',\n 'rebase',\n 'remote',\n 'removeRemote',\n 'reset',\n 'revert',\n 'revparse',\n 'rm',\n 'rmKeepLocal',\n 'show',\n 'stash',\n 'stashList',\n 'status',\n 'subModule',\n 'submoduleAdd',\n 'submoduleInit',\n 'submoduleUpdate',\n 'tag',\n 'tags',\n 'updateServerInfo',\n];\n\nexport function gitP(\n ...args: [] | [string] | [Partial] | [string, Partial]\n): SimpleGit {\n let git: any;\n\n let chain = Promise.resolve();\n\n try {\n git = gitInstanceFactory(...args);\n } catch (e) {\n chain = Promise.reject(e);\n }\n\n function builderReturn() {\n return promiseApi;\n }\n\n function chainReturn() {\n return chain;\n }\n\n const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce(\n (api: any, name: string) => {\n const isAsync = functionNamesPromiseApi.includes(name);\n\n const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api);\n const alternative = isAsync ? chainReturn : builderReturn;\n\n Object.defineProperty(api, name, {\n enumerable: false,\n configurable: false,\n value: git ? valid : alternative,\n });\n\n return api;\n },\n {}\n );\n\n return promiseApi as SimpleGit;\n\n function asyncWrapper(fn: string, git: any): (...args: any[]) => Promise {\n return function (...args: any[]) {\n if (typeof args[args.length] === 'function') {\n throw new TypeError(\n 'Promise interface requires that handlers are not supplied inline, ' +\n 'trailing function not allowed in call to ' +\n fn\n );\n }\n\n return chain.then(function () {\n return new Promise(function (resolve, reject) {\n const callback: SimpleGitTaskCallback = (err: Error | null, result?: any) => {\n if (err) {\n return reject(toError(err));\n }\n\n resolve(result);\n };\n args.push(callback);\n\n git[fn].apply(git, args);\n });\n });\n };\n }\n\n function syncWrapper(fn: string, git: any, api: SimpleGit) {\n return (...args: any[]) => {\n git[fn](...args);\n\n return api;\n };\n }\n}\n\nfunction toError(error: Error | string | any): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n return new GitResponseError(error);\n}\n", "import { gitInstanceFactory } from './lib/git-factory';\n\nexport { gitP } from './lib/runners/promise-wrapped';\nexport * from './lib/api';\n\nexport const simpleGit = gitInstanceFactory;\n\nexport default gitInstanceFactory;\n", "import path from \"path\";\n\nimport { ensureDir, safeWriteFile } from \"../utils/fs\";\n\nimport type { RepoAnalysis } from \"./analyzer\";\n\nexport type FileAction = {\n path: string;\n action: \"wrote\" | \"skipped\";\n};\n\nexport type GenerateResult = {\n files: FileAction[];\n};\n\nexport type GenerateOptions = {\n repoPath: string;\n analysis: RepoAnalysis;\n selections: string[];\n force: boolean;\n};\n\nexport async function generateConfigs(options: GenerateOptions): Promise {\n const { repoPath, analysis, selections, force } = options;\n const files: FileAction[] = [];\n\n if (selections.includes(\"mcp\")) {\n const filePath = path.join(repoPath, \".vscode\", \"mcp.json\");\n await ensureDir(path.dirname(filePath));\n const content = renderMcp();\n const { wrote } = await safeWriteFile(filePath, content, force);\n files.push({\n path: path.relative(process.cwd(), filePath),\n action: wrote ? \"wrote\" : \"skipped\"\n });\n }\n\n if (selections.includes(\"vscode\")) {\n const filePath = path.join(repoPath, \".vscode\", \"settings.json\");\n await ensureDir(path.dirname(filePath));\n const content = renderVscodeSettings(analysis);\n const { wrote } = await safeWriteFile(filePath, content, force);\n files.push({\n path: path.relative(process.cwd(), filePath),\n action: wrote ? \"wrote\" : \"skipped\"\n });\n }\n\n return { files };\n}\n\nfunction renderMcp(): string {\n return JSON.stringify(\n {\n servers: {\n github: {\n command: \"npx\",\n args: [\"-y\", \"@modelcontextprotocol/server-github\"],\n env: {\n GITHUB_PERSONAL_ACCESS_TOKEN: \"${input:github_token}\"\n }\n },\n filesystem: {\n command: \"npx\",\n args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"${workspaceFolder}\"]\n }\n },\n inputs: [\n {\n id: \"github_token\",\n type: \"promptString\",\n description: \"GitHub Personal Access Token\"\n }\n ]\n },\n null,\n 2\n );\n}\n\nfunction renderVscodeSettings(analysis: RepoAnalysis): string {\n const reviewFocus = analysis.frameworks.length\n ? `Focus on ${analysis.frameworks.join(\", \")} best practices and repo conventions.`\n : \"Focus on repo conventions and maintainability.\";\n\n return JSON.stringify(\n {\n \"github.copilot.chat.codeGeneration.instructions\": [\n { file: \".github/copilot-instructions.md\" }\n ],\n \"github.copilot.chat.reviewSelection.instructions\": [{ text: reviewFocus }],\n \"chat.promptFiles\": true,\n \"chat.mcp.enabled\": true\n },\n null,\n 2\n );\n}\n", "export const DEFAULT_MODEL = \"claude-sonnet-4.5\";\nexport const DEFAULT_JUDGE_MODEL = \"claude-sonnet-4.5\";\n", "import fs from \"fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport path from \"path\";\n\nimport fg from \"fast-glob\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type CopilotCliConfig = {\n cliPath: string;\n cliArgs?: string[];\n};\n\nlet cachedCliConfig: CopilotCliConfig | null = null;\nlet cachedCliConfigTimestamp = 0;\nconst CLI_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\nfunction cacheConfig(config: CopilotCliConfig): CopilotCliConfig {\n cachedCliConfig = config;\n cachedCliConfigTimestamp = Date.now();\n return config;\n}\n\nexport async function assertCopilotCliReady(): Promise {\n const config = await findCopilotCliConfig();\n\n try {\n const [cmd, args] = buildExecArgs(config, [\"--version\"]);\n await execFileAsync(cmd, args, { timeout: 5000 });\n } catch {\n const desc = config.cliArgs ? `${config.cliPath} ${config.cliArgs.join(\" \")}` : config.cliPath;\n throw new Error(`Copilot CLI at ${desc} is not working.`);\n }\n\n return config;\n}\n\nexport async function listCopilotModels(): Promise {\n const config = await assertCopilotCliReady();\n const [cmd, args] = buildExecArgs(config, [\"--help\"]);\n const { stdout } = await execFileAsync(cmd, args, { timeout: 5000 });\n return extractModelChoices(stdout);\n}\n\nfunction buildExecArgs(config: CopilotCliConfig, extraArgs: string[]): [string, string[]] {\n if (config.cliArgs && config.cliArgs.length > 0) {\n return [config.cliPath, [...config.cliArgs, ...extraArgs]];\n }\n if (\n process.platform === \"win32\" &&\n (config.cliPath.endsWith(\".bat\") || config.cliPath.endsWith(\".cmd\"))\n ) {\n return [\"cmd\", [\"/c\", config.cliPath, ...extraArgs]];\n }\n return [config.cliPath, extraArgs];\n}\n\nasync function findCopilotCliConfig(): Promise {\n if (cachedCliConfig && Date.now() - cachedCliConfigTimestamp < CLI_CACHE_TTL_MS) {\n return cachedCliConfig;\n }\n\n const isWindows = process.platform === \"win32\";\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n const appData = process.env.APPDATA ?? \"\";\n\n // On Windows, prefer npm-installed binary and use node + cliArgs approach.\n // This bypasses .cmd/.bat wrapper issues that prevent direct spawning.\n // See: https://github.com/microsoft/vscode/issues/291990\n if (isWindows && appData) {\n const npmLoaderPath = path.join(\n appData,\n \"npm\",\n \"node_modules\",\n \"@github\",\n \"copilot\",\n \"npm-loader.js\"\n );\n try {\n await fs.access(npmLoaderPath);\n return cacheConfig({ cliPath: process.execPath, cliArgs: [npmLoaderPath] });\n } catch {\n // npm binary not found, will try PATH and VS Code locations\n }\n }\n\n const whichCmd = isWindows ? \"where\" : \"which\";\n try {\n const { stdout } = await execFileAsync(whichCmd, [\"copilot\"], { timeout: 5000 });\n const found = stdout.trim().split(/\\r?\\n/)[0];\n if (found) {\n return cacheConfig({ cliPath: found });\n }\n } catch {\n // Not on PATH, will try VS Code locations\n }\n\n const staticLocations: string[] = [];\n\n if (process.platform === \"darwin\") {\n staticLocations.push(\n `${home}/Library/Application Support/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`,\n `${home}/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`\n );\n } else if (process.platform === \"linux\") {\n staticLocations.push(\n `${home}/.config/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`,\n `${home}/.config/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`\n );\n } else if (isWindows && appData) {\n staticLocations.push(\n `${appData}\\\\Code - Insiders\\\\User\\\\globalStorage\\\\github.copilot-chat\\\\copilotCli\\\\copilot.bat`,\n `${appData}\\\\Code\\\\User\\\\globalStorage\\\\github.copilot-chat\\\\copilotCli\\\\copilot.bat`\n );\n }\n\n for (const location of staticLocations) {\n try {\n await fs.access(location);\n return cacheConfig({ cliPath: location });\n } catch {\n // Try next\n }\n }\n\n const exts = isWindows ? \"{.exe,.bat,.cmd}\" : \"\";\n const normalizedHome = home.replace(/\\\\/g, \"/\");\n const globPatterns = [\n `${normalizedHome}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot${exts}`,\n `${normalizedHome}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot${exts}`\n ];\n\n for (const pattern of globPatterns) {\n const matches = await fg(pattern, { onlyFiles: true });\n if (matches.length > 0) {\n return cacheConfig({ cliPath: path.normalize(matches[0]) });\n }\n }\n\n const platformHint = isWindows\n ? \" Searched APPDATA and VS Code extension paths.\"\n : process.platform === \"linux\"\n ? \" Searched ~/.config/Code and VS Code extension paths.\"\n : \" Searched ~/Library/Application Support/Code and VS Code extension paths.\";\n\n throw new Error(\n `Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code or run: npm install -g @github/copilot.${platformHint}`\n );\n}\n\nfunction extractModelChoices(helpText: string): string[] {\n const lines = helpText.split(\"\\n\");\n let captured = \"\";\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n if (!line.includes(\"--model\")) continue;\n\n captured = line.trim();\n while (!captured.includes(\")\") && index + 1 < lines.length) {\n index += 1;\n captured += ` ${lines[index].trim()}`;\n }\n break;\n }\n\n const match = captured.match(/choices:\\s*([^)]*)/);\n if (!match) return [];\n\n const models: string[] = [];\n const matcher = /\"([^\"]+)\"/g;\n let entry = matcher.exec(match[1]);\n while (entry) {\n models.push(entry[1]);\n entry = matcher.exec(match[1]);\n }\n\n return models;\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { DEFAULT_MODEL } from \"../config\";\nimport { ensureDir, fileExists } from \"../utils/fs\";\n\nimport type { Area } from \"./analyzer\";\nimport { sanitizeAreaName } from \"./analyzer\";\nimport { assertCopilotCliReady } from \"./copilot\";\n\ntype GenerateInstructionsOptions = {\n repoPath: string;\n instructionFile?: string;\n model?: string;\n onProgress?: (message: string) => void;\n};\n\nexport async function generateCopilotInstructions(\n options: GenerateInstructionsOptions\n): Promise {\n const repoPath = options.repoPath;\n const progress = options.onProgress ?? (() => {});\n\n progress(\"Checking Copilot CLI...\");\n const cliConfig = await assertCopilotCliReady();\n\n progress(\"Starting Copilot SDK...\");\n const sdk = await import(\"@github/copilot-sdk\");\n const client = new sdk.CopilotClient(cliConfig);\n\n try {\n progress(\"Creating session...\");\n const preferredModel = options.model ?? DEFAULT_MODEL;\n const session = await client.createSession({\n model: preferredModel,\n streaming: true,\n workingDirectory: repoPath,\n systemMessage: {\n content:\n \"You are an expert codebase analyst. Your task is to generate a concise .github/copilot-instructions.md file. Use the available tools (glob, view, grep) to explore the codebase. Output ONLY the final markdown content, no explanations.\"\n },\n infiniteSessions: { enabled: false }\n });\n\n let content = \"\";\n\n // Subscribe to events for progress and to capture content\n session.on((event) => {\n const e = event as { type: string; data?: Record };\n if (e.type === \"assistant.message_delta\") {\n const delta = e.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(\"Generating instructions...\");\n }\n } else if (e.type === \"tool.execution_start\") {\n const toolName = e.data?.toolName as string | undefined;\n progress(`Using tool: ${toolName ?? \"...\"}`);\n } else if (e.type === \"session.error\") {\n const errorMsg = (e.data?.message as string) ?? \"Unknown error\";\n if (errorMsg.toLowerCase().includes(\"auth\") || errorMsg.toLowerCase().includes(\"login\")) {\n throw new Error(\n \"Copilot CLI not logged in. Run `copilot` then `/login` to authenticate.\"\n );\n }\n }\n });\n\n // Simple prompt - let the agent use tools to explore\n const prompt = `Analyze this codebase and generate a .github/copilot-instructions.md file.\n\nUse tools to explore:\n1. Check for existing instruction files: glob for **/{.github/copilot-instructions.md,AGENT.md,CLAUDE.md,.cursorrules,README.md}\n2. Identify the tech stack: look at package.json, tsconfig.json, pyproject.toml, Cargo.toml, go.mod, *.csproj, *.sln, build.gradle, pom.xml, etc.\n3. Understand the structure: list key directories\n4. Detect monorepo structures: check for workspace configs (npm/pnpm/yarn workspaces, Cargo.toml [workspace], go.work, .sln solution files, settings.gradle include directives, pom.xml modules)\n\nGenerate concise instructions (~20-50 lines) covering:\n- Tech stack and architecture\n- Build/test commands\n- Project-specific conventions\n- Key files/directories\n- Monorepo structure and per-app layout (if this is a monorepo, describe the workspace organization, how apps relate to each other, and any shared libraries)\n\nOutput ONLY the markdown content for the instructions file.`;\n\n progress(\"Analyzing codebase...\");\n await session.sendAndWait({ prompt }, 180000);\n await session.destroy();\n\n return content.trim() || \"\";\n } finally {\n await client.stop();\n }\n}\n\ntype GenerateAreaInstructionsOptions = {\n repoPath: string;\n area: Area;\n model?: string;\n onProgress?: (message: string) => void;\n};\n\nexport async function generateAreaInstructions(\n options: GenerateAreaInstructionsOptions\n): Promise {\n const { repoPath, area } = options;\n const progress = options.onProgress ?? (() => {});\n\n progress(`Checking Copilot CLI for area \"${area.name}\"...`);\n const cliConfig = await assertCopilotCliReady();\n\n progress(`Starting Copilot SDK for area \"${area.name}\"...`);\n const sdk = await import(\"@github/copilot-sdk\");\n const client = new sdk.CopilotClient(cliConfig);\n\n try {\n const applyToPatterns = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo];\n const applyToStr = applyToPatterns.join(\", \");\n\n progress(`Creating session for area \"${area.name}\"...`);\n const preferredModel = options.model ?? DEFAULT_MODEL;\n const session = await client.createSession({\n model: preferredModel,\n streaming: true,\n workingDirectory: repoPath,\n systemMessage: {\n content: `You are an expert codebase analyst. Your task is to generate a concise .instructions.md file for a specific area of a codebase. This file will be used as a file-based custom instruction in VS Code Copilot, automatically applied when working on files matching certain patterns. Use the available tools (glob, view, grep) to explore the codebase. Output ONLY the final markdown content (no frontmatter, no explanations).`\n },\n infiniteSessions: { enabled: false }\n });\n\n let content = \"\";\n\n session.on((event) => {\n const e = event as { type: string; data?: Record };\n if (e.type === \"assistant.message_delta\") {\n const delta = e.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(`Generating instructions for \"${area.name}\"...`);\n }\n } else if (e.type === \"tool.execution_start\") {\n const toolName = e.data?.toolName as string | undefined;\n progress(`${area.name}: using tool ${toolName ?? \"...\"}`);\n } else if (e.type === \"session.error\") {\n const errorMsg = (e.data?.message as string) ?? \"Unknown error\";\n if (errorMsg.toLowerCase().includes(\"auth\") || errorMsg.toLowerCase().includes(\"login\")) {\n throw new Error(\n \"Copilot CLI not logged in. Run `copilot` then `/login` to authenticate.\"\n );\n }\n }\n });\n\n const prompt = `Analyze the \"${area.name}\" area of this codebase and generate a file-based instruction file.\n\nThis area covers files matching: ${applyToStr}\n${area.description ? `Description: ${area.description}` : \"\"}\n\nUse tools to explore ONLY the files and directories within this area:\n1. List the key files: glob for ${applyToPatterns.map((p) => `\"${p}\"`).join(\", \")}\n2. Identify the tech stack, dependencies, and frameworks used in this area\n3. Look at key source files to understand patterns and conventions specific to this area\n\nGenerate concise instructions (~10-30 lines) covering:\n- What this area does and its role in the overall project\n- Area-specific tech stack, dependencies, and frameworks\n- Coding conventions and patterns specific to this area\n- Build/test commands relevant to this area (if different from root)\n- Key files and directory structure within this area\n\nIMPORTANT:\n- Focus ONLY on this specific area, not the whole repo\n- Do NOT repeat repo-wide information (that goes in the root copilot-instructions.md)\n- Keep it complementary to root instructions\n- Output ONLY the markdown content, no YAML frontmatter, no code fences`;\n\n progress(`Analyzing area \"${area.name}\"...`);\n await session.sendAndWait({ prompt }, 180000);\n await session.destroy();\n\n return content.trim() || \"\";\n } finally {\n await client.stop();\n }\n}\n\nfunction escapeYamlString(value: string): string {\n return value\n .replace(/\\0/gu, \"\")\n .replace(/\\\\/gu, \"\\\\\\\\\")\n .replace(/\"/gu, '\\\\\"')\n .replace(/\\n/gu, \"\\\\n\")\n .replace(/\\r/gu, \"\\\\r\")\n .replace(/\\t/gu, \"\\\\t\");\n}\n\nexport function buildAreaFrontmatter(area: Area): string {\n const applyTo = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo];\n const applyToValue =\n applyTo.length === 1\n ? `\"${escapeYamlString(applyTo[0])}\"`\n : `[${applyTo.map((p) => `\"${escapeYamlString(p)}\"`).join(\", \")}]`;\n const desc = area.description\n ? `Use when working on ${area.name}. ${area.description}`\n : `Use when working on ${area.name}`;\n\n return `---\ndescription: \"${escapeYamlString(desc)}\"\napplyTo: ${applyToValue}\n---`;\n}\n\nexport function buildAreaInstructionContent(area: Area, body: string): string {\n return `${buildAreaFrontmatter(area)}\\n\\n${body}\\n`;\n}\n\nexport function areaInstructionPath(repoPath: string, area: Area): string {\n return path.join(\n repoPath,\n \".github\",\n \"instructions\",\n `${sanitizeAreaName(area.name)}.instructions.md`\n );\n}\n\nexport type WriteAreaResult = { status: \"written\" | \"skipped\" | \"empty\"; filePath: string };\n\nexport async function writeAreaInstruction(\n repoPath: string,\n area: Area,\n body: string,\n force?: boolean\n): Promise {\n const filePath = areaInstructionPath(repoPath, area);\n if (!body.trim()) return { status: \"empty\", filePath };\n if (!force && (await fileExists(filePath))) return { status: \"skipped\", filePath };\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, buildAreaInstructionContent(area, body), \"utf8\");\n return { status: \"written\", filePath };\n}\n\n// Re-export for backward compatibility\nexport { sanitizeAreaName } from \"./analyzer\";\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { buildTimestampedName } from \"../utils/fs\";\n\nimport { assertCopilotCliReady } from \"./copilot\";\nimport type { EvalConfig } from \"./evalScaffold\";\n\nconst DEFAULT_SYSTEM_MESSAGE =\n \"You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them.\";\n\ninterface CopilotSession {\n on(handler: (event: { type: string; data?: Record }) => void): void;\n sendAndWait(params: { prompt: string }, timeoutMs?: number): Promise;\n destroy(): Promise;\n}\n\ninterface CopilotClient {\n createSession(config?: Record): Promise;\n stop(): Promise;\n}\n\ntype EvalRunOptions = {\n configPath: string;\n repoPath: string;\n model: string;\n judgeModel: string;\n outputPath?: string;\n onProgress?: (message: string) => void;\n};\n\ntype TokenUsage = {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n};\n\ntype ToolCallSummary = {\n count: number;\n byName: Record;\n totalDurationMs: number;\n};\n\ntype AskMetrics = {\n durationMs: number;\n tokenUsage?: TokenUsage;\n toolCalls: ToolCallSummary;\n};\n\ntype EvalMetrics = {\n withoutInstructions: AskMetrics;\n withInstructions: AskMetrics;\n judge: AskMetrics;\n totalDurationMs: number;\n};\n\ntype EvalPhase = \"withoutInstructions\" | \"withInstructions\" | \"judge\";\n\ntype TrajectoryEvent = {\n timestampMs: number;\n phase: EvalPhase;\n type: string;\n data?: Record;\n};\n\nexport type EvalResult = {\n id: string;\n prompt: string;\n expectation: string;\n withInstructions?: string;\n withoutInstructions?: string;\n verdict?: \"pass\" | \"fail\" | \"unknown\";\n score?: number;\n rationale?: string;\n metrics?: EvalMetrics;\n trajectory?: TrajectoryEvent[];\n};\n\nexport async function runEval(\n options: EvalRunOptions\n): Promise<{ summary: string; results: EvalResult[]; viewerPath?: string }> {\n const config = await loadConfig(options.configPath);\n const instructionFile = config.instructionFile ?? \".github/copilot-instructions.md\";\n const instructionPath = path.resolve(options.repoPath, instructionFile);\n const instructionText = await readOptionalFile(instructionPath);\n const baseSystemMessage = config.systemMessage ?? DEFAULT_SYSTEM_MESSAGE;\n const progress = options.onProgress ?? (() => {});\n const defaultOutputPath = path.resolve(\n options.repoPath,\n \".primer\",\n \"evals\",\n buildTimestampedName(\"eval-results\")\n );\n const outputPath =\n resolveOutputPath(options.repoPath, options.outputPath, config.outputPath) ?? defaultOutputPath;\n const runStartedAt = Date.now();\n\n progress(\"Starting Copilot SDK...\");\n const cliConfig = await assertCopilotCliReady();\n const sdk = await import(\"@github/copilot-sdk\");\n const client = new sdk.CopilotClient(cliConfig);\n\n try {\n const results: EvalResult[] = [];\n const total = config.cases.length;\n\n for (const [index, testCase] of config.cases.entries()) {\n const id = testCase.id ?? `case-${index + 1}`;\n const prompt = buildPrompt(options.repoPath, testCase.prompt);\n const caseStartedAt = Date.now();\n\n progress(`Running eval ${index + 1}/${total}: ${id} (without instructions)...`);\n const withoutResult = await askOnce(client, {\n prompt,\n model: options.model,\n systemMessage: baseSystemMessage,\n phase: \"withoutInstructions\"\n });\n\n progress(`Running eval ${index + 1}/${total}: ${id} (with instructions)...`);\n const withResult = await askOnce(client, {\n prompt,\n model: options.model,\n systemMessage: [baseSystemMessage, instructionText].filter(Boolean).join(\"\\n\\n\"),\n phase: \"withInstructions\"\n });\n\n progress(`Running eval ${index + 1}/${total}: ${id} (judging)...`);\n const judgment = await judge(client, {\n model: options.judgeModel,\n prompt: testCase.prompt,\n expectation: testCase.expectation,\n withoutInstructions: withoutResult.content,\n withInstructions: withResult.content\n });\n\n const metrics: EvalMetrics = {\n withoutInstructions: withoutResult.metrics,\n withInstructions: withResult.metrics,\n judge: judgment.metrics,\n totalDurationMs: Date.now() - caseStartedAt\n };\n\n const trajectory = [\n ...withoutResult.trajectory,\n ...withResult.trajectory,\n ...judgment.trajectory\n ];\n\n results.push({\n id,\n prompt: testCase.prompt,\n expectation: testCase.expectation,\n withInstructions: withResult.content,\n withoutInstructions: withoutResult.content,\n verdict: judgment.result.verdict,\n score: judgment.result.score,\n rationale: judgment.result.rationale,\n metrics,\n trajectory\n });\n\n progress(\n `Eval ${index + 1}/${total}: ${id} \u2192 ${judgment.result.verdict} (score: ${judgment.result.score})`\n );\n }\n\n const runFinishedAt = Date.now();\n const output = {\n repoPath: options.repoPath,\n model: options.model,\n judgeModel: options.judgeModel,\n runMetrics: {\n startedAt: new Date(runStartedAt).toISOString(),\n finishedAt: new Date(runFinishedAt).toISOString(),\n durationMs: runFinishedAt - runStartedAt\n },\n results\n };\n let viewerPath: string | undefined;\n if (outputPath) {\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, JSON.stringify(output, null, 2), \"utf8\");\n viewerPath = buildViewerPath(outputPath);\n await fs.writeFile(viewerPath, buildTrajectoryViewerHtml(output), \"utf8\");\n }\n\n const summary = formatSummary(results, runFinishedAt - runStartedAt);\n return { summary, results, viewerPath };\n } finally {\n await client.stop();\n }\n}\n\ntype AskOptions = {\n prompt: string;\n model: string;\n systemMessage?: string;\n phase: EvalPhase;\n};\n\ntype AskResult = {\n content: string;\n metrics: AskMetrics;\n trajectory: TrajectoryEvent[];\n};\n\nasync function askOnce(client: CopilotClient, options: AskOptions): Promise {\n const session = await client.createSession({\n model: options.model,\n streaming: true,\n infiniteSessions: { enabled: false },\n systemMessage: options.systemMessage ? { content: options.systemMessage } : undefined\n });\n\n let content = \"\";\n const telemetry = createTelemetry(options.phase);\n const startedAt = Date.now();\n session.on((event: { type: string; data?: Record }) => {\n captureTelemetryEvent(event, telemetry);\n if (event.type === \"assistant.message_delta\") {\n const delta = event.data?.deltaContent as string | undefined;\n if (delta) content += delta;\n }\n });\n\n await session.sendAndWait({ prompt: options.prompt }, 120000);\n await session.destroy();\n const finishedAt = Date.now();\n return {\n content: content.trim(),\n metrics: {\n durationMs: finishedAt - startedAt,\n tokenUsage: normalizeTokenUsage(telemetry.tokenUsage),\n toolCalls: telemetry.toolCalls\n },\n trajectory: telemetry.trajectory\n };\n}\n\ntype JudgeOptions = {\n model: string;\n prompt: string;\n expectation: string;\n withoutInstructions: string;\n withInstructions: string;\n};\n\ntype JudgeResult = {\n verdict: \"pass\" | \"fail\" | \"unknown\";\n score: number;\n rationale: string;\n};\n\nasync function judge(\n client: CopilotClient,\n options: JudgeOptions\n): Promise<{ result: JudgeResult; metrics: AskMetrics; trajectory: TrajectoryEvent[] }> {\n const session = await client.createSession({\n model: options.model,\n streaming: true,\n infiniteSessions: { enabled: false },\n systemMessage: {\n content:\n \"You are a strict evaluator. Return JSON with keys: verdict (pass|fail|unknown), score (0-100), rationale. Do not include any other text.\"\n }\n });\n\n let content = \"\";\n const telemetry = createTelemetry(\"judge\");\n const startedAt = Date.now();\n session.on((event: { type: string; data?: Record }) => {\n captureTelemetryEvent(event, telemetry);\n if (event.type === \"assistant.message_delta\") {\n const delta = event.data?.deltaContent as string | undefined;\n if (delta) content += delta;\n }\n });\n\n const prompt = [\n \"Evaluate which response best matches the expectation.\",\n \"\",\n `Expectation: ${options.expectation}`,\n \"\",\n \"Response A (without custom instructions):\",\n options.withoutInstructions,\n \"\",\n \"Response B (with custom instructions):\",\n options.withInstructions,\n \"\",\n \"Return JSON only.\"\n ].join(\"\\n\");\n\n await session.sendAndWait({ prompt }, 120000);\n await session.destroy();\n\n const finishedAt = Date.now();\n return {\n result: parseJudge(content),\n metrics: {\n durationMs: finishedAt - startedAt,\n tokenUsage: normalizeTokenUsage(telemetry.tokenUsage),\n toolCalls: telemetry.toolCalls\n },\n trajectory: telemetry.trajectory\n };\n}\n\nfunction parseJudge(content: string): JudgeResult {\n try {\n const match = content.match(/\\{[\\s\\S]*\\}/);\n if (!match) throw new Error(\"No JSON detected\");\n const parsed = JSON.parse(match[0]) as JudgeResult;\n if (!parsed.verdict) throw new Error(\"Missing verdict\");\n return {\n verdict: parsed.verdict,\n score: Number(parsed.score ?? 0),\n rationale: String(parsed.rationale ?? \"\")\n };\n } catch {\n return {\n verdict: \"unknown\",\n score: 0,\n rationale: content.trim()\n };\n }\n}\n\nasync function loadConfig(configPath: string): Promise {\n const raw = await fs.readFile(configPath, \"utf8\");\n const parsed = JSON.parse(raw) as EvalConfig;\n if (!parsed || !Array.isArray(parsed.cases)) {\n throw new Error(\"Eval config must have a 'cases' array.\");\n }\n return parsed;\n}\n\nasync function readOptionalFile(filePath: string): Promise {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\nfunction buildPrompt(repoPath: string, userPrompt: string): string {\n return [\n \"You are working in this repository:\",\n repoPath,\n \"Use the file system tools when needed to inspect the codebase.\",\n \"\",\n userPrompt\n ].join(\"\\n\");\n}\n\nfunction formatSummary(results: EvalResult[], runDurationMs: number): string {\n const total = results.length;\n const passed = results.filter((r) => r.verdict === \"pass\").length;\n const failed = results.filter((r) => r.verdict === \"fail\").length;\n const unknown = results.filter((r) => r.verdict === \"unknown\").length;\n const totalUsage = aggregateTokenUsage(results);\n const hasUsage = Boolean(\n totalUsage.promptTokens || totalUsage.completionTokens || totalUsage.totalTokens\n );\n\n const lines = [\n `Eval results: ${passed}/${total} pass, ${failed} fail, ${unknown} unknown.`,\n `Runtime: ${formatDuration(runDurationMs)}.`,\n hasUsage ? `Token usage: ${formatTokenUsage(totalUsage)}.` : \"Token usage: unavailable.\"\n ];\n\n for (const result of results) {\n lines.push(`- ${result.id}: ${result.verdict ?? \"unknown\"} (score: ${result.score ?? 0})`);\n }\n\n return `\\n${lines.join(\"\\n\")}`;\n}\n\ntype TelemetryCollector = {\n trajectory: TrajectoryEvent[];\n tokenUsage: TokenUsage;\n toolCalls: ToolCallSummary;\n toolCallMap: Map;\n phase: EvalPhase;\n};\n\nfunction createTelemetry(phase: EvalPhase): TelemetryCollector {\n return {\n trajectory: [],\n tokenUsage: {},\n toolCalls: { count: 0, byName: {}, totalDurationMs: 0 },\n toolCallMap: new Map(),\n phase\n };\n}\n\nfunction captureTelemetryEvent(\n event: { type: string; data?: Record },\n telemetry: TelemetryCollector\n): void {\n const timestampMs = Date.now();\n telemetry.trajectory.push({\n timestampMs,\n phase: telemetry.phase,\n type: event.type,\n data: sanitizeEventData(event.data)\n });\n\n if (event.type === \"tool.execution_start\") {\n const toolName = (event.data?.toolName as string | undefined) ?? \"unknown\";\n const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size);\n telemetry.toolCallMap.set(toolId, { name: toolName, startMs: timestampMs });\n telemetry.toolCalls.count += 1;\n telemetry.toolCalls.byName[toolName] = (telemetry.toolCalls.byName[toolName] ?? 0) + 1;\n } else if (event.type === \"tool.execution_finish\" || event.type === \"tool.execution_error\") {\n const toolName = (event.data?.toolName as string | undefined) ?? \"unknown\";\n const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size);\n const entry =\n telemetry.toolCallMap.get(toolId) ?? findLatestToolByName(telemetry.toolCallMap, toolName);\n if (entry) {\n const durationMs = timestampMs - entry.startMs;\n telemetry.toolCalls.totalDurationMs += durationMs;\n telemetry.toolCallMap.delete(toolId);\n }\n }\n\n const usage = extractTokenUsage(event.data);\n if (usage) {\n telemetry.tokenUsage = mergeTokenUsage(telemetry.tokenUsage, usage);\n }\n}\n\nfunction resolveToolId(\n data: Record | undefined,\n toolName: string,\n index: number\n): string {\n const rawId = data?.executionId ?? data?.toolCallId ?? data?.callId ?? data?.id;\n if (typeof rawId === \"string\" || typeof rawId === \"number\") {\n return String(rawId);\n }\n return `${toolName}-${index + 1}`;\n}\n\nfunction findLatestToolByName(\n map: Map,\n toolName: string\n): { name?: string; startMs: number } | undefined {\n const entries = Array.from(map.values()).filter((entry) => entry.name === toolName);\n return entries.at(-1);\n}\n\nfunction extractTokenUsage(data: Record | undefined): TokenUsage | null {\n if (!data) return null;\n const usage = findUsageObject(data);\n const promptTokens = getNumber(\n usage?.prompt_tokens ?? usage?.promptTokens ?? data.promptTokens ?? data.inputTokens\n );\n const completionTokens = getNumber(\n usage?.completion_tokens ??\n usage?.completionTokens ??\n data.completionTokens ??\n data.outputTokens\n );\n const totalTokens = getNumber(usage?.total_tokens ?? usage?.totalTokens ?? data.totalTokens);\n\n if (promptTokens == null && completionTokens == null && totalTokens == null) {\n return null;\n }\n\n return {\n promptTokens: promptTokens ?? undefined,\n completionTokens: completionTokens ?? undefined,\n totalTokens: totalTokens ?? undefined\n };\n}\n\nfunction findUsageObject(data: Record): Record | undefined {\n const direct = (data.usage ?? data.tokenUsage ?? data.tokens) as\n | Record\n | undefined;\n if (direct) return direct;\n\n const candidates = [data.response, data.result, data.message, data.metrics, data.output];\n\n for (const candidate of candidates) {\n if (candidate && typeof candidate === \"object\") {\n const nested =\n (candidate as Record).usage ??\n (candidate as Record).tokenUsage;\n if (nested && typeof nested === \"object\") return nested as Record;\n }\n }\n\n return scanForUsage(data, 0);\n}\n\nfunction scanForUsage(value: unknown, depth: number): Record | undefined {\n if (!value || typeof value !== \"object\" || depth > 4) return undefined;\n if (Array.isArray(value)) {\n for (const entry of value) {\n const found = scanForUsage(entry, depth + 1);\n if (found) return found;\n }\n return undefined;\n }\n\n const record = value as Record;\n if (hasTokenFields(record)) return record;\n\n for (const entry of Object.values(record)) {\n const found = scanForUsage(entry, depth + 1);\n if (found) return found;\n }\n\n return undefined;\n}\n\nfunction hasTokenFields(record: Record): boolean {\n const keys = Object.keys(record);\n return (\n keys.includes(\"prompt_tokens\") ||\n keys.includes(\"completion_tokens\") ||\n keys.includes(\"total_tokens\") ||\n keys.includes(\"promptTokens\") ||\n keys.includes(\"completionTokens\") ||\n keys.includes(\"totalTokens\") ||\n keys.includes(\"inputTokens\") ||\n keys.includes(\"outputTokens\")\n );\n}\n\nfunction getNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\n// The SDK reports cumulative token counts per session, so we keep the peak (max) value\n// rather than summing incremental deltas.\nfunction mergeTokenUsage(existing: TokenUsage, next: TokenUsage): TokenUsage {\n return {\n promptTokens: Math.max(existing.promptTokens ?? 0, next.promptTokens ?? 0) || undefined,\n completionTokens:\n Math.max(existing.completionTokens ?? 0, next.completionTokens ?? 0) || undefined,\n totalTokens: Math.max(existing.totalTokens ?? 0, next.totalTokens ?? 0) || undefined\n };\n}\n\nfunction normalizeTokenUsage(usage: TokenUsage): TokenUsage | undefined {\n if (!usage.promptTokens && !usage.completionTokens && !usage.totalTokens) return undefined;\n if (!usage.totalTokens) {\n const prompt = usage.promptTokens ?? 0;\n const completion = usage.completionTokens ?? 0;\n const total = prompt + completion;\n return {\n ...usage,\n totalTokens: total || undefined\n };\n }\n return usage;\n}\n\nfunction aggregateTokenUsage(results: EvalResult[]): TokenUsage {\n const total: TokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n for (const result of results) {\n const metrics = result.metrics;\n if (!metrics) continue;\n const usages = [\n metrics.withoutInstructions.tokenUsage,\n metrics.withInstructions.tokenUsage,\n metrics.judge.tokenUsage\n ];\n for (const usage of usages) {\n if (!usage) continue;\n total.promptTokens = (total.promptTokens ?? 0) + (usage.promptTokens ?? 0);\n total.completionTokens = (total.completionTokens ?? 0) + (usage.completionTokens ?? 0);\n total.totalTokens = (total.totalTokens ?? 0) + (usage.totalTokens ?? 0);\n }\n }\n return total;\n}\n\nfunction formatDuration(durationMs: number): string {\n const seconds = Math.round(durationMs / 100) / 10;\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remaining = Math.round((seconds % 60) * 10) / 10;\n return `${minutes}m ${remaining}s`;\n}\n\nfunction formatTokenUsage(usage: TokenUsage): string {\n const prompt = usage.promptTokens ?? 0;\n const completion = usage.completionTokens ?? 0;\n const total = usage.totalTokens ?? prompt + completion;\n return `prompt ${prompt}, completion ${completion}, total ${total}`;\n}\n\nfunction resolveOutputPath(\n repoPath: string,\n override?: string,\n configValue?: string\n): string | undefined {\n const chosen = override ?? configValue;\n if (!chosen) return undefined;\n return path.isAbsolute(chosen) ? chosen : path.resolve(repoPath, chosen);\n}\n\nfunction buildViewerPath(outputPath: string): string {\n if (outputPath.endsWith(\".json\")) {\n return outputPath.replace(/\\.json$/u, \".html\");\n }\n return `${outputPath}.html`;\n}\n\nfunction buildTrajectoryViewerHtml(data: Record): string {\n const serialized = JSON.stringify(data).replace(/\n\n\n\n\n\nPrimer Eval Results\n\n\n\n
    \n
    \n \n
    \n

    Eval Results

    \n
    \n
    \n
    \n \n
    \n\n
    \n\n
    \n
    Impact of Instructions
    \n
    \n
    \n\n
    \n
    Results by Case
    \n
    \n
    \n\n
    \n
    Case Details
    \n
    \n
    \n\n\n\n`;\n}\n\nfunction sanitizeEventData(\n data: Record | undefined\n): Record | undefined {\n if (!data) return undefined;\n const sanitized: Record = {};\n for (const [key, value] of Object.entries(data)) {\n if (key === \"deltaContent\" && typeof value === \"string\") {\n sanitized.deltaChars = value.length;\n sanitized.deltaPreview = value.slice(0, 120);\n continue;\n }\n sanitized[key] = sanitizeValue(value, 0);\n }\n return sanitized;\n}\n\nfunction sanitizeValue(value: unknown, depth: number): unknown {\n if (depth > 4) return \"[depth-limit]\";\n if (typeof value === \"string\") {\n return value.length > 2000 ? `${value.slice(0, 2000)}\u2026` : value;\n }\n if (Array.isArray(value)) {\n return value.slice(0, 50).map((entry) => sanitizeValue(entry, depth + 1));\n }\n if (value && typeof value === \"object\") {\n const obj: Record = {};\n for (const [key, entry] of Object.entries(value as Record)) {\n obj[key] = sanitizeValue(entry, depth + 1);\n }\n return obj;\n }\n return value;\n}\n", "import { DEFAULT_MODEL } from \"../config\";\n\nimport type { Area } from \"./analyzer\";\nimport { assertCopilotCliReady } from \"./copilot\";\n\nconst EVAL_SCAFFOLD_TIMEOUT_MS = 600000;\nconst EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS = 90000;\n\nexport type EvalCase = {\n id?: string;\n prompt: string;\n expectation: string;\n area?: string;\n};\n\nexport type EvalConfig = {\n instructionFile?: string;\n cases: EvalCase[];\n systemMessage?: string;\n outputPath?: string;\n ui?: {\n modelPicker?: \"visible\" | \"hidden\";\n };\n};\n\ntype EvalScaffoldOptions = {\n repoPath: string;\n count: number;\n model?: string;\n areas?: Area[];\n onProgress?: (message: string) => void;\n};\n\nexport async function generateEvalScaffold(options: EvalScaffoldOptions): Promise {\n const repoPath = options.repoPath;\n const count = Math.max(1, options.count);\n const progress = options.onProgress ?? (() => {});\n\n progress(\"Checking Copilot CLI...\");\n const cliConfig = await assertCopilotCliReady();\n\n progress(\"Starting Copilot SDK...\");\n const sdk = await import(\"@github/copilot-sdk\");\n const client = new sdk.CopilotClient(cliConfig);\n\n try {\n progress(\"Creating session...\");\n const preferredModel = options.model ?? DEFAULT_MODEL;\n const session = await client.createSession({\n model: preferredModel,\n streaming: true,\n workingDirectory: repoPath,\n systemMessage: {\n content:\n \"You are an expert codebase analyst specializing in deep architectural analysis. Generate challenging, cross-cutting eval cases for this repository that require synthesizing information from multiple files and tracing logic across layers. Avoid trivial questions answerable from a single file read or grep. Use tools (glob, view, grep) extensively to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation}).\"\n },\n infiniteSessions: { enabled: false }\n });\n\n let content = \"\";\n session.on((event: { type: string; data?: Record }) => {\n if (event.type === \"assistant.message_delta\") {\n const delta = event.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(\"Generating eval cases...\");\n }\n } else if (event.type === \"tool.execution_start\") {\n const toolName = event.data?.toolName as string | undefined;\n progress(`Using tool: ${toolName ?? \"...\"}`);\n } else if (event.type === \"session.error\") {\n const errorMsg = (event.data?.message as string) ?? \"Unknown error\";\n if (errorMsg.toLowerCase().includes(\"auth\") || errorMsg.toLowerCase().includes(\"login\")) {\n throw new Error(\n \"Copilot CLI not logged in. Run `copilot` then `/login` to authenticate.\"\n );\n }\n }\n });\n\n const areaContext = options.areas?.length\n ? [\n \"\",\n \"AREA CONTEXT:\",\n \"This repo has the following areas:\",\n ...options.areas.map((a) => {\n const patterns = Array.isArray(a.applyTo) ? a.applyTo.join(\", \") : a.applyTo;\n return `- ${a.name} (${patterns})`;\n }),\n \"\",\n \"Generate a mix of:\",\n \"- Single-area cases that go deep into one area's internals\",\n \"- Cross-area cases that test interactions between areas\",\n 'Include an optional \"area\" field in each case to tag which area(s) it targets.'\n ].join(\"\\n\")\n : \"\";\n\n const prompt = [\n `Analyze this repository and generate ${count} eval cases.`,\n \"\",\n \"IMPORTANT: Generate HARD eval cases that require deep, cross-cutting understanding of the codebase.\",\n \"Each case should require synthesizing information from MULTIPLE files or tracing logic across several layers.\",\n \"Do NOT generate simple questions that can be answered by reading a single file or running a single grep.\",\n \"\",\n \"Good eval case examples (adapt to this repo):\",\n \"- Questions about how data flows end-to-end through multiple modules (e.g., 'Trace what happens when X is called \u2014 which services, transforms, and side effects are involved?')\",\n \"- Questions about implicit conventions or patterns that span many files (e.g., 'What error-handling pattern is used across the service layer, and where does it deviate?')\",\n \"- Questions requiring understanding of runtime behavior not obvious from static code (e.g., 'What is the order of initialization and what would break if module X loaded before Y?')\",\n \"- Questions about non-obvious interactions between components (e.g., 'How does changing config option X affect the behavior of feature Y?')\",\n \"- Questions about edge cases or failure modes that require reading implementation details across files\",\n \"- Questions that require understanding the type system, generics, or shared interfaces across module boundaries\",\n \"\",\n \"Bad eval case examples (avoid these):\",\n \"- 'What does this project do?' (answered by README alone)\",\n \"- 'How do I build/test?' (answered by package.json alone)\",\n \"- 'What is the entrypoint?' (answered by a single file)\",\n \"- Any question answerable by reading one file or searching for one keyword\",\n \"\",\n \"Use tools extensively to inspect the codebase \u2014 read multiple files, trace imports, follow call chains.\",\n \"If this is a monorepo (npm/pnpm/yarn workspaces, Cargo workspace, Go workspace, .NET solution, Gradle/Maven multi-module), generate cases that involve cross-app dependencies, shared libraries, and how changes in one app affect others.\",\n \"Ensure cases cover cross-cutting concerns: data flow, error propagation, configuration impact, implicit coupling, architectural invariants.\",\n \"Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).\",\n \"Return JSON ONLY (no markdown, no commentary) in this schema:\",\n '{\\n \"instructionFile\": \".github/copilot-instructions.md\",\\n \"systemMessage\": \"...\",\\n \"cases\": [\\n {\"id\": \"case-1\", \"prompt\": \"...\", \"expectation\": \"...\", \"area\": \"optional-area-name\"}\\n ]\\n}',\n areaContext\n ].join(\"\\n\");\n\n progress(\"Analyzing codebase...\");\n let timedOutWaitingForIdle = false;\n try {\n await session.sendAndWait({ prompt }, EVAL_SCAFFOLD_TIMEOUT_MS);\n } catch (error) {\n if (!isSessionIdleTimeoutError(error)) {\n throw error;\n }\n\n timedOutWaitingForIdle = true;\n progress(\"Generation took longer than expected; requesting final JSON output...\");\n\n try {\n await session.sendAndWait(\n {\n prompt:\n \"Stop analysis and return only the final JSON scaffold now. Do not include markdown or commentary.\"\n },\n EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS\n );\n } catch (recoveryError) {\n if (!isSessionIdleTimeoutError(recoveryError)) {\n throw recoveryError;\n }\n progress(\"Still waiting on idle; attempting to parse partial output...\");\n }\n } finally {\n await session.destroy();\n }\n\n let parsed: EvalConfig;\n try {\n parsed = parseEvalConfig(content);\n } catch (error) {\n if (timedOutWaitingForIdle) {\n throw new Error(\n \"Timed out waiting for scaffold generation to become idle before a complete JSON payload was returned. Try again or lower `--count`.\"\n );\n }\n throw error;\n }\n\n const normalized = normalizeEvalConfig(parsed, count);\n return normalized;\n } finally {\n await client.stop();\n }\n}\n\nfunction isSessionIdleTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return message.includes(\"timeout\") && message.includes(\"session.idle\");\n}\n\nfunction parseEvalConfig(raw: string): EvalConfig {\n const match = raw.match(/\\{[\\s\\S]*\\}/u);\n if (!match) {\n throw new Error(\"Failed to parse eval scaffold JSON.\");\n }\n const parsed = JSON.parse(match[0]) as EvalConfig;\n if (!parsed || !Array.isArray(parsed.cases)) {\n throw new Error(\"Eval scaffold JSON is missing cases.\");\n }\n return parsed;\n}\n\nfunction normalizeEvalConfig(parsed: EvalConfig, count: number): EvalConfig {\n const cases = (parsed.cases ?? []).slice(0, count).map((entry, index) => {\n const id = typeof entry.id === \"string\" && entry.id.trim() ? entry.id : `case-${index + 1}`;\n return {\n id,\n prompt: String(entry.prompt ?? \"\").trim(),\n expectation: String(entry.expectation ?? \"\").trim(),\n area: typeof entry.area === \"string\" && entry.area.trim() ? entry.area.trim() : undefined\n };\n });\n\n if (!cases.length) {\n throw new Error(\"Eval scaffold JSON did not include any usable cases.\");\n }\n\n const defaultSystemMessage =\n \"You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them.\";\n\n return {\n instructionFile: parsed.instructionFile ?? \".github/copilot-instructions.md\",\n systemMessage: parsed.systemMessage ?? defaultSystemMessage,\n cases\n };\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { fileExists, safeReadDir, readJson } from \"../utils/fs\";\n\nimport type { RepoApp, RepoAnalysis, Area } from \"./analyzer\";\nimport { analyzeRepo, sanitizeAreaName, loadPrimerConfig } from \"./analyzer\";\nimport type { ExtraDefinition, PolicyConfig } from \"./policy\";\nimport { loadPolicy, resolveChain } from \"./policy\";\n\nexport type ReadinessPillar =\n | \"style-validation\"\n | \"build-system\"\n | \"testing\"\n | \"documentation\"\n | \"dev-environment\"\n | \"code-quality\"\n | \"observability\"\n | \"security-governance\"\n | \"ai-tooling\";\n\nexport type ReadinessScope = \"repo\" | \"app\" | \"area\";\n\nexport type ReadinessStatus = \"pass\" | \"fail\" | \"skip\";\n\nexport type ReadinessCriterionResult = {\n id: string;\n title: string;\n pillar: ReadinessPillar;\n level: number;\n scope: ReadinessScope;\n impact: \"high\" | \"medium\" | \"low\";\n effort: \"low\" | \"medium\" | \"high\";\n status: ReadinessStatus;\n reason?: string;\n evidence?: string[];\n passRate?: number;\n appSummary?: { passed: number; total: number };\n appFailures?: string[];\n areaSummary?: { passed: number; total: number };\n areaFailures?: string[];\n};\n\nexport type ReadinessExtraResult = {\n id: string;\n title: string;\n status: ReadinessStatus;\n reason?: string;\n};\n\nexport type ReadinessPillarSummary = {\n id: ReadinessPillar;\n name: string;\n passed: number;\n total: number;\n passRate: number;\n};\n\nexport type ReadinessLevelSummary = {\n level: number;\n name: string;\n passed: number;\n total: number;\n passRate: number;\n achieved: boolean;\n};\n\nexport type AreaReadinessReport = {\n area: Area;\n criteria: ReadinessCriterionResult[];\n pillars: ReadinessPillarSummary[];\n};\n\nexport type ReadinessReport = {\n repoPath: string;\n generatedAt: string;\n isMonorepo: boolean;\n apps: Array<{ name: string; path: string }>;\n pillars: ReadinessPillarSummary[];\n levels: ReadinessLevelSummary[];\n achievedLevel: number;\n criteria: ReadinessCriterionResult[];\n extras: ReadinessExtraResult[];\n areaReports?: AreaReadinessReport[];\n policies?: { chain: string[]; criteriaCount: number };\n};\n\ntype ReadinessOptions = {\n repoPath: string;\n includeExtras?: boolean;\n perArea?: boolean;\n policies?: string[];\n};\n\nexport type ReadinessContext = {\n repoPath: string;\n analysis: RepoAnalysis;\n apps: RepoApp[];\n rootFiles: string[];\n rootPackageJson?: Record;\n areaPath?: string;\n areaFiles?: string[];\n};\n\nexport type ReadinessCriterion = {\n id: string;\n title: string;\n pillar: ReadinessPillar;\n level: number;\n scope: ReadinessScope;\n impact: \"high\" | \"medium\" | \"low\";\n effort: \"low\" | \"medium\" | \"high\";\n check: (context: ReadinessContext, app?: RepoApp, area?: Area) => Promise;\n};\n\nexport type CheckResult = {\n status: ReadinessStatus;\n reason?: string;\n evidence?: string[];\n};\n\nexport async function runReadinessReport(options: ReadinessOptions): Promise {\n const repoPath = options.repoPath;\n const analysis = await analyzeRepo(repoPath);\n const rootFiles = await safeReadDir(repoPath);\n const rootPackageJson = await readJson(path.join(repoPath, \"package.json\"));\n const apps = analysis.apps?.length ? analysis.apps : [];\n\n const context: ReadinessContext = {\n repoPath,\n analysis,\n apps,\n rootFiles,\n rootPackageJson\n };\n\n // \u2500\u2500 Policy resolution \u2500\u2500\n let policySources = options.policies;\n if (!policySources?.length) {\n // Check primer.config.json for policy config\n const primerConfig = await loadPrimerConfig(repoPath);\n if (primerConfig?.policies?.length) {\n policySources = primerConfig.policies;\n }\n }\n\n const baseCriteria = buildCriteria();\n const baseExtras = buildExtras();\n let resolvedCriteria: ReadinessCriterion[];\n let resolvedExtras: ExtraDefinition[];\n let passRateThreshold = 0.8;\n let policyInfo: { chain: string[]; criteriaCount: number } | undefined;\n\n if (policySources?.length) {\n const policyConfigs: PolicyConfig[] = [];\n // Config-sourced policies are restricted to JSON-only (no import())\n const isConfigSourced = policySources !== options.policies;\n for (const source of policySources) {\n policyConfigs.push(await loadPolicy(source, { jsonOnly: isConfigSourced }));\n }\n const resolved = resolveChain(baseCriteria, baseExtras, policyConfigs);\n resolvedCriteria = resolved.criteria;\n resolvedExtras = resolved.extras;\n passRateThreshold = resolved.thresholds.passRate;\n policyInfo = { chain: resolved.chain, criteriaCount: resolved.criteria.length };\n } else {\n resolvedCriteria = baseCriteria;\n resolvedExtras = baseExtras;\n }\n\n const criteriaResults: ReadinessCriterionResult[] = [];\n\n for (const criterion of resolvedCriteria) {\n if (criterion.scope === \"repo\") {\n const result = await criterion.check(context);\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: result.status,\n reason: result.reason,\n evidence: result.evidence\n });\n continue;\n }\n\n if (criterion.scope === \"area\") {\n if (!options.perArea) continue; // Exclude area criteria unless --per-area\n // Area criteria get a placeholder \u2014 populated by per-area loop below\n const areas = analysis.areas ?? [];\n if (areas.length === 0) continue; // No areas, nothing to aggregate\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: \"skip\",\n reason: \"Run with --per-area for area breakdown.\"\n });\n continue;\n }\n\n const appResults = await Promise.all(\n apps.map(async (app) => ({\n app,\n result: await criterion.check(context, app)\n }))\n );\n\n if (!appResults.length) {\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: \"skip\",\n reason: \"No application packages detected.\"\n });\n continue;\n }\n\n const passed = appResults.filter((entry) => entry.result.status === \"pass\").length;\n const total = appResults.length;\n const passRate = total ? passed / total : 0;\n const status: ReadinessStatus = passRate >= passRateThreshold ? \"pass\" : \"fail\";\n const failures = appResults\n .filter((entry) => entry.result.status !== \"pass\")\n .map((entry) => entry.app.name);\n\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status,\n reason: status === \"pass\" ? undefined : `Only ${passed}/${total} apps pass this check.`,\n passRate,\n appSummary: { passed, total },\n appFailures: failures\n });\n }\n\n // Per-area breakdown\n let areaReports: AreaReadinessReport[] | undefined;\n const areas = analysis.areas ?? [];\n\n if (options.perArea && areas.length > 0) {\n const areaCriteria = resolvedCriteria.filter((c) => c.scope === \"area\");\n areaReports = [];\n\n for (const area of areas) {\n if (!area.path) continue;\n const areaFiles = await safeReadDir(area.path);\n const areaContext: ReadinessContext = {\n ...context,\n areaPath: area.path,\n areaFiles\n };\n\n const areaResults: ReadinessCriterionResult[] = [];\n for (const criterion of areaCriteria) {\n const result = await criterion.check(areaContext, undefined, area);\n areaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: result.status,\n reason: result.reason,\n evidence: result.evidence\n });\n }\n\n const areaPillars = summarizePillars(areaResults);\n areaReports.push({ area, criteria: areaResults, pillars: areaPillars });\n }\n\n // Update aggregate area criteria in main results\n for (const criterion of criteriaResults) {\n if (criterion.scope !== \"area\") continue;\n const perAreaResults = areaReports\n .map((ar) => ar.criteria.find((c) => c.id === criterion.id))\n .filter(Boolean) as ReadinessCriterionResult[];\n if (!perAreaResults.length) continue;\n\n const passed = perAreaResults.filter((r) => r.status === \"pass\").length;\n const total = perAreaResults.length;\n const passRate = total ? passed / total : 0;\n criterion.status = passRate >= passRateThreshold ? \"pass\" : \"fail\";\n criterion.reason =\n criterion.status === \"pass\" ? undefined : `Only ${passed}/${total} areas pass this check.`;\n criterion.passRate = passRate;\n criterion.areaSummary = { passed, total };\n criterion.areaFailures = areaReports\n .filter((ar) => ar.criteria.find((c) => c.id === criterion.id)?.status !== \"pass\")\n .map((ar) => ar.area.name);\n }\n }\n\n // Compute summaries after area aggregation so they reflect final statuses\n const pillars = summarizePillars(criteriaResults);\n const levels = summarizeLevels(criteriaResults, passRateThreshold);\n const achievedLevel = levels\n .filter((level) => level.achieved)\n .reduce((acc, level) => Math.max(acc, level.level), 0);\n\n const extras = options.includeExtras === false ? [] : await runExtras(context, resolvedExtras);\n\n return {\n repoPath,\n generatedAt: new Date().toISOString(),\n isMonorepo: analysis.isMonorepo ?? false,\n apps: apps.map((app) => ({ name: app.name, path: app.path })),\n pillars,\n levels,\n achievedLevel,\n criteria: criteriaResults,\n extras,\n areaReports,\n policies: policyInfo\n };\n}\n\nexport function buildCriteria(): ReadinessCriterion[] {\n return [\n {\n id: \"lint-config\",\n title: \"Linting configured\",\n pillar: \"style-validation\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasLintConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing ESLint/Biome/Prettier configuration.\",\n evidence: [\"eslint.config.js\", \".eslintrc\", \"biome.json\", \".prettierrc\"]\n };\n }\n },\n {\n id: \"typecheck-config\",\n title: \"Type checking configured\",\n pillar: \"style-validation\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasTypecheckConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing type checking config (tsconfig or equivalent).\",\n evidence: [\"tsconfig.json\", \"pyproject.toml\", \"mypy.ini\"]\n };\n }\n },\n {\n id: \"build-script\",\n title: \"Build script present\",\n pillar: \"build-system\",\n level: 1,\n scope: \"app\",\n impact: \"high\",\n effort: \"low\",\n check: async (_context, app) => {\n const found = Boolean(app?.scripts?.build);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing build script in package.json.\"\n };\n }\n },\n {\n id: \"ci-config\",\n title: \"CI workflow configured\",\n pillar: \"build-system\",\n level: 2,\n scope: \"repo\",\n impact: \"high\",\n effort: \"medium\",\n check: async (context) => {\n const found = await hasGithubWorkflows(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing .github/workflows CI configuration.\",\n evidence: [\".github/workflows\"]\n };\n }\n },\n {\n id: \"test-script\",\n title: \"Test script present\",\n pillar: \"testing\",\n level: 1,\n scope: \"app\",\n impact: \"high\",\n effort: \"low\",\n check: async (_context, app) => {\n const found = Boolean(app?.scripts?.test);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing test script in package.json.\"\n };\n }\n },\n {\n id: \"readme\",\n title: \"README present\",\n pillar: \"documentation\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasReadme(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing README documentation.\",\n evidence: [\"README.md\"]\n };\n }\n },\n {\n id: \"contributing\",\n title: \"CONTRIBUTING guide present\",\n pillar: \"documentation\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \"CONTRIBUTING.md\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing CONTRIBUTING.md for contributor workflows.\"\n };\n }\n },\n {\n id: \"lockfile\",\n title: \"Lockfile present\",\n pillar: \"dev-environment\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = hasAnyFile(context.rootFiles, [\n \"pnpm-lock.yaml\",\n \"yarn.lock\",\n \"package-lock.json\",\n \"bun.lockb\"\n ]);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing package manager lockfile.\"\n };\n }\n },\n {\n id: \"env-example\",\n title: \"Environment example present\",\n pillar: \"dev-environment\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = hasAnyFile(context.rootFiles, [\".env.example\", \".env.sample\"]);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing .env.example or .env.sample for setup guidance.\"\n };\n }\n },\n {\n id: \"format-config\",\n title: \"Formatter configured\",\n pillar: \"code-quality\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasFormatterConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing Prettier/Biome formatting config.\"\n };\n }\n },\n {\n id: \"codeowners\",\n title: \"CODEOWNERS present\",\n pillar: \"security-governance\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasCodeowners(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing CODEOWNERS file.\"\n };\n }\n },\n {\n id: \"license\",\n title: \"LICENSE present\",\n pillar: \"security-governance\",\n level: 1,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasLicense(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing LICENSE file.\"\n };\n }\n },\n {\n id: \"security-policy\",\n title: \"Security policy present\",\n pillar: \"security-governance\",\n level: 3,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \"SECURITY.md\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing SECURITY.md policy.\"\n };\n }\n },\n {\n id: \"dependabot\",\n title: \"Dependabot configured\",\n pillar: \"security-governance\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \".github\", \"dependabot.yml\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing .github/dependabot.yml configuration.\"\n };\n }\n },\n {\n id: \"observability\",\n title: \"Observability tooling present\",\n pillar: \"observability\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const deps = await readAllDependencies(context);\n const has = deps.some((dep) =>\n [\"@opentelemetry/api\", \"@opentelemetry/sdk\", \"pino\", \"winston\", \"bunyan\"].includes(dep)\n );\n return {\n status: has ? \"pass\" : \"fail\",\n reason: \"No observability dependencies detected (OpenTelemetry/logging).\"\n };\n }\n },\n {\n id: \"custom-instructions\",\n title: \"Custom AI instructions or agent guidance\",\n pillar: \"ai-tooling\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const rootFound = await hasCustomInstructions(context.repoPath);\n if (rootFound.length === 0) {\n return {\n status: \"fail\",\n reason:\n \"Missing custom AI instructions (e.g. copilot-instructions.md, CLAUDE.md, AGENTS.md, .cursorrules).\",\n evidence: [\n \"copilot-instructions.md\",\n \"CLAUDE.md\",\n \"AGENTS.md\",\n \".cursorrules\",\n \".github/copilot-instructions.md\"\n ]\n };\n }\n\n // Check for file-based instructions (.github/instructions/*.instructions.md)\n const fileBasedInstructions = await hasFileBasedInstructions(context.repoPath);\n const areas = context.analysis.areas ?? [];\n\n // For monorepos or repos with detected areas, check coverage\n if (areas.length > 0) {\n if (fileBasedInstructions.length === 0) {\n return {\n status: \"pass\",\n reason: `Root instructions found, but no file-based instructions for ${areas.length} detected areas. Run \\`primer instructions --areas\\` to generate.`,\n evidence: [...rootFound, ...areas.map((a) => `${a.name}: missing .instructions.md`)]\n };\n }\n return {\n status: \"pass\",\n reason: `Root + ${fileBasedInstructions.length} file-based instruction(s) found.`,\n evidence: [...rootFound, ...fileBasedInstructions]\n };\n }\n\n // For monorepos without areas, check per-app instructions (legacy behavior)\n if (context.analysis.isMonorepo && context.apps.length > 1) {\n const appsMissing: string[] = [];\n for (const app of context.apps) {\n const appFound = await hasCustomInstructions(app.path);\n if (appFound.length === 0) {\n appsMissing.push(app.name);\n }\n }\n if (appsMissing.length > 0) {\n return {\n status: \"pass\",\n reason: `Root instructions found, but ${appsMissing.length}/${context.apps.length} apps missing their own: ${appsMissing.join(\", \")}`,\n evidence: [\n ...rootFound,\n ...appsMissing.map((name) => `${name}: missing app-level instructions`)\n ]\n };\n }\n }\n\n return {\n status: \"pass\",\n evidence: rootFound\n };\n }\n },\n {\n id: \"mcp-config\",\n title: \"MCP configuration present\",\n pillar: \"ai-tooling\",\n level: 2,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasMcpConfig(context.repoPath);\n return {\n status: found.length > 0 ? \"pass\" : \"fail\",\n reason: \"Missing MCP (Model Context Protocol) configuration (e.g. .vscode/mcp.json).\",\n evidence:\n found.length > 0\n ? found\n : [\".vscode/mcp.json\", \".vscode/settings.json (mcp section)\", \"mcp.json\"]\n };\n }\n },\n {\n id: \"custom-agents\",\n title: \"Custom AI agents configured\",\n pillar: \"ai-tooling\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const found = await hasCustomAgents(context.repoPath);\n return {\n status: found.length > 0 ? \"pass\" : \"fail\",\n reason: \"No custom AI agents configured (e.g. .github/agents/, .copilot/agents/).\",\n evidence:\n found.length > 0\n ? found\n : [\".github/agents/\", \".copilot/agents/\", \".github/copilot/agents/\"]\n };\n }\n },\n {\n id: \"copilot-skills\",\n title: \"Copilot/Claude skills present\",\n pillar: \"ai-tooling\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const found = await hasCopilotSkills(context.repoPath);\n return {\n status: found.length > 0 ? \"pass\" : \"fail\",\n reason: \"No Copilot or Claude skills found (e.g. .copilot/skills/, .github/skills/).\",\n evidence:\n found.length > 0 ? found : [\".copilot/skills/\", \".github/skills/\", \".claude/skills/\"]\n };\n }\n },\n // \u2500\u2500 Area-scoped criteria (only run when areaPath is set) \u2500\u2500\n {\n id: \"area-readme\",\n title: \"Area README present\",\n pillar: \"documentation\",\n level: 1,\n scope: \"area\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n if (!context.areaPath || !context.areaFiles) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n const found = context.areaFiles.some(\n (f) => f.toLowerCase() === \"readme.md\" || f.toLowerCase() === \"readme\"\n );\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing README in area directory.\"\n };\n }\n },\n {\n id: \"area-build-script\",\n title: \"Area build script present\",\n pillar: \"build-system\",\n level: 1,\n scope: \"area\",\n impact: \"high\",\n effort: \"low\",\n check: async (context, _app, area) => {\n if (!context.areaPath || !context.areaFiles) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n // Check area.scripts from enriched Area type\n if (area?.scripts?.build) {\n return { status: \"pass\" };\n }\n // Fallback: check for package.json with build script in area\n const pkgPath = path.join(context.areaPath, \"package.json\");\n const pkg = await readJson(pkgPath);\n const scripts = (pkg?.scripts ?? {}) as Record;\n const found = Boolean(scripts.build);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing build script in area.\"\n };\n }\n },\n {\n id: \"area-test-script\",\n title: \"Area test script present\",\n pillar: \"testing\",\n level: 1,\n scope: \"area\",\n impact: \"high\",\n effort: \"low\",\n check: async (context, _app, area) => {\n if (!context.areaPath || !context.areaFiles) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n if (area?.scripts?.test) {\n return { status: \"pass\" };\n }\n const pkgPath = path.join(context.areaPath, \"package.json\");\n const pkg = await readJson(pkgPath);\n const scripts = (pkg?.scripts ?? {}) as Record;\n const found = Boolean(scripts.test);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing test script in area.\"\n };\n }\n },\n {\n id: \"area-instructions\",\n title: \"Area-specific instructions present\",\n pillar: \"ai-tooling\",\n level: 2,\n scope: \"area\",\n impact: \"high\",\n effort: \"low\",\n check: async (context, _app, area) => {\n if (!area) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n const sanitized = sanitizeAreaName(area.name);\n const instructionPath = path.join(\n context.repoPath,\n \".github\",\n \"instructions\",\n `${sanitized}.instructions.md`\n );\n const found = await fileExists(instructionPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : `Missing .github/instructions/${sanitized}.instructions.md`\n };\n }\n }\n ];\n}\n\nexport function buildExtras(): ExtraDefinition[] {\n return [\n {\n id: \"agents-doc\",\n title: \"AGENTS.md present\",\n check: async (context) => ({\n status: (await fileExists(path.join(context.repoPath, \"AGENTS.md\"))) ? \"pass\" : \"fail\",\n reason: \"Missing AGENTS.md to guide coding agents.\"\n })\n },\n {\n id: \"pr-template\",\n title: \"Pull request template present\",\n check: async (context) => ({\n status: (await hasPullRequestTemplate(context.repoPath)) ? \"pass\" : \"fail\",\n reason: \"Missing PR template for consistent reviews.\"\n })\n },\n {\n id: \"pre-commit\",\n title: \"Pre-commit hooks configured\",\n check: async (context) => ({\n status: (await hasPrecommitConfig(context.repoPath)) ? \"pass\" : \"fail\",\n reason: \"Missing pre-commit or Husky configuration for fast feedback.\"\n })\n },\n {\n id: \"architecture-doc\",\n title: \"Architecture guide present\",\n check: async (context) => ({\n status: (await hasArchitectureDoc(context.repoPath)) ? \"pass\" : \"fail\",\n reason: \"Missing architecture documentation.\"\n })\n }\n ];\n}\n\nasync function runExtras(\n context: ReadinessContext,\n extraDefs: ExtraDefinition[]\n): Promise {\n const results: ReadinessExtraResult[] = [];\n for (const def of extraDefs) {\n const result = await def.check(context);\n results.push({\n id: def.id,\n title: def.title,\n status: result.status,\n reason: result.reason\n });\n }\n return results;\n}\n\nfunction summarizePillars(criteria: ReadinessCriterionResult[]): ReadinessPillarSummary[] {\n const pillarNames: Record = {\n \"style-validation\": \"Style & Validation\",\n \"build-system\": \"Build System\",\n testing: \"Testing\",\n documentation: \"Documentation\",\n \"dev-environment\": \"Dev Environment\",\n \"code-quality\": \"Code Quality\",\n observability: \"Observability\",\n \"security-governance\": \"Security & Governance\",\n \"ai-tooling\": \"AI Tooling\"\n };\n\n return (Object.keys(pillarNames) as ReadinessPillar[]).map((pillar) => {\n const items = criteria.filter((criterion) => criterion.pillar === pillar);\n const { passed, total } = countStatus(items);\n return {\n id: pillar,\n name: pillarNames[pillar],\n passed,\n total,\n passRate: total ? passed / total : 0\n };\n });\n}\n\nfunction summarizeLevels(\n criteria: ReadinessCriterionResult[],\n passRateThreshold = 0.8\n): ReadinessLevelSummary[] {\n const levelNames: Record = {\n 1: \"Functional\",\n 2: \"Documented\",\n 3: \"Standardized\",\n 4: \"Optimized\",\n 5: \"Autonomous\"\n };\n\n const summaries: ReadinessLevelSummary[] = [];\n for (let level = 1; level <= 5; level += 1) {\n const items = criteria.filter((criterion) => criterion.level === level);\n const { passed, total } = countStatus(items);\n const passRate = total ? passed / total : 0;\n summaries.push({\n level,\n name: levelNames[level],\n passed,\n total,\n passRate,\n achieved: false\n });\n }\n\n for (const summary of summaries) {\n const allPrior = summaries.filter((candidate) => candidate.level <= summary.level);\n const achieved = allPrior.every(\n (candidate) => candidate.total > 0 && candidate.passRate >= passRateThreshold\n );\n summary.achieved = achieved;\n }\n\n return summaries;\n}\n\nfunction countStatus(items: ReadinessCriterionResult[]): { passed: number; total: number } {\n const relevant = items.filter((item) => item.status !== \"skip\");\n const passed = relevant.filter((item) => item.status === \"pass\").length;\n return { passed, total: relevant.length };\n}\n\nfunction hasAnyFile(files: string[], candidates: string[]): boolean {\n return candidates.some((candidate) => files.includes(candidate));\n}\n\nasync function hasReadme(repoPath: string): Promise {\n const files = await safeReadDir(repoPath);\n return files.some(\n (file) => file.toLowerCase() === \"readme.md\" || file.toLowerCase() === \"readme\"\n );\n}\n\nasync function hasLintConfig(repoPath: string): Promise {\n return hasAnyFile(await safeReadDir(repoPath), [\n \"eslint.config.js\",\n \"eslint.config.mjs\",\n \".eslintrc\",\n \".eslintrc.js\",\n \".eslintrc.cjs\",\n \".eslintrc.json\",\n \".eslintrc.yml\",\n \".eslintrc.yaml\",\n \"biome.json\",\n \"biome.jsonc\",\n \".prettierrc\",\n \".prettierrc.json\",\n \".prettierrc.js\",\n \".prettierrc.cjs\",\n \"prettier.config.js\",\n \"prettier.config.cjs\"\n ]);\n}\n\nasync function hasFormatterConfig(repoPath: string): Promise {\n return hasAnyFile(await safeReadDir(repoPath), [\n \"biome.json\",\n \"biome.jsonc\",\n \".prettierrc\",\n \".prettierrc.json\",\n \".prettierrc.js\",\n \".prettierrc.cjs\",\n \"prettier.config.js\",\n \"prettier.config.cjs\"\n ]);\n}\n\nasync function hasTypecheckConfig(repoPath: string): Promise {\n return hasAnyFile(await safeReadDir(repoPath), [\n \"tsconfig.json\",\n \"tsconfig.base.json\",\n \"pyproject.toml\",\n \"mypy.ini\"\n ]);\n}\n\nasync function hasGithubWorkflows(repoPath: string): Promise {\n return fileExists(path.join(repoPath, \".github\", \"workflows\"));\n}\n\nasync function hasCodeowners(repoPath: string): Promise {\n const root = await fileExists(path.join(repoPath, \"CODEOWNERS\"));\n const github = await fileExists(path.join(repoPath, \".github\", \"CODEOWNERS\"));\n return root || github;\n}\n\nasync function hasLicense(repoPath: string): Promise {\n const files = await safeReadDir(repoPath);\n return files.some((file) => file.toLowerCase().startsWith(\"license\"));\n}\n\nasync function hasPullRequestTemplate(repoPath: string): Promise {\n const direct = await fileExists(path.join(repoPath, \".github\", \"PULL_REQUEST_TEMPLATE.md\"));\n if (direct) return true;\n const dir = path.join(repoPath, \".github\", \"PULL_REQUEST_TEMPLATE\");\n try {\n const entries = await fs.readdir(dir);\n return entries.some((entry) => entry.toLowerCase().endsWith(\".md\"));\n } catch {\n return false;\n }\n}\n\nasync function hasPrecommitConfig(repoPath: string): Promise {\n const precommit = await fileExists(path.join(repoPath, \".pre-commit-config.yaml\"));\n if (precommit) return true;\n return fileExists(path.join(repoPath, \".husky\"));\n}\n\nasync function hasArchitectureDoc(repoPath: string): Promise {\n const files = await safeReadDir(repoPath);\n if (files.some((file) => file.toLowerCase() === \"architecture.md\")) return true;\n return fileExists(path.join(repoPath, \"docs\", \"architecture.md\"));\n}\n\nasync function hasCustomInstructions(repoPath: string): Promise {\n const found: string[] = [];\n const candidates = [\n \".github/copilot-instructions.md\",\n \"CLAUDE.md\",\n \".claude/CLAUDE.md\",\n \"AGENTS.md\",\n \".github/AGENTS.md\",\n \".cursorrules\",\n \".cursorignore\",\n \".windsurfrules\",\n \".github/instructions.md\",\n \"copilot-instructions.md\"\n ];\n for (const candidate of candidates) {\n if (await fileExists(path.join(repoPath, candidate))) {\n found.push(candidate);\n }\n }\n return found;\n}\n\nasync function hasFileBasedInstructions(repoPath: string): Promise {\n const instructionsDir = path.join(repoPath, \".github\", \"instructions\");\n try {\n const entries = await fs.readdir(instructionsDir);\n return entries\n .filter((e) => e.endsWith(\".instructions.md\"))\n .map((e) => `.github/instructions/${e}`);\n } catch {\n return [];\n }\n}\n\nasync function hasMcpConfig(repoPath: string): Promise {\n const found: string[] = [];\n // Check .vscode/mcp.json\n if (await fileExists(path.join(repoPath, \".vscode\", \"mcp.json\"))) {\n found.push(\".vscode/mcp.json\");\n }\n // Check root mcp.json\n if (await fileExists(path.join(repoPath, \"mcp.json\"))) {\n found.push(\"mcp.json\");\n }\n // Check .vscode/settings.json for MCP section\n const settings = await readJson(path.join(repoPath, \".vscode\", \"settings.json\"));\n if (settings && (settings[\"mcp\"] || settings[\"github.copilot.chat.mcp.enabled\"])) {\n found.push(\".vscode/settings.json (mcp section)\");\n }\n // Check .claude/mcp.json\n if (await fileExists(path.join(repoPath, \".claude\", \"mcp.json\"))) {\n found.push(\".claude/mcp.json\");\n }\n return found;\n}\n\nasync function hasCustomAgents(repoPath: string): Promise {\n const found: string[] = [];\n const agentDirs = [\".github/agents\", \".copilot/agents\", \".github/copilot/agents\"];\n for (const dir of agentDirs) {\n if (await fileExists(path.join(repoPath, dir))) {\n found.push(dir);\n }\n }\n // Check for agent config files\n const agentFiles = [\".github/copilot-agents.yml\", \".github/copilot-agents.yaml\"];\n for (const agentFile of agentFiles) {\n if (await fileExists(path.join(repoPath, agentFile))) {\n found.push(agentFile);\n }\n }\n return found;\n}\n\nasync function hasCopilotSkills(repoPath: string): Promise {\n const found: string[] = [];\n const skillDirs = [\n \".copilot/skills\",\n \".github/skills\",\n \".claude/skills\",\n \".github/copilot/skills\"\n ];\n for (const dir of skillDirs) {\n if (await fileExists(path.join(repoPath, dir))) {\n found.push(dir);\n }\n }\n return found;\n}\n\nasync function readAllDependencies(context: ReadinessContext): Promise {\n const dependencies: string[] = [];\n const apps = context.apps.length ? context.apps : [];\n for (const app of apps) {\n if (!app.packageJsonPath) continue;\n const pkg = await readJson(app.packageJsonPath);\n const deps = (pkg?.dependencies ?? {}) as Record;\n const devDeps = (pkg?.devDependencies ?? {}) as Record;\n dependencies.push(\n ...Object.keys({\n ...deps,\n ...devDeps\n })\n );\n }\n\n if (!apps.length && context.rootPackageJson) {\n const rootDeps = (context.rootPackageJson.dependencies ?? {}) as Record;\n const rootDevDeps = (context.rootPackageJson.devDependencies ?? {}) as Record;\n dependencies.push(\n ...Object.keys({\n ...rootDeps,\n ...rootDevDeps\n })\n );\n }\n\n return Array.from(new Set(dependencies));\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { readJson } from \"../utils/fs\";\n\nimport type { ReadinessCriterion, ReadinessContext } from \"./readiness\";\n\n// \u2500\u2500\u2500 Policy configuration types \u2500\u2500\u2500\n\ntype CriterionMetadata = Pick<\n ReadinessCriterion,\n \"title\" | \"pillar\" | \"level\" | \"scope\" | \"impact\" | \"effort\"\n>;\n\nexport type ExtraDefinition = {\n id: string;\n title: string;\n check: (context: ReadinessContext) => Promise<{ status: \"pass\" | \"fail\"; reason?: string }>;\n};\n\nexport type PolicyConfig = {\n name: string;\n version?: string;\n criteria?: {\n disable?: string[];\n add?: ReadinessCriterion[];\n override?: Record>;\n };\n extras?: {\n disable?: string[];\n add?: ExtraDefinition[];\n };\n thresholds?: {\n passRate?: number;\n };\n};\n\nexport type ResolvedPolicy = {\n chain: string[];\n criteria: ReadinessCriterion[];\n extras: ExtraDefinition[];\n thresholds: { passRate: number };\n};\n\n// \u2500\u2500\u2500 Default thresholds \u2500\u2500\u2500\n\nconst DEFAULT_PASS_RATE = 0.8;\n\n// \u2500\u2500\u2500 Validation \u2500\u2500\u2500\n\nfunction validatePolicyConfig(\n obj: unknown,\n source: string,\n format: \"json\" | \"module\" = \"module\"\n): PolicyConfig {\n if (typeof obj !== \"object\" || obj === null) {\n throw new Error(`Policy \"${source}\" is invalid: expected an object, got ${typeof obj}`);\n }\n const record = obj as Record;\n if (typeof record.name !== \"string\" || !record.name.trim()) {\n throw new Error(`Policy \"${source}\" is invalid: missing required field \"name\" at root`);\n }\n if (record.criteria !== undefined) {\n if (typeof record.criteria !== \"object\") {\n throw new Error(`Policy \"${source}\" is invalid: \"criteria\" must be an object`);\n }\n const criteria = record.criteria as Record;\n if (criteria.disable !== undefined && !isStringArray(criteria.disable)) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"criteria.disable\" must be an array of strings`\n );\n }\n if (criteria.override !== undefined) {\n if (\n typeof criteria.override !== \"object\" ||\n criteria.override === null ||\n Array.isArray(criteria.override)\n ) {\n throw new Error(`Policy \"${source}\" is invalid: \"criteria.override\" must be an object`);\n }\n const ALLOWED_OVERRIDE_KEYS = new Set([\n \"title\",\n \"pillar\",\n \"level\",\n \"scope\",\n \"impact\",\n \"effort\"\n ]);\n for (const [id, value] of Object.entries(\n criteria.override as Record>\n )) {\n if (typeof value !== \"object\" || value === null) continue;\n for (const key of Object.keys(value)) {\n if (!ALLOWED_OVERRIDE_KEYS.has(key)) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"criteria.override.${id}\" contains disallowed key \"${key}\". Allowed keys: ${[...ALLOWED_OVERRIDE_KEYS].join(\", \")}`\n );\n }\n }\n }\n }\n if (format === \"json\" && criteria.add !== undefined) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"criteria.add\" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.`\n );\n }\n }\n if (record.extras !== undefined) {\n if (typeof record.extras !== \"object\" || record.extras === null) {\n throw new Error(`Policy \"${source}\" is invalid: \"extras\" must be an object`);\n }\n const extras = record.extras as Record;\n if (extras.disable !== undefined && !isStringArray(extras.disable)) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"extras.disable\" must be an array of strings`\n );\n }\n if (format === \"json\" && extras.add !== undefined) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"extras.add\" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.`\n );\n }\n }\n if (record.thresholds !== undefined) {\n if (typeof record.thresholds !== \"object\" || record.thresholds === null) {\n throw new Error(`Policy \"${source}\" is invalid: \"thresholds\" must be an object`);\n }\n const thresholds = record.thresholds as Record;\n if (thresholds.passRate !== undefined && typeof thresholds.passRate !== \"number\") {\n throw new Error(`Policy \"${source}\" is invalid: \"thresholds.passRate\" must be a number`);\n }\n if (\n typeof thresholds.passRate === \"number\" &&\n (thresholds.passRate < 0 || thresholds.passRate > 1)\n ) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"thresholds.passRate\" must be between 0 and 1`\n );\n }\n }\n return record as unknown as PolicyConfig;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\n\nexport function parsePolicySources(raw: string | undefined): string[] | undefined {\n if (!raw) return undefined;\n const sources = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return sources.length ? sources : undefined;\n}\n\n// \u2500\u2500\u2500 Loading \u2500\u2500\u2500\n\nexport async function loadPolicy(\n source: string,\n options?: { jsonOnly?: boolean }\n): Promise {\n const jsonOnly = options?.jsonOnly ?? false;\n\n // Local file path (relative or absolute)\n if (source.startsWith(\".\") || path.isAbsolute(source)) {\n const resolved = path.resolve(source);\n if (resolved.endsWith(\".json\")) {\n const data = await readJson(resolved);\n if (!data) {\n throw new Error(`Policy \"${source}\" not found at: ${resolved}`);\n }\n return validatePolicyConfig(data, source, \"json\");\n }\n // TS/JS module \u2014 blocked when jsonOnly\n if (/\\.[mc]?[jt]s$/u.test(resolved)) {\n if (jsonOnly) {\n throw new Error(\n `Policy \"${source}\" rejected: only JSON policies are allowed from primer.config.json. Module policies (.ts/.js) must be passed via --policy.`\n );\n }\n try {\n const mod = (await import(resolved)) as Record;\n const config = (mod.default ?? mod) as unknown;\n return validatePolicyConfig(config, source);\n } catch (err) {\n if (\n err instanceof Error &&\n (err.message.includes(\"Cannot find module\") || err.message.includes(\"MODULE_NOT_FOUND\"))\n ) {\n throw new Error(`Policy \"${source}\" not found at: ${resolved}`);\n }\n throw err;\n }\n }\n // Unsupported extension \u2014 try as JSON\n try {\n const raw = await fs.readFile(resolved, \"utf8\");\n const data = JSON.parse(raw) as unknown;\n return validatePolicyConfig(data, source, \"json\");\n } catch {\n throw new Error(\n `Policy \"${source}\" could not be loaded from: ${resolved}. Supported formats: .json, .js, .ts, .mjs`\n );\n }\n }\n\n // npm package (bare specifier or scoped) \u2014 blocked when jsonOnly\n if (jsonOnly) {\n throw new Error(\n `Policy \"${source}\" rejected: only JSON file policies are allowed from primer.config.json. npm policies must be passed via --policy.`\n );\n }\n try {\n const mod = (await import(source)) as Record;\n const config = (mod.default ?? mod) as unknown;\n return validatePolicyConfig(config, source);\n } catch (err) {\n if (\n err instanceof Error &&\n (err.message.includes(\"Cannot find module\") ||\n err.message.includes(\"Cannot find package\") ||\n err.message.includes(\"MODULE_NOT_FOUND\") ||\n err.message.includes(\"ERR_MODULE_NOT_FOUND\"))\n ) {\n throw new Error(`Policy \"${source}\" not found. Install it with: npm install ${source}`);\n }\n throw err;\n }\n}\n\n// \u2500\u2500\u2500 Chain resolution \u2500\u2500\u2500\n\nexport function resolveChain(\n baseCriteria: ReadinessCriterion[],\n baseExtras: ExtraDefinition[],\n policies: PolicyConfig[]\n): ResolvedPolicy {\n const chain: string[] = [];\n let criteria = [...baseCriteria];\n let extras = [...baseExtras];\n let passRate = DEFAULT_PASS_RATE;\n\n for (const policy of policies) {\n chain.push(policy.name);\n\n if (policy.criteria) {\n // Disable criteria by id\n if (policy.criteria.disable?.length) {\n const disableSet = new Set(policy.criteria.disable);\n criteria = criteria.filter((c) => !disableSet.has(c.id));\n }\n\n // Override metadata by id\n if (policy.criteria.override) {\n for (const [id, overrides] of Object.entries(policy.criteria.override)) {\n const idx = criteria.findIndex((c) => c.id === id);\n if (idx >= 0) {\n criteria[idx] = { ...criteria[idx], ...overrides };\n }\n }\n }\n\n // Add new criteria\n if (policy.criteria.add?.length) {\n for (const newCriterion of policy.criteria.add) {\n // Replace if same id exists, otherwise append\n const existingIdx = criteria.findIndex((c) => c.id === newCriterion.id);\n if (existingIdx >= 0) {\n criteria[existingIdx] = newCriterion;\n } else {\n criteria.push(newCriterion);\n }\n }\n }\n }\n\n if (policy.extras) {\n if (policy.extras.disable?.length) {\n const disableSet = new Set(policy.extras.disable);\n extras = extras.filter((e) => !disableSet.has(e.id));\n }\n if (policy.extras.add?.length) {\n for (const newExtra of policy.extras.add) {\n const existingIdx = extras.findIndex((e) => e.id === newExtra.id);\n if (existingIdx >= 0) {\n extras[existingIdx] = newExtra;\n } else {\n extras.push(newExtra);\n }\n }\n }\n }\n\n if (policy.thresholds?.passRate !== undefined) {\n passRate = policy.thresholds.passRate;\n }\n }\n\n return { chain, criteria, extras, thresholds: { passRate } };\n}\n", "import type { ReadinessReport, AreaReadinessReport } from \"./readiness\";\n\ntype VisualReportOptions = {\n reports: Array<{ repo: string; report: ReadinessReport; error?: string }>;\n title?: string;\n generatedAt?: string;\n};\n\nexport function generateVisualReport(options: VisualReportOptions): string {\n const {\n reports,\n title = \"AI Readiness Report\",\n generatedAt = new Date().toISOString()\n } = options;\n\n const successfulReports = reports.filter((r) => !r.error);\n const failedReports = reports.filter((r) => r.error);\n\n const totalRepos = reports.length;\n const successfulRepos = successfulReports.length;\n const avgLevel =\n successfulReports.length > 0\n ? successfulReports.reduce((sum, r) => sum + r.report.achievedLevel, 0) /\n successfulReports.length\n : 0;\n\n const pillarStats = calculatePillarStats(successfulReports);\n const aiToolingData = calculateAiToolingData(successfulReports);\n\n return `\n\n\n \n \n \n ${escapeHtml(title)}\n \n\n\n
    \n
    \n \n \n \n
    \n

    ${escapeHtml(title)}

    \n

    Generated ${new Date(generatedAt).toLocaleString()}

    \n
    \n \n
    \n\n
    \n
    \n
    Repositories
    \n
    ${totalRepos}
    \n
    ${successfulRepos} analyzed successfully
    \n
    \n
    \n
    Avg Maturity
    \n
    ${avgLevel.toFixed(1)}
    \n
    ${getLevelName(Math.round(avgLevel))}
    \n
    \n
    \n
    Success Rate
    \n
    ${totalRepos > 0 ? Math.round((successfulRepos / totalRepos) * 100) : 0}%
    \n
    ${failedReports.length > 0 ? failedReports.length + \" failed\" : \"All succeeded\"}
    \n
    \n
    \n\n ${\n successfulReports.length > 0\n ? `\n ${buildAiToolingHeroHtml(aiToolingData, successfulReports)}\n\n
    \n

    Pillar Performance

    \n
    \n ${pillarStats\n .map(\n (pillar) => `\n
    \n
    ${escapeHtml(pillar.name)}
    \n
    \n
    \n
    0 ? 2 : 0)}%\">
    \n
    \n ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%)\n
    \n
    \n `\n )\n .join(\"\")}\n
    \n
    \n\n
    \n

    Maturity Model

    \n
    \n ${[1, 2, 3, 4, 5]\n .map((level) => {\n const count = successfulReports.filter((r) => r.report.achievedLevel === level).length;\n return `\n
    0 ? \" has-repos\" : \"\"}\">\n
    \n ${level}\n ${getLevelName(level)}\n ${count} repo${count !== 1 ? \"s\" : \"\"}\n
    \n
    ${getLevelDescription(level)}
    \n
    \n `;\n })\n .join(\"\")}\n
    \n\n

    Distribution

    \n
    \n ${[1, 2, 3, 4, 5]\n .map((level) => {\n const count = successfulReports.filter((r) => r.report.achievedLevel === level).length;\n const percent =\n successfulReports.length > 0 ? (count / successfulReports.length) * 100 : 0;\n const barHeight = count > 0 ? Math.max(40, percent * 2) : 0;\n return `\n
    \n
    ${count}
    \n
    \n
    ${level}
    ${getLevelName(level)}
    \n
    \n `;\n })\n .join(\"\")}\n
    \n
    \n `\n : \"\"\n }\n\n
    \n

    Repository Details

    \n
    \n ${reports\n .map(({ repo, report, error }) => {\n if (error) {\n return `\n
    \n
    \n
    ${escapeHtml(repo)}
    \n Error\n
    \n
    ${escapeHtml(error)}
    \n
    \n `;\n }\n\n return `\n
    \n
    \n
    ${escapeHtml(repo)}
    \n
    \n Maturity ${report.achievedLevel}: ${getLevelName(report.achievedLevel)}\n
    \n
    \n ${report.isMonorepo ? `
    Monorepo · ${report.apps.length} apps
    ` : \"\"}\n
    \n ${report.pillars\n .map((pillar) => {\n const pillarCriteria = report.criteria.filter((c) => c.pillar === pillar.id);\n return `\n
    \n
    \n \n ${escapeHtml(pillar.name)}\n ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%)\n \n
    \n ${pillarCriteria\n .map(\n (c) => `\n
    \n ${escapeHtml(c.title)}\n ${c.status === \"pass\" ? \"Pass\" : c.status === \"fail\" ? \"Fail\" : \"Skip\"}\n
    \n `\n )\n .join(\"\")}\n ${pillarCriteria.length === 0 ? '
    No criteria
    ' : \"\"}\n
    \n
    \n
    \n `;\n })\n .join(\"\")}\n
    \n ${getTopFixesHtml(report)}\n ${buildAreaReportsHtml(report.areaReports)}\n
    \n `;\n })\n .join(\"\")}\n
    \n
    \n\n ${\n failedReports.length > 0\n ? `\n
    \n

    Failed Repositories

    \n
    \n ${failedReports\n .map(\n ({ repo, error }) => `\n
    \n
    ${escapeHtml(repo)}
    \n
    ${escapeHtml(error || \"Unknown error\")}
    \n
    \n `\n )\n .join(\"\")}\n
    \n
    \n `\n : \"\"\n }\n\n
    \n

    Generated with Primer · AI Readiness Tool

    \n
    \n
    \n \n\n`;\n}\n\n// \u2500\u2500 Helper Functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction calculatePillarStats(reports: Array<{ repo: string; report: ReadinessReport }>): Array<{\n id: string;\n name: string;\n passed: number;\n total: number;\n passRate: number;\n}> {\n const pillarMap = new Map();\n\n for (const { report } of reports) {\n for (const pillar of report.pillars) {\n const existing = pillarMap.get(pillar.id);\n if (existing) {\n existing.passed += pillar.passed;\n existing.total += pillar.total;\n } else {\n pillarMap.set(pillar.id, {\n name: pillar.name,\n passed: pillar.passed,\n total: pillar.total\n });\n }\n }\n }\n\n return Array.from(pillarMap.entries()).map(([id, stats]) => ({\n id,\n name: stats.name,\n passed: stats.passed,\n total: stats.total,\n passRate: stats.total > 0 ? stats.passed / stats.total : 0\n }));\n}\n\nfunction getTopFixesHtml(report: ReadinessReport): string {\n const failedCriteria = report.criteria\n .filter((c) => c.status === \"fail\")\n .sort((a, b) => {\n const impactWeight = { high: 3, medium: 2, low: 1 };\n const effortWeight = { low: 1, medium: 2, high: 3 };\n const impactDelta = impactWeight[b.impact] - impactWeight[a.impact];\n if (impactDelta !== 0) return impactDelta;\n return effortWeight[a.effort] - effortWeight[b.effort];\n })\n .slice(0, 3);\n\n if (failedCriteria.length === 0) {\n return '
    All criteria passing
    ';\n }\n\n return `\n
    \n
    Top Fixes Needed
    \n
      \n ${failedCriteria\n .map(\n (c) => `\n
    • \n \n ${escapeHtml(c.title)}\n ${c.impact} impact, ${c.effort} effort\n
    • \n `\n )\n .join(\"\")}\n
    \n
    \n `;\n}\n\nfunction getLevelName(level: number): string {\n const names: Record = {\n 1: \"Functional\",\n 2: \"Documented\",\n 3: \"Standardized\",\n 4: \"Optimized\",\n 5: \"Autonomous\"\n };\n return names[level] || \"Unknown\";\n}\n\nfunction getLevelDescription(level: number): string {\n const descriptions: Record = {\n 1: \"Repo builds, tests run, and basic tooling (linter, lockfile) is in place. AI agents can clone and get started.\",\n 2: \"README, CONTRIBUTING guide, and custom AI instructions exist. Agents understand project context and conventions.\",\n 3: \"CI/CD, security policies, CODEOWNERS, and observability are configured. Agents operate within well-defined guardrails.\",\n 4: \"MCP servers, custom agents, and AI skills are set up. Agents have deep integration with project-specific tools and workflows.\",\n 5: \"Full AI-native development: agents can independently plan, implement, test, and ship changes with minimal human oversight.\"\n };\n return descriptions[level] || \"\";\n}\n\nfunction getProgressClass(passRate: number): string {\n if (passRate >= 0.8) return \"high\";\n if (passRate >= 0.5) return \"medium\";\n return \"low\";\n}\n\n// \u2500\u2500 AI Tooling Hero \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype AiToolingCriterionSummary = {\n id: string;\n title: string;\n passCount: number;\n totalRepos: number;\n status: \"pass\" | \"fail\";\n evidence: string[];\n reason: string;\n};\n\ntype AiToolingData = {\n criteria: AiToolingCriterionSummary[];\n passed: number;\n total: number;\n passRate: number;\n};\n\nfunction calculateAiToolingData(\n reports: Array<{ repo: string; report: ReadinessReport }>\n): AiToolingData {\n const criterionMap = new Map();\n\n for (const { report } of reports) {\n const aiCriteria = report.criteria.filter((c) => c.pillar === \"ai-tooling\");\n for (const c of aiCriteria) {\n const existing = criterionMap.get(c.id);\n if (existing) {\n existing.totalRepos += 1;\n if (c.status === \"pass\") existing.passCount += 1;\n if (c.evidence) existing.evidence.push(...c.evidence);\n } else {\n criterionMap.set(c.id, {\n id: c.id,\n title: c.title,\n passCount: c.status === \"pass\" ? 1 : 0,\n totalRepos: 1,\n status: c.status === \"pass\" ? \"pass\" : \"fail\",\n evidence: c.evidence ? [...c.evidence] : [],\n reason: c.reason || \"\"\n });\n }\n }\n }\n\n const criteria = Array.from(criterionMap.values()).map((c) => ({\n ...c,\n status: (c.passCount / c.totalRepos >= 0.5 ? \"pass\" : \"fail\") as \"pass\" | \"fail\",\n evidence: [...new Set(c.evidence)]\n }));\n\n const passed = criteria.filter((c) => c.status === \"pass\").length;\n return {\n criteria,\n passed,\n total: criteria.length,\n passRate: criteria.length > 0 ? passed / criteria.length : 0\n };\n}\n\nfunction getAiScoreClass(passRate: number): string {\n if (passRate >= 0.6) return \"score-high\";\n if (passRate >= 0.3) return \"score-medium\";\n return \"score-low\";\n}\n\nfunction getAiScoreLabel(passRate: number): string {\n if (passRate >= 0.8) return \"Excellent\";\n if (passRate >= 0.6) return \"Good\";\n if (passRate >= 0.4) return \"Fair\";\n if (passRate >= 0.2) return \"Getting Started\";\n return \"Not Started\";\n}\n\nfunction getAiCriterionIcon(id: string): string {\n const icons: Record = {\n \"custom-instructions\": \"📝\",\n \"mcp-config\": \"🔌\",\n \"custom-agents\": \"🤖\",\n \"copilot-skills\": \"⚡\"\n };\n return icons[id] || \"🔧\";\n}\n\nfunction buildAiToolingHeroHtml(\n data: AiToolingData,\n reports: Array<{ repo: string; report: ReadinessReport }>\n): string {\n if (data.criteria.length === 0) return \"\";\n\n const pct = Math.round(data.passRate * 100);\n const scoreClass = getAiScoreClass(data.passRate);\n const scoreLabel = getAiScoreLabel(data.passRate);\n\n const multiRepo = reports.length > 1;\n const perRepoHtml = multiRepo\n ? `\n
    \n
    Per Repository
    \n
    \n ${reports\n .map(({ repo, report }) => {\n const aiPillar = report.pillars.find((p) => p.id === \"ai-tooling\");\n const repoPct = aiPillar ? Math.round(aiPillar.passRate * 100) : 0;\n const repoPass = aiPillar?.passed ?? 0;\n const repoTotal = aiPillar?.total ?? 0;\n return `
    \n ${escapeHtml(repo)}\n = 60 ? \"var(--color-success-fg)\" : repoPct >= 30 ? \"var(--color-attention-fg)\" : \"var(--color-danger-fg)\"};\">${repoPass}/${repoTotal} (${repoPct}%)\n
    `;\n })\n .join(\"\")}\n
    \n
    \n `\n : \"\";\n\n return `\n
    \n

    AI Tooling Readiness

    \n

    How well prepared ${multiRepo ? \"your repositories are\" : \"this repository is\"} for AI-assisted development

    \n\n
    \n
    ${pct}%
    \n
    \n
    ${scoreLabel}
    \n
    ${data.passed} of ${data.total} AI tooling checks passing${multiRepo ? ` across ${reports.length} repositories` : \"\"}
    \n
    \n
    \n\n
    \n ${data.criteria\n .map(\n (c) => `\n
    \n
    \n ${c.status === \"pass\" ? \"✓\" : \"✗\"}\n
    \n
    \n
    ${getAiCriterionIcon(c.id)} ${escapeHtml(c.title)}
    \n
    ${\n c.status === \"pass\"\n ? multiRepo\n ? `${c.passCount}/${c.totalRepos} repos`\n : \"Detected\"\n : escapeHtml(c.reason)\n }
    \n
    \n
    \n `\n )\n .join(\"\")}\n
    \n ${perRepoHtml}\n
    \n `;\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\"\n };\n return text.replace(/[&<>\"']/g, (m) => map[m]);\n}\n\nfunction buildAreaReportsHtml(areaReports?: AreaReadinessReport[]): string {\n if (!areaReports?.length) return \"\";\n\n return `\n
    \n
    Per-Area Breakdown
    \n
    \n ${areaReports\n .map((ar) => {\n const relevant = ar.criteria.filter((c) => c.status !== \"skip\");\n const passed = relevant.filter((c) => c.status === \"pass\").length;\n const total = relevant.length;\n const pct = total ? Math.round((passed / total) * 100) : 0;\n const sourceLabel = ar.area.source === \"config\" ? \"config\" : \"auto\";\n const applyTo = Array.isArray(ar.area.applyTo)\n ? ar.area.applyTo.join(\", \")\n : ar.area.applyTo;\n\n return `\n
    \n
    \n \n ${escapeHtml(ar.area.name)}\n \n ${sourceLabel}\n = 80 ? \"var(--color-success-fg)\" : pct >= 50 ? \"var(--color-attention-fg)\" : \"var(--color-danger-fg)\"};\">${passed}/${total} (${pct}%)\n \n \n
    \n
    ${escapeHtml(applyTo)}
    \n ${ar.criteria\n .map(\n (c) => `\n
    \n ${escapeHtml(c.title)}\n ${c.status === \"pass\" ? \"Pass\" : c.status === \"fail\" ? \"Fail\" : \"Skip\"}\n
    \n `\n )\n .join(\"\")}\n
    \n
    \n
    \n `;\n })\n .join(\"\")}\n
    \n
    \n `;\n}\n", "import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nimport { Octokit } from \"@octokit/rest\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Get a GitHub token from environment variables or the GitHub CLI.\n * Tries GITHUB_TOKEN, GH_TOKEN, then `gh auth token` in that order.\n */\nexport async function getGitHubToken(): Promise {\n // Check environment variables first\n const envToken = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;\n if (envToken) {\n return envToken;\n }\n\n // Fall back to GitHub CLI\n try {\n const { stdout } = await execFileAsync(\"gh\", [\"auth\", \"token\"], { timeout: 5000 });\n const token = stdout.trim();\n if (token) {\n return token;\n }\n } catch {\n // gh CLI not installed or not authenticated\n }\n\n return null;\n}\n\nexport type GitHubRepo = {\n name: string;\n owner: string;\n fullName: string;\n cloneUrl: string;\n isPrivate: boolean;\n defaultBranch: string;\n hasInstructions?: boolean;\n};\n\nexport function createGitHubClient(token: string): Octokit {\n return new Octokit({ auth: token });\n}\n\nexport async function listAccessibleRepos(token: string, limit = 100): Promise {\n const client = createGitHubClient(token);\n\n // Fetch only first page - avoids timeout for users with many repos\n const repos = await client.rest.repos.listForAuthenticatedUser({\n visibility: \"all\",\n affiliation: \"owner\",\n sort: \"pushed\",\n per_page: Math.min(limit, 100)\n });\n\n return repos.data.slice(0, limit).map((repo) => ({\n name: repo.name,\n owner: repo.owner?.login ?? \"unknown\",\n fullName: repo.full_name,\n cloneUrl: repo.clone_url ?? \"\",\n isPrivate: repo.private,\n defaultBranch: repo.default_branch ?? \"main\"\n }));\n}\n\nexport async function getRepo(token: string, owner: string, repo: string): Promise {\n const client = createGitHubClient(token);\n const response = await client.rest.repos.get({ owner, repo });\n\n return {\n name: response.data.name,\n owner: response.data.owner?.login ?? owner,\n fullName: response.data.full_name,\n cloneUrl: response.data.clone_url,\n isPrivate: response.data.private,\n defaultBranch: response.data.default_branch\n };\n}\n\nexport async function createPullRequest(params: {\n token: string;\n owner: string;\n repo: string;\n title: string;\n body: string;\n head: string;\n base: string;\n}): Promise {\n const client = createGitHubClient(params.token);\n const response = await client.rest.pulls.create({\n owner: params.owner,\n repo: params.repo,\n title: params.title,\n body: params.body,\n head: params.head,\n base: params.base\n });\n\n return response.data.html_url;\n}\n\nexport type GitHubOrg = {\n login: string;\n name: string | null;\n};\n\nexport async function listUserOrgs(token: string): Promise {\n const client = createGitHubClient(token);\n const orgs = await client.paginate(client.rest.orgs.listForAuthenticatedUser, {\n per_page: 100\n });\n\n return orgs.map((org) => ({\n login: org.login,\n name: org.description ?? null\n }));\n}\n\nexport async function listOrgRepos(token: string, org: string, limit = 100): Promise {\n const client = createGitHubClient(token);\n\n // Fetch only the first page(s) up to limit - avoids timeout on huge orgs\n const repos = await client.rest.repos.listForOrg({\n org,\n type: \"all\",\n sort: \"pushed\",\n per_page: Math.min(limit, 100)\n });\n\n return repos.data.slice(0, limit).map((repo) => ({\n name: repo.name,\n owner: repo.owner?.login ?? org,\n fullName: repo.full_name,\n cloneUrl: repo.clone_url ?? \"\",\n isPrivate: repo.private,\n defaultBranch: repo.default_branch ?? \"main\"\n }));\n}\n\n/**\n * Check if a repo has .github/copilot-instructions.md\n */\nexport async function checkRepoHasInstructions(\n token: string,\n owner: string,\n repo: string\n): Promise {\n const client = createGitHubClient(token);\n try {\n await client.rest.repos.getContent({\n owner,\n repo,\n path: \".github/copilot-instructions.md\"\n });\n return true;\n } catch (error: unknown) {\n if (\n error &&\n typeof error === \"object\" &&\n \"status\" in error &&\n (error as { status: number }).status === 404\n ) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Check multiple repos for instructions in parallel (with concurrency limit)\n */\nexport async function checkReposForInstructions(\n token: string,\n repos: GitHubRepo[],\n onProgress?: (checked: number, total: number) => void\n): Promise {\n const concurrency = 10;\n const results: GitHubRepo[] = [];\n let checked = 0;\n\n for (let i = 0; i < repos.length; i += concurrency) {\n const batch = repos.slice(i, i + concurrency);\n const checks = await Promise.all(\n batch.map(async (repo) => {\n const hasInstructions = await checkRepoHasInstructions(token, repo.owner, repo.name);\n return { ...repo, hasInstructions };\n })\n );\n results.push(...checks);\n checked += batch.length;\n onProgress?.(checked, repos.length);\n }\n\n return results;\n}\n", "export function getUserAgent() {\n if (typeof navigator === \"object\" && \"userAgent\" in navigator) {\n return navigator.userAgent;\n }\n\n if (typeof process === \"object\" && process.version !== undefined) {\n return `Node.js/${process.version.substr(1)} (${process.platform}; ${\n process.arch\n })`;\n }\n\n return \"\";\n}\n", "// @ts-check\n\nexport function register(state, name, method, options) {\n if (typeof method !== \"function\") {\n throw new Error(\"method for before hook must be a function\");\n }\n\n if (!options) {\n options = {};\n }\n\n if (Array.isArray(name)) {\n return name.reverse().reduce((callback, name) => {\n return register.bind(null, state, name, callback, options);\n }, method)();\n }\n\n return Promise.resolve().then(() => {\n if (!state.registry[name]) {\n return method(options);\n }\n\n return state.registry[name].reduce((method, registered) => {\n return registered.hook.bind(null, method, options);\n }, method)();\n });\n}\n", "// @ts-check\n\nexport function addHook(state, kind, name, hook) {\n const orig = hook;\n if (!state.registry[name]) {\n state.registry[name] = [];\n }\n\n if (kind === \"before\") {\n hook = (method, options) => {\n return Promise.resolve()\n .then(orig.bind(null, options))\n .then(method.bind(null, options));\n };\n }\n\n if (kind === \"after\") {\n hook = (method, options) => {\n let result;\n return Promise.resolve()\n .then(method.bind(null, options))\n .then((result_) => {\n result = result_;\n return orig(result, options);\n })\n .then(() => {\n return result;\n });\n };\n }\n\n if (kind === \"error\") {\n hook = (method, options) => {\n return Promise.resolve()\n .then(method.bind(null, options))\n .catch((error) => {\n return orig(error, options);\n });\n };\n }\n\n state.registry[name].push({\n hook: hook,\n orig: orig,\n });\n}\n", "// @ts-check\n\nexport function removeHook(state, name, method) {\n if (!state.registry[name]) {\n return;\n }\n\n const index = state.registry[name]\n .map((registered) => {\n return registered.orig;\n })\n .indexOf(method);\n\n if (index === -1) {\n return;\n }\n\n state.registry[name].splice(index, 1);\n}\n", "// @ts-check\n\nimport { register } from \"./lib/register.js\";\nimport { addHook } from \"./lib/add.js\";\nimport { removeHook } from \"./lib/remove.js\";\n\n// bind with array of arguments: https://stackoverflow.com/a/21792913\nconst bind = Function.bind;\nconst bindable = bind.bind(bind);\n\nfunction bindApi(hook, state, name) {\n const removeHookRef = bindable(removeHook, null).apply(\n null,\n name ? [state, name] : [state]\n );\n hook.api = { remove: removeHookRef };\n hook.remove = removeHookRef;\n [\"before\", \"error\", \"after\", \"wrap\"].forEach((kind) => {\n const args = name ? [state, kind, name] : [state, kind];\n hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args);\n });\n}\n\nfunction Singular() {\n const singularHookName = Symbol(\"Singular\");\n const singularHookState = {\n registry: {},\n };\n const singularHook = register.bind(null, singularHookState, singularHookName);\n bindApi(singularHook, singularHookState, singularHookName);\n return singularHook;\n}\n\nfunction Collection() {\n const state = {\n registry: {},\n };\n\n const hook = register.bind(null, state);\n bindApi(hook, state);\n\n return hook;\n}\n\nexport default { Singular, Collection };\n", "// pkg/dist-src/defaults.js\nimport { getUserAgent } from \"universal-user-agent\";\n\n// pkg/dist-src/version.js\nvar VERSION = \"0.0.0-development\";\n\n// pkg/dist-src/defaults.js\nvar userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;\nvar DEFAULTS = {\n method: \"GET\",\n baseUrl: \"https://api.github.com\",\n headers: {\n accept: \"application/vnd.github.v3+json\",\n \"user-agent\": userAgent\n },\n mediaType: {\n format: \"\"\n }\n};\n\n// pkg/dist-src/util/lowercase-keys.js\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\n// pkg/dist-src/util/is-plain-object.js\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null) return false;\n if (Object.prototype.toString.call(value) !== \"[object Object]\") return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null) return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n return typeof Ctor === \"function\" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n// pkg/dist-src/util/merge-deep.js\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach((key) => {\n if (isPlainObject(options[key])) {\n if (!(key in defaults)) Object.assign(result, { [key]: options[key] });\n else result[key] = mergeDeep(defaults[key], options[key]);\n } else {\n Object.assign(result, { [key]: options[key] });\n }\n });\n return result;\n}\n\n// pkg/dist-src/util/remove-undefined-properties.js\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === void 0) {\n delete obj[key];\n }\n }\n return obj;\n}\n\n// pkg/dist-src/merge.js\nfunction merge(defaults, route, options) {\n if (typeof route === \"string\") {\n let [method, url] = route.split(\" \");\n options = Object.assign(url ? { method, url } : { url: method }, options);\n } else {\n options = Object.assign({}, route);\n }\n options.headers = lowercaseKeys(options.headers);\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options);\n if (options.url === \"/graphql\") {\n if (defaults && defaults.mediaType.previews?.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(\n (preview) => !mergedOptions.mediaType.previews.includes(preview)\n ).concat(mergedOptions.mediaType.previews);\n }\n mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, \"\"));\n }\n return mergedOptions;\n}\n\n// pkg/dist-src/util/add-query-parameters.js\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? \"&\" : \"?\";\n const names = Object.keys(parameters);\n if (names.length === 0) {\n return url;\n }\n return url + separator + names.map((name) => {\n if (name === \"q\") {\n return \"q=\" + parameters.q.split(\"+\").map(encodeURIComponent).join(\"+\");\n }\n return `${name}=${encodeURIComponent(parameters[name])}`;\n }).join(\"&\");\n}\n\n// pkg/dist-src/util/extract-url-variable-names.js\nvar urlVariableRegex = /\\{[^{}}]+\\}/g;\nfunction removeNonChars(variableName) {\n return variableName.replace(/(?:^\\W+)|(?:(? a.concat(b), []);\n}\n\n// pkg/dist-src/util/omit.js\nfunction omit(object, keysToOmit) {\n const result = { __proto__: null };\n for (const key of Object.keys(object)) {\n if (keysToOmit.indexOf(key) === -1) {\n result[key] = object[key];\n }\n }\n return result;\n}\n\n// pkg/dist-src/util/url-template.js\nfunction encodeReserved(str) {\n return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, \"[\").replace(/%5D/g, \"]\");\n }\n return part;\n }).join(\"\");\n}\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {\n return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nfunction encodeValue(operator, value, key) {\n value = operator === \"+\" || operator === \"#\" ? encodeReserved(value) : encodeUnreserved(value);\n if (key) {\n return encodeUnreserved(key) + \"=\" + value;\n } else {\n return value;\n }\n}\nfunction isDefined(value) {\n return value !== void 0 && value !== null;\n}\nfunction isKeyOperator(operator) {\n return operator === \";\" || operator === \"&\" || operator === \"?\";\n}\nfunction getValues(context, operator, key, modifier) {\n var value = context[key], result = [];\n if (isDefined(value) && value !== \"\") {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n value = value.toString();\n if (modifier && modifier !== \"*\") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n result.push(\n encodeValue(operator, value, isKeyOperator(operator) ? key : \"\")\n );\n } else {\n if (modifier === \"*\") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n result.push(\n encodeValue(operator, value2, isKeyOperator(operator) ? key : \"\")\n );\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n } else {\n const tmp = [];\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n tmp.push(encodeValue(operator, value2));\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + \"=\" + tmp.join(\",\"));\n } else if (tmp.length !== 0) {\n result.push(tmp.join(\",\"));\n }\n }\n }\n } else {\n if (operator === \";\") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n } else if (value === \"\" && (operator === \"&\" || operator === \"?\")) {\n result.push(encodeUnreserved(key) + \"=\");\n } else if (value === \"\") {\n result.push(\"\");\n }\n }\n return result;\n}\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template)\n };\n}\nfunction expand(template, context) {\n var operators = [\"+\", \"#\", \".\", \"/\", \";\", \"?\", \"&\"];\n template = template.replace(\n /\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g,\n function(_, expression, literal) {\n if (expression) {\n let operator = \"\";\n const values = [];\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n expression.split(/,/g).forEach(function(variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n if (operator && operator !== \"+\") {\n var separator = \",\";\n if (operator === \"?\") {\n separator = \"&\";\n } else if (operator !== \"#\") {\n separator = operator;\n }\n return (values.length !== 0 ? operator : \"\") + values.join(separator);\n } else {\n return values.join(\",\");\n }\n } else {\n return encodeReserved(literal);\n }\n }\n );\n if (template === \"/\") {\n return template;\n } else {\n return template.replace(/\\/$/, \"\");\n }\n}\n\n// pkg/dist-src/parse.js\nfunction parse(options) {\n let method = options.method.toUpperCase();\n let url = (options.url || \"/\").replace(/:([a-z]\\w+)/g, \"{$1}\");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"mediaType\"\n ]);\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat(\"baseUrl\");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n headers.accept = headers.accept.split(/,/).map(\n (format) => format.replace(\n /application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/,\n `application/vnd$1$2.${options.mediaType.format}`\n )\n ).join(\",\");\n }\n if (url.endsWith(\"/graphql\")) {\n if (options.mediaType.previews?.length) {\n const previewsFromAcceptHeader = headers.accept.match(/(? {\n const format = options.mediaType.format ? `.${options.mediaType.format}` : \"+json\";\n return `application/vnd.github.${preview}-preview${format}`;\n }).join(\",\");\n }\n }\n }\n if ([\"GET\", \"HEAD\"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n } else {\n if (\"data\" in remainingParameters) {\n body = remainingParameters.data;\n } else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n }\n }\n }\n if (!headers[\"content-type\"] && typeof body !== \"undefined\") {\n headers[\"content-type\"] = \"application/json; charset=utf-8\";\n }\n if ([\"PATCH\", \"PUT\"].includes(method) && typeof body === \"undefined\") {\n body = \"\";\n }\n return Object.assign(\n { method, url, headers },\n typeof body !== \"undefined\" ? { body } : null,\n options.request ? { request: options.request } : null\n );\n}\n\n// pkg/dist-src/endpoint-with-defaults.js\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS2 = merge(oldDefaults, newDefaults);\n const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2);\n return Object.assign(endpoint2, {\n DEFAULTS: DEFAULTS2,\n defaults: withDefaults.bind(null, DEFAULTS2),\n merge: merge.bind(null, DEFAULTS2),\n parse\n });\n}\n\n// pkg/dist-src/index.js\nvar endpoint = withDefaults(null, DEFAULTS);\nexport {\n endpoint\n};\n", "// pkg/dist-src/index.js\nimport { endpoint } from \"@octokit/endpoint\";\n\n// pkg/dist-src/defaults.js\nimport { getUserAgent } from \"universal-user-agent\";\n\n// pkg/dist-src/version.js\nvar VERSION = \"10.0.7\";\n\n// pkg/dist-src/defaults.js\nvar defaults_default = {\n headers: {\n \"user-agent\": `octokit-request.js/${VERSION} ${getUserAgent()}`\n }\n};\n\n// pkg/dist-src/fetch-wrapper.js\nimport { safeParse } from \"fast-content-type-parse\";\n\n// pkg/dist-src/is-plain-object.js\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null) return false;\n if (Object.prototype.toString.call(value) !== \"[object Object]\") return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null) return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n return typeof Ctor === \"function\" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n// pkg/dist-src/fetch-wrapper.js\nimport { RequestError } from \"@octokit/request-error\";\nvar noop = () => \"\";\nasync function fetchWrapper(requestOptions) {\n const fetch = requestOptions.request?.fetch || globalThis.fetch;\n if (!fetch) {\n throw new Error(\n \"fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing\"\n );\n }\n const log = requestOptions.request?.log || console;\n const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false;\n const body = isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body) ? JSON.stringify(requestOptions.body) : requestOptions.body;\n const requestHeaders = Object.fromEntries(\n Object.entries(requestOptions.headers).map(([name, value]) => [\n name,\n String(value)\n ])\n );\n let fetchResponse;\n try {\n fetchResponse = await fetch(requestOptions.url, {\n method: requestOptions.method,\n body,\n redirect: requestOptions.request?.redirect,\n headers: requestHeaders,\n signal: requestOptions.request?.signal,\n // duplex must be set if request.body is ReadableStream or Async Iterables.\n // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.\n ...requestOptions.body && { duplex: \"half\" }\n });\n } catch (error) {\n let message = \"Unknown Error\";\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n error.status = 500;\n throw error;\n }\n message = error.message;\n if (error.name === \"TypeError\" && \"cause\" in error) {\n if (error.cause instanceof Error) {\n message = error.cause.message;\n } else if (typeof error.cause === \"string\") {\n message = error.cause;\n }\n }\n }\n const requestError = new RequestError(message, 500, {\n request: requestOptions\n });\n requestError.cause = error;\n throw requestError;\n }\n const status = fetchResponse.status;\n const url = fetchResponse.url;\n const responseHeaders = {};\n for (const [key, value] of fetchResponse.headers) {\n responseHeaders[key] = value;\n }\n const octokitResponse = {\n url,\n status,\n headers: responseHeaders,\n data: \"\"\n };\n if (\"deprecation\" in responseHeaders) {\n const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel=\"deprecation\"/);\n const deprecationLink = matches && matches.pop();\n log.warn(\n `[@octokit/request] \"${requestOptions.method} ${requestOptions.url}\" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : \"\"}`\n );\n }\n if (status === 204 || status === 205) {\n return octokitResponse;\n }\n if (requestOptions.method === \"HEAD\") {\n if (status < 400) {\n return octokitResponse;\n }\n throw new RequestError(fetchResponse.statusText, status, {\n response: octokitResponse,\n request: requestOptions\n });\n }\n if (status === 304) {\n octokitResponse.data = await getResponseData(fetchResponse);\n throw new RequestError(\"Not modified\", status, {\n response: octokitResponse,\n request: requestOptions\n });\n }\n if (status >= 400) {\n octokitResponse.data = await getResponseData(fetchResponse);\n throw new RequestError(toErrorMessage(octokitResponse.data), status, {\n response: octokitResponse,\n request: requestOptions\n });\n }\n octokitResponse.data = parseSuccessResponseBody ? await getResponseData(fetchResponse) : fetchResponse.body;\n return octokitResponse;\n}\nasync function getResponseData(response) {\n const contentType = response.headers.get(\"content-type\");\n if (!contentType) {\n return response.text().catch(noop);\n }\n const mimetype = safeParse(contentType);\n if (isJSONResponse(mimetype)) {\n let text = \"\";\n try {\n text = await response.text();\n return JSON.parse(text);\n } catch (err) {\n return text;\n }\n } else if (mimetype.type.startsWith(\"text/\") || mimetype.parameters.charset?.toLowerCase() === \"utf-8\") {\n return response.text().catch(noop);\n } else {\n return response.arrayBuffer().catch(\n /* v8 ignore next -- @preserve */\n () => new ArrayBuffer(0)\n );\n }\n}\nfunction isJSONResponse(mimetype) {\n return mimetype.type === \"application/json\" || mimetype.type === \"application/scim+json\";\n}\nfunction toErrorMessage(data) {\n if (typeof data === \"string\") {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return \"Unknown error\";\n }\n if (\"message\" in data) {\n const suffix = \"documentation_url\" in data ? ` - ${data.documentation_url}` : \"\";\n return Array.isArray(data.errors) ? `${data.message}: ${data.errors.map((v) => JSON.stringify(v)).join(\", \")}${suffix}` : `${data.message}${suffix}`;\n }\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldEndpoint, newDefaults) {\n const endpoint2 = oldEndpoint.defaults(newDefaults);\n const newApi = function(route, parameters) {\n const endpointOptions = endpoint2.merge(route, parameters);\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint2.parse(endpointOptions));\n }\n const request2 = (route2, parameters2) => {\n return fetchWrapper(\n endpoint2.parse(endpoint2.merge(route2, parameters2))\n );\n };\n Object.assign(request2, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n return endpointOptions.request.hook(request2, endpointOptions);\n };\n return Object.assign(newApi, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n}\n\n// pkg/dist-src/index.js\nvar request = withDefaults(endpoint, defaults_default);\nexport {\n request\n};\n/* v8 ignore next -- @preserve */\n/* v8 ignore else -- @preserve */\n", "class RequestError extends Error {\n name;\n /**\n * http status code\n */\n status;\n /**\n * Request options that lead to the error.\n */\n request;\n /**\n * Response object if a response was received\n */\n response;\n constructor(message, statusCode, options) {\n super(message, { cause: options.cause });\n this.name = \"HttpError\";\n this.status = Number.parseInt(statusCode);\n if (Number.isNaN(this.status)) {\n this.status = 0;\n }\n /* v8 ignore else -- @preserve -- Bug with vitest coverage where it sees an else branch that doesn't exist */\n if (\"response\" in options) {\n this.response = options.response;\n }\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(\n /(? ` - ${e.message}`).join(\"\\n\");\n}\nvar GraphqlResponseError = class extends Error {\n constructor(request2, headers, response) {\n super(_buildMessageForResponseErrors(response));\n this.request = request2;\n this.headers = headers;\n this.response = response;\n this.errors = response.errors;\n this.data = response.data;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n name = \"GraphqlResponseError\";\n errors;\n data;\n};\n\n// pkg/dist-src/graphql.js\nvar NON_VARIABLE_OPTIONS = [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"query\",\n \"mediaType\",\n \"operationName\"\n];\nvar FORBIDDEN_VARIABLE_OPTIONS = [\"query\", \"method\", \"url\"];\nvar GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request2, query, options) {\n if (options) {\n if (typeof query === \"string\" && \"query\" in options) {\n return Promise.reject(\n new Error(`[@octokit/graphql] \"query\" cannot be used as variable name`)\n );\n }\n for (const key in options) {\n if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue;\n return Promise.reject(\n new Error(\n `[@octokit/graphql] \"${key}\" cannot be used as variable name`\n )\n );\n }\n }\n const parsedOptions = typeof query === \"string\" ? Object.assign({ query }, options) : query;\n const requestOptions = Object.keys(\n parsedOptions\n ).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = parsedOptions[key];\n return result;\n }, {});\n const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, \"/api/graphql\");\n }\n return request2(requestOptions).then((response) => {\n if (response.data.errors) {\n const headers = {};\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n throw new GraphqlResponseError(\n requestOptions,\n headers,\n response.data\n );\n }\n return response.data.data;\n });\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(request2, newDefaults) {\n const newRequest = request2.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: withDefaults.bind(null, newRequest),\n endpoint: newRequest.endpoint\n });\n}\n\n// pkg/dist-src/index.js\nvar graphql2 = withDefaults(request, {\n headers: {\n \"user-agent\": `octokit-graphql.js/${VERSION} ${getUserAgent()}`\n },\n method: \"POST\",\n url: \"/graphql\"\n});\nfunction withCustomRequest(customRequest) {\n return withDefaults(customRequest, {\n method: \"POST\",\n url: \"/graphql\"\n });\n}\nexport {\n GraphqlResponseError,\n graphql2 as graphql,\n withCustomRequest\n};\n", "// pkg/dist-src/is-jwt.js\nvar b64url = \"(?:[a-zA-Z0-9_-]+)\";\nvar sep = \"\\\\.\";\nvar jwtRE = new RegExp(`^${b64url}${sep}${b64url}${sep}${b64url}$`);\nvar isJWT = jwtRE.test.bind(jwtRE);\n\n// pkg/dist-src/auth.js\nasync function auth(token) {\n const isApp = isJWT(token);\n const isInstallation = token.startsWith(\"v1.\") || token.startsWith(\"ghs_\");\n const isUserToServer = token.startsWith(\"ghu_\");\n const tokenType = isApp ? \"app\" : isInstallation ? \"installation\" : isUserToServer ? \"user-to-server\" : \"oauth\";\n return {\n type: \"token\",\n token,\n tokenType\n };\n}\n\n// pkg/dist-src/with-authorization-prefix.js\nfunction withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n\n// pkg/dist-src/hook.js\nasync function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(\n route,\n parameters\n );\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n\n// pkg/dist-src/index.js\nvar createTokenAuth = function createTokenAuth2(token) {\n if (!token) {\n throw new Error(\"[@octokit/auth-token] No token passed to createTokenAuth\");\n }\n if (typeof token !== \"string\") {\n throw new Error(\n \"[@octokit/auth-token] Token passed to createTokenAuth is not a string\"\n );\n }\n token = token.replace(/^(token|bearer) +/i, \"\");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token)\n });\n};\nexport {\n createTokenAuth\n};\n", "const VERSION = \"7.0.6\";\nexport {\n VERSION\n};\n", "import { getUserAgent } from \"universal-user-agent\";\nimport Hook from \"before-after-hook\";\nimport { request } from \"@octokit/request\";\nimport { withCustomRequest } from \"@octokit/graphql\";\nimport { createTokenAuth } from \"@octokit/auth-token\";\nimport { VERSION } from \"./version.js\";\nconst noop = () => {\n};\nconst consoleWarn = console.warn.bind(console);\nconst consoleError = console.error.bind(console);\nfunction createLogger(logger = {}) {\n if (typeof logger.debug !== \"function\") {\n logger.debug = noop;\n }\n if (typeof logger.info !== \"function\") {\n logger.info = noop;\n }\n if (typeof logger.warn !== \"function\") {\n logger.warn = consoleWarn;\n }\n if (typeof logger.error !== \"function\") {\n logger.error = consoleError;\n }\n return logger;\n}\nconst userAgentTrail = `octokit-core.js/${VERSION} ${getUserAgent()}`;\nclass Octokit {\n static VERSION = VERSION;\n static defaults(defaults) {\n const OctokitWithDefaults = class extends this {\n constructor(...args) {\n const options = args[0] || {};\n if (typeof defaults === \"function\") {\n super(defaults(options));\n return;\n }\n super(\n Object.assign(\n {},\n defaults,\n options,\n options.userAgent && defaults.userAgent ? {\n userAgent: `${options.userAgent} ${defaults.userAgent}`\n } : null\n )\n );\n }\n };\n return OctokitWithDefaults;\n }\n static plugins = [];\n /**\n * Attach a plugin (or many) to your Octokit instance.\n *\n * @example\n * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin(...newPlugins) {\n const currentPlugins = this.plugins;\n const NewOctokit = class extends this {\n static plugins = currentPlugins.concat(\n newPlugins.filter((plugin) => !currentPlugins.includes(plugin))\n );\n };\n return NewOctokit;\n }\n constructor(options = {}) {\n const hook = new Hook.Collection();\n const requestDefaults = {\n baseUrl: request.endpoint.DEFAULTS.baseUrl,\n headers: {},\n request: Object.assign({}, options.request, {\n // @ts-ignore internal usage only, no need to type\n hook: hook.bind(null, \"request\")\n }),\n mediaType: {\n previews: [],\n format: \"\"\n }\n };\n requestDefaults.headers[\"user-agent\"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail;\n if (options.baseUrl) {\n requestDefaults.baseUrl = options.baseUrl;\n }\n if (options.previews) {\n requestDefaults.mediaType.previews = options.previews;\n }\n if (options.timeZone) {\n requestDefaults.headers[\"time-zone\"] = options.timeZone;\n }\n this.request = request.defaults(requestDefaults);\n this.graphql = withCustomRequest(this.request).defaults(requestDefaults);\n this.log = createLogger(options.log);\n this.hook = hook;\n if (!options.authStrategy) {\n if (!options.auth) {\n this.auth = async () => ({\n type: \"unauthenticated\"\n });\n } else {\n const auth = createTokenAuth(options.auth);\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n }\n } else {\n const { authStrategy, ...otherOptions } = options;\n const auth = authStrategy(\n Object.assign(\n {\n request: this.request,\n log: this.log,\n // we pass the current octokit instance as well as its constructor options\n // to allow for authentication strategies that return a new octokit instance\n // that shares the same internal state as the current one. The original\n // requirement for this was the \"event-octokit\" authentication strategy\n // of https://github.com/probot/octokit-auth-probot.\n octokit: this,\n octokitOptions: otherOptions\n },\n options.auth\n )\n );\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n }\n const classConstructor = this.constructor;\n for (let i = 0; i < classConstructor.plugins.length; ++i) {\n Object.assign(this, classConstructor.plugins[i](this, options));\n }\n }\n // assigned during constructor\n request;\n graphql;\n log;\n hook;\n // TODO: type `octokit.auth` based on passed options.authStrategy\n auth;\n}\nexport {\n Octokit\n};\n", "const VERSION = \"6.0.0\";\nexport {\n VERSION\n};\n", "import { VERSION } from \"./version.js\";\nfunction requestLog(octokit) {\n octokit.hook.wrap(\"request\", (request, options) => {\n octokit.log.debug(\"request\", options);\n const start = Date.now();\n const requestOptions = octokit.request.endpoint.parse(options);\n const path = requestOptions.url.replace(options.baseUrl, \"\");\n return request(options).then((response) => {\n const requestId = response.headers[\"x-github-request-id\"];\n octokit.log.info(\n `${requestOptions.method} ${path} - ${response.status} with id ${requestId} in ${Date.now() - start}ms`\n );\n return response;\n }).catch((error) => {\n const requestId = error.response?.headers[\"x-github-request-id\"] || \"UNKNOWN\";\n octokit.log.error(\n `${requestOptions.method} ${path} - ${error.status} with id ${requestId} in ${Date.now() - start}ms`\n );\n throw error;\n });\n });\n}\nrequestLog.VERSION = VERSION;\nexport {\n requestLog\n};\n", "// pkg/dist-src/version.js\nvar VERSION = \"0.0.0-development\";\n\n// pkg/dist-src/normalize-paginated-list-response.js\nfunction normalizePaginatedListResponse(response) {\n if (!response.data) {\n return {\n ...response,\n data: []\n };\n }\n const responseNeedsNormalization = (\"total_count\" in response.data || \"total_commits\" in response.data) && !(\"url\" in response.data);\n if (!responseNeedsNormalization) return response;\n const incompleteResults = response.data.incomplete_results;\n const repositorySelection = response.data.repository_selection;\n const totalCount = response.data.total_count;\n const totalCommits = response.data.total_commits;\n delete response.data.incomplete_results;\n delete response.data.repository_selection;\n delete response.data.total_count;\n delete response.data.total_commits;\n const namespaceKey = Object.keys(response.data)[0];\n const data = response.data[namespaceKey];\n response.data = data;\n if (typeof incompleteResults !== \"undefined\") {\n response.data.incomplete_results = incompleteResults;\n }\n if (typeof repositorySelection !== \"undefined\") {\n response.data.repository_selection = repositorySelection;\n }\n response.data.total_count = totalCount;\n response.data.total_commits = totalCommits;\n return response;\n}\n\n// pkg/dist-src/iterator.js\nfunction iterator(octokit, route, parameters) {\n const options = typeof route === \"function\" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters);\n const requestMethod = typeof route === \"function\" ? route : octokit.request;\n const method = options.method;\n const headers = options.headers;\n let url = options.url;\n return {\n [Symbol.asyncIterator]: () => ({\n async next() {\n if (!url) return { done: true };\n try {\n const response = await requestMethod({ method, url, headers });\n const normalizedResponse = normalizePaginatedListResponse(response);\n url = ((normalizedResponse.headers.link || \"\").match(\n /<([^<>]+)>;\\s*rel=\"next\"/\n ) || [])[1];\n if (!url && \"total_commits\" in normalizedResponse.data) {\n const parsedUrl = new URL(normalizedResponse.url);\n const params = parsedUrl.searchParams;\n const page = parseInt(params.get(\"page\") || \"1\", 10);\n const per_page = parseInt(params.get(\"per_page\") || \"250\", 10);\n if (page * per_page < normalizedResponse.data.total_commits) {\n params.set(\"page\", String(page + 1));\n url = parsedUrl.toString();\n }\n }\n return { value: normalizedResponse };\n } catch (error) {\n if (error.status !== 409) throw error;\n url = \"\";\n return {\n value: {\n status: 200,\n headers: {},\n data: []\n }\n };\n }\n }\n })\n };\n}\n\n// pkg/dist-src/paginate.js\nfunction paginate(octokit, route, parameters, mapFn) {\n if (typeof parameters === \"function\") {\n mapFn = parameters;\n parameters = void 0;\n }\n return gather(\n octokit,\n [],\n iterator(octokit, route, parameters)[Symbol.asyncIterator](),\n mapFn\n );\n}\nfunction gather(octokit, results, iterator2, mapFn) {\n return iterator2.next().then((result) => {\n if (result.done) {\n return results;\n }\n let earlyExit = false;\n function done() {\n earlyExit = true;\n }\n results = results.concat(\n mapFn ? mapFn(result.value, done) : result.value.data\n );\n if (earlyExit) {\n return results;\n }\n return gather(octokit, results, iterator2, mapFn);\n });\n}\n\n// pkg/dist-src/compose-paginate.js\nvar composePaginateRest = Object.assign(paginate, {\n iterator\n});\n\n// pkg/dist-src/generated/paginating-endpoints.js\nvar paginatingEndpoints = [\n \"GET /advisories\",\n \"GET /app/hook/deliveries\",\n \"GET /app/installation-requests\",\n \"GET /app/installations\",\n \"GET /assignments/{assignment_id}/accepted_assignments\",\n \"GET /classrooms\",\n \"GET /classrooms/{classroom_id}/assignments\",\n \"GET /enterprises/{enterprise}/code-security/configurations\",\n \"GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories\",\n \"GET /enterprises/{enterprise}/dependabot/alerts\",\n \"GET /enterprises/{enterprise}/teams\",\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships\",\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations\",\n \"GET /events\",\n \"GET /gists\",\n \"GET /gists/public\",\n \"GET /gists/starred\",\n \"GET /gists/{gist_id}/comments\",\n \"GET /gists/{gist_id}/commits\",\n \"GET /gists/{gist_id}/forks\",\n \"GET /installation/repositories\",\n \"GET /issues\",\n \"GET /licenses\",\n \"GET /marketplace_listing/plans\",\n \"GET /marketplace_listing/plans/{plan_id}/accounts\",\n \"GET /marketplace_listing/stubbed/plans\",\n \"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts\",\n \"GET /networks/{owner}/{repo}/events\",\n \"GET /notifications\",\n \"GET /organizations\",\n \"GET /organizations/{org}/dependabot/repository-access\",\n \"GET /orgs/{org}/actions/cache/usage-by-repository\",\n \"GET /orgs/{org}/actions/hosted-runners\",\n \"GET /orgs/{org}/actions/permissions/repositories\",\n \"GET /orgs/{org}/actions/permissions/self-hosted-runners/repositories\",\n \"GET /orgs/{org}/actions/runner-groups\",\n \"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners\",\n \"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories\",\n \"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners\",\n \"GET /orgs/{org}/actions/runners\",\n \"GET /orgs/{org}/actions/secrets\",\n \"GET /orgs/{org}/actions/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/actions/variables\",\n \"GET /orgs/{org}/actions/variables/{name}/repositories\",\n \"GET /orgs/{org}/attestations/repositories\",\n \"GET /orgs/{org}/attestations/{subject_digest}\",\n \"GET /orgs/{org}/blocks\",\n \"GET /orgs/{org}/campaigns\",\n \"GET /orgs/{org}/code-scanning/alerts\",\n \"GET /orgs/{org}/code-security/configurations\",\n \"GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories\",\n \"GET /orgs/{org}/codespaces\",\n \"GET /orgs/{org}/codespaces/secrets\",\n \"GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/copilot/billing/seats\",\n \"GET /orgs/{org}/copilot/metrics\",\n \"GET /orgs/{org}/dependabot/alerts\",\n \"GET /orgs/{org}/dependabot/secrets\",\n \"GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/events\",\n \"GET /orgs/{org}/failed_invitations\",\n \"GET /orgs/{org}/hooks\",\n \"GET /orgs/{org}/hooks/{hook_id}/deliveries\",\n \"GET /orgs/{org}/insights/api/route-stats/{actor_type}/{actor_id}\",\n \"GET /orgs/{org}/insights/api/subject-stats\",\n \"GET /orgs/{org}/insights/api/user-stats/{user_id}\",\n \"GET /orgs/{org}/installations\",\n \"GET /orgs/{org}/invitations\",\n \"GET /orgs/{org}/invitations/{invitation_id}/teams\",\n \"GET /orgs/{org}/issues\",\n \"GET /orgs/{org}/members\",\n \"GET /orgs/{org}/members/{username}/codespaces\",\n \"GET /orgs/{org}/migrations\",\n \"GET /orgs/{org}/migrations/{migration_id}/repositories\",\n \"GET /orgs/{org}/organization-roles/{role_id}/teams\",\n \"GET /orgs/{org}/organization-roles/{role_id}/users\",\n \"GET /orgs/{org}/outside_collaborators\",\n \"GET /orgs/{org}/packages\",\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n \"GET /orgs/{org}/personal-access-token-requests\",\n \"GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories\",\n \"GET /orgs/{org}/personal-access-tokens\",\n \"GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories\",\n \"GET /orgs/{org}/private-registries\",\n \"GET /orgs/{org}/projects\",\n \"GET /orgs/{org}/projectsV2\",\n \"GET /orgs/{org}/projectsV2/{project_number}/fields\",\n \"GET /orgs/{org}/projectsV2/{project_number}/items\",\n \"GET /orgs/{org}/properties/values\",\n \"GET /orgs/{org}/public_members\",\n \"GET /orgs/{org}/repos\",\n \"GET /orgs/{org}/rulesets\",\n \"GET /orgs/{org}/rulesets/rule-suites\",\n \"GET /orgs/{org}/rulesets/{ruleset_id}/history\",\n \"GET /orgs/{org}/secret-scanning/alerts\",\n \"GET /orgs/{org}/security-advisories\",\n \"GET /orgs/{org}/settings/immutable-releases/repositories\",\n \"GET /orgs/{org}/settings/network-configurations\",\n \"GET /orgs/{org}/team/{team_slug}/copilot/metrics\",\n \"GET /orgs/{org}/teams\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\",\n \"GET /orgs/{org}/teams/{team_slug}/invitations\",\n \"GET /orgs/{org}/teams/{team_slug}/members\",\n \"GET /orgs/{org}/teams/{team_slug}/projects\",\n \"GET /orgs/{org}/teams/{team_slug}/repos\",\n \"GET /orgs/{org}/teams/{team_slug}/teams\",\n \"GET /projects/{project_id}/collaborators\",\n \"GET /repos/{owner}/{repo}/actions/artifacts\",\n \"GET /repos/{owner}/{repo}/actions/caches\",\n \"GET /repos/{owner}/{repo}/actions/organization-secrets\",\n \"GET /repos/{owner}/{repo}/actions/organization-variables\",\n \"GET /repos/{owner}/{repo}/actions/runners\",\n \"GET /repos/{owner}/{repo}/actions/runs\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs\",\n \"GET /repos/{owner}/{repo}/actions/secrets\",\n \"GET /repos/{owner}/{repo}/actions/variables\",\n \"GET /repos/{owner}/{repo}/actions/workflows\",\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs\",\n \"GET /repos/{owner}/{repo}/activity\",\n \"GET /repos/{owner}/{repo}/assignees\",\n \"GET /repos/{owner}/{repo}/attestations/{subject_digest}\",\n \"GET /repos/{owner}/{repo}/branches\",\n \"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations\",\n \"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs\",\n \"GET /repos/{owner}/{repo}/code-scanning/alerts\",\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n \"GET /repos/{owner}/{repo}/code-scanning/analyses\",\n \"GET /repos/{owner}/{repo}/codespaces\",\n \"GET /repos/{owner}/{repo}/codespaces/devcontainers\",\n \"GET /repos/{owner}/{repo}/codespaces/secrets\",\n \"GET /repos/{owner}/{repo}/collaborators\",\n \"GET /repos/{owner}/{repo}/comments\",\n \"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/commits\",\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments\",\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/check-runs\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/check-suites\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/status\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/statuses\",\n \"GET /repos/{owner}/{repo}/compare/{basehead}\",\n \"GET /repos/{owner}/{repo}/compare/{base}...{head}\",\n \"GET /repos/{owner}/{repo}/contributors\",\n \"GET /repos/{owner}/{repo}/dependabot/alerts\",\n \"GET /repos/{owner}/{repo}/dependabot/secrets\",\n \"GET /repos/{owner}/{repo}/deployments\",\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\",\n \"GET /repos/{owner}/{repo}/environments\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/secrets\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/variables\",\n \"GET /repos/{owner}/{repo}/events\",\n \"GET /repos/{owner}/{repo}/forks\",\n \"GET /repos/{owner}/{repo}/hooks\",\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries\",\n \"GET /repos/{owner}/{repo}/invitations\",\n \"GET /repos/{owner}/{repo}/issues\",\n \"GET /repos/{owner}/{repo}/issues/comments\",\n \"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/issues/events\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/comments\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/events\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/labels\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline\",\n \"GET /repos/{owner}/{repo}/keys\",\n \"GET /repos/{owner}/{repo}/labels\",\n \"GET /repos/{owner}/{repo}/milestones\",\n \"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels\",\n \"GET /repos/{owner}/{repo}/notifications\",\n \"GET /repos/{owner}/{repo}/pages/builds\",\n \"GET /repos/{owner}/{repo}/projects\",\n \"GET /repos/{owner}/{repo}/pulls\",\n \"GET /repos/{owner}/{repo}/pulls/comments\",\n \"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/files\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments\",\n \"GET /repos/{owner}/{repo}/releases\",\n \"GET /repos/{owner}/{repo}/releases/{release_id}/assets\",\n \"GET /repos/{owner}/{repo}/releases/{release_id}/reactions\",\n \"GET /repos/{owner}/{repo}/rules/branches/{branch}\",\n \"GET /repos/{owner}/{repo}/rulesets\",\n \"GET /repos/{owner}/{repo}/rulesets/rule-suites\",\n \"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history\",\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts\",\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations\",\n \"GET /repos/{owner}/{repo}/security-advisories\",\n \"GET /repos/{owner}/{repo}/stargazers\",\n \"GET /repos/{owner}/{repo}/subscribers\",\n \"GET /repos/{owner}/{repo}/tags\",\n \"GET /repos/{owner}/{repo}/teams\",\n \"GET /repos/{owner}/{repo}/topics\",\n \"GET /repositories\",\n \"GET /search/code\",\n \"GET /search/commits\",\n \"GET /search/issues\",\n \"GET /search/labels\",\n \"GET /search/repositories\",\n \"GET /search/topics\",\n \"GET /search/users\",\n \"GET /teams/{team_id}/discussions\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/comments\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/reactions\",\n \"GET /teams/{team_id}/invitations\",\n \"GET /teams/{team_id}/members\",\n \"GET /teams/{team_id}/projects\",\n \"GET /teams/{team_id}/repos\",\n \"GET /teams/{team_id}/teams\",\n \"GET /user/blocks\",\n \"GET /user/codespaces\",\n \"GET /user/codespaces/secrets\",\n \"GET /user/emails\",\n \"GET /user/followers\",\n \"GET /user/following\",\n \"GET /user/gpg_keys\",\n \"GET /user/installations\",\n \"GET /user/installations/{installation_id}/repositories\",\n \"GET /user/issues\",\n \"GET /user/keys\",\n \"GET /user/marketplace_purchases\",\n \"GET /user/marketplace_purchases/stubbed\",\n \"GET /user/memberships/orgs\",\n \"GET /user/migrations\",\n \"GET /user/migrations/{migration_id}/repositories\",\n \"GET /user/orgs\",\n \"GET /user/packages\",\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n \"GET /user/public_emails\",\n \"GET /user/repos\",\n \"GET /user/repository_invitations\",\n \"GET /user/social_accounts\",\n \"GET /user/ssh_signing_keys\",\n \"GET /user/starred\",\n \"GET /user/subscriptions\",\n \"GET /user/teams\",\n \"GET /users\",\n \"GET /users/{username}/attestations/{subject_digest}\",\n \"GET /users/{username}/events\",\n \"GET /users/{username}/events/orgs/{org}\",\n \"GET /users/{username}/events/public\",\n \"GET /users/{username}/followers\",\n \"GET /users/{username}/following\",\n \"GET /users/{username}/gists\",\n \"GET /users/{username}/gpg_keys\",\n \"GET /users/{username}/keys\",\n \"GET /users/{username}/orgs\",\n \"GET /users/{username}/packages\",\n \"GET /users/{username}/projects\",\n \"GET /users/{username}/projectsV2\",\n \"GET /users/{username}/projectsV2/{project_number}/fields\",\n \"GET /users/{username}/projectsV2/{project_number}/items\",\n \"GET /users/{username}/received_events\",\n \"GET /users/{username}/received_events/public\",\n \"GET /users/{username}/repos\",\n \"GET /users/{username}/social_accounts\",\n \"GET /users/{username}/ssh_signing_keys\",\n \"GET /users/{username}/starred\",\n \"GET /users/{username}/subscriptions\"\n];\n\n// pkg/dist-src/paginating-endpoints.js\nfunction isPaginatingEndpoint(arg) {\n if (typeof arg === \"string\") {\n return paginatingEndpoints.includes(arg);\n } else {\n return false;\n }\n}\n\n// pkg/dist-src/index.js\nfunction paginateRest(octokit) {\n return {\n paginate: Object.assign(paginate.bind(null, octokit), {\n iterator: iterator.bind(null, octokit)\n })\n };\n}\npaginateRest.VERSION = VERSION;\nexport {\n composePaginateRest,\n isPaginatingEndpoint,\n paginateRest,\n paginatingEndpoints\n};\n", "export const VERSION = \"17.0.0\";\n", "import type { EndpointsDefaultsAndDecorations } from \"../types.js\";\nconst Endpoints: EndpointsDefaultsAndDecorations = {\n actions: {\n addCustomLabelsToSelfHostedRunnerForOrg: [\n \"POST /orgs/{org}/actions/runners/{runner_id}/labels\",\n ],\n addCustomLabelsToSelfHostedRunnerForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\",\n ],\n addRepoAccessToSelfHostedRunnerGroupInOrg: [\n \"PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}\",\n ],\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n addSelectedRepoToOrgVariable: [\n \"PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}\",\n ],\n approveWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve\",\n ],\n cancelWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel\",\n ],\n createEnvironmentVariable: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/variables\",\n ],\n createHostedRunnerForOrg: [\"POST /orgs/{org}/actions/hosted-runners\"],\n createOrUpdateEnvironmentSecret: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}\",\n ],\n createOrUpdateOrgSecret: [\"PUT /orgs/{org}/actions/secrets/{secret_name}\"],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}\",\n ],\n createOrgVariable: [\"POST /orgs/{org}/actions/variables\"],\n createRegistrationTokenForOrg: [\n \"POST /orgs/{org}/actions/runners/registration-token\",\n ],\n createRegistrationTokenForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/registration-token\",\n ],\n createRemoveTokenForOrg: [\"POST /orgs/{org}/actions/runners/remove-token\"],\n createRemoveTokenForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/remove-token\",\n ],\n createRepoVariable: [\"POST /repos/{owner}/{repo}/actions/variables\"],\n createWorkflowDispatch: [\n \"POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches\",\n ],\n deleteActionsCacheById: [\n \"DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}\",\n ],\n deleteActionsCacheByKey: [\n \"DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}\",\n ],\n deleteArtifact: [\n \"DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\",\n ],\n deleteCustomImageFromOrg: [\n \"DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}\",\n ],\n deleteCustomImageVersionFromOrg: [\n \"DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}\",\n ],\n deleteEnvironmentSecret: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}\",\n ],\n deleteEnvironmentVariable: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}\",\n ],\n deleteHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}\",\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/actions/secrets/{secret_name}\"],\n deleteOrgVariable: [\"DELETE /orgs/{org}/actions/variables/{name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}\",\n ],\n deleteRepoVariable: [\n \"DELETE /repos/{owner}/{repo}/actions/variables/{name}\",\n ],\n deleteSelfHostedRunnerFromOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}\",\n ],\n deleteSelfHostedRunnerFromRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}\",\n ],\n deleteWorkflowRun: [\"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n deleteWorkflowRunLogs: [\n \"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs\",\n ],\n disableSelectedRepositoryGithubActionsOrganization: [\n \"DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}\",\n ],\n disableWorkflow: [\n \"PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable\",\n ],\n downloadArtifact: [\n \"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}\",\n ],\n downloadJobLogsForWorkflowRun: [\n \"GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs\",\n ],\n downloadWorkflowRunAttemptLogs: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs\",\n ],\n downloadWorkflowRunLogs: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs\",\n ],\n enableSelectedRepositoryGithubActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/repositories/{repository_id}\",\n ],\n enableWorkflow: [\n \"PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable\",\n ],\n forceCancelWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel\",\n ],\n generateRunnerJitconfigForOrg: [\n \"POST /orgs/{org}/actions/runners/generate-jitconfig\",\n ],\n generateRunnerJitconfigForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig\",\n ],\n getActionsCacheList: [\"GET /repos/{owner}/{repo}/actions/caches\"],\n getActionsCacheUsage: [\"GET /repos/{owner}/{repo}/actions/cache/usage\"],\n getActionsCacheUsageByRepoForOrg: [\n \"GET /orgs/{org}/actions/cache/usage-by-repository\",\n ],\n getActionsCacheUsageForOrg: [\"GET /orgs/{org}/actions/cache/usage\"],\n getAllowedActionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/selected-actions\",\n ],\n getAllowedActionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/selected-actions\",\n ],\n getArtifact: [\"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\"],\n getCustomImageForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}\",\n ],\n getCustomImageVersionForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}\",\n ],\n getCustomOidcSubClaimForRepo: [\n \"GET /repos/{owner}/{repo}/actions/oidc/customization/sub\",\n ],\n getEnvironmentPublicKey: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key\",\n ],\n getEnvironmentSecret: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}\",\n ],\n getEnvironmentVariable: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}\",\n ],\n getGithubActionsDefaultWorkflowPermissionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/workflow\",\n ],\n getGithubActionsDefaultWorkflowPermissionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/workflow\",\n ],\n getGithubActionsPermissionsOrganization: [\n \"GET /orgs/{org}/actions/permissions\",\n ],\n getGithubActionsPermissionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions\",\n ],\n getHostedRunnerForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}\",\n ],\n getHostedRunnersGithubOwnedImagesForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/github-owned\",\n ],\n getHostedRunnersLimitsForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/limits\",\n ],\n getHostedRunnersMachineSpecsForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/machine-sizes\",\n ],\n getHostedRunnersPartnerImagesForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/partner\",\n ],\n getHostedRunnersPlatformsForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/platforms\",\n ],\n getJobForWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/jobs/{job_id}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/actions/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/actions/secrets/{secret_name}\"],\n getOrgVariable: [\"GET /orgs/{org}/actions/variables/{name}\"],\n getPendingDeploymentsForRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments\",\n ],\n getRepoPermissions: [\n \"GET /repos/{owner}/{repo}/actions/permissions\",\n {},\n { renamed: [\"actions\", \"getGithubActionsPermissionsRepository\"] },\n ],\n getRepoPublicKey: [\"GET /repos/{owner}/{repo}/actions/secrets/public-key\"],\n getRepoSecret: [\"GET /repos/{owner}/{repo}/actions/secrets/{secret_name}\"],\n getRepoVariable: [\"GET /repos/{owner}/{repo}/actions/variables/{name}\"],\n getReviewsForRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals\",\n ],\n getSelfHostedRunnerForOrg: [\"GET /orgs/{org}/actions/runners/{runner_id}\"],\n getSelfHostedRunnerForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/{runner_id}\",\n ],\n getWorkflow: [\"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}\"],\n getWorkflowAccessToRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/access\",\n ],\n getWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n getWorkflowRunAttempt: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}\",\n ],\n getWorkflowRunUsage: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing\",\n ],\n getWorkflowUsage: [\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing\",\n ],\n listArtifactsForRepo: [\"GET /repos/{owner}/{repo}/actions/artifacts\"],\n listCustomImageVersionsForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions\",\n ],\n listCustomImagesForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/custom\",\n ],\n listEnvironmentSecrets: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/secrets\",\n ],\n listEnvironmentVariables: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/variables\",\n ],\n listGithubHostedRunnersInGroupForOrg: [\n \"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners\",\n ],\n listHostedRunnersForOrg: [\"GET /orgs/{org}/actions/hosted-runners\"],\n listJobsForWorkflowRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs\",\n ],\n listJobsForWorkflowRunAttempt: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs\",\n ],\n listLabelsForSelfHostedRunnerForOrg: [\n \"GET /orgs/{org}/actions/runners/{runner_id}/labels\",\n ],\n listLabelsForSelfHostedRunnerForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\",\n ],\n listOrgSecrets: [\"GET /orgs/{org}/actions/secrets\"],\n listOrgVariables: [\"GET /orgs/{org}/actions/variables\"],\n listRepoOrganizationSecrets: [\n \"GET /repos/{owner}/{repo}/actions/organization-secrets\",\n ],\n listRepoOrganizationVariables: [\n \"GET /repos/{owner}/{repo}/actions/organization-variables\",\n ],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/actions/secrets\"],\n listRepoVariables: [\"GET /repos/{owner}/{repo}/actions/variables\"],\n listRepoWorkflows: [\"GET /repos/{owner}/{repo}/actions/workflows\"],\n listRunnerApplicationsForOrg: [\"GET /orgs/{org}/actions/runners/downloads\"],\n listRunnerApplicationsForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/downloads\",\n ],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/actions/secrets/{secret_name}/repositories\",\n ],\n listSelectedReposForOrgVariable: [\n \"GET /orgs/{org}/actions/variables/{name}/repositories\",\n ],\n listSelectedRepositoriesEnabledGithubActionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/repositories\",\n ],\n listSelfHostedRunnersForOrg: [\"GET /orgs/{org}/actions/runners\"],\n listSelfHostedRunnersForRepo: [\"GET /repos/{owner}/{repo}/actions/runners\"],\n listWorkflowRunArtifacts: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts\",\n ],\n listWorkflowRuns: [\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs\",\n ],\n listWorkflowRunsForRepo: [\"GET /repos/{owner}/{repo}/actions/runs\"],\n reRunJobForWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun\",\n ],\n reRunWorkflow: [\"POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun\"],\n reRunWorkflowFailedJobs: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs\",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}/labels\",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\",\n ],\n removeCustomLabelFromSelfHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}\",\n ],\n removeCustomLabelFromSelfHostedRunnerForRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}\",\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n removeSelectedRepoFromOrgVariable: [\n \"DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}\",\n ],\n reviewCustomGatesForRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule\",\n ],\n reviewPendingDeploymentsForRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments\",\n ],\n setAllowedActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/selected-actions\",\n ],\n setAllowedActionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/selected-actions\",\n ],\n setCustomLabelsForSelfHostedRunnerForOrg: [\n \"PUT /orgs/{org}/actions/runners/{runner_id}/labels\",\n ],\n setCustomLabelsForSelfHostedRunnerForRepo: [\n \"PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\",\n ],\n setCustomOidcSubClaimForRepo: [\n \"PUT /repos/{owner}/{repo}/actions/oidc/customization/sub\",\n ],\n setGithubActionsDefaultWorkflowPermissionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/workflow\",\n ],\n setGithubActionsDefaultWorkflowPermissionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/workflow\",\n ],\n setGithubActionsPermissionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions\",\n ],\n setGithubActionsPermissionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions\",\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories\",\n ],\n setSelectedReposForOrgVariable: [\n \"PUT /orgs/{org}/actions/variables/{name}/repositories\",\n ],\n setSelectedRepositoriesEnabledGithubActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/repositories\",\n ],\n setWorkflowAccessToRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/access\",\n ],\n updateEnvironmentVariable: [\n \"PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}\",\n ],\n updateHostedRunnerForOrg: [\n \"PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}\",\n ],\n updateOrgVariable: [\"PATCH /orgs/{org}/actions/variables/{name}\"],\n updateRepoVariable: [\n \"PATCH /repos/{owner}/{repo}/actions/variables/{name}\",\n ],\n },\n activity: {\n checkRepoIsStarredByAuthenticatedUser: [\"GET /user/starred/{owner}/{repo}\"],\n deleteRepoSubscription: [\"DELETE /repos/{owner}/{repo}/subscription\"],\n deleteThreadSubscription: [\n \"DELETE /notifications/threads/{thread_id}/subscription\",\n ],\n getFeeds: [\"GET /feeds\"],\n getRepoSubscription: [\"GET /repos/{owner}/{repo}/subscription\"],\n getThread: [\"GET /notifications/threads/{thread_id}\"],\n getThreadSubscriptionForAuthenticatedUser: [\n \"GET /notifications/threads/{thread_id}/subscription\",\n ],\n listEventsForAuthenticatedUser: [\"GET /users/{username}/events\"],\n listNotificationsForAuthenticatedUser: [\"GET /notifications\"],\n listOrgEventsForAuthenticatedUser: [\n \"GET /users/{username}/events/orgs/{org}\",\n ],\n listPublicEvents: [\"GET /events\"],\n listPublicEventsForRepoNetwork: [\"GET /networks/{owner}/{repo}/events\"],\n listPublicEventsForUser: [\"GET /users/{username}/events/public\"],\n listPublicOrgEvents: [\"GET /orgs/{org}/events\"],\n listReceivedEventsForUser: [\"GET /users/{username}/received_events\"],\n listReceivedPublicEventsForUser: [\n \"GET /users/{username}/received_events/public\",\n ],\n listRepoEvents: [\"GET /repos/{owner}/{repo}/events\"],\n listRepoNotificationsForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/notifications\",\n ],\n listReposStarredByAuthenticatedUser: [\"GET /user/starred\"],\n listReposStarredByUser: [\"GET /users/{username}/starred\"],\n listReposWatchedByUser: [\"GET /users/{username}/subscriptions\"],\n listStargazersForRepo: [\"GET /repos/{owner}/{repo}/stargazers\"],\n listWatchedReposForAuthenticatedUser: [\"GET /user/subscriptions\"],\n listWatchersForRepo: [\"GET /repos/{owner}/{repo}/subscribers\"],\n markNotificationsAsRead: [\"PUT /notifications\"],\n markRepoNotificationsAsRead: [\"PUT /repos/{owner}/{repo}/notifications\"],\n markThreadAsDone: [\"DELETE /notifications/threads/{thread_id}\"],\n markThreadAsRead: [\"PATCH /notifications/threads/{thread_id}\"],\n setRepoSubscription: [\"PUT /repos/{owner}/{repo}/subscription\"],\n setThreadSubscription: [\n \"PUT /notifications/threads/{thread_id}/subscription\",\n ],\n starRepoForAuthenticatedUser: [\"PUT /user/starred/{owner}/{repo}\"],\n unstarRepoForAuthenticatedUser: [\"DELETE /user/starred/{owner}/{repo}\"],\n },\n apps: {\n addRepoToInstallation: [\n \"PUT /user/installations/{installation_id}/repositories/{repository_id}\",\n {},\n { renamed: [\"apps\", \"addRepoToInstallationForAuthenticatedUser\"] },\n ],\n addRepoToInstallationForAuthenticatedUser: [\n \"PUT /user/installations/{installation_id}/repositories/{repository_id}\",\n ],\n checkToken: [\"POST /applications/{client_id}/token\"],\n createFromManifest: [\"POST /app-manifests/{code}/conversions\"],\n createInstallationAccessToken: [\n \"POST /app/installations/{installation_id}/access_tokens\",\n ],\n deleteAuthorization: [\"DELETE /applications/{client_id}/grant\"],\n deleteInstallation: [\"DELETE /app/installations/{installation_id}\"],\n deleteToken: [\"DELETE /applications/{client_id}/token\"],\n getAuthenticated: [\"GET /app\"],\n getBySlug: [\"GET /apps/{app_slug}\"],\n getInstallation: [\"GET /app/installations/{installation_id}\"],\n getOrgInstallation: [\"GET /orgs/{org}/installation\"],\n getRepoInstallation: [\"GET /repos/{owner}/{repo}/installation\"],\n getSubscriptionPlanForAccount: [\n \"GET /marketplace_listing/accounts/{account_id}\",\n ],\n getSubscriptionPlanForAccountStubbed: [\n \"GET /marketplace_listing/stubbed/accounts/{account_id}\",\n ],\n getUserInstallation: [\"GET /users/{username}/installation\"],\n getWebhookConfigForApp: [\"GET /app/hook/config\"],\n getWebhookDelivery: [\"GET /app/hook/deliveries/{delivery_id}\"],\n listAccountsForPlan: [\"GET /marketplace_listing/plans/{plan_id}/accounts\"],\n listAccountsForPlanStubbed: [\n \"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts\",\n ],\n listInstallationReposForAuthenticatedUser: [\n \"GET /user/installations/{installation_id}/repositories\",\n ],\n listInstallationRequestsForAuthenticatedApp: [\n \"GET /app/installation-requests\",\n ],\n listInstallations: [\"GET /app/installations\"],\n listInstallationsForAuthenticatedUser: [\"GET /user/installations\"],\n listPlans: [\"GET /marketplace_listing/plans\"],\n listPlansStubbed: [\"GET /marketplace_listing/stubbed/plans\"],\n listReposAccessibleToInstallation: [\"GET /installation/repositories\"],\n listSubscriptionsForAuthenticatedUser: [\"GET /user/marketplace_purchases\"],\n listSubscriptionsForAuthenticatedUserStubbed: [\n \"GET /user/marketplace_purchases/stubbed\",\n ],\n listWebhookDeliveries: [\"GET /app/hook/deliveries\"],\n redeliverWebhookDelivery: [\n \"POST /app/hook/deliveries/{delivery_id}/attempts\",\n ],\n removeRepoFromInstallation: [\n \"DELETE /user/installations/{installation_id}/repositories/{repository_id}\",\n {},\n { renamed: [\"apps\", \"removeRepoFromInstallationForAuthenticatedUser\"] },\n ],\n removeRepoFromInstallationForAuthenticatedUser: [\n \"DELETE /user/installations/{installation_id}/repositories/{repository_id}\",\n ],\n resetToken: [\"PATCH /applications/{client_id}/token\"],\n revokeInstallationAccessToken: [\"DELETE /installation/token\"],\n scopeToken: [\"POST /applications/{client_id}/token/scoped\"],\n suspendInstallation: [\"PUT /app/installations/{installation_id}/suspended\"],\n unsuspendInstallation: [\n \"DELETE /app/installations/{installation_id}/suspended\",\n ],\n updateWebhookConfigForApp: [\"PATCH /app/hook/config\"],\n },\n billing: {\n getGithubActionsBillingOrg: [\"GET /orgs/{org}/settings/billing/actions\"],\n getGithubActionsBillingUser: [\n \"GET /users/{username}/settings/billing/actions\",\n ],\n getGithubBillingPremiumRequestUsageReportOrg: [\n \"GET /organizations/{org}/settings/billing/premium_request/usage\",\n ],\n getGithubBillingPremiumRequestUsageReportUser: [\n \"GET /users/{username}/settings/billing/premium_request/usage\",\n ],\n getGithubBillingUsageReportOrg: [\n \"GET /organizations/{org}/settings/billing/usage\",\n ],\n getGithubBillingUsageReportUser: [\n \"GET /users/{username}/settings/billing/usage\",\n ],\n getGithubPackagesBillingOrg: [\"GET /orgs/{org}/settings/billing/packages\"],\n getGithubPackagesBillingUser: [\n \"GET /users/{username}/settings/billing/packages\",\n ],\n getSharedStorageBillingOrg: [\n \"GET /orgs/{org}/settings/billing/shared-storage\",\n ],\n getSharedStorageBillingUser: [\n \"GET /users/{username}/settings/billing/shared-storage\",\n ],\n },\n campaigns: {\n createCampaign: [\"POST /orgs/{org}/campaigns\"],\n deleteCampaign: [\"DELETE /orgs/{org}/campaigns/{campaign_number}\"],\n getCampaignSummary: [\"GET /orgs/{org}/campaigns/{campaign_number}\"],\n listOrgCampaigns: [\"GET /orgs/{org}/campaigns\"],\n updateCampaign: [\"PATCH /orgs/{org}/campaigns/{campaign_number}\"],\n },\n checks: {\n create: [\"POST /repos/{owner}/{repo}/check-runs\"],\n createSuite: [\"POST /repos/{owner}/{repo}/check-suites\"],\n get: [\"GET /repos/{owner}/{repo}/check-runs/{check_run_id}\"],\n getSuite: [\"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}\"],\n listAnnotations: [\n \"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations\",\n ],\n listForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-runs\"],\n listForSuite: [\n \"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs\",\n ],\n listSuitesForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-suites\"],\n rerequestRun: [\n \"POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest\",\n ],\n rerequestSuite: [\n \"POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest\",\n ],\n setSuitesPreferences: [\n \"PATCH /repos/{owner}/{repo}/check-suites/preferences\",\n ],\n update: [\"PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}\"],\n },\n codeScanning: {\n commitAutofix: [\n \"POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits\",\n ],\n createAutofix: [\n \"POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix\",\n ],\n createVariantAnalysis: [\n \"POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses\",\n ],\n deleteAnalysis: [\n \"DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}\",\n ],\n deleteCodeqlDatabase: [\n \"DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}\",\n ],\n getAlert: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\",\n {},\n { renamedParameters: { alert_id: \"alert_number\" } },\n ],\n getAnalysis: [\n \"GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}\",\n ],\n getAutofix: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix\",\n ],\n getCodeqlDatabase: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}\",\n ],\n getDefaultSetup: [\"GET /repos/{owner}/{repo}/code-scanning/default-setup\"],\n getSarif: [\"GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}\"],\n getVariantAnalysis: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}\",\n ],\n getVariantAnalysisRepoTask: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}\",\n ],\n listAlertInstances: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/code-scanning/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/code-scanning/alerts\"],\n listAlertsInstances: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n {},\n { renamed: [\"codeScanning\", \"listAlertInstances\"] },\n ],\n listCodeqlDatabases: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/databases\",\n ],\n listRecentAnalyses: [\"GET /repos/{owner}/{repo}/code-scanning/analyses\"],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\",\n ],\n updateDefaultSetup: [\n \"PATCH /repos/{owner}/{repo}/code-scanning/default-setup\",\n ],\n uploadSarif: [\"POST /repos/{owner}/{repo}/code-scanning/sarifs\"],\n },\n codeSecurity: {\n attachConfiguration: [\n \"POST /orgs/{org}/code-security/configurations/{configuration_id}/attach\",\n ],\n attachEnterpriseConfiguration: [\n \"POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach\",\n ],\n createConfiguration: [\"POST /orgs/{org}/code-security/configurations\"],\n createConfigurationForEnterprise: [\n \"POST /enterprises/{enterprise}/code-security/configurations\",\n ],\n deleteConfiguration: [\n \"DELETE /orgs/{org}/code-security/configurations/{configuration_id}\",\n ],\n deleteConfigurationForEnterprise: [\n \"DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}\",\n ],\n detachConfiguration: [\n \"DELETE /orgs/{org}/code-security/configurations/detach\",\n ],\n getConfiguration: [\n \"GET /orgs/{org}/code-security/configurations/{configuration_id}\",\n ],\n getConfigurationForRepository: [\n \"GET /repos/{owner}/{repo}/code-security-configuration\",\n ],\n getConfigurationsForEnterprise: [\n \"GET /enterprises/{enterprise}/code-security/configurations\",\n ],\n getConfigurationsForOrg: [\"GET /orgs/{org}/code-security/configurations\"],\n getDefaultConfigurations: [\n \"GET /orgs/{org}/code-security/configurations/defaults\",\n ],\n getDefaultConfigurationsForEnterprise: [\n \"GET /enterprises/{enterprise}/code-security/configurations/defaults\",\n ],\n getRepositoriesForConfiguration: [\n \"GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories\",\n ],\n getRepositoriesForEnterpriseConfiguration: [\n \"GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories\",\n ],\n getSingleConfigurationForEnterprise: [\n \"GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}\",\n ],\n setConfigurationAsDefault: [\n \"PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults\",\n ],\n setConfigurationAsDefaultForEnterprise: [\n \"PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults\",\n ],\n updateConfiguration: [\n \"PATCH /orgs/{org}/code-security/configurations/{configuration_id}\",\n ],\n updateEnterpriseConfiguration: [\n \"PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}\",\n ],\n },\n codesOfConduct: {\n getAllCodesOfConduct: [\"GET /codes_of_conduct\"],\n getConductCode: [\"GET /codes_of_conduct/{key}\"],\n },\n codespaces: {\n addRepositoryForSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n checkPermissionsForDevcontainer: [\n \"GET /repos/{owner}/{repo}/codespaces/permissions_check\",\n ],\n codespaceMachinesForAuthenticatedUser: [\n \"GET /user/codespaces/{codespace_name}/machines\",\n ],\n createForAuthenticatedUser: [\"POST /user/codespaces\"],\n createOrUpdateOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}\",\n ],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\",\n ],\n createOrUpdateSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}\",\n ],\n createWithPrForAuthenticatedUser: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces\",\n ],\n createWithRepoForAuthenticatedUser: [\n \"POST /repos/{owner}/{repo}/codespaces\",\n ],\n deleteForAuthenticatedUser: [\"DELETE /user/codespaces/{codespace_name}\"],\n deleteFromOrganization: [\n \"DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}\",\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/codespaces/secrets/{secret_name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\",\n ],\n deleteSecretForAuthenticatedUser: [\n \"DELETE /user/codespaces/secrets/{secret_name}\",\n ],\n exportForAuthenticatedUser: [\n \"POST /user/codespaces/{codespace_name}/exports\",\n ],\n getCodespacesForUserInOrg: [\n \"GET /orgs/{org}/members/{username}/codespaces\",\n ],\n getExportDetailsForAuthenticatedUser: [\n \"GET /user/codespaces/{codespace_name}/exports/{export_id}\",\n ],\n getForAuthenticatedUser: [\"GET /user/codespaces/{codespace_name}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/codespaces/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/codespaces/secrets/{secret_name}\"],\n getPublicKeyForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/public-key\",\n ],\n getRepoPublicKey: [\n \"GET /repos/{owner}/{repo}/codespaces/secrets/public-key\",\n ],\n getRepoSecret: [\n \"GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\",\n ],\n getSecretForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/{secret_name}\",\n ],\n listDevcontainersInRepositoryForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/devcontainers\",\n ],\n listForAuthenticatedUser: [\"GET /user/codespaces\"],\n listInOrganization: [\n \"GET /orgs/{org}/codespaces\",\n {},\n { renamedParameters: { org_id: \"org\" } },\n ],\n listInRepositoryForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces\",\n ],\n listOrgSecrets: [\"GET /orgs/{org}/codespaces/secrets\"],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/codespaces/secrets\"],\n listRepositoriesForSecretForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/{secret_name}/repositories\",\n ],\n listSecretsForAuthenticatedUser: [\"GET /user/codespaces/secrets\"],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories\",\n ],\n preFlightWithRepoForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/new\",\n ],\n publishForAuthenticatedUser: [\n \"POST /user/codespaces/{codespace_name}/publish\",\n ],\n removeRepositoryForSecretForAuthenticatedUser: [\n \"DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n repoMachinesForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/machines\",\n ],\n setRepositoriesForSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}/repositories\",\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories\",\n ],\n startForAuthenticatedUser: [\"POST /user/codespaces/{codespace_name}/start\"],\n stopForAuthenticatedUser: [\"POST /user/codespaces/{codespace_name}/stop\"],\n stopInOrganization: [\n \"POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop\",\n ],\n updateForAuthenticatedUser: [\"PATCH /user/codespaces/{codespace_name}\"],\n },\n copilot: {\n addCopilotSeatsForTeams: [\n \"POST /orgs/{org}/copilot/billing/selected_teams\",\n ],\n addCopilotSeatsForUsers: [\n \"POST /orgs/{org}/copilot/billing/selected_users\",\n ],\n cancelCopilotSeatAssignmentForTeams: [\n \"DELETE /orgs/{org}/copilot/billing/selected_teams\",\n ],\n cancelCopilotSeatAssignmentForUsers: [\n \"DELETE /orgs/{org}/copilot/billing/selected_users\",\n ],\n copilotMetricsForOrganization: [\"GET /orgs/{org}/copilot/metrics\"],\n copilotMetricsForTeam: [\"GET /orgs/{org}/team/{team_slug}/copilot/metrics\"],\n getCopilotOrganizationDetails: [\"GET /orgs/{org}/copilot/billing\"],\n getCopilotSeatDetailsForUser: [\n \"GET /orgs/{org}/members/{username}/copilot\",\n ],\n listCopilotSeats: [\"GET /orgs/{org}/copilot/billing/seats\"],\n },\n credentials: { revoke: [\"POST /credentials/revoke\"] },\n dependabot: {\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n createOrUpdateOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}\",\n ],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\",\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/dependabot/secrets/{secret_name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\",\n ],\n getAlert: [\"GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/dependabot/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/dependabot/secrets/{secret_name}\"],\n getRepoPublicKey: [\n \"GET /repos/{owner}/{repo}/dependabot/secrets/public-key\",\n ],\n getRepoSecret: [\n \"GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\",\n ],\n listAlertsForEnterprise: [\n \"GET /enterprises/{enterprise}/dependabot/alerts\",\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/dependabot/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/dependabot/alerts\"],\n listOrgSecrets: [\"GET /orgs/{org}/dependabot/secrets\"],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/dependabot/secrets\"],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories\",\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n repositoryAccessForOrg: [\n \"GET /organizations/{org}/dependabot/repository-access\",\n ],\n setRepositoryAccessDefaultLevel: [\n \"PUT /organizations/{org}/dependabot/repository-access/default-level\",\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories\",\n ],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}\",\n ],\n updateRepositoryAccessForOrg: [\n \"PATCH /organizations/{org}/dependabot/repository-access\",\n ],\n },\n dependencyGraph: {\n createRepositorySnapshot: [\n \"POST /repos/{owner}/{repo}/dependency-graph/snapshots\",\n ],\n diffRange: [\n \"GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}\",\n ],\n exportSbom: [\"GET /repos/{owner}/{repo}/dependency-graph/sbom\"],\n },\n emojis: { get: [\"GET /emojis\"] },\n enterpriseTeamMemberships: {\n add: [\n \"PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}\",\n ],\n bulkAdd: [\n \"POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add\",\n ],\n bulkRemove: [\n \"POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove\",\n ],\n get: [\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}\",\n ],\n list: [\"GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships\"],\n remove: [\n \"DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}\",\n ],\n },\n enterpriseTeamOrganizations: {\n add: [\n \"PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}\",\n ],\n bulkAdd: [\n \"POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add\",\n ],\n bulkRemove: [\n \"POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/remove\",\n ],\n delete: [\n \"DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}\",\n ],\n getAssignment: [\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}\",\n ],\n getAssignments: [\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations\",\n ],\n },\n enterpriseTeams: {\n create: [\"POST /enterprises/{enterprise}/teams\"],\n delete: [\"DELETE /enterprises/{enterprise}/teams/{team_slug}\"],\n get: [\"GET /enterprises/{enterprise}/teams/{team_slug}\"],\n list: [\"GET /enterprises/{enterprise}/teams\"],\n update: [\"PATCH /enterprises/{enterprise}/teams/{team_slug}\"],\n },\n gists: {\n checkIsStarred: [\"GET /gists/{gist_id}/star\"],\n create: [\"POST /gists\"],\n createComment: [\"POST /gists/{gist_id}/comments\"],\n delete: [\"DELETE /gists/{gist_id}\"],\n deleteComment: [\"DELETE /gists/{gist_id}/comments/{comment_id}\"],\n fork: [\"POST /gists/{gist_id}/forks\"],\n get: [\"GET /gists/{gist_id}\"],\n getComment: [\"GET /gists/{gist_id}/comments/{comment_id}\"],\n getRevision: [\"GET /gists/{gist_id}/{sha}\"],\n list: [\"GET /gists\"],\n listComments: [\"GET /gists/{gist_id}/comments\"],\n listCommits: [\"GET /gists/{gist_id}/commits\"],\n listForUser: [\"GET /users/{username}/gists\"],\n listForks: [\"GET /gists/{gist_id}/forks\"],\n listPublic: [\"GET /gists/public\"],\n listStarred: [\"GET /gists/starred\"],\n star: [\"PUT /gists/{gist_id}/star\"],\n unstar: [\"DELETE /gists/{gist_id}/star\"],\n update: [\"PATCH /gists/{gist_id}\"],\n updateComment: [\"PATCH /gists/{gist_id}/comments/{comment_id}\"],\n },\n git: {\n createBlob: [\"POST /repos/{owner}/{repo}/git/blobs\"],\n createCommit: [\"POST /repos/{owner}/{repo}/git/commits\"],\n createRef: [\"POST /repos/{owner}/{repo}/git/refs\"],\n createTag: [\"POST /repos/{owner}/{repo}/git/tags\"],\n createTree: [\"POST /repos/{owner}/{repo}/git/trees\"],\n deleteRef: [\"DELETE /repos/{owner}/{repo}/git/refs/{ref}\"],\n getBlob: [\"GET /repos/{owner}/{repo}/git/blobs/{file_sha}\"],\n getCommit: [\"GET /repos/{owner}/{repo}/git/commits/{commit_sha}\"],\n getRef: [\"GET /repos/{owner}/{repo}/git/ref/{ref}\"],\n getTag: [\"GET /repos/{owner}/{repo}/git/tags/{tag_sha}\"],\n getTree: [\"GET /repos/{owner}/{repo}/git/trees/{tree_sha}\"],\n listMatchingRefs: [\"GET /repos/{owner}/{repo}/git/matching-refs/{ref}\"],\n updateRef: [\"PATCH /repos/{owner}/{repo}/git/refs/{ref}\"],\n },\n gitignore: {\n getAllTemplates: [\"GET /gitignore/templates\"],\n getTemplate: [\"GET /gitignore/templates/{name}\"],\n },\n hostedCompute: {\n createNetworkConfigurationForOrg: [\n \"POST /orgs/{org}/settings/network-configurations\",\n ],\n deleteNetworkConfigurationFromOrg: [\n \"DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}\",\n ],\n getNetworkConfigurationForOrg: [\n \"GET /orgs/{org}/settings/network-configurations/{network_configuration_id}\",\n ],\n getNetworkSettingsForOrg: [\n \"GET /orgs/{org}/settings/network-settings/{network_settings_id}\",\n ],\n listNetworkConfigurationsForOrg: [\n \"GET /orgs/{org}/settings/network-configurations\",\n ],\n updateNetworkConfigurationForOrg: [\n \"PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}\",\n ],\n },\n interactions: {\n getRestrictionsForAuthenticatedUser: [\"GET /user/interaction-limits\"],\n getRestrictionsForOrg: [\"GET /orgs/{org}/interaction-limits\"],\n getRestrictionsForRepo: [\"GET /repos/{owner}/{repo}/interaction-limits\"],\n getRestrictionsForYourPublicRepos: [\n \"GET /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"getRestrictionsForAuthenticatedUser\"] },\n ],\n removeRestrictionsForAuthenticatedUser: [\"DELETE /user/interaction-limits\"],\n removeRestrictionsForOrg: [\"DELETE /orgs/{org}/interaction-limits\"],\n removeRestrictionsForRepo: [\n \"DELETE /repos/{owner}/{repo}/interaction-limits\",\n ],\n removeRestrictionsForYourPublicRepos: [\n \"DELETE /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"removeRestrictionsForAuthenticatedUser\"] },\n ],\n setRestrictionsForAuthenticatedUser: [\"PUT /user/interaction-limits\"],\n setRestrictionsForOrg: [\"PUT /orgs/{org}/interaction-limits\"],\n setRestrictionsForRepo: [\"PUT /repos/{owner}/{repo}/interaction-limits\"],\n setRestrictionsForYourPublicRepos: [\n \"PUT /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"setRestrictionsForAuthenticatedUser\"] },\n ],\n },\n issues: {\n addAssignees: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/assignees\",\n ],\n addBlockedByDependency: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by\",\n ],\n addLabels: [\"POST /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n addSubIssue: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues\",\n ],\n checkUserCanBeAssigned: [\"GET /repos/{owner}/{repo}/assignees/{assignee}\"],\n checkUserCanBeAssignedToIssue: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}\",\n ],\n create: [\"POST /repos/{owner}/{repo}/issues\"],\n createComment: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/comments\",\n ],\n createLabel: [\"POST /repos/{owner}/{repo}/labels\"],\n createMilestone: [\"POST /repos/{owner}/{repo}/milestones\"],\n deleteComment: [\n \"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}\",\n ],\n deleteLabel: [\"DELETE /repos/{owner}/{repo}/labels/{name}\"],\n deleteMilestone: [\n \"DELETE /repos/{owner}/{repo}/milestones/{milestone_number}\",\n ],\n get: [\"GET /repos/{owner}/{repo}/issues/{issue_number}\"],\n getComment: [\"GET /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n getEvent: [\"GET /repos/{owner}/{repo}/issues/events/{event_id}\"],\n getLabel: [\"GET /repos/{owner}/{repo}/labels/{name}\"],\n getMilestone: [\"GET /repos/{owner}/{repo}/milestones/{milestone_number}\"],\n getParent: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/parent\"],\n list: [\"GET /issues\"],\n listAssignees: [\"GET /repos/{owner}/{repo}/assignees\"],\n listComments: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/comments\"],\n listCommentsForRepo: [\"GET /repos/{owner}/{repo}/issues/comments\"],\n listDependenciesBlockedBy: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by\",\n ],\n listDependenciesBlocking: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking\",\n ],\n listEvents: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/events\"],\n listEventsForRepo: [\"GET /repos/{owner}/{repo}/issues/events\"],\n listEventsForTimeline: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline\",\n ],\n listForAuthenticatedUser: [\"GET /user/issues\"],\n listForOrg: [\"GET /orgs/{org}/issues\"],\n listForRepo: [\"GET /repos/{owner}/{repo}/issues\"],\n listLabelsForMilestone: [\n \"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels\",\n ],\n listLabelsForRepo: [\"GET /repos/{owner}/{repo}/labels\"],\n listLabelsOnIssue: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/labels\",\n ],\n listMilestones: [\"GET /repos/{owner}/{repo}/milestones\"],\n listSubIssues: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues\",\n ],\n lock: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n removeAllLabels: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels\",\n ],\n removeAssignees: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees\",\n ],\n removeDependencyBlockedBy: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}\",\n ],\n removeLabel: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}\",\n ],\n removeSubIssue: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue\",\n ],\n reprioritizeSubIssue: [\n \"PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority\",\n ],\n setLabels: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n unlock: [\"DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n update: [\"PATCH /repos/{owner}/{repo}/issues/{issue_number}\"],\n updateComment: [\"PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n updateLabel: [\"PATCH /repos/{owner}/{repo}/labels/{name}\"],\n updateMilestone: [\n \"PATCH /repos/{owner}/{repo}/milestones/{milestone_number}\",\n ],\n },\n licenses: {\n get: [\"GET /licenses/{license}\"],\n getAllCommonlyUsed: [\"GET /licenses\"],\n getForRepo: [\"GET /repos/{owner}/{repo}/license\"],\n },\n markdown: {\n render: [\"POST /markdown\"],\n renderRaw: [\n \"POST /markdown/raw\",\n { headers: { \"content-type\": \"text/plain; charset=utf-8\" } },\n ],\n },\n meta: {\n get: [\"GET /meta\"],\n getAllVersions: [\"GET /versions\"],\n getOctocat: [\"GET /octocat\"],\n getZen: [\"GET /zen\"],\n root: [\"GET /\"],\n },\n migrations: {\n deleteArchiveForAuthenticatedUser: [\n \"DELETE /user/migrations/{migration_id}/archive\",\n ],\n deleteArchiveForOrg: [\n \"DELETE /orgs/{org}/migrations/{migration_id}/archive\",\n ],\n downloadArchiveForOrg: [\n \"GET /orgs/{org}/migrations/{migration_id}/archive\",\n ],\n getArchiveForAuthenticatedUser: [\n \"GET /user/migrations/{migration_id}/archive\",\n ],\n getStatusForAuthenticatedUser: [\"GET /user/migrations/{migration_id}\"],\n getStatusForOrg: [\"GET /orgs/{org}/migrations/{migration_id}\"],\n listForAuthenticatedUser: [\"GET /user/migrations\"],\n listForOrg: [\"GET /orgs/{org}/migrations\"],\n listReposForAuthenticatedUser: [\n \"GET /user/migrations/{migration_id}/repositories\",\n ],\n listReposForOrg: [\"GET /orgs/{org}/migrations/{migration_id}/repositories\"],\n listReposForUser: [\n \"GET /user/migrations/{migration_id}/repositories\",\n {},\n { renamed: [\"migrations\", \"listReposForAuthenticatedUser\"] },\n ],\n startForAuthenticatedUser: [\"POST /user/migrations\"],\n startForOrg: [\"POST /orgs/{org}/migrations\"],\n unlockRepoForAuthenticatedUser: [\n \"DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock\",\n ],\n unlockRepoForOrg: [\n \"DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock\",\n ],\n },\n oidc: {\n getOidcCustomSubTemplateForOrg: [\n \"GET /orgs/{org}/actions/oidc/customization/sub\",\n ],\n updateOidcCustomSubTemplateForOrg: [\n \"PUT /orgs/{org}/actions/oidc/customization/sub\",\n ],\n },\n orgs: {\n addSecurityManagerTeam: [\n \"PUT /orgs/{org}/security-managers/teams/{team_slug}\",\n {},\n {\n deprecated:\n \"octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team\",\n },\n ],\n assignTeamToOrgRole: [\n \"PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}\",\n ],\n assignUserToOrgRole: [\n \"PUT /orgs/{org}/organization-roles/users/{username}/{role_id}\",\n ],\n blockUser: [\"PUT /orgs/{org}/blocks/{username}\"],\n cancelInvitation: [\"DELETE /orgs/{org}/invitations/{invitation_id}\"],\n checkBlockedUser: [\"GET /orgs/{org}/blocks/{username}\"],\n checkMembershipForUser: [\"GET /orgs/{org}/members/{username}\"],\n checkPublicMembershipForUser: [\"GET /orgs/{org}/public_members/{username}\"],\n convertMemberToOutsideCollaborator: [\n \"PUT /orgs/{org}/outside_collaborators/{username}\",\n ],\n createArtifactStorageRecord: [\n \"POST /orgs/{org}/artifacts/metadata/storage-record\",\n ],\n createInvitation: [\"POST /orgs/{org}/invitations\"],\n createIssueType: [\"POST /orgs/{org}/issue-types\"],\n createWebhook: [\"POST /orgs/{org}/hooks\"],\n customPropertiesForOrgsCreateOrUpdateOrganizationValues: [\n \"PATCH /organizations/{org}/org-properties/values\",\n ],\n customPropertiesForOrgsGetOrganizationValues: [\n \"GET /organizations/{org}/org-properties/values\",\n ],\n customPropertiesForReposCreateOrUpdateOrganizationDefinition: [\n \"PUT /orgs/{org}/properties/schema/{custom_property_name}\",\n ],\n customPropertiesForReposCreateOrUpdateOrganizationDefinitions: [\n \"PATCH /orgs/{org}/properties/schema\",\n ],\n customPropertiesForReposCreateOrUpdateOrganizationValues: [\n \"PATCH /orgs/{org}/properties/values\",\n ],\n customPropertiesForReposDeleteOrganizationDefinition: [\n \"DELETE /orgs/{org}/properties/schema/{custom_property_name}\",\n ],\n customPropertiesForReposGetOrganizationDefinition: [\n \"GET /orgs/{org}/properties/schema/{custom_property_name}\",\n ],\n customPropertiesForReposGetOrganizationDefinitions: [\n \"GET /orgs/{org}/properties/schema\",\n ],\n customPropertiesForReposGetOrganizationValues: [\n \"GET /orgs/{org}/properties/values\",\n ],\n delete: [\"DELETE /orgs/{org}\"],\n deleteAttestationsBulk: [\"POST /orgs/{org}/attestations/delete-request\"],\n deleteAttestationsById: [\n \"DELETE /orgs/{org}/attestations/{attestation_id}\",\n ],\n deleteAttestationsBySubjectDigest: [\n \"DELETE /orgs/{org}/attestations/digest/{subject_digest}\",\n ],\n deleteIssueType: [\"DELETE /orgs/{org}/issue-types/{issue_type_id}\"],\n deleteWebhook: [\"DELETE /orgs/{org}/hooks/{hook_id}\"],\n disableSelectedRepositoryImmutableReleasesOrganization: [\n \"DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}\",\n ],\n enableSelectedRepositoryImmutableReleasesOrganization: [\n \"PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}\",\n ],\n get: [\"GET /orgs/{org}\"],\n getImmutableReleasesSettings: [\n \"GET /orgs/{org}/settings/immutable-releases\",\n ],\n getImmutableReleasesSettingsRepositories: [\n \"GET /orgs/{org}/settings/immutable-releases/repositories\",\n ],\n getMembershipForAuthenticatedUser: [\"GET /user/memberships/orgs/{org}\"],\n getMembershipForUser: [\"GET /orgs/{org}/memberships/{username}\"],\n getOrgRole: [\"GET /orgs/{org}/organization-roles/{role_id}\"],\n getOrgRulesetHistory: [\"GET /orgs/{org}/rulesets/{ruleset_id}/history\"],\n getOrgRulesetVersion: [\n \"GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}\",\n ],\n getWebhook: [\"GET /orgs/{org}/hooks/{hook_id}\"],\n getWebhookConfigForOrg: [\"GET /orgs/{org}/hooks/{hook_id}/config\"],\n getWebhookDelivery: [\n \"GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}\",\n ],\n list: [\"GET /organizations\"],\n listAppInstallations: [\"GET /orgs/{org}/installations\"],\n listArtifactStorageRecords: [\n \"GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records\",\n ],\n listAttestationRepositories: [\"GET /orgs/{org}/attestations/repositories\"],\n listAttestations: [\"GET /orgs/{org}/attestations/{subject_digest}\"],\n listAttestationsBulk: [\n \"POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}\",\n ],\n listBlockedUsers: [\"GET /orgs/{org}/blocks\"],\n listFailedInvitations: [\"GET /orgs/{org}/failed_invitations\"],\n listForAuthenticatedUser: [\"GET /user/orgs\"],\n listForUser: [\"GET /users/{username}/orgs\"],\n listInvitationTeams: [\"GET /orgs/{org}/invitations/{invitation_id}/teams\"],\n listIssueTypes: [\"GET /orgs/{org}/issue-types\"],\n listMembers: [\"GET /orgs/{org}/members\"],\n listMembershipsForAuthenticatedUser: [\"GET /user/memberships/orgs\"],\n listOrgRoleTeams: [\"GET /orgs/{org}/organization-roles/{role_id}/teams\"],\n listOrgRoleUsers: [\"GET /orgs/{org}/organization-roles/{role_id}/users\"],\n listOrgRoles: [\"GET /orgs/{org}/organization-roles\"],\n listOrganizationFineGrainedPermissions: [\n \"GET /orgs/{org}/organization-fine-grained-permissions\",\n ],\n listOutsideCollaborators: [\"GET /orgs/{org}/outside_collaborators\"],\n listPatGrantRepositories: [\n \"GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories\",\n ],\n listPatGrantRequestRepositories: [\n \"GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories\",\n ],\n listPatGrantRequests: [\"GET /orgs/{org}/personal-access-token-requests\"],\n listPatGrants: [\"GET /orgs/{org}/personal-access-tokens\"],\n listPendingInvitations: [\"GET /orgs/{org}/invitations\"],\n listPublicMembers: [\"GET /orgs/{org}/public_members\"],\n listSecurityManagerTeams: [\n \"GET /orgs/{org}/security-managers\",\n {},\n {\n deprecated:\n \"octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams\",\n },\n ],\n listWebhookDeliveries: [\"GET /orgs/{org}/hooks/{hook_id}/deliveries\"],\n listWebhooks: [\"GET /orgs/{org}/hooks\"],\n pingWebhook: [\"POST /orgs/{org}/hooks/{hook_id}/pings\"],\n redeliverWebhookDelivery: [\n \"POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts\",\n ],\n removeMember: [\"DELETE /orgs/{org}/members/{username}\"],\n removeMembershipForUser: [\"DELETE /orgs/{org}/memberships/{username}\"],\n removeOutsideCollaborator: [\n \"DELETE /orgs/{org}/outside_collaborators/{username}\",\n ],\n removePublicMembershipForAuthenticatedUser: [\n \"DELETE /orgs/{org}/public_members/{username}\",\n ],\n removeSecurityManagerTeam: [\n \"DELETE /orgs/{org}/security-managers/teams/{team_slug}\",\n {},\n {\n deprecated:\n \"octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team\",\n },\n ],\n reviewPatGrantRequest: [\n \"POST /orgs/{org}/personal-access-token-requests/{pat_request_id}\",\n ],\n reviewPatGrantRequestsInBulk: [\n \"POST /orgs/{org}/personal-access-token-requests\",\n ],\n revokeAllOrgRolesTeam: [\n \"DELETE /orgs/{org}/organization-roles/teams/{team_slug}\",\n ],\n revokeAllOrgRolesUser: [\n \"DELETE /orgs/{org}/organization-roles/users/{username}\",\n ],\n revokeOrgRoleTeam: [\n \"DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}\",\n ],\n revokeOrgRoleUser: [\n \"DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}\",\n ],\n setImmutableReleasesSettings: [\n \"PUT /orgs/{org}/settings/immutable-releases\",\n ],\n setImmutableReleasesSettingsRepositories: [\n \"PUT /orgs/{org}/settings/immutable-releases/repositories\",\n ],\n setMembershipForUser: [\"PUT /orgs/{org}/memberships/{username}\"],\n setPublicMembershipForAuthenticatedUser: [\n \"PUT /orgs/{org}/public_members/{username}\",\n ],\n unblockUser: [\"DELETE /orgs/{org}/blocks/{username}\"],\n update: [\"PATCH /orgs/{org}\"],\n updateIssueType: [\"PUT /orgs/{org}/issue-types/{issue_type_id}\"],\n updateMembershipForAuthenticatedUser: [\n \"PATCH /user/memberships/orgs/{org}\",\n ],\n updatePatAccess: [\"POST /orgs/{org}/personal-access-tokens/{pat_id}\"],\n updatePatAccesses: [\"POST /orgs/{org}/personal-access-tokens\"],\n updateWebhook: [\"PATCH /orgs/{org}/hooks/{hook_id}\"],\n updateWebhookConfigForOrg: [\"PATCH /orgs/{org}/hooks/{hook_id}/config\"],\n },\n packages: {\n deletePackageForAuthenticatedUser: [\n \"DELETE /user/packages/{package_type}/{package_name}\",\n ],\n deletePackageForOrg: [\n \"DELETE /orgs/{org}/packages/{package_type}/{package_name}\",\n ],\n deletePackageForUser: [\n \"DELETE /users/{username}/packages/{package_type}/{package_name}\",\n ],\n deletePackageVersionForAuthenticatedUser: [\n \"DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n deletePackageVersionForOrg: [\n \"DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n deletePackageVersionForUser: [\n \"DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n getAllPackageVersionsForAPackageOwnedByAnOrg: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n {},\n { renamed: [\"packages\", \"getAllPackageVersionsForPackageOwnedByOrg\"] },\n ],\n getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n {},\n {\n renamed: [\n \"packages\",\n \"getAllPackageVersionsForPackageOwnedByAuthenticatedUser\",\n ],\n },\n ],\n getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n ],\n getAllPackageVersionsForPackageOwnedByOrg: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n ],\n getAllPackageVersionsForPackageOwnedByUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}/versions\",\n ],\n getPackageForAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}\",\n ],\n getPackageForOrganization: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}\",\n ],\n getPackageForUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}\",\n ],\n getPackageVersionForAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n getPackageVersionForOrganization: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n getPackageVersionForUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n listDockerMigrationConflictingPackagesForAuthenticatedUser: [\n \"GET /user/docker/conflicts\",\n ],\n listDockerMigrationConflictingPackagesForOrganization: [\n \"GET /orgs/{org}/docker/conflicts\",\n ],\n listDockerMigrationConflictingPackagesForUser: [\n \"GET /users/{username}/docker/conflicts\",\n ],\n listPackagesForAuthenticatedUser: [\"GET /user/packages\"],\n listPackagesForOrganization: [\"GET /orgs/{org}/packages\"],\n listPackagesForUser: [\"GET /users/{username}/packages\"],\n restorePackageForAuthenticatedUser: [\n \"POST /user/packages/{package_type}/{package_name}/restore{?token}\",\n ],\n restorePackageForOrg: [\n \"POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}\",\n ],\n restorePackageForUser: [\n \"POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}\",\n ],\n restorePackageVersionForAuthenticatedUser: [\n \"POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\",\n ],\n restorePackageVersionForOrg: [\n \"POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\",\n ],\n restorePackageVersionForUser: [\n \"POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\",\n ],\n },\n privateRegistries: {\n createOrgPrivateRegistry: [\"POST /orgs/{org}/private-registries\"],\n deleteOrgPrivateRegistry: [\n \"DELETE /orgs/{org}/private-registries/{secret_name}\",\n ],\n getOrgPrivateRegistry: [\"GET /orgs/{org}/private-registries/{secret_name}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/private-registries/public-key\"],\n listOrgPrivateRegistries: [\"GET /orgs/{org}/private-registries\"],\n updateOrgPrivateRegistry: [\n \"PATCH /orgs/{org}/private-registries/{secret_name}\",\n ],\n },\n projects: {\n addItemForOrg: [\"POST /orgs/{org}/projectsV2/{project_number}/items\"],\n addItemForUser: [\n \"POST /users/{username}/projectsV2/{project_number}/items\",\n ],\n deleteItemForOrg: [\n \"DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}\",\n ],\n deleteItemForUser: [\n \"DELETE /users/{username}/projectsV2/{project_number}/items/{item_id}\",\n ],\n getFieldForOrg: [\n \"GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}\",\n ],\n getFieldForUser: [\n \"GET /users/{username}/projectsV2/{project_number}/fields/{field_id}\",\n ],\n getForOrg: [\"GET /orgs/{org}/projectsV2/{project_number}\"],\n getForUser: [\"GET /users/{username}/projectsV2/{project_number}\"],\n getOrgItem: [\"GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}\"],\n getUserItem: [\n \"GET /users/{username}/projectsV2/{project_number}/items/{item_id}\",\n ],\n listFieldsForOrg: [\"GET /orgs/{org}/projectsV2/{project_number}/fields\"],\n listFieldsForUser: [\n \"GET /users/{username}/projectsV2/{project_number}/fields\",\n ],\n listForOrg: [\"GET /orgs/{org}/projectsV2\"],\n listForUser: [\"GET /users/{username}/projectsV2\"],\n listItemsForOrg: [\"GET /orgs/{org}/projectsV2/{project_number}/items\"],\n listItemsForUser: [\n \"GET /users/{username}/projectsV2/{project_number}/items\",\n ],\n updateItemForOrg: [\n \"PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}\",\n ],\n updateItemForUser: [\n \"PATCH /users/{username}/projectsV2/{project_number}/items/{item_id}\",\n ],\n },\n pulls: {\n checkIfMerged: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n create: [\"POST /repos/{owner}/{repo}/pulls\"],\n createReplyForReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies\",\n ],\n createReview: [\"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n createReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments\",\n ],\n deletePendingReview: [\n \"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\",\n ],\n deleteReviewComment: [\n \"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}\",\n ],\n dismissReview: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals\",\n ],\n get: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}\"],\n getReview: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\",\n ],\n getReviewComment: [\"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}\"],\n list: [\"GET /repos/{owner}/{repo}/pulls\"],\n listCommentsForReview: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments\",\n ],\n listCommits: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits\"],\n listFiles: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/files\"],\n listRequestedReviewers: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\",\n ],\n listReviewComments: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments\",\n ],\n listReviewCommentsForRepo: [\"GET /repos/{owner}/{repo}/pulls/comments\"],\n listReviews: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n merge: [\"PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n removeRequestedReviewers: [\n \"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\",\n ],\n requestReviewers: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\",\n ],\n submitReview: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events\",\n ],\n update: [\"PATCH /repos/{owner}/{repo}/pulls/{pull_number}\"],\n updateBranch: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch\",\n ],\n updateReview: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\",\n ],\n updateReviewComment: [\n \"PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}\",\n ],\n },\n rateLimit: { get: [\"GET /rate_limit\"] },\n reactions: {\n createForCommitComment: [\n \"POST /repos/{owner}/{repo}/comments/{comment_id}/reactions\",\n ],\n createForIssue: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/reactions\",\n ],\n createForIssueComment: [\n \"POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\",\n ],\n createForPullRequestReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\",\n ],\n createForRelease: [\n \"POST /repos/{owner}/{repo}/releases/{release_id}/reactions\",\n ],\n createForTeamDiscussionCommentInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n ],\n createForTeamDiscussionInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\",\n ],\n deleteForCommitComment: [\n \"DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}\",\n ],\n deleteForIssue: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}\",\n ],\n deleteForIssueComment: [\n \"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}\",\n ],\n deleteForPullRequestComment: [\n \"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}\",\n ],\n deleteForRelease: [\n \"DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}\",\n ],\n deleteForTeamDiscussion: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}\",\n ],\n deleteForTeamDiscussionComment: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}\",\n ],\n listForCommitComment: [\n \"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions\",\n ],\n listForIssue: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions\"],\n listForIssueComment: [\n \"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\",\n ],\n listForPullRequestReviewComment: [\n \"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\",\n ],\n listForRelease: [\n \"GET /repos/{owner}/{repo}/releases/{release_id}/reactions\",\n ],\n listForTeamDiscussionCommentInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n ],\n listForTeamDiscussionInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\",\n ],\n },\n repos: {\n acceptInvitation: [\n \"PATCH /user/repository_invitations/{invitation_id}\",\n {},\n { renamed: [\"repos\", \"acceptInvitationForAuthenticatedUser\"] },\n ],\n acceptInvitationForAuthenticatedUser: [\n \"PATCH /user/repository_invitations/{invitation_id}\",\n ],\n addAppAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" },\n ],\n addCollaborator: [\"PUT /repos/{owner}/{repo}/collaborators/{username}\"],\n addStatusCheckContexts: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" },\n ],\n addTeamAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" },\n ],\n addUserAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" },\n ],\n cancelPagesDeployment: [\n \"POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel\",\n ],\n checkAutomatedSecurityFixes: [\n \"GET /repos/{owner}/{repo}/automated-security-fixes\",\n ],\n checkCollaborator: [\"GET /repos/{owner}/{repo}/collaborators/{username}\"],\n checkImmutableReleases: [\"GET /repos/{owner}/{repo}/immutable-releases\"],\n checkPrivateVulnerabilityReporting: [\n \"GET /repos/{owner}/{repo}/private-vulnerability-reporting\",\n ],\n checkVulnerabilityAlerts: [\n \"GET /repos/{owner}/{repo}/vulnerability-alerts\",\n ],\n codeownersErrors: [\"GET /repos/{owner}/{repo}/codeowners/errors\"],\n compareCommits: [\"GET /repos/{owner}/{repo}/compare/{base}...{head}\"],\n compareCommitsWithBasehead: [\n \"GET /repos/{owner}/{repo}/compare/{basehead}\",\n ],\n createAttestation: [\"POST /repos/{owner}/{repo}/attestations\"],\n createAutolink: [\"POST /repos/{owner}/{repo}/autolinks\"],\n createCommitComment: [\n \"POST /repos/{owner}/{repo}/commits/{commit_sha}/comments\",\n ],\n createCommitSignatureProtection: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\",\n ],\n createCommitStatus: [\"POST /repos/{owner}/{repo}/statuses/{sha}\"],\n createDeployKey: [\"POST /repos/{owner}/{repo}/keys\"],\n createDeployment: [\"POST /repos/{owner}/{repo}/deployments\"],\n createDeploymentBranchPolicy: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\",\n ],\n createDeploymentProtectionRule: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules\",\n ],\n createDeploymentStatus: [\n \"POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\",\n ],\n createDispatchEvent: [\"POST /repos/{owner}/{repo}/dispatches\"],\n createForAuthenticatedUser: [\"POST /user/repos\"],\n createFork: [\"POST /repos/{owner}/{repo}/forks\"],\n createInOrg: [\"POST /orgs/{org}/repos\"],\n createOrUpdateEnvironment: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}\",\n ],\n createOrUpdateFileContents: [\"PUT /repos/{owner}/{repo}/contents/{path}\"],\n createOrgRuleset: [\"POST /orgs/{org}/rulesets\"],\n createPagesDeployment: [\"POST /repos/{owner}/{repo}/pages/deployments\"],\n createPagesSite: [\"POST /repos/{owner}/{repo}/pages\"],\n createRelease: [\"POST /repos/{owner}/{repo}/releases\"],\n createRepoRuleset: [\"POST /repos/{owner}/{repo}/rulesets\"],\n createUsingTemplate: [\n \"POST /repos/{template_owner}/{template_repo}/generate\",\n ],\n createWebhook: [\"POST /repos/{owner}/{repo}/hooks\"],\n customPropertiesForReposCreateOrUpdateRepositoryValues: [\n \"PATCH /repos/{owner}/{repo}/properties/values\",\n ],\n customPropertiesForReposGetRepositoryValues: [\n \"GET /repos/{owner}/{repo}/properties/values\",\n ],\n declineInvitation: [\n \"DELETE /user/repository_invitations/{invitation_id}\",\n {},\n { renamed: [\"repos\", \"declineInvitationForAuthenticatedUser\"] },\n ],\n declineInvitationForAuthenticatedUser: [\n \"DELETE /user/repository_invitations/{invitation_id}\",\n ],\n delete: [\"DELETE /repos/{owner}/{repo}\"],\n deleteAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\",\n ],\n deleteAdminBranchProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\",\n ],\n deleteAnEnvironment: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}\",\n ],\n deleteAutolink: [\"DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}\"],\n deleteBranchProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection\",\n ],\n deleteCommitComment: [\"DELETE /repos/{owner}/{repo}/comments/{comment_id}\"],\n deleteCommitSignatureProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\",\n ],\n deleteDeployKey: [\"DELETE /repos/{owner}/{repo}/keys/{key_id}\"],\n deleteDeployment: [\n \"DELETE /repos/{owner}/{repo}/deployments/{deployment_id}\",\n ],\n deleteDeploymentBranchPolicy: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\",\n ],\n deleteFile: [\"DELETE /repos/{owner}/{repo}/contents/{path}\"],\n deleteInvitation: [\n \"DELETE /repos/{owner}/{repo}/invitations/{invitation_id}\",\n ],\n deleteOrgRuleset: [\"DELETE /orgs/{org}/rulesets/{ruleset_id}\"],\n deletePagesSite: [\"DELETE /repos/{owner}/{repo}/pages\"],\n deletePullRequestReviewProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\",\n ],\n deleteRelease: [\"DELETE /repos/{owner}/{repo}/releases/{release_id}\"],\n deleteReleaseAsset: [\n \"DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}\",\n ],\n deleteRepoRuleset: [\"DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n deleteWebhook: [\"DELETE /repos/{owner}/{repo}/hooks/{hook_id}\"],\n disableAutomatedSecurityFixes: [\n \"DELETE /repos/{owner}/{repo}/automated-security-fixes\",\n ],\n disableDeploymentProtectionRule: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}\",\n ],\n disableImmutableReleases: [\n \"DELETE /repos/{owner}/{repo}/immutable-releases\",\n ],\n disablePrivateVulnerabilityReporting: [\n \"DELETE /repos/{owner}/{repo}/private-vulnerability-reporting\",\n ],\n disableVulnerabilityAlerts: [\n \"DELETE /repos/{owner}/{repo}/vulnerability-alerts\",\n ],\n downloadArchive: [\n \"GET /repos/{owner}/{repo}/zipball/{ref}\",\n {},\n { renamed: [\"repos\", \"downloadZipballArchive\"] },\n ],\n downloadTarballArchive: [\"GET /repos/{owner}/{repo}/tarball/{ref}\"],\n downloadZipballArchive: [\"GET /repos/{owner}/{repo}/zipball/{ref}\"],\n enableAutomatedSecurityFixes: [\n \"PUT /repos/{owner}/{repo}/automated-security-fixes\",\n ],\n enableImmutableReleases: [\"PUT /repos/{owner}/{repo}/immutable-releases\"],\n enablePrivateVulnerabilityReporting: [\n \"PUT /repos/{owner}/{repo}/private-vulnerability-reporting\",\n ],\n enableVulnerabilityAlerts: [\n \"PUT /repos/{owner}/{repo}/vulnerability-alerts\",\n ],\n generateReleaseNotes: [\n \"POST /repos/{owner}/{repo}/releases/generate-notes\",\n ],\n get: [\"GET /repos/{owner}/{repo}\"],\n getAccessRestrictions: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\",\n ],\n getAdminBranchProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\",\n ],\n getAllDeploymentProtectionRules: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules\",\n ],\n getAllEnvironments: [\"GET /repos/{owner}/{repo}/environments\"],\n getAllStatusCheckContexts: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n ],\n getAllTopics: [\"GET /repos/{owner}/{repo}/topics\"],\n getAppsWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n ],\n getAutolink: [\"GET /repos/{owner}/{repo}/autolinks/{autolink_id}\"],\n getBranch: [\"GET /repos/{owner}/{repo}/branches/{branch}\"],\n getBranchProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection\",\n ],\n getBranchRules: [\"GET /repos/{owner}/{repo}/rules/branches/{branch}\"],\n getClones: [\"GET /repos/{owner}/{repo}/traffic/clones\"],\n getCodeFrequencyStats: [\"GET /repos/{owner}/{repo}/stats/code_frequency\"],\n getCollaboratorPermissionLevel: [\n \"GET /repos/{owner}/{repo}/collaborators/{username}/permission\",\n ],\n getCombinedStatusForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/status\"],\n getCommit: [\"GET /repos/{owner}/{repo}/commits/{ref}\"],\n getCommitActivityStats: [\"GET /repos/{owner}/{repo}/stats/commit_activity\"],\n getCommitComment: [\"GET /repos/{owner}/{repo}/comments/{comment_id}\"],\n getCommitSignatureProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\",\n ],\n getCommunityProfileMetrics: [\"GET /repos/{owner}/{repo}/community/profile\"],\n getContent: [\"GET /repos/{owner}/{repo}/contents/{path}\"],\n getContributorsStats: [\"GET /repos/{owner}/{repo}/stats/contributors\"],\n getCustomDeploymentProtectionRule: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}\",\n ],\n getDeployKey: [\"GET /repos/{owner}/{repo}/keys/{key_id}\"],\n getDeployment: [\"GET /repos/{owner}/{repo}/deployments/{deployment_id}\"],\n getDeploymentBranchPolicy: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\",\n ],\n getDeploymentStatus: [\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}\",\n ],\n getEnvironment: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}\",\n ],\n getLatestPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/latest\"],\n getLatestRelease: [\"GET /repos/{owner}/{repo}/releases/latest\"],\n getOrgRuleSuite: [\"GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}\"],\n getOrgRuleSuites: [\"GET /orgs/{org}/rulesets/rule-suites\"],\n getOrgRuleset: [\"GET /orgs/{org}/rulesets/{ruleset_id}\"],\n getOrgRulesets: [\"GET /orgs/{org}/rulesets\"],\n getPages: [\"GET /repos/{owner}/{repo}/pages\"],\n getPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/{build_id}\"],\n getPagesDeployment: [\n \"GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}\",\n ],\n getPagesHealthCheck: [\"GET /repos/{owner}/{repo}/pages/health\"],\n getParticipationStats: [\"GET /repos/{owner}/{repo}/stats/participation\"],\n getPullRequestReviewProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\",\n ],\n getPunchCardStats: [\"GET /repos/{owner}/{repo}/stats/punch_card\"],\n getReadme: [\"GET /repos/{owner}/{repo}/readme\"],\n getReadmeInDirectory: [\"GET /repos/{owner}/{repo}/readme/{dir}\"],\n getRelease: [\"GET /repos/{owner}/{repo}/releases/{release_id}\"],\n getReleaseAsset: [\"GET /repos/{owner}/{repo}/releases/assets/{asset_id}\"],\n getReleaseByTag: [\"GET /repos/{owner}/{repo}/releases/tags/{tag}\"],\n getRepoRuleSuite: [\n \"GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}\",\n ],\n getRepoRuleSuites: [\"GET /repos/{owner}/{repo}/rulesets/rule-suites\"],\n getRepoRuleset: [\"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n getRepoRulesetHistory: [\n \"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history\",\n ],\n getRepoRulesetVersion: [\n \"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}\",\n ],\n getRepoRulesets: [\"GET /repos/{owner}/{repo}/rulesets\"],\n getStatusChecksProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n ],\n getTeamsWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n ],\n getTopPaths: [\"GET /repos/{owner}/{repo}/traffic/popular/paths\"],\n getTopReferrers: [\"GET /repos/{owner}/{repo}/traffic/popular/referrers\"],\n getUsersWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n ],\n getViews: [\"GET /repos/{owner}/{repo}/traffic/views\"],\n getWebhook: [\"GET /repos/{owner}/{repo}/hooks/{hook_id}\"],\n getWebhookConfigForRepo: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/config\",\n ],\n getWebhookDelivery: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}\",\n ],\n listActivities: [\"GET /repos/{owner}/{repo}/activity\"],\n listAttestations: [\n \"GET /repos/{owner}/{repo}/attestations/{subject_digest}\",\n ],\n listAutolinks: [\"GET /repos/{owner}/{repo}/autolinks\"],\n listBranches: [\"GET /repos/{owner}/{repo}/branches\"],\n listBranchesForHeadCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head\",\n ],\n listCollaborators: [\"GET /repos/{owner}/{repo}/collaborators\"],\n listCommentsForCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments\",\n ],\n listCommitCommentsForRepo: [\"GET /repos/{owner}/{repo}/comments\"],\n listCommitStatusesForRef: [\n \"GET /repos/{owner}/{repo}/commits/{ref}/statuses\",\n ],\n listCommits: [\"GET /repos/{owner}/{repo}/commits\"],\n listContributors: [\"GET /repos/{owner}/{repo}/contributors\"],\n listCustomDeploymentRuleIntegrations: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps\",\n ],\n listDeployKeys: [\"GET /repos/{owner}/{repo}/keys\"],\n listDeploymentBranchPolicies: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\",\n ],\n listDeploymentStatuses: [\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\",\n ],\n listDeployments: [\"GET /repos/{owner}/{repo}/deployments\"],\n listForAuthenticatedUser: [\"GET /user/repos\"],\n listForOrg: [\"GET /orgs/{org}/repos\"],\n listForUser: [\"GET /users/{username}/repos\"],\n listForks: [\"GET /repos/{owner}/{repo}/forks\"],\n listInvitations: [\"GET /repos/{owner}/{repo}/invitations\"],\n listInvitationsForAuthenticatedUser: [\"GET /user/repository_invitations\"],\n listLanguages: [\"GET /repos/{owner}/{repo}/languages\"],\n listPagesBuilds: [\"GET /repos/{owner}/{repo}/pages/builds\"],\n listPublic: [\"GET /repositories\"],\n listPullRequestsAssociatedWithCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls\",\n ],\n listReleaseAssets: [\n \"GET /repos/{owner}/{repo}/releases/{release_id}/assets\",\n ],\n listReleases: [\"GET /repos/{owner}/{repo}/releases\"],\n listTags: [\"GET /repos/{owner}/{repo}/tags\"],\n listTeams: [\"GET /repos/{owner}/{repo}/teams\"],\n listWebhookDeliveries: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries\",\n ],\n listWebhooks: [\"GET /repos/{owner}/{repo}/hooks\"],\n merge: [\"POST /repos/{owner}/{repo}/merges\"],\n mergeUpstream: [\"POST /repos/{owner}/{repo}/merge-upstream\"],\n pingWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/pings\"],\n redeliverWebhookDelivery: [\n \"POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts\",\n ],\n removeAppAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" },\n ],\n removeCollaborator: [\n \"DELETE /repos/{owner}/{repo}/collaborators/{username}\",\n ],\n removeStatusCheckContexts: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" },\n ],\n removeStatusCheckProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n ],\n removeTeamAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" },\n ],\n removeUserAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" },\n ],\n renameBranch: [\"POST /repos/{owner}/{repo}/branches/{branch}/rename\"],\n replaceAllTopics: [\"PUT /repos/{owner}/{repo}/topics\"],\n requestPagesBuild: [\"POST /repos/{owner}/{repo}/pages/builds\"],\n setAdminBranchProtection: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\",\n ],\n setAppAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" },\n ],\n setStatusCheckContexts: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" },\n ],\n setTeamAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" },\n ],\n setUserAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" },\n ],\n testPushWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/tests\"],\n transfer: [\"POST /repos/{owner}/{repo}/transfer\"],\n update: [\"PATCH /repos/{owner}/{repo}\"],\n updateBranchProtection: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection\",\n ],\n updateCommitComment: [\"PATCH /repos/{owner}/{repo}/comments/{comment_id}\"],\n updateDeploymentBranchPolicy: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\",\n ],\n updateInformationAboutPagesSite: [\"PUT /repos/{owner}/{repo}/pages\"],\n updateInvitation: [\n \"PATCH /repos/{owner}/{repo}/invitations/{invitation_id}\",\n ],\n updateOrgRuleset: [\"PUT /orgs/{org}/rulesets/{ruleset_id}\"],\n updatePullRequestReviewProtection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\",\n ],\n updateRelease: [\"PATCH /repos/{owner}/{repo}/releases/{release_id}\"],\n updateReleaseAsset: [\n \"PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}\",\n ],\n updateRepoRuleset: [\"PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n updateStatusCheckPotection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n {},\n { renamed: [\"repos\", \"updateStatusCheckProtection\"] },\n ],\n updateStatusCheckProtection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n ],\n updateWebhook: [\"PATCH /repos/{owner}/{repo}/hooks/{hook_id}\"],\n updateWebhookConfigForRepo: [\n \"PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config\",\n ],\n uploadReleaseAsset: [\n \"POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}\",\n { baseUrl: \"https://uploads.github.com\" },\n ],\n },\n search: {\n code: [\"GET /search/code\"],\n commits: [\"GET /search/commits\"],\n issuesAndPullRequests: [\"GET /search/issues\"],\n labels: [\"GET /search/labels\"],\n repos: [\"GET /search/repositories\"],\n topics: [\"GET /search/topics\"],\n users: [\"GET /search/users\"],\n },\n secretScanning: {\n createPushProtectionBypass: [\n \"POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses\",\n ],\n getAlert: [\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}\",\n ],\n getScanHistory: [\"GET /repos/{owner}/{repo}/secret-scanning/scan-history\"],\n listAlertsForOrg: [\"GET /orgs/{org}/secret-scanning/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/secret-scanning/alerts\"],\n listLocationsForAlert: [\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations\",\n ],\n listOrgPatternConfigs: [\n \"GET /orgs/{org}/secret-scanning/pattern-configurations\",\n ],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}\",\n ],\n updateOrgPatternConfigs: [\n \"PATCH /orgs/{org}/secret-scanning/pattern-configurations\",\n ],\n },\n securityAdvisories: {\n createFork: [\n \"POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks\",\n ],\n createPrivateVulnerabilityReport: [\n \"POST /repos/{owner}/{repo}/security-advisories/reports\",\n ],\n createRepositoryAdvisory: [\n \"POST /repos/{owner}/{repo}/security-advisories\",\n ],\n createRepositoryAdvisoryCveRequest: [\n \"POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve\",\n ],\n getGlobalAdvisory: [\"GET /advisories/{ghsa_id}\"],\n getRepositoryAdvisory: [\n \"GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}\",\n ],\n listGlobalAdvisories: [\"GET /advisories\"],\n listOrgRepositoryAdvisories: [\"GET /orgs/{org}/security-advisories\"],\n listRepositoryAdvisories: [\"GET /repos/{owner}/{repo}/security-advisories\"],\n updateRepositoryAdvisory: [\n \"PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}\",\n ],\n },\n teams: {\n addOrUpdateMembershipForUserInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/memberships/{username}\",\n ],\n addOrUpdateRepoPermissionsInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\",\n ],\n checkPermissionsForRepoInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\",\n ],\n create: [\"POST /orgs/{org}/teams\"],\n createDiscussionCommentInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\",\n ],\n createDiscussionInOrg: [\"POST /orgs/{org}/teams/{team_slug}/discussions\"],\n deleteDiscussionCommentInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\",\n ],\n deleteDiscussionInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\",\n ],\n deleteInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}\"],\n getByName: [\"GET /orgs/{org}/teams/{team_slug}\"],\n getDiscussionCommentInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\",\n ],\n getDiscussionInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\",\n ],\n getMembershipForUserInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/memberships/{username}\",\n ],\n list: [\"GET /orgs/{org}/teams\"],\n listChildInOrg: [\"GET /orgs/{org}/teams/{team_slug}/teams\"],\n listDiscussionCommentsInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\",\n ],\n listDiscussionsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions\"],\n listForAuthenticatedUser: [\"GET /user/teams\"],\n listMembersInOrg: [\"GET /orgs/{org}/teams/{team_slug}/members\"],\n listPendingInvitationsInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/invitations\",\n ],\n listReposInOrg: [\"GET /orgs/{org}/teams/{team_slug}/repos\"],\n removeMembershipForUserInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}\",\n ],\n removeRepoInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\",\n ],\n updateDiscussionCommentInOrg: [\n \"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\",\n ],\n updateDiscussionInOrg: [\n \"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\",\n ],\n updateInOrg: [\"PATCH /orgs/{org}/teams/{team_slug}\"],\n },\n users: {\n addEmailForAuthenticated: [\n \"POST /user/emails\",\n {},\n { renamed: [\"users\", \"addEmailForAuthenticatedUser\"] },\n ],\n addEmailForAuthenticatedUser: [\"POST /user/emails\"],\n addSocialAccountForAuthenticatedUser: [\"POST /user/social_accounts\"],\n block: [\"PUT /user/blocks/{username}\"],\n checkBlocked: [\"GET /user/blocks/{username}\"],\n checkFollowingForUser: [\"GET /users/{username}/following/{target_user}\"],\n checkPersonIsFollowedByAuthenticated: [\"GET /user/following/{username}\"],\n createGpgKeyForAuthenticated: [\n \"POST /user/gpg_keys\",\n {},\n { renamed: [\"users\", \"createGpgKeyForAuthenticatedUser\"] },\n ],\n createGpgKeyForAuthenticatedUser: [\"POST /user/gpg_keys\"],\n createPublicSshKeyForAuthenticated: [\n \"POST /user/keys\",\n {},\n { renamed: [\"users\", \"createPublicSshKeyForAuthenticatedUser\"] },\n ],\n createPublicSshKeyForAuthenticatedUser: [\"POST /user/keys\"],\n createSshSigningKeyForAuthenticatedUser: [\"POST /user/ssh_signing_keys\"],\n deleteAttestationsBulk: [\n \"POST /users/{username}/attestations/delete-request\",\n ],\n deleteAttestationsById: [\n \"DELETE /users/{username}/attestations/{attestation_id}\",\n ],\n deleteAttestationsBySubjectDigest: [\n \"DELETE /users/{username}/attestations/digest/{subject_digest}\",\n ],\n deleteEmailForAuthenticated: [\n \"DELETE /user/emails\",\n {},\n { renamed: [\"users\", \"deleteEmailForAuthenticatedUser\"] },\n ],\n deleteEmailForAuthenticatedUser: [\"DELETE /user/emails\"],\n deleteGpgKeyForAuthenticated: [\n \"DELETE /user/gpg_keys/{gpg_key_id}\",\n {},\n { renamed: [\"users\", \"deleteGpgKeyForAuthenticatedUser\"] },\n ],\n deleteGpgKeyForAuthenticatedUser: [\"DELETE /user/gpg_keys/{gpg_key_id}\"],\n deletePublicSshKeyForAuthenticated: [\n \"DELETE /user/keys/{key_id}\",\n {},\n { renamed: [\"users\", \"deletePublicSshKeyForAuthenticatedUser\"] },\n ],\n deletePublicSshKeyForAuthenticatedUser: [\"DELETE /user/keys/{key_id}\"],\n deleteSocialAccountForAuthenticatedUser: [\"DELETE /user/social_accounts\"],\n deleteSshSigningKeyForAuthenticatedUser: [\n \"DELETE /user/ssh_signing_keys/{ssh_signing_key_id}\",\n ],\n follow: [\"PUT /user/following/{username}\"],\n getAuthenticated: [\"GET /user\"],\n getById: [\"GET /user/{account_id}\"],\n getByUsername: [\"GET /users/{username}\"],\n getContextForUser: [\"GET /users/{username}/hovercard\"],\n getGpgKeyForAuthenticated: [\n \"GET /user/gpg_keys/{gpg_key_id}\",\n {},\n { renamed: [\"users\", \"getGpgKeyForAuthenticatedUser\"] },\n ],\n getGpgKeyForAuthenticatedUser: [\"GET /user/gpg_keys/{gpg_key_id}\"],\n getPublicSshKeyForAuthenticated: [\n \"GET /user/keys/{key_id}\",\n {},\n { renamed: [\"users\", \"getPublicSshKeyForAuthenticatedUser\"] },\n ],\n getPublicSshKeyForAuthenticatedUser: [\"GET /user/keys/{key_id}\"],\n getSshSigningKeyForAuthenticatedUser: [\n \"GET /user/ssh_signing_keys/{ssh_signing_key_id}\",\n ],\n list: [\"GET /users\"],\n listAttestations: [\"GET /users/{username}/attestations/{subject_digest}\"],\n listAttestationsBulk: [\n \"POST /users/{username}/attestations/bulk-list{?per_page,before,after}\",\n ],\n listBlockedByAuthenticated: [\n \"GET /user/blocks\",\n {},\n { renamed: [\"users\", \"listBlockedByAuthenticatedUser\"] },\n ],\n listBlockedByAuthenticatedUser: [\"GET /user/blocks\"],\n listEmailsForAuthenticated: [\n \"GET /user/emails\",\n {},\n { renamed: [\"users\", \"listEmailsForAuthenticatedUser\"] },\n ],\n listEmailsForAuthenticatedUser: [\"GET /user/emails\"],\n listFollowedByAuthenticated: [\n \"GET /user/following\",\n {},\n { renamed: [\"users\", \"listFollowedByAuthenticatedUser\"] },\n ],\n listFollowedByAuthenticatedUser: [\"GET /user/following\"],\n listFollowersForAuthenticatedUser: [\"GET /user/followers\"],\n listFollowersForUser: [\"GET /users/{username}/followers\"],\n listFollowingForUser: [\"GET /users/{username}/following\"],\n listGpgKeysForAuthenticated: [\n \"GET /user/gpg_keys\",\n {},\n { renamed: [\"users\", \"listGpgKeysForAuthenticatedUser\"] },\n ],\n listGpgKeysForAuthenticatedUser: [\"GET /user/gpg_keys\"],\n listGpgKeysForUser: [\"GET /users/{username}/gpg_keys\"],\n listPublicEmailsForAuthenticated: [\n \"GET /user/public_emails\",\n {},\n { renamed: [\"users\", \"listPublicEmailsForAuthenticatedUser\"] },\n ],\n listPublicEmailsForAuthenticatedUser: [\"GET /user/public_emails\"],\n listPublicKeysForUser: [\"GET /users/{username}/keys\"],\n listPublicSshKeysForAuthenticated: [\n \"GET /user/keys\",\n {},\n { renamed: [\"users\", \"listPublicSshKeysForAuthenticatedUser\"] },\n ],\n listPublicSshKeysForAuthenticatedUser: [\"GET /user/keys\"],\n listSocialAccountsForAuthenticatedUser: [\"GET /user/social_accounts\"],\n listSocialAccountsForUser: [\"GET /users/{username}/social_accounts\"],\n listSshSigningKeysForAuthenticatedUser: [\"GET /user/ssh_signing_keys\"],\n listSshSigningKeysForUser: [\"GET /users/{username}/ssh_signing_keys\"],\n setPrimaryEmailVisibilityForAuthenticated: [\n \"PATCH /user/email/visibility\",\n {},\n { renamed: [\"users\", \"setPrimaryEmailVisibilityForAuthenticatedUser\"] },\n ],\n setPrimaryEmailVisibilityForAuthenticatedUser: [\n \"PATCH /user/email/visibility\",\n ],\n unblock: [\"DELETE /user/blocks/{username}\"],\n unfollow: [\"DELETE /user/following/{username}\"],\n updateAuthenticated: [\"PATCH /user\"],\n },\n};\n\nexport default Endpoints;\n", "import type { Octokit } from \"@octokit/core\";\nimport type { EndpointOptions, RequestParameters, Route } from \"@octokit/types\";\nimport ENDPOINTS from \"./generated/endpoints.js\";\nimport type { RestEndpointMethods } from \"./generated/method-types.js\";\nimport type { EndpointDecorations } from \"./types.js\";\n\n// The following code was refactored in: https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/622\n// to optimise the runtime performance of Octokit initialization.\n//\n// This optimization involves two key changes:\n// 1. Pre-Computation: The endpoint methods are pre-computed once at module load\n// time instead of each invocation of `endpointsToMethods()`.\n// 2. Lazy initialization and caching: We use a Proxy for each scope to only\n// initialize methods that are actually called. This reduces runtime overhead\n// as the initialization involves deep merging of objects. The initialized\n// methods are then cached for future use.\n\nconst endpointMethodsMap = new Map();\nfor (const [scope, endpoints] of Object.entries(ENDPOINTS)) {\n for (const [methodName, endpoint] of Object.entries(endpoints)) {\n const [route, defaults, decorations] = endpoint;\n const [method, url] = route.split(/ /);\n const endpointDefaults = Object.assign(\n {\n method,\n url,\n },\n defaults,\n );\n\n if (!endpointMethodsMap.has(scope)) {\n endpointMethodsMap.set(scope, new Map());\n }\n\n endpointMethodsMap.get(scope).set(methodName, {\n scope,\n methodName,\n endpointDefaults,\n decorations,\n });\n }\n}\n\ntype ProxyTarget = {\n octokit: Octokit;\n scope: string;\n cache: Record any>;\n};\n\nconst handler = {\n has({ scope }: ProxyTarget, methodName: string) {\n return endpointMethodsMap.get(scope).has(methodName);\n },\n getOwnPropertyDescriptor(target: ProxyTarget, methodName: string) {\n return {\n value: this.get(target, methodName), // ensures method is in the cache\n configurable: true,\n writable: true,\n enumerable: true,\n };\n },\n defineProperty(\n target: ProxyTarget,\n methodName: string,\n descriptor: PropertyDescriptor,\n ) {\n Object.defineProperty(target.cache, methodName, descriptor);\n return true;\n },\n deleteProperty(target: ProxyTarget, methodName: string) {\n delete target.cache[methodName];\n return true;\n },\n ownKeys({ scope }: ProxyTarget) {\n return [...endpointMethodsMap.get(scope).keys()];\n },\n set(target: ProxyTarget, methodName: string, value: any) {\n return (target.cache[methodName] = value);\n },\n get({ octokit, scope, cache }: ProxyTarget, methodName: string) {\n if (cache[methodName]) {\n return cache[methodName];\n }\n\n const method = endpointMethodsMap.get(scope).get(methodName);\n if (!method) {\n return undefined;\n }\n\n const { endpointDefaults, decorations } = method;\n\n if (decorations) {\n cache[methodName] = decorate(\n octokit,\n scope,\n methodName,\n endpointDefaults,\n decorations,\n );\n } else {\n cache[methodName] = octokit.request.defaults(endpointDefaults);\n }\n\n return cache[methodName];\n },\n};\n\nexport function endpointsToMethods(octokit: Octokit): RestEndpointMethods {\n const newMethods = {} as { [key: string]: object };\n\n for (const scope of endpointMethodsMap.keys()) {\n newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler);\n }\n\n return newMethods as RestEndpointMethods;\n}\n\nfunction decorate(\n octokit: Octokit,\n scope: string,\n methodName: string,\n defaults: EndpointOptions,\n decorations: EndpointDecorations,\n) {\n const requestWithDefaults = octokit.request.defaults(defaults);\n\n /* istanbul ignore next */\n function withDecorations(\n ...args: [Route, RequestParameters?] | [EndpointOptions]\n ) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n let options = requestWithDefaults.endpoint.merge(...args);\n\n // There are currently no other decorations than `.mapToData`\n if (decorations.mapToData) {\n options = Object.assign({}, options, {\n data: options[decorations.mapToData],\n [decorations.mapToData]: undefined,\n });\n return requestWithDefaults(options);\n }\n\n if (decorations.renamed) {\n const [newScope, newMethodName] = decorations.renamed;\n octokit.log.warn(\n `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`,\n );\n }\n if (decorations.deprecated) {\n octokit.log.warn(decorations.deprecated);\n }\n\n if (decorations.renamedParameters) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n const options = requestWithDefaults.endpoint.merge(...args);\n\n for (const [name, alias] of Object.entries(\n decorations.renamedParameters,\n )) {\n if (name in options) {\n octokit.log.warn(\n `\"${name}\" parameter is deprecated for \"octokit.${scope}.${methodName}()\". Use \"${alias}\" instead`,\n );\n if (!(alias in options)) {\n options[alias] = options[name];\n }\n delete options[name];\n }\n }\n return requestWithDefaults(options);\n }\n\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n return requestWithDefaults(...args);\n }\n return Object.assign(withDecorations, requestWithDefaults);\n}\n", "import type { Octokit } from \"@octokit/core\";\n\nexport type { RestEndpointMethodTypes } from \"./generated/parameters-and-response-types.js\";\nimport { VERSION } from \"./version.js\";\nimport type { Api } from \"./types.js\";\nimport { endpointsToMethods } from \"./endpoints-to-methods.js\";\n\n// Export the type for downstream users in order to fix a TypeScript error\n// The inferred type of 'Octokit' cannot be named without a reference to '../node_modules/@octokit/plugin-rest-endpoint-methods/dist-types/types.js'. This is likely not portable. A type annotation is necessary.\nexport type { Api };\n\nexport function restEndpointMethods(octokit: Octokit): Api {\n const api = endpointsToMethods(octokit);\n return {\n rest: api,\n };\n}\nrestEndpointMethods.VERSION = VERSION;\n\nexport function legacyRestEndpointMethods(octokit: Octokit): Api[\"rest\"] & Api {\n const api = endpointsToMethods(octokit);\n return {\n ...api,\n rest: api,\n };\n}\nlegacyRestEndpointMethods.VERSION = VERSION;\n", "const VERSION = \"22.0.1\";\nexport {\n VERSION\n};\n", "import { Octokit as Core } from \"@octokit/core\";\nimport { requestLog } from \"@octokit/plugin-request-log\";\nimport {\n paginateRest\n} from \"@octokit/plugin-paginate-rest\";\nimport { legacyRestEndpointMethods } from \"@octokit/plugin-rest-endpoint-methods\";\nimport { VERSION } from \"./version.js\";\nconst Octokit = Core.plugin(requestLog, legacyRestEndpointMethods, paginateRest).defaults(\n {\n userAgent: `octokit-rest.js/${VERSION}`\n }\n);\nexport {\n Octokit\n};\n", "import * as vscode from \"vscode\";\nimport { generateConfigs, analyzeRepo } from \"../services.js\";\nimport { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from \"./analyze.js\";\n\nconst GENERATE_OPTIONS = [\n { label: \"MCP Config\", value: \"mcp\", description: \".vscode/mcp.json\" },\n { label: \"VS Code Settings\", value: \"vscode\", description: \".vscode/settings.json\" },\n] as const;\n\nexport async function generateCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const picked = await vscode.window.showQuickPick(\n GENERATE_OPTIONS.map((o) => ({ label: o.label, description: o.description, value: o.value })),\n { placeHolder: \"Select config type to generate\" },\n );\n if (!picked) return;\n\n let analysis = getCachedAnalysis();\n\n const result = await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: `Primer: Generating ${picked.label}\u2026` },\n async () => {\n try {\n if (!analysis) {\n analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n }\n\n return await generateConfigs({\n repoPath: workspacePath,\n analysis,\n selections: [picked.value],\n force: false,\n });\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Config generation failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n return undefined;\n }\n },\n );\n\n if (!result) return;\n\n const wrote = result.files.filter((f) => f.action === \"wrote\");\n const skipped = result.files.filter((f) => f.action === \"skipped\");\n\n if (wrote.length > 0) {\n const openAction = \"Open File\";\n const msg = `Generated ${wrote.map((f) => f.path).join(\", \")}${skipped.length ? ` (${skipped.length} skipped)` : \"\"}`;\n const action = await vscode.window.showInformationMessage(`Primer: ${msg}`, openAction);\n if (action === openAction && wrote[0]) {\n const doc = await vscode.workspace.openTextDocument(wrote[0].path);\n await vscode.window.showTextDocument(doc);\n }\n } else if (skipped.length > 0) {\n const overwrite = \"Overwrite\";\n const action = await vscode.window.showWarningMessage(\n \"Primer: All config files already exist.\",\n overwrite,\n );\n if (action === overwrite) {\n await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: `Primer: Overwriting ${picked.label}\u2026` },\n async () => {\n const forceResult = await generateConfigs({\n repoPath: workspacePath,\n analysis: analysis!,\n selections: [picked.value],\n force: true,\n });\n const forceWrote = forceResult.files.filter((f) => f.action === \"wrote\");\n if (forceWrote.length > 0) {\n const doc = await vscode.workspace.openTextDocument(forceWrote[0]!.path);\n await vscode.window.showTextDocument(doc);\n }\n },\n );\n }\n }\n}\n", "import * as vscode from \"vscode\";\nimport { generateCopilotInstructions, generateAreaInstructions, analyzeRepo } from \"../services.js\";\nimport { VscodeProgressReporter } from \"../progress.js\";\nimport { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from \"./analyze.js\";\n\nexport async function instructionsCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const model = vscode.workspace.getConfiguration(\"primer\").get(\"model\");\n\n // Ensure analysis is available before starting progress\n let analysis = getCachedAnalysis();\n if (!analysis) {\n await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: \"Primer: Analyzing repository\u2026\" },\n async () => {\n analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis!);\n },\n );\n }\n if (!analysis) return;\n\n // Collect area selections before starting generation progress\n let selectedAreas: typeof analysis.areas = undefined;\n if (analysis.areas && analysis.areas.length > 0) {\n const picked = await vscode.window.showQuickPick(\n analysis.areas.map((a) => ({ label: a.name, description: a.description, area: a })),\n { placeHolder: \"Select areas for instructions (or Escape for root only)\", canPickMany: true },\n );\n if (picked && picked.length > 0) {\n selectedAreas = picked.map((p) => p.area);\n }\n }\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Generating Copilot instructions\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n reporter.update(\"Generating root instructions\u2026\");\n await generateCopilotInstructions({\n repoPath: workspacePath,\n model,\n onProgress: (msg) => reporter.update(msg),\n });\n\n if (selectedAreas) {\n for (const area of selectedAreas) {\n reporter.update(`Generating instructions for ${area.name}\u2026`);\n await generateAreaInstructions({\n repoPath: workspacePath,\n area,\n model,\n onProgress: (msg) => reporter.update(msg),\n });\n }\n }\n\n reporter.succeed(\"Instructions generated.\");\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Instruction generation failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import type * as vscode from \"vscode\";\nimport type { ProgressReporter } from \"primer/utils/output.js\";\n\n/**\n * Adapts VS Code's `Progress<{ message, increment }>` to Primer's `ProgressReporter` interface.\n */\nexport class VscodeProgressReporter implements ProgressReporter {\n constructor(\n private readonly progress: vscode.Progress<{ message?: string; increment?: number }>,\n ) {}\n\n update(message: string): void {\n this.progress.report({ message });\n }\n\n succeed(message: string): void {\n this.progress.report({ message: `$(check) ${message}` });\n }\n\n fail(message: string): void {\n this.progress.report({ message: `$(error) ${message}` });\n }\n\n done(): void {\n // VS Code progress auto-closes when the withProgress callback resolves\n }\n}\n", "import * as vscode from \"vscode\";\nimport { runReadinessReport, generateVisualReport, analyzeRepo } from \"../services.js\";\nimport { VscodeProgressReporter } from \"../progress.js\";\nimport { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from \"./analyze.js\";\nimport { createWebviewPanel } from \"../webview.js\";\nimport { readinessTreeProvider } from \"../views/providers.js\";\n\nexport async function readinessCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Running readiness assessment\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n let analysis = getCachedAnalysis();\n if (!analysis) {\n reporter.update(\"Analyzing repository\u2026\");\n analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n }\n\n reporter.update(\"Evaluating readiness pillars\u2026\");\n const report = await runReadinessReport({ repoPath: workspacePath });\n\n reporter.update(\"Generating report\u2026\");\n const repoName = vscode.workspace.workspaceFolders?.[0]?.name ?? \"Repository\";\n const html = generateVisualReport({\n reports: [{ repo: repoName, report }],\n title: `${repoName} \u2014 AI Readiness`,\n });\n\n createWebviewPanel(\"primer.readinessReport\", \"AI Readiness Report\", html);\n readinessTreeProvider.setReport(report);\n reporter.succeed(`Readiness: Level ${report.achievedLevel} achieved.`);\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Readiness assessment failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import * as vscode from \"vscode\";\n\nconst panels = new Map();\n\n/**\n * Create or reuse a webview panel to display HTML content.\n */\nexport function createWebviewPanel(id: string, title: string, html: string): vscode.WebviewPanel {\n const existing = panels.get(id);\n if (existing) {\n existing.webview.html = html;\n existing.reveal();\n return existing;\n }\n\n const panel = vscode.window.createWebviewPanel(id, title, vscode.ViewColumn.One, {\n enableScripts: true,\n localResourceRoots: [],\n });\n\n panel.webview.html = html;\n panel.onDidDispose(() => panels.delete(id));\n panels.set(id, panel);\n return panel;\n}\n", "import * as vscode from \"vscode\";\nimport type { RepoAnalysis } from \"../types.js\";\nimport { getCachedAnalysis } from \"../commands/analyze.js\";\n\nexport class AnalysisTreeProvider implements vscode.TreeDataProvider {\n private _onDidChangeTreeData = new vscode.EventEmitter();\n readonly onDidChangeTreeData = this._onDidChangeTreeData.event;\n\n refresh(): void {\n this._onDidChangeTreeData.fire(undefined);\n }\n\n getTreeItem(element: AnalysisItem): vscode.TreeItem {\n return element;\n }\n\n getChildren(element?: AnalysisItem): AnalysisItem[] {\n if (element) return element.children ?? [];\n const analysis = getCachedAnalysis();\n if (!analysis) return [];\n return this.getRootItems(analysis);\n }\n\n private getRootItems(analysis: RepoAnalysis): AnalysisItem[] {\n const items: AnalysisItem[] = [];\n\n if (analysis.languages.length > 0) {\n const langs = new AnalysisItem(\n \"Languages\",\n vscode.TreeItemCollapsibleState.Expanded,\n analysis.languages.map((l) => {\n const item = new AnalysisItem(l, vscode.TreeItemCollapsibleState.None);\n item.contextValue = \"language\";\n return item;\n }),\n );\n langs.iconPath = new vscode.ThemeIcon(\"code\");\n langs.description = `${analysis.languages.length}`;\n langs.contextValue = \"category\";\n items.push(langs);\n }\n\n if (analysis.frameworks.length > 0) {\n const frameworks = new AnalysisItem(\n \"Frameworks\",\n vscode.TreeItemCollapsibleState.Expanded,\n analysis.frameworks.map((f) => {\n const item = new AnalysisItem(f, vscode.TreeItemCollapsibleState.None);\n item.contextValue = \"framework\";\n return item;\n }),\n );\n frameworks.iconPath = new vscode.ThemeIcon(\"extensions\");\n frameworks.description = `${analysis.frameworks.length}`;\n frameworks.contextValue = \"category\";\n items.push(frameworks);\n }\n\n if (analysis.isMonorepo && analysis.areas) {\n const areas = new AnalysisItem(\n \"Monorepo\",\n vscode.TreeItemCollapsibleState.Expanded,\n analysis.areas.map((a) => {\n const item = new AnalysisItem(a.name, vscode.TreeItemCollapsibleState.None);\n item.description = typeof a.applyTo === \"string\" ? a.applyTo : a.applyTo.join(\", \");\n item.iconPath = new vscode.ThemeIcon(\"folder\");\n item.contextValue = \"area\";\n const md = new vscode.MarkdownString();\n md.appendMarkdown(`**${a.name}**`);\n if (a.description) md.appendMarkdown(`\\n\\n${a.description}`);\n md.appendMarkdown(`\\n\\nGlobs: \\`${typeof a.applyTo === \"string\" ? a.applyTo : a.applyTo.join(\"\\`, \\`\")}\\``);\n item.tooltip = md;\n return item;\n }),\n );\n areas.iconPath = new vscode.ThemeIcon(\"folder-library\");\n areas.description = analysis.workspaceType ?? undefined;\n areas.contextValue = \"category\";\n items.push(areas);\n }\n\n if (analysis.packageManager) {\n const pm = new AnalysisItem(\n \"Package Manager\",\n vscode.TreeItemCollapsibleState.None,\n );\n pm.description = analysis.packageManager;\n pm.iconPath = new vscode.ThemeIcon(\"package\");\n pm.contextValue = \"info\";\n items.push(pm);\n }\n\n return items;\n }\n}\n\nclass AnalysisItem extends vscode.TreeItem {\n constructor(\n label: string,\n collapsibleState: vscode.TreeItemCollapsibleState,\n public readonly children?: AnalysisItem[],\n ) {\n super(label, collapsibleState);\n }\n}\n", "import * as vscode from \"vscode\";\nimport type { ReadinessReport, ReadinessPillarSummary, ReadinessCriterionResult } from \"../types.js\";\n\nexport class ReadinessTreeProvider implements vscode.TreeDataProvider {\n private _onDidChangeTreeData = new vscode.EventEmitter();\n readonly onDidChangeTreeData = this._onDidChangeTreeData.event;\n\n private report: ReadinessReport | undefined;\n\n setReport(report: ReadinessReport): void {\n this.report = report;\n this._onDidChangeTreeData.fire(undefined);\n }\n\n getReport(): ReadinessReport | undefined {\n return this.report;\n }\n\n refresh(): void {\n this._onDidChangeTreeData.fire(undefined);\n }\n\n getTreeItem(element: ReadinessItem): vscode.TreeItem {\n return element;\n }\n\n getChildren(element?: ReadinessItem): ReadinessItem[] {\n if (element) return element.children ?? [];\n if (!this.report) return [];\n return this.getRootItems(this.report);\n }\n\n private getRootItems(report: ReadinessReport): ReadinessItem[] {\n const items: ReadinessItem[] = [];\n\n const levelInfo = report.levels.find((l) => l.level === report.achievedLevel);\n const level = new ReadinessItem(\n levelInfo?.name ?? `Level ${report.achievedLevel}`,\n vscode.TreeItemCollapsibleState.None,\n );\n level.description = `Level ${report.achievedLevel}`;\n level.iconPath = new vscode.ThemeIcon(\n report.achievedLevel >= 3 ? \"pass\" : \"warning\",\n new vscode.ThemeColor(report.achievedLevel >= 3 ? \"testing.iconPassed\" : \"problemsWarningIcon.foreground\"),\n );\n level.contextValue = \"level\";\n items.push(level);\n\n for (const pillar of report.pillars) {\n const criteria = report.criteria.filter((c) => c.pillar === pillar.id);\n items.push(this.createPillarItem(pillar, criteria));\n }\n\n return items;\n }\n\n private createPillarItem(pillar: ReadinessPillarSummary, criteria: ReadinessCriterionResult[]): ReadinessItem {\n const pct = Math.round(pillar.passRate * 100);\n const item = new ReadinessItem(\n pillar.name,\n criteria.length > 0 ? vscode.TreeItemCollapsibleState.Collapsed : vscode.TreeItemCollapsibleState.None,\n criteria.map((c) => {\n const ci = new ReadinessItem(c.title, vscode.TreeItemCollapsibleState.None);\n ci.iconPath = new vscode.ThemeIcon(\n c.status === \"pass\" ? \"pass\" : c.status === \"fail\" ? \"error\" : \"circle-outline\",\n c.status === \"pass\"\n ? new vscode.ThemeColor(\"testing.iconPassed\")\n : c.status === \"fail\"\n ? new vscode.ThemeColor(\"testing.iconFailed\")\n : undefined,\n );\n ci.description = c.reason;\n ci.contextValue = `criterion.${c.status}`;\n const md = new vscode.MarkdownString();\n md.appendMarkdown(`**${c.title}**\\n\\n`);\n if (c.reason) md.appendMarkdown(`${c.reason}\\n\\n`);\n if (c.evidence && c.evidence.length > 0) {\n md.appendMarkdown(\"**Evidence:**\\n\");\n for (const e of c.evidence) {\n md.appendMarkdown(`- ${e}\\n`);\n }\n }\n ci.tooltip = md;\n return ci;\n }),\n );\n item.iconPath = new vscode.ThemeIcon(\n pct === 100 ? \"pass\" : pct >= 50 ? \"warning\" : \"error\",\n pct === 100\n ? new vscode.ThemeColor(\"testing.iconPassed\")\n : pct >= 50\n ? new vscode.ThemeColor(\"problemsWarningIcon.foreground\")\n : new vscode.ThemeColor(\"testing.iconFailed\"),\n );\n item.description = `${pillar.passed}/${pillar.total} (${pct}%)`;\n item.contextValue = \"pillar\";\n return item;\n }\n}\n\nclass ReadinessItem extends vscode.TreeItem {\n constructor(\n label: string,\n collapsibleState: vscode.TreeItemCollapsibleState,\n public readonly children?: ReadinessItem[],\n ) {\n super(label, collapsibleState);\n }\n}\n", "import { AnalysisTreeProvider } from \"./AnalysisTreeProvider.js\";\nimport { ReadinessTreeProvider } from \"./ReadinessTreeProvider.js\";\n\nexport const analysisTreeProvider = new AnalysisTreeProvider();\nexport const readinessTreeProvider = new ReadinessTreeProvider();\n", "import * as vscode from \"vscode\";\nimport path from \"node:path\";\nimport { runEval, generateEvalScaffold, analyzeRepo, safeWriteFile } from \"../services.js\";\nimport { VscodeProgressReporter } from \"../progress.js\";\nimport { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from \"./analyze.js\";\nimport { createWebviewPanel } from \"../webview.js\";\nimport fs from \"node:fs\";\n\nexport async function evalCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const configPath = path.join(workspacePath, \"primer.eval.json\");\n if (!fs.existsSync(configPath)) {\n const action = await vscode.window.showWarningMessage(\n \"Primer: No primer.eval.json found. Create one?\",\n \"Scaffold\",\n \"Cancel\",\n );\n if (action === \"Scaffold\") {\n await evalInitCommand();\n }\n return;\n }\n\n const config = vscode.workspace.getConfiguration(\"primer\");\n const model = config.get(\"model\") ?? \"claude-sonnet-4.5\";\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Running eval\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n reporter.update(\"Running evaluation\u2026\");\n const result = await runEval({\n configPath,\n repoPath: workspacePath,\n model,\n judgeModel: model,\n onProgress: (msg) => reporter.update(msg),\n });\n\n reporter.succeed(`Eval complete. ${result.summary}`);\n\n if (result.viewerPath && fs.existsSync(result.viewerPath)) {\n const html = fs.readFileSync(result.viewerPath, \"utf-8\");\n createWebviewPanel(\"primer.evalResults\", \"Eval Results\", html);\n }\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Eval failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n\nexport async function evalInitCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const config = vscode.workspace.getConfiguration(\"primer\");\n const model = config.get(\"model\");\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Scaffolding eval config\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n let analysis = getCachedAnalysis();\n if (!analysis) {\n reporter.update(\"Analyzing repository\u2026\");\n analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n }\n\n reporter.update(\"Generating eval cases\u2026\");\n const evalConfig = await generateEvalScaffold({\n repoPath: workspacePath,\n count: 5,\n model,\n areas: analysis.areas,\n onProgress: (msg) => reporter.update(msg),\n });\n\n const outputPath = path.join(workspacePath, \"primer.eval.json\");\n await safeWriteFile(outputPath, JSON.stringify(evalConfig, null, 2) + \"\\n\", false);\n\n reporter.succeed(\"Eval config scaffolded.\");\n const doc = await vscode.workspace.openTextDocument(outputPath);\n await vscode.window.showTextDocument(doc);\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Eval scaffold failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import * as vscode from \"vscode\";\nimport path from \"node:path\";\nimport { analyzeRepo, generateConfigs, generateCopilotInstructions } from \"../services.js\";\nimport { VscodeProgressReporter } from \"../progress.js\";\nimport { getWorkspacePath, setCachedAnalysis } from \"./analyze.js\";\n\nexport async function initCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const config = vscode.workspace.getConfiguration(\"primer\");\n const model = config.get(\"model\");\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Initializing repository\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n reporter.update(\"Analyzing repository\u2026\");\n const analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n\n reporter.update(\"Generating Copilot instructions\u2026\");\n await generateCopilotInstructions({\n repoPath: workspacePath,\n model,\n onProgress: (msg) => reporter.update(msg),\n });\n\n reporter.update(\"Generating configs\u2026\");\n const result = await generateConfigs({\n repoPath: workspacePath,\n analysis,\n selections: [\"mcp\", \"vscode\"],\n force: false,\n });\n\n const wrote = result.files.filter((f) => f.action === \"wrote\");\n const skipped = result.files.filter((f) => f.action === \"skipped\");\n const parts: string[] = [];\n if (wrote.length) parts.push(`${wrote.length} files generated`);\n if (skipped.length) parts.push(`${skipped.length} skipped (already exist)`);\n\n reporter.succeed(\"Repository initialized.\");\n\n const instructionsPath = path.join(workspacePath, \".github\", \"copilot-instructions.md\");\n try {\n const doc = await vscode.workspace.openTextDocument(instructionsPath);\n await vscode.window.showTextDocument(doc);\n } catch {\n // File may not exist if generation was skipped\n }\n\n vscode.window.showInformationMessage(`Primer: ${parts.join(\", \") || \"Done.\"}`);\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Initialization failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import * as vscode from \"vscode\";\nimport { createPullRequest } from \"../services.js\";\nimport { getGitHubToken } from \"../auth.js\";\nimport { getWorkspacePath } from \"./analyze.js\";\nimport simpleGit from \"simple-git\";\n\nexport async function prCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const git = simpleGit(workspacePath);\n\n // Detect remote owner/repo\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === \"origin\");\n if (!origin?.refs.push) {\n vscode.window.showErrorMessage(\"Primer: No origin remote found.\");\n return;\n }\n\n const match = origin.refs.push.match(/github\\.com[:/]([^/]+)\\/([^/.]+)/);\n if (!match) {\n vscode.window.showErrorMessage(\"Primer: Could not parse GitHub owner/repo from origin remote.\");\n return;\n }\n const [, owner, repo] = match;\n\n const branch = (await git.branch()).current;\n const defaultBranch = await git.raw([\"symbolic-ref\", \"refs/remotes/origin/HEAD\", \"--short\"]).catch(() => \"origin/main\");\n const base = defaultBranch.replace(\"origin/\", \"\").trim();\n\n if (branch === base) {\n vscode.window.showErrorMessage(\"Primer: Cannot create PR from the default branch. Check out a feature branch first.\");\n return;\n }\n\n const title = await vscode.window.showInputBox({\n prompt: \"Pull request title\",\n value: `Add Primer AI configs for ${repo}`,\n });\n if (!title) return;\n\n await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: \"Primer: Creating pull request\u2026\" },\n async () => {\n try {\n const token = await getGitHubToken();\n\n // Commit and push if there are changes\n const status = await git.status();\n if (status.files.length > 0) {\n const primerFiles = status.files\n .map((f) => f.path)\n .filter(\n (p) =>\n p.startsWith(\".github/\") ||\n p.startsWith(\".vscode/\") ||\n p.endsWith(\".instructions.md\") ||\n p === \"primer.eval.json\",\n );\n\n if (primerFiles.length === 0) {\n vscode.window.showWarningMessage(\"Primer: No Primer-generated files to commit.\");\n return;\n }\n\n await git.add(primerFiles);\n await git.commit(title);\n await git.push(\"origin\", branch);\n }\n\n const prUrl = await createPullRequest({\n token,\n owner: owner!,\n repo: repo!,\n title,\n body: \"Generated by Primer VS Code extension.\",\n head: branch,\n base,\n });\n\n const openAction = \"Open in Browser\";\n const action = await vscode.window.showInformationMessage(\n `Primer: Pull request created.`,\n openAction,\n );\n if (action === openAction && prUrl.startsWith(\"https://\")) {\n vscode.env.openExternal(vscode.Uri.parse(prUrl));\n }\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: PR creation failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import * as vscode from \"vscode\";\n\n/**\n * Acquires a GitHub token via VS Code's built-in authentication provider.\n * Used by SDK-dependent services (instructions, eval) and Octokit (PR creation).\n */\nexport async function getGitHubToken(): Promise {\n const session = await vscode.authentication.getSession(\"github\", [\"repo\"], {\n createIfNone: true,\n });\n return session.accessToken;\n}\n", "const cache = new WeakMap();\n\nexport function pathspec(...paths: string[]) {\n const key = new String(paths);\n cache.set(key, paths);\n\n return key as string;\n}\n\nexport function isPathSpec(path: string | unknown): path is string {\n return path instanceof String && cache.has(path);\n}\n\nexport function toPaths(pathSpec: string): string[] {\n return cache.get(pathSpec) || [];\n}\n", "import type { SimpleGitTask } from '../types';\n\n/**\n * The `GitError` is thrown when the underlying `git` process throws a\n * fatal exception (eg an `ENOENT` exception when attempting to use a\n * non-writable directory as the root for your repo), and acts as the\n * base class for more specific errors thrown by the parsing of the\n * git response or errors in the configuration of the task about to\n * be run.\n *\n * When an exception is thrown, pending tasks in the same instance will\n * not be executed. The recommended way to run a series of tasks that\n * can independently fail without needing to prevent future tasks from\n * running is to catch them individually:\n *\n * ```typescript\n import { gitP, SimpleGit, GitError, PullResult } from 'simple-git';\n\n function catchTask (e: GitError) {\n return e.\n }\n\n const git = gitP(repoWorkingDir);\n const pulled: PullResult | GitError = await git.pull().catch(catchTask);\n const pushed: string | GitError = await git.pushTags().catch(catchTask);\n ```\n */\nexport class GitError extends Error {\n constructor(\n public task?: SimpleGitTask,\n message?: string\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n", "import { GitError } from './git-error';\n\n/**\n * The `GitResponseError` is the wrapper for a parsed response that is treated as\n * a fatal error, for example attempting a `merge` can leave the repo in a corrupted\n * state when there are conflicts so the task will reject rather than resolve.\n *\n * For example, catching the merge conflict exception:\n *\n * ```typescript\n import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git';\n\n const git = gitP(repoRoot);\n const mergeOptions: string[] = ['--no-ff', 'other-branch'];\n const mergeSummary: MergeSummary = await git.merge(mergeOptions)\n .catch((e: GitResponseError) => e.git);\n\n if (mergeSummary.failed) {\n // deal with the error\n }\n ```\n */\nexport class GitResponseError extends GitError {\n constructor(\n /**\n * `.git` access the parsed response that is treated as being an error\n */\n public readonly git: T,\n message?: string\n ) {\n super(undefined, message || String(git));\n }\n}\n", "import { GitError } from './git-error';\n\n/**\n * The `TaskConfigurationError` is thrown when a command was incorrectly\n * configured. An error of this kind means that no attempt was made to\n * run your command through the underlying `git` binary.\n *\n * Check the `.message` property for more detail on why your configuration\n * resulted in an error.\n */\nexport class TaskConfigurationError extends GitError {\n constructor(message?: string) {\n super(undefined, message);\n }\n}\n", "import { Buffer } from 'node:buffer';\nimport { exists, FOLDER } from '@kwsites/file-exists';\nimport type { Maybe } from '../types';\nimport { filterHasLength } from './argument-filters';\n\ntype Callable = (...args: unknown[]) => unknown;\n\nexport const NULL = '\\0';\n\nexport const NOOP: Callable = () => {};\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function asFunction(source: T | unknown): Callable {\n if (typeof source !== 'function') {\n return NOOP;\n }\n return source as Callable;\n}\n\n/**\n * Determines whether the supplied argument is both a function, and is not\n * the `NOOP` function.\n */\nexport function isUserFunction(source: T | unknown): source is T {\n return typeof source === 'function' && source !== NOOP;\n}\n\nexport function splitOn(input: string, char: string): [string, string] {\n const index = input.indexOf(char);\n if (index <= 0) {\n return [input, ''];\n }\n\n return [input.substr(0, index), input.substr(index + 1)];\n}\n\nexport function first(input: T, offset?: number): Maybe;\nexport function first(input: T, offset?: number): Maybe;\nexport function first(input: unknown[] | IArguments, offset = 0): Maybe {\n return isArrayLike(input) && input.length > offset ? input[offset] : undefined;\n}\n\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: unknown, offset = 0) {\n if (isArrayLike(input) && input.length > offset) {\n return input[input.length - 1 - offset];\n }\n}\n\ntype ArrayLike = T[] | IArguments | { [index: number]: T; length: number };\n\nfunction isArrayLike(input: unknown): input is ArrayLike {\n return filterHasLength(input);\n}\n\nexport function toLinesWithContent(input = '', trimmed = true, separator = '\\n'): string[] {\n return input.split(separator).reduce((output, line) => {\n const lineContent = trimmed ? line.trim() : line;\n if (lineContent) {\n output.push(lineContent);\n }\n return output;\n }, [] as string[]);\n}\n\ntype LineWithContentCallback = (line: string) => T;\n\nexport function forEachLineWithContent(\n input: string,\n callback: LineWithContentCallback\n): T[] {\n return toLinesWithContent(input, true).map((line) => callback(line));\n}\n\nexport function folderExists(path: string): boolean {\n return exists(path, FOLDER);\n}\n\n/**\n * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`.\n */\nexport function append(target: T[] | Set, item: T): typeof item {\n if (Array.isArray(target)) {\n if (!target.includes(item)) {\n target.push(item);\n }\n } else {\n target.add(item);\n }\n return item;\n}\n\n/**\n * Adds `item` into the `target` `Array` when it is not already present and returns the `target`.\n */\nexport function including(target: T[], item: T): typeof target {\n if (Array.isArray(target) && !target.includes(item)) {\n target.push(item);\n }\n\n return target;\n}\n\nexport function remove(target: Set | T[], item: T): T {\n if (Array.isArray(target)) {\n const index = target.indexOf(item);\n if (index >= 0) {\n target.splice(index, 1);\n }\n } else {\n target.delete(item);\n }\n return item;\n}\n\nexport const objectToString = Object.prototype.toString.call.bind(Object.prototype.toString) as (\n input: unknown\n) => string;\n\nexport function asArray(source: T | T[]): T[] {\n return Array.isArray(source) ? source : [source];\n}\n\nexport function asCamelCase(str: string) {\n return str.replace(/[\\s-]+(.)/g, (_all, chr) => {\n return chr.toUpperCase();\n });\n}\n\nexport function asStringArray(source: T | T[]): string[] {\n return asArray(source).map((item) => {\n return item instanceof String ? (item as string) : String(item);\n });\n}\n\nexport function asNumber(source: string | null | undefined, onNaN = 0) {\n if (source == null) {\n return onNaN;\n }\n\n const num = parseInt(source, 10);\n return Number.isNaN(num) ? onNaN : num;\n}\n\nexport function prefixedArray(input: T[], prefix: T): T[] {\n const output: T[] = [];\n for (let i = 0, max = input.length; i < max; i++) {\n output.push(prefix, input[i]);\n }\n return output;\n}\n\nexport function bufferToString(input: Buffer | Buffer[]): string {\n return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8');\n}\n\n/**\n * Get a new object from a source object with only the listed properties.\n */\nexport function pick(source: T, properties: readonly K[]) {\n const out: Partial> = {};\n\n properties.forEach((key) => {\n if (source[key] !== undefined) {\n out[key] = source[key];\n }\n });\n\n return out;\n}\n\nexport function delay(duration = 0): Promise {\n return new Promise((done) => setTimeout(done, duration));\n}\n\nexport function orVoid(input: T | false) {\n if (input === false) {\n return undefined;\n }\n return input;\n}\n", "import { isPathSpec } from '../args/pathspec';\nimport type { Maybe, Options, Primitives } from '../types';\nimport { objectToString } from './util';\n\nexport type ArgumentFilterPredicate = (input: T | unknown) => input is T;\n\nexport function filterType(\n input: K,\n filter: ArgumentFilterPredicate\n): K extends T ? T : undefined;\nexport function filterType(input: K, filter: ArgumentFilterPredicate, def: T): T;\nexport function filterType(input: K, filter: ArgumentFilterPredicate, def?: T): Maybe {\n if (filter(input)) {\n return input;\n }\n return arguments.length > 2 ? def : undefined;\n}\n\nexport const filterArray: ArgumentFilterPredicate> = (\n input\n): input is Array => {\n return Array.isArray(input);\n};\n\nexport function filterPrimitives(\n input: unknown,\n omit?: Array<'boolean' | 'string' | 'number'>\n): input is Primitives {\n const type = isPathSpec(input) ? 'string' : typeof input;\n\n return (\n /number|string|boolean/.test(type) &&\n (!omit || !omit.includes(type as 'boolean' | 'string' | 'number'))\n );\n}\n\nexport const filterNumber: ArgumentFilterPredicate = (input: unknown): input is number => {\n return typeof input === 'number';\n};\n\nexport const filterString: ArgumentFilterPredicate = (input: unknown): input is string => {\n return typeof input === 'string';\n};\n\nexport const filterStringOrStringArray: ArgumentFilterPredicate = (\n input\n): input is string | string[] => {\n return filterString(input) || (Array.isArray(input) && input.every(filterString));\n};\n\nexport function filterPlainObject(input: T | unknown): input is T;\nexport function filterPlainObject>(\n input: T | unknown\n): input is T {\n return !!input && objectToString(input) === '[object Object]';\n}\n\nexport function filterFunction(input: unknown): input is (...args: unknown[]) => unknown {\n return typeof input === 'function';\n}\n\nexport const filterHasLength: ArgumentFilterPredicate<{ length: number }> = (\n input\n): input is { length: number } => {\n if (input == null || 'number|boolean|function'.includes(typeof input)) {\n return false;\n }\n\n return typeof (input as { length?: number }).length === 'number';\n};\n", "/**\n * Known process exit codes used by the task parsers to determine whether an error\n * was one they can automatically handle\n */\nexport enum ExitCodes {\n SUCCESS,\n ERROR,\n NOT_FOUND = -2,\n UNCLEAN = 128,\n}\n", "import { TaskResponseFormat } from '../types';\n\nexport class GitOutputStreams {\n constructor(\n public readonly stdOut: T,\n public readonly stdErr: T\n ) {}\n\n asStrings(): GitOutputStreams {\n return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8'));\n }\n}\n", "function useMatchesDefault() {\n throw new Error(`LineParser:useMatches not implemented`);\n}\n\nexport class LineParser {\n protected matches: string[] = [];\n protected useMatches: (target: T, match: string[]) => boolean | void = useMatchesDefault;\n\n private _regExp: RegExp[];\n\n constructor(\n regExp: RegExp | RegExp[],\n useMatches?: (target: T, match: string[]) => boolean | void\n ) {\n this._regExp = Array.isArray(regExp) ? regExp : [regExp];\n if (useMatches) {\n this.useMatches = useMatches;\n }\n }\n\n parse = (line: (offset: number) => string | undefined, target: T): boolean => {\n this.resetMatches();\n\n if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) {\n return false;\n }\n\n return this.useMatches(target, this.prepareMatches()) !== false;\n };\n\n protected resetMatches() {\n this.matches.length = 0;\n }\n\n protected prepareMatches() {\n return this.matches;\n }\n\n protected addMatch(reg: RegExp, index: number, line?: string) {\n const matched = line && reg.exec(line);\n if (matched) {\n this.pushMatch(index, matched);\n }\n\n return !!matched;\n }\n\n protected pushMatch(_index: number, matched: string[]) {\n this.matches.push(...matched.slice(1));\n }\n}\n\nexport class RemoteLineParser extends LineParser {\n protected addMatch(reg: RegExp, index: number, line?: string): boolean {\n return /^remote:\\s/.test(String(line)) && super.addMatch(reg, index, line);\n }\n\n protected pushMatch(index: number, matched: string[]) {\n if (index > 0 || matched.length > 1) {\n super.pushMatch(index, matched);\n }\n }\n}\n", "import { SimpleGitOptions } from '../types';\n\nconst defaultOptions: Omit = {\n binary: 'git',\n maxConcurrentProcesses: 5,\n config: [],\n trimmed: false,\n};\n\nexport function createInstanceConfig(\n ...options: Array | undefined>\n): SimpleGitOptions {\n const baseDir = process.cwd();\n const config: SimpleGitOptions = Object.assign(\n { baseDir, ...defaultOptions },\n ...options.filter((o) => typeof o === 'object' && o)\n );\n\n config.baseDir = config.baseDir || baseDir;\n config.trimmed = config.trimmed === true;\n\n return config;\n}\n", "import {\n filterArray,\n filterFunction,\n filterPlainObject,\n filterPrimitives,\n filterType,\n} from './argument-filters';\nimport { asFunction, asStringArray, isUserFunction, last } from './util';\nimport { Maybe, Options } from '../types';\nimport { isPathSpec } from '../args/pathspec';\n\nexport function appendTaskOptions(\n options: Maybe,\n commands: string[] = []\n): string[] {\n if (!filterPlainObject(options)) {\n return commands;\n }\n\n return Object.keys(options).reduce((commands: string[], key: string) => {\n const value = options[key];\n\n if (isPathSpec(value)) {\n commands.push(value);\n } else if (filterPrimitives(value, ['boolean'])) {\n commands.push(key + '=' + value);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n if (!filterPrimitives(v, ['string', 'number'])) {\n commands.push(key + '=' + v);\n }\n }\n } else {\n commands.push(key);\n }\n\n return commands;\n }, commands);\n}\n\nexport function getTrailingOptions(\n args: IArguments,\n initialPrimitive = 0,\n objectOnly = false\n): string[] {\n const command: string[] = [];\n\n for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) {\n if ('string|number'.includes(typeof args[i])) {\n command.push(String(args[i]));\n }\n }\n\n appendTaskOptions(trailingOptionsArgument(args), command);\n if (!objectOnly) {\n command.push(...trailingArrayArgument(args));\n }\n\n return command;\n}\n\nfunction trailingArrayArgument(args: IArguments) {\n const hasTrailingCallback = typeof last(args) === 'function';\n return asStringArray(filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, []));\n}\n\n/**\n * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument\n * if there is one. When not found, the return value is null.\n */\nexport function trailingOptionsArgument(args: IArguments): Maybe {\n const hasTrailingCallback = filterFunction(last(args));\n return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject);\n}\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function trailingFunctionArgument(\n args: unknown[] | IArguments | unknown,\n includeNoop = true\n): Maybe<(...args: unknown[]) => unknown> {\n const callback = asFunction(last(args));\n return includeNoop || isUserFunction(callback) ? callback : undefined;\n}\n", "import type { MaybeArray, TaskParser, TaskResponseFormat } from '../types';\nimport { GitOutputStreams } from './git-output-streams';\nimport { LineParser } from './line-parser';\nimport { asArray, toLinesWithContent } from './util';\n\nexport function callTaskParser(\n parser: TaskParser,\n streams: GitOutputStreams\n) {\n return parser(streams.stdOut, streams.stdErr);\n}\n\nexport function parseStringResponse(\n result: T,\n parsers: LineParser[],\n texts: MaybeArray,\n trim = true\n): T {\n asArray(texts).forEach((text) => {\n for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) {\n const line = (offset = 0) => {\n if (i + offset >= max) {\n return;\n }\n return lines[i + offset];\n };\n\n parsers.some(({ parse }) => parse(line, result));\n }\n });\n\n return result;\n}\n", "export * from './argument-filters';\nexport * from './exit-codes';\nexport * from './git-output-streams';\nexport * from './line-parser';\nexport * from './simple-git-options';\nexport * from './task-options';\nexport * from './task-parser';\nexport * from './util';\n", "import { ExitCodes } from '../utils';\nimport { Maybe, StringTask } from '../types';\n\nexport enum CheckRepoActions {\n BARE = 'bare',\n IN_TREE = 'tree',\n IS_REPO_ROOT = 'root',\n}\n\nconst onError: StringTask['onError'] = ({ exitCode }, error, done, fail) => {\n if (exitCode === ExitCodes.UNCLEAN && isNotRepoMessage(error)) {\n return done(Buffer.from('false'));\n }\n\n fail(error);\n};\n\nconst parser: StringTask['parser'] = (text) => {\n return text.trim() === 'true';\n};\n\nexport function checkIsRepoTask(action: Maybe): StringTask {\n switch (action) {\n case CheckRepoActions.BARE:\n return checkIsBareRepoTask();\n case CheckRepoActions.IS_REPO_ROOT:\n return checkIsRepoRootTask();\n }\n\n const commands = ['rev-parse', '--is-inside-work-tree'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nexport function checkIsRepoRootTask(): StringTask {\n const commands = ['rev-parse', '--git-dir'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser(path) {\n return /^\\.(git)?$/.test(path.trim());\n },\n };\n}\n\nexport function checkIsBareRepoTask(): StringTask {\n const commands = ['rev-parse', '--is-bare-repository'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nfunction isNotRepoMessage(error: Error): boolean {\n return /(Not a git repository|Kein Git-Repository)/i.test(String(error));\n}\n", "import { CleanSummary } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\n\nexport class CleanResponse implements CleanSummary {\n public paths: string[] = [];\n public files: string[] = [];\n public folders: string[] = [];\n\n constructor(public readonly dryRun: boolean) {}\n}\n\nconst removalRegexp = /^[a-z]+\\s*/i;\nconst dryRunRemovalRegexp = /^[a-z]+\\s+[a-z]+\\s*/i;\nconst isFolderRegexp = /\\/$/;\n\nexport function cleanSummaryParser(dryRun: boolean, text: string): CleanSummary {\n const summary = new CleanResponse(dryRun);\n const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp;\n\n toLinesWithContent(text).forEach((line) => {\n const removed = line.replace(regexp, '');\n\n summary.paths.push(removed);\n (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed);\n });\n\n return summary;\n}\n", "import { TaskConfigurationError } from '../errors/task-configuration-error';\nimport type { BufferTask, EmptyTaskParser, SimpleGitTask, StringTask } from '../types';\n\nexport const EMPTY_COMMANDS: [] = [];\n\nexport type EmptyTask = {\n commands: typeof EMPTY_COMMANDS;\n format: 'empty';\n parser: EmptyTaskParser;\n onError?: undefined;\n};\n\nexport function adhocExecTask(parser: EmptyTaskParser): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser,\n };\n}\n\nexport function configurationErrorTask(error: Error | string): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser() {\n throw typeof error === 'string' ? new TaskConfigurationError(error) : error;\n },\n };\n}\n\nexport function straightThroughStringTask(commands: string[], trimmed = false): StringTask {\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return trimmed ? String(text).trim() : text;\n },\n };\n}\n\nexport function straightThroughBufferTask(commands: string[]): BufferTask {\n return {\n commands,\n format: 'buffer',\n parser(buffer) {\n return buffer;\n },\n };\n}\n\nexport function isBufferTask(task: SimpleGitTask): task is BufferTask {\n return task.format === 'buffer';\n}\n\nexport function isEmptyTask(task: SimpleGitTask): task is EmptyTask {\n return task.format === 'empty' || !task.commands.length;\n}\n", "import { CleanSummary } from '../../../typings';\nimport { cleanSummaryParser } from '../responses/CleanSummary';\nimport { Maybe, StringTask } from '../types';\nimport { asStringArray } from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport const CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported';\nexport const CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter (\"n\" or \"f\") is required';\nexport const CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: ';\n\n/**\n * All supported option switches available for use in a `git.clean` operation\n */\nexport enum CleanOptions {\n DRY_RUN = 'n',\n FORCE = 'f',\n IGNORED_INCLUDED = 'x',\n IGNORED_ONLY = 'X',\n EXCLUDING = 'e',\n QUIET = 'q',\n RECURSIVE = 'd',\n}\n\n/**\n * The two modes `git.clean` can run in - one of these must be supplied in order\n * for the command to not throw a `TaskConfigurationError`\n */\nexport type CleanMode = CleanOptions.FORCE | CleanOptions.DRY_RUN;\n\nconst CleanOptionValues: Set = new Set([\n 'i',\n ...asStringArray(Object.values(CleanOptions as any)),\n]);\n\nexport function cleanWithOptionsTask(mode: CleanMode | string, customArgs: string[]) {\n const { cleanMode, options, valid } = getCleanOptions(mode);\n\n if (!cleanMode) {\n return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED);\n }\n\n if (!valid.options) {\n return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode));\n }\n\n options.push(...customArgs);\n\n if (options.some(isInteractiveMode)) {\n return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE);\n }\n\n return cleanTask(cleanMode, options);\n}\n\nexport function cleanTask(mode: CleanMode, customArgs: string[]): StringTask {\n const commands: string[] = ['clean', `-${mode}`, ...customArgs];\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): CleanSummary {\n return cleanSummaryParser(mode === CleanOptions.DRY_RUN, text);\n },\n };\n}\n\nexport function isCleanOptionsArray(input: string[]): input is CleanOptions[] {\n return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test));\n}\n\nfunction getCleanOptions(input: string) {\n let cleanMode: Maybe;\n let options: string[] = [];\n let valid = { cleanMode: false, options: true };\n\n input\n .replace(/[^a-z]i/g, '')\n .split('')\n .forEach((char) => {\n if (isCleanMode(char)) {\n cleanMode = char;\n valid.cleanMode = true;\n } else {\n valid.options = valid.options && isKnownOption((options[options.length] = `-${char}`));\n }\n });\n\n return {\n cleanMode,\n options,\n valid,\n };\n}\n\nfunction isCleanMode(cleanMode?: string): cleanMode is CleanMode {\n return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN;\n}\n\nfunction isKnownOption(option: string): boolean {\n return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1));\n}\n\nfunction isInteractiveMode(option: string): boolean {\n if (/^-[^\\-]/.test(option)) {\n return option.indexOf('i') > 0;\n }\n\n return option === '--interactive';\n}\n", "import { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings';\nimport { last, splitOn } from '../utils';\n\nexport class ConfigList implements ConfigListSummary {\n public files: string[] = [];\n public values: { [fileName: string]: ConfigValues } = Object.create(null);\n\n private _all: ConfigValues | undefined;\n\n public get all(): ConfigValues {\n if (!this._all) {\n this._all = this.files.reduce((all: ConfigValues, file: string) => {\n return Object.assign(all, this.values[file]);\n }, {});\n }\n\n return this._all;\n }\n\n public addFile(file: string): ConfigValues {\n if (!(file in this.values)) {\n const latest = last(this.files);\n this.values[file] = latest ? Object.create(this.values[latest]) : {};\n\n this.files.push(file);\n }\n\n return this.values[file];\n }\n\n public addValue(file: string, key: string, value: string) {\n const values = this.addFile(file);\n\n if (!Object.hasOwn(values, key)) {\n values[key] = value;\n } else if (Array.isArray(values[key])) {\n (values[key] as string[]).push(value);\n } else {\n values[key] = [values[key] as string, value];\n }\n\n this._all = undefined;\n }\n}\n\nexport function configListParser(text: string): ConfigList {\n const config = new ConfigList();\n\n for (const item of configParser(text)) {\n config.addValue(item.file, String(item.key), item.value);\n }\n\n return config;\n}\n\nexport function configGetParser(text: string, key: string): ConfigGetResult {\n let value: string | null = null;\n const values: string[] = [];\n const scopes: Map = new Map();\n\n for (const item of configParser(text, key)) {\n if (item.key !== key) {\n continue;\n }\n\n values.push((value = item.value));\n\n if (!scopes.has(item.file)) {\n scopes.set(item.file, []);\n }\n\n scopes.get(item.file)!.push(value);\n }\n\n return {\n key,\n paths: Array.from(scopes.keys()),\n scopes,\n value,\n values,\n };\n}\n\nfunction configFilePath(filePath: string): string {\n return filePath.replace(/^(file):/, '');\n}\n\nfunction* configParser(text: string, requestedKey: string | null = null) {\n const lines = text.split('\\0');\n\n for (let i = 0, max = lines.length - 1; i < max; ) {\n const file = configFilePath(lines[i++]);\n\n let value = lines[i++];\n let key = requestedKey;\n\n if (value.includes('\\n')) {\n const line = splitOn(value, '\\n');\n key = line[0];\n value = line[1];\n }\n\n yield { file, key, value };\n }\n}\n", "import type { ConfigGetResult, ConfigListSummary, SimpleGit } from '../../../typings';\nimport { configGetParser, configListParser } from '../responses/ConfigList';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { trailingFunctionArgument } from '../utils';\n\nexport enum GitConfigScope {\n system = 'system',\n global = 'global',\n local = 'local',\n worktree = 'worktree',\n}\n\nfunction asConfigScope(\n scope: GitConfigScope | unknown,\n fallback: T\n): GitConfigScope | T {\n if (typeof scope === 'string' && Object.hasOwn(GitConfigScope, scope)) {\n return scope as GitConfigScope;\n }\n return fallback;\n}\n\nfunction addConfigTask(\n key: string,\n value: string,\n append: boolean,\n scope: GitConfigScope\n): StringTask {\n const commands: string[] = ['config', `--${scope}`];\n\n if (append) {\n commands.push('--add');\n }\n\n commands.push(key, value);\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): string {\n return text;\n },\n };\n}\n\nfunction getConfigTask(key: string, scope?: GitConfigScope): StringTask {\n const commands: string[] = ['config', '--null', '--show-origin', '--get-all', key];\n\n if (scope) {\n commands.splice(1, 0, `--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return configGetParser(text, key);\n },\n };\n}\n\nfunction listConfigTask(scope?: GitConfigScope): StringTask {\n const commands = ['config', '--list', '--show-origin', '--null'];\n\n if (scope) {\n commands.push(`--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string) {\n return configListParser(text);\n },\n };\n}\n\nexport default function (): Pick {\n return {\n addConfig(this: SimpleGitApi, key: string, value: string, ...rest: unknown[]) {\n return this._runTask(\n addConfigTask(\n key,\n value,\n rest[0] === true,\n asConfigScope(rest[1], GitConfigScope.local)\n ),\n trailingFunctionArgument(arguments)\n );\n },\n\n getConfig(this: SimpleGitApi, key: string, scope?: GitConfigScope) {\n return this._runTask(\n getConfigTask(key, asConfigScope(scope, undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n\n listConfig(this: SimpleGitApi, ...rest: unknown[]) {\n return this._runTask(\n listConfigTask(asConfigScope(rest[0], undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "export enum DiffNameStatus {\n ADDED = 'A',\n COPIED = 'C',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n CHANGED = 'T',\n UNMERGED = 'U',\n UNKNOWN = 'X',\n BROKEN = 'B',\n}\n\nconst diffNameStatus = new Set(Object.values(DiffNameStatus));\n\nexport function isDiffNameStatus(input: string): input is DiffNameStatus {\n return diffNameStatus.has(input as DiffNameStatus);\n}\n", "import { GrepResult, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport {\n asNumber,\n forEachLineWithContent,\n getTrailingOptions,\n NULL,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\n\nimport { configurationErrorTask } from './task';\n\nconst disallowedOptions = ['-h'];\n\nconst Query = Symbol('grepQuery');\n\nexport interface GitGrepQuery extends Iterable {\n /** Adds one or more terms to be grouped as an \"and\" to any other terms */\n and(...and: string[]): this;\n\n /** Adds one or more search terms - git.grep will \"or\" this to other terms */\n param(...param: string[]): this;\n}\n\nclass GrepQuery implements GitGrepQuery {\n private [Query]: string[] = [];\n\n *[Symbol.iterator]() {\n for (const query of this[Query]) {\n yield query;\n }\n }\n\n and(...and: string[]) {\n and.length && this[Query].push('--and', '(', ...prefixedArray(and, '-e'), ')');\n return this;\n }\n\n param(...param: string[]) {\n this[Query].push(...prefixedArray(param, '-e'));\n return this;\n }\n}\n\n/**\n * Creates a new builder for a `git.grep` query with optional params\n */\nexport function grepQueryBuilder(...params: string[]): GitGrepQuery {\n return new GrepQuery().param(...params);\n}\n\nfunction parseGrep(grep: string): GrepResult {\n const paths: GrepResult['paths'] = new Set();\n const results: GrepResult['results'] = {};\n\n forEachLineWithContent(grep, (input) => {\n const [path, line, preview] = input.split(NULL);\n paths.add(path);\n (results[path] = results[path] || []).push({\n line: asNumber(line),\n path,\n preview,\n });\n });\n\n return {\n paths,\n results,\n };\n}\n\nexport default function (): Pick {\n return {\n grep(this: SimpleGitApi, searchTerm: string | GitGrepQuery) {\n const then = trailingFunctionArgument(arguments);\n const options = getTrailingOptions(arguments);\n\n for (const option of disallowedOptions) {\n if (options.includes(option)) {\n return this._runTask(\n configurationErrorTask(`git.grep: use of \"${option}\" is not supported.`),\n then\n );\n }\n }\n\n if (typeof searchTerm === 'string') {\n searchTerm = grepQueryBuilder().param(searchTerm);\n }\n\n const commands = ['grep', '--null', '-n', '--full-name', ...options, ...searchTerm];\n\n return this._runTask(\n {\n commands,\n format: 'utf-8',\n parser(stdOut) {\n return parseGrep(stdOut);\n },\n },\n then\n );\n },\n };\n}\n", "import type { Maybe, OptionFlags, Options } from '../types';\nimport { asStringArray } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport enum ResetMode {\n MIXED = 'mixed',\n SOFT = 'soft',\n HARD = 'hard',\n MERGE = 'merge',\n KEEP = 'keep',\n}\n\nconst validResetModes = asStringArray(Object.values(ResetMode));\n\nexport type ResetOptions = Options &\n OptionFlags<'-q' | '--quiet' | '--no-quiet' | '--pathspec-from-nul'> &\n OptionFlags<'--pathspec-from-file', string>;\n\nexport function resetTask(mode: Maybe, customArgs: string[]) {\n const commands: string[] = ['reset'];\n if (isValidResetMode(mode)) {\n commands.push(`--${mode}`);\n }\n commands.push(...customArgs);\n\n return straightThroughStringTask(commands);\n}\n\nexport function getResetMode(mode: ResetMode | unknown): Maybe {\n if (isValidResetMode(mode)) {\n return mode;\n }\n\n switch (typeof mode) {\n case 'string':\n case 'undefined':\n return ResetMode.SOFT;\n }\n\n return;\n}\n\nfunction isValidResetMode(mode: ResetMode | unknown): mode is ResetMode {\n return typeof mode === 'string' && validResetModes.includes(mode);\n}\n", "import debug, { Debugger } from 'debug';\nimport {\n append,\n filterHasLength,\n filterString,\n filterType,\n NOOP,\n objectToString,\n remove,\n} from './utils';\nimport { Maybe } from './types';\n\ndebug.formatters.L = (value: any) => String(filterHasLength(value) ? value.length : '-');\ndebug.formatters.B = (value: Buffer) => {\n if (Buffer.isBuffer(value)) {\n return value.toString('utf8');\n }\n return objectToString(value);\n};\n\ntype OutputLoggingHandler = (message: string, ...args: any[]) => void;\n\nfunction createLog() {\n return debug('simple-git');\n}\n\nexport interface OutputLogger extends OutputLoggingHandler {\n readonly label: string;\n\n info: OutputLoggingHandler;\n step(nextStep?: string): OutputLogger;\n sibling(name: string): OutputLogger;\n}\n\nfunction prefixedLogger(\n to: Debugger,\n prefix: string,\n forward?: OutputLoggingHandler\n): OutputLoggingHandler {\n if (!prefix || !String(prefix).replace(/\\s*/, '')) {\n return !forward\n ? to\n : (message, ...args) => {\n to(message, ...args);\n forward(message, ...args);\n };\n }\n\n return (message, ...args) => {\n to(`%s ${message}`, prefix, ...args);\n if (forward) {\n forward(message, ...args);\n }\n };\n}\n\nfunction childLoggerName(\n name: Maybe,\n childDebugger: Maybe,\n { namespace: parentNamespace }: Debugger\n): string {\n if (typeof name === 'string') {\n return name;\n }\n const childNamespace = (childDebugger && childDebugger.namespace) || '';\n\n if (childNamespace.startsWith(parentNamespace)) {\n return childNamespace.substr(parentNamespace.length + 1);\n }\n\n return childNamespace || parentNamespace;\n}\n\nexport function createLogger(\n label: string,\n verbose?: string | Debugger,\n initialStep?: string,\n infoDebugger = createLog()\n): OutputLogger {\n const labelPrefix = (label && `[${label}]`) || '';\n\n const spawned: OutputLogger[] = [];\n const debugDebugger: Maybe =\n typeof verbose === 'string' ? infoDebugger.extend(verbose) : verbose;\n const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger);\n\n return step(initialStep);\n\n function sibling(name: string, initial?: string) {\n return append(\n spawned,\n createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)\n );\n }\n\n function step(phase?: string) {\n const stepPrefix = (phase && `[${phase}]`) || '';\n const debug = (debugDebugger && prefixedLogger(debugDebugger, stepPrefix)) || NOOP;\n const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug);\n\n return Object.assign(debugDebugger ? debug : info, {\n label,\n sibling,\n info,\n step,\n });\n }\n}\n\n/**\n * The `GitLogger` is used by the main `SimpleGit` runner to handle logging\n * any warnings or errors.\n */\nexport class GitLogger {\n public error: OutputLoggingHandler;\n\n public warn: OutputLoggingHandler;\n\n constructor(private _out: Debugger = createLog()) {\n this.error = prefixedLogger(_out, '[ERROR]');\n this.warn = prefixedLogger(_out, '[WARN]');\n }\n\n silent(silence = false) {\n if (silence !== this._out.enabled) {\n return;\n }\n\n const { namespace } = this._out;\n const env = (process.env.DEBUG || '').split(',').filter((s) => !!s);\n const hasOn = env.includes(namespace);\n const hasOff = env.includes(`-${namespace}`);\n\n // enabling the log\n if (!silence) {\n if (hasOff) {\n remove(env, `-${namespace}`);\n } else {\n env.push(namespace);\n }\n } else {\n if (hasOn) {\n remove(env, namespace);\n } else {\n env.push(`-${namespace}`);\n }\n }\n\n debug.enable(env.join(','));\n }\n}\n", "import { SimpleGitTask } from '../types';\nimport { GitError } from '../errors/git-error';\nimport { createLogger, OutputLogger } from '../git-logger';\n\ntype AnySimpleGitTask = SimpleGitTask;\n\ntype TaskInProgress = {\n name: string;\n logger: OutputLogger;\n task: AnySimpleGitTask;\n};\n\nexport class TasksPendingQueue {\n private _queue: Map = new Map();\n\n constructor(private logLabel = 'GitExecutor') {}\n\n private withProgress(task: AnySimpleGitTask) {\n return this._queue.get(task);\n }\n\n private createProgress(task: AnySimpleGitTask): TaskInProgress {\n const name = TasksPendingQueue.getName(task.commands[0]);\n const logger = createLogger(this.logLabel, name);\n\n return {\n task,\n logger,\n name,\n };\n }\n\n push(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.createProgress(task);\n progress.logger('Adding task to the queue, commands = %o', task.commands);\n\n this._queue.set(task, progress);\n\n return progress;\n }\n\n fatal(err: GitError) {\n for (const [task, { logger }] of Array.from(this._queue.entries())) {\n if (task === err.task) {\n logger.info(`Failed %o`, err);\n logger(\n `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`\n );\n } else {\n logger.info(\n `A fatal exception occurred in a previous task, the queue has been purged: %o`,\n err.message\n );\n }\n\n this.complete(task);\n }\n\n if (this._queue.size !== 0) {\n throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`);\n }\n }\n\n complete(task: AnySimpleGitTask) {\n const progress = this.withProgress(task);\n if (progress) {\n this._queue.delete(task);\n }\n }\n\n attempt(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.withProgress(task);\n if (!progress) {\n throw new GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task');\n }\n progress.logger('Starting task');\n\n return progress;\n }\n\n static getName(name = 'empty') {\n return `task:${name}:${++TasksPendingQueue.counter}`;\n }\n\n private static counter = 0;\n}\n", "import { spawn, SpawnOptions } from 'child_process';\nimport { GitError } from '../errors/git-error';\nimport { OutputLogger } from '../git-logger';\nimport { PluginStore } from '../plugins';\nimport { EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task';\nimport {\n GitExecutorResult,\n Maybe,\n outputHandler,\n RunnableTask,\n SimpleGitExecutor,\n SimpleGitTask,\n} from '../types';\nimport { callTaskParser, first, GitOutputStreams, objectToString } from '../utils';\nimport { Scheduler } from './scheduler';\nimport { TasksPendingQueue } from './tasks-pending-queue';\n\nexport class GitExecutorChain implements SimpleGitExecutor {\n private _chain: Promise = Promise.resolve();\n private _queue = new TasksPendingQueue();\n private _cwd: string | undefined;\n\n public get cwd() {\n return this._cwd || this._executor.cwd;\n }\n\n public set cwd(cwd: string) {\n this._cwd = cwd;\n }\n\n public get env() {\n return this._executor.env;\n }\n\n public get outputHandler() {\n return this._executor.outputHandler;\n }\n\n constructor(\n private _executor: SimpleGitExecutor,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n public chain() {\n return this;\n }\n\n public push(task: SimpleGitTask): Promise {\n this._queue.push(task);\n\n return (this._chain = this._chain.then(() => this.attemptTask(task)));\n }\n\n private async attemptTask(task: SimpleGitTask): Promise {\n const onScheduleComplete = await this._scheduler.next();\n const onQueueComplete = () => this._queue.complete(task);\n\n try {\n const { logger } = this._queue.attempt(task);\n return (await (isEmptyTask(task)\n ? this.attemptEmptyTask(task, logger)\n : this.attemptRemoteTask(task, logger))) as R;\n } catch (e) {\n throw this.onFatalException(task, e as Error);\n } finally {\n onQueueComplete();\n onScheduleComplete();\n }\n }\n\n private onFatalException(task: SimpleGitTask, e: Error) {\n const gitError =\n e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e));\n\n this._chain = Promise.resolve();\n this._queue.fatal(gitError);\n\n return gitError;\n }\n\n private async attemptRemoteTask(task: RunnableTask, logger: OutputLogger) {\n const binary = this._plugins.exec('spawn.binary', '', pluginContext(task, task.commands));\n const args = this._plugins.exec(\n 'spawn.args',\n [...task.commands],\n pluginContext(task, task.commands)\n );\n\n const raw = await this.gitResponse(\n task,\n binary,\n args,\n this.outputHandler,\n logger.step('SPAWN')\n );\n const outputStreams = await this.handleTaskData(task, args, raw, logger.step('HANDLE'));\n\n logger(`passing response to task's parser as a %s`, task.format);\n\n if (isBufferTask(task)) {\n return callTaskParser(task.parser, outputStreams);\n }\n\n return callTaskParser(task.parser, outputStreams.asStrings());\n }\n\n private async attemptEmptyTask(task: EmptyTask, logger: OutputLogger) {\n logger(`empty task bypassing child process to call to task's parser`);\n return task.parser(this);\n }\n\n private handleTaskData(\n task: SimpleGitTask,\n args: string[],\n result: GitExecutorResult,\n logger: OutputLogger\n ): Promise {\n const { exitCode, rejection, stdOut, stdErr } = result;\n\n return new Promise((done, fail) => {\n logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode);\n\n const { error } = this._plugins.exec(\n 'task.error',\n { error: rejection },\n {\n ...pluginContext(task, args),\n ...result,\n }\n );\n\n if (error && task.onError) {\n logger.info(`exitCode=%s handling with custom error handler`);\n\n return task.onError(\n result,\n error,\n (newStdOut) => {\n logger.info(`custom error handler treated as success`);\n logger(`custom error returned a %s`, objectToString(newStdOut));\n\n done(\n new GitOutputStreams(\n Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut,\n Buffer.concat(stdErr)\n )\n );\n },\n fail\n );\n }\n\n if (error) {\n logger.info(\n `handling as error: exitCode=%s stdErr=%s rejection=%o`,\n exitCode,\n stdErr.length,\n rejection\n );\n return fail(error);\n }\n\n logger.info(`retrieving task output complete`);\n done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr)));\n });\n }\n\n private async gitResponse(\n task: SimpleGitTask,\n command: string,\n args: string[],\n outputHandler: Maybe,\n logger: OutputLogger\n ): Promise {\n const outputLogger = logger.sibling('output');\n const spawnOptions: SpawnOptions = this._plugins.exec(\n 'spawn.options',\n {\n cwd: this.cwd,\n env: this.env,\n windowsHide: true,\n },\n pluginContext(task, task.commands)\n );\n\n return new Promise((done) => {\n const stdOut: Buffer[] = [];\n const stdErr: Buffer[] = [];\n\n logger.info(`%s %o`, command, args);\n logger('%O', spawnOptions);\n\n let rejection = this._beforeSpawn(task, args);\n if (rejection) {\n return done({\n stdOut,\n stdErr,\n exitCode: 9901,\n rejection,\n });\n }\n\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n const spawned = spawn(command, args, spawnOptions);\n\n spawned.stdout!.on(\n 'data',\n onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))\n );\n spawned.stderr!.on(\n 'data',\n onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))\n );\n\n spawned.on('error', onErrorReceived(stdErr, logger));\n\n if (outputHandler) {\n logger(`Passing child process stdOut/stdErr to custom outputHandler`);\n outputHandler(command, spawned.stdout!, spawned.stderr!, [...args]);\n }\n\n this._plugins.exec('spawn.after', undefined, {\n ...pluginContext(task, args),\n spawned,\n close(exitCode: number, reason?: Error) {\n done({\n stdOut,\n stdErr,\n exitCode,\n rejection: rejection || reason,\n });\n },\n kill(reason: Error) {\n if (spawned.killed) {\n return;\n }\n\n rejection = reason;\n spawned.kill('SIGINT');\n },\n });\n });\n }\n\n private _beforeSpawn(task: SimpleGitTask, args: string[]) {\n let rejection: Maybe;\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n return rejection;\n }\n}\n\nfunction pluginContext(task: SimpleGitTask, commands: string[]) {\n return {\n method: first(task.commands) || '',\n commands,\n };\n}\n\nfunction onErrorReceived(target: Buffer[], logger: OutputLogger) {\n return (err: Error) => {\n logger(`[ERROR] child process exception %o`, err);\n target.push(Buffer.from(String(err.stack), 'ascii'));\n };\n}\n\nfunction onDataReceived(\n target: Buffer[],\n name: string,\n logger: OutputLogger,\n output: OutputLogger\n) {\n return (buffer: Buffer) => {\n logger(`%s received %L bytes`, name, buffer);\n output(`%B`, buffer);\n target.push(buffer);\n };\n}\n", "import type { PluginStore } from '../plugins';\nimport type { GitExecutorEnv, outputHandler, SimpleGitExecutor, SimpleGitTask } from '../types';\n\nimport { GitExecutorChain } from './git-executor-chain';\nimport { Scheduler } from './scheduler';\n\nexport class GitExecutor implements SimpleGitExecutor {\n private _chain = new GitExecutorChain(this, this._scheduler, this._plugins);\n\n public env: GitExecutorEnv;\n public outputHandler?: outputHandler;\n\n constructor(\n public cwd: string,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n chain(): SimpleGitExecutor {\n return new GitExecutorChain(this, this._scheduler, this._plugins);\n }\n\n push(task: SimpleGitTask): Promise {\n return this._chain.push(task);\n }\n}\n", "import { GitError } from './errors/git-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport { NOOP } from './utils';\n\nexport function taskCallback(\n task: SimpleGitTask,\n response: Promise,\n callback: SimpleGitTaskCallback = NOOP\n) {\n const onSuccess = (data: R) => {\n callback(null, data);\n };\n\n const onError = (err: GitError | GitResponseError) => {\n if (err?.task === task) {\n callback(\n err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err,\n undefined as any\n );\n }\n };\n\n response.then(onSuccess, onError);\n}\n\nfunction addDeprecationNoticeToError(err: GitResponseError) {\n let log = (name: string) => {\n console.warn(\n `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`\n );\n log = NOOP;\n };\n\n return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {}));\n\n function descriptorReducer(all: PropertyDescriptorMap, name: string): typeof all {\n if (name in err) {\n return all;\n }\n\n all[name] = {\n enumerable: false,\n configurable: false,\n get() {\n log(name);\n return err.git[name];\n },\n };\n\n return all;\n }\n}\n", "import { folderExists } from '../utils';\nimport { SimpleGitExecutor } from '../types';\nimport { adhocExecTask } from './task';\n\nexport function changeWorkingDirectoryTask(directory: string, root?: SimpleGitExecutor) {\n return adhocExecTask((instance: SimpleGitExecutor) => {\n if (!folderExists(directory)) {\n throw new Error(`Git.cwd: cannot change to non-directory \"${directory}\"`);\n }\n\n return ((root || instance).cwd = directory);\n });\n}\n", "import type { SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, remove, trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nfunction checkoutTask(args: string[]) {\n const commands = ['checkout', ...args];\n if (commands[1] === '-b' && commands.includes('-B')) {\n commands[1] = remove(commands, '-B');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport default function (): Pick {\n return {\n checkout(this: SimpleGitApi) {\n return this._runTask(\n checkoutTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutBranch(this: SimpleGitApi, branchName, startPoint) {\n return this._runTask(\n checkoutTask(['-b', branchName, startPoint, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutLocalBranch(this: SimpleGitApi, branchName) {\n return this._runTask(\n checkoutTask(['-b', branchName, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asCamelCase, asNumber, LineParser, parseStringResponse } from '../utils';\n\nexport interface CountObjectsResult {\n count: number;\n size: number;\n inPack: number;\n packs: number;\n sizePack: number;\n prunePackable: number;\n garbage: number;\n sizeGarbage: number;\n}\n\nfunction countObjectsResponse(): CountObjectsResult {\n return {\n count: 0,\n garbage: 0,\n inPack: 0,\n packs: 0,\n prunePackable: 0,\n size: 0,\n sizeGarbage: 0,\n sizePack: 0,\n };\n}\n\nconst parser: LineParser = new LineParser(\n /([a-z-]+): (\\d+)$/,\n (result, [key, value]) => {\n const property = asCamelCase(key);\n if (Object.hasOwn(result, property)) {\n result[property as keyof typeof result] = asNumber(value);\n }\n }\n);\n\nexport default function (): Pick {\n return {\n countObjects(this: SimpleGitApi) {\n return this._runTask({\n commands: ['count-objects', '--verbose'],\n format: 'utf-8',\n parser(stdOut: string) {\n return parseStringResponse(countObjectsResponse(), [parser], stdOut);\n },\n });\n },\n };\n}\n", "import { CommitResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/^\\[([^\\s]+)( \\([^)]+\\))? ([^\\]]+)/, (result, [branch, root, commit]) => {\n result.branch = branch;\n result.commit = commit;\n result.root = !!root;\n }),\n new LineParser(/\\s*Author:\\s(.+)/i, (result, [author]) => {\n const parts = author.split('<');\n const email = parts.pop();\n\n if (!email || !email.includes('@')) {\n return;\n }\n\n result.author = {\n email: email.substr(0, email.length - 1),\n name: parts.join('<').trim(),\n };\n }),\n new LineParser(\n /(\\d+)[^,]*(?:,\\s*(\\d+)[^,]*)(?:,\\s*(\\d+))/g,\n (result, [changes, insertions, deletions]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n result.summary.insertions = parseInt(insertions, 10) || 0;\n result.summary.deletions = parseInt(deletions, 10) || 0;\n }\n ),\n new LineParser(\n /^(\\d+)[^,]*(?:,\\s*(\\d+)[^(]+\\(([+-]))?/,\n (result, [changes, lines, direction]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n const count = parseInt(lines, 10) || 0;\n if (direction === '-') {\n result.summary.deletions = count;\n } else if (direction === '+') {\n result.summary.insertions = count;\n }\n }\n ),\n];\n\nexport function parseCommitResult(stdOut: string): CommitResult {\n const result: CommitResult = {\n author: null,\n branch: '',\n commit: '',\n root: false,\n summary: {\n changes: 0,\n insertions: 0,\n deletions: 0,\n },\n };\n return parseStringResponse(result, parsers, stdOut);\n}\n", "import type { CommitResult, SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { parseCommitResult } from '../parsers/parse-commit';\nimport {\n asArray,\n asStringArray,\n filterArray,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport function commitTask(\n message: string[],\n files: string[],\n customArgs: string[]\n): StringTask {\n const commands: string[] = [\n '-c',\n 'core.abbrev=40',\n 'commit',\n ...prefixedArray(message, '-m'),\n ...files,\n ...customArgs,\n ];\n\n return {\n commands,\n format: 'utf-8',\n parser: parseCommitResult,\n };\n}\n\nexport default function (): Pick {\n return {\n commit(this: SimpleGitApi, message: string | string[], ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const task =\n rejectDeprecatedSignatures(message) ||\n commitTask(\n asArray(message),\n asArray(filterType(rest[0], filterStringOrStringArray, [])),\n [\n ...asStringArray(filterType(rest[1], filterArray, [])),\n ...getTrailingOptions(arguments, 0, true),\n ]\n );\n\n return this._runTask(task, next);\n },\n };\n\n function rejectDeprecatedSignatures(message?: unknown) {\n return (\n !filterStringOrStringArray(message) &&\n configurationErrorTask(\n `git.commit: requires the commit message to be supplied as a string/string[]`\n )\n );\n }\n}\n", "import { Response, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport default function (): Pick {\n return {\n firstCommit(this: SimpleGitApi): Response {\n return this._runTask(\n straightThroughStringTask(['rev-list', '--max-parents=0', 'HEAD'], true),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import { straightThroughStringTask } from './task';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.hashObject`\n */\nexport function hashObjectTask(filePath: string, write: boolean): StringTask {\n const commands = ['hash-object', filePath];\n if (write) {\n commands.push('-w');\n }\n\n return straightThroughStringTask(commands, true);\n}\n", "import { InitResult } from '../../../typings';\n\nexport class InitSummary implements InitResult {\n constructor(\n public readonly bare: boolean,\n public readonly path: string,\n public readonly existing: boolean,\n public readonly gitDir: string\n ) {}\n}\n\nconst initResponseRegex = /^Init.+ repository in (.+)$/;\nconst reInitResponseRegex = /^Rein.+ in (.+)$/;\n\nexport function parseInit(bare: boolean, path: string, text: string) {\n const response = String(text).trim();\n let result;\n\n if ((result = initResponseRegex.exec(response))) {\n return new InitSummary(bare, path, false, result[1]);\n }\n\n if ((result = reInitResponseRegex.exec(response))) {\n return new InitSummary(bare, path, true, result[1]);\n }\n\n let gitDir = '';\n const tokens = response.split(' ');\n while (tokens.length) {\n const token = tokens.shift();\n if (token === 'in') {\n gitDir = tokens.join(' ');\n break;\n }\n }\n\n return new InitSummary(bare, path, /^re/i.test(response), gitDir);\n}\n", "import { InitResult } from '../../../typings';\nimport { parseInit } from '../responses/InitSummary';\nimport { StringTask } from '../types';\n\nconst bareCommand = '--bare';\n\nfunction hasBareCommand(command: string[]) {\n return command.includes(bareCommand);\n}\n\nexport function initTask(bare = false, path: string, customArgs: string[]): StringTask {\n const commands = ['init', ...customArgs];\n if (bare && !hasBareCommand(commands)) {\n commands.splice(1, 0, bareCommand);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): InitResult {\n return parseInit(commands.includes('--bare'), path, text);\n },\n };\n}\n", "export enum LogFormat {\n NONE = '',\n STAT = '--stat',\n NUM_STAT = '--numstat',\n NAME_ONLY = '--name-only',\n NAME_STATUS = '--name-status',\n}\n\nconst logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/;\n\nexport function logFormatFromCommand(customArgs: string[]) {\n for (let i = 0; i < customArgs.length; i++) {\n const format = logFormatRegex.exec(customArgs[i]);\n if (format) {\n return `--${format[1]}` as LogFormat;\n }\n }\n\n return LogFormat.NONE;\n}\n\nexport function isLogFormat(customArg: string | unknown) {\n return logFormatRegex.test(customArg as string);\n}\n", "import { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings';\n\n/***\n * The DiffSummary is returned as a response to getting `git().status()`\n */\nexport class DiffSummary implements DiffResult {\n changed = 0;\n deletions = 0;\n insertions = 0;\n\n files: Array = [];\n}\n", "import { DiffResult } from '../../../typings';\nimport { LogFormat } from '../args/log-format';\nimport { DiffSummary } from '../responses/DiffSummary';\nimport { isDiffNameStatus } from '../tasks/diff-name-status';\nimport { asNumber, LineParser, orVoid, parseStringResponse } from '../utils';\n\nconst statParser = [\n new LineParser(\n /^(.+)\\s+\\|\\s+(\\d+)(\\s+[+\\-]+)?$/,\n (result, [file, changes, alterations = '']) => {\n result.files.push({\n file: file.trim(),\n changes: asNumber(changes),\n insertions: alterations.replace(/[^+]/g, '').length,\n deletions: alterations.replace(/[^-]/g, '').length,\n binary: false,\n });\n }\n ),\n new LineParser(\n /^(.+) \\|\\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/,\n (result, [file, before, after]) => {\n result.files.push({\n file: file.trim(),\n before: asNumber(before),\n after: asNumber(after),\n binary: true,\n });\n }\n ),\n new LineParser(\n /(\\d+) files? changed\\s*((?:, \\d+ [^,]+){0,2})/,\n (result, [changed, summary]) => {\n const inserted = /(\\d+) i/.exec(summary);\n const deleted = /(\\d+) d/.exec(summary);\n\n result.changed = asNumber(changed);\n result.insertions = asNumber(inserted?.[1]);\n result.deletions = asNumber(deleted?.[1]);\n }\n ),\n];\n\nconst numStatParser = [\n new LineParser(\n /(\\d+)\\t(\\d+)\\t(.+)$/,\n (result, [changesInsert, changesDelete, file]) => {\n const insertions = asNumber(changesInsert);\n const deletions = asNumber(changesDelete);\n\n result.changed++;\n result.insertions += insertions;\n result.deletions += deletions;\n\n result.files.push({\n file,\n changes: insertions + deletions,\n insertions,\n deletions,\n binary: false,\n });\n }\n ),\n new LineParser(/-\\t-\\t(.+)$/, (result, [file]) => {\n result.changed++;\n\n result.files.push({\n file,\n after: 0,\n before: 0,\n binary: true,\n });\n }),\n];\n\nconst nameOnlyParser = [\n new LineParser(/(.+)$/, (result, [file]) => {\n result.changed++;\n result.files.push({\n file,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n });\n }),\n];\n\nconst nameStatusParser = [\n new LineParser(\n /([ACDMRTUXB])([0-9]{0,3})\\t(.[^\\t]*)(\\t(.[^\\t]*))?$/,\n (result, [status, similarity, from, _to, to]) => {\n result.changed++;\n result.files.push({\n file: to ?? from,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n status: orVoid(isDiffNameStatus(status) && status),\n from: orVoid(!!to && from !== to && from),\n similarity: asNumber(similarity),\n });\n }\n ),\n];\n\nconst diffSummaryParsers: Record[]> = {\n [LogFormat.NONE]: statParser,\n [LogFormat.STAT]: statParser,\n [LogFormat.NUM_STAT]: numStatParser,\n [LogFormat.NAME_STATUS]: nameStatusParser,\n [LogFormat.NAME_ONLY]: nameOnlyParser,\n};\n\nexport function getDiffParser(format = LogFormat.NONE) {\n const parser = diffSummaryParsers[format];\n\n return (stdOut: string) => parseStringResponse(new DiffSummary(), parser, stdOut, false);\n}\n", "import { ListLogLine, LogResult } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\nimport { getDiffParser } from './parse-diff-summary';\nimport { LogFormat } from '../args/log-format';\n\nexport const START_BOUNDARY = '\u00F2\u00F2\u00F2\u00F2\u00F2\u00F2 ';\n\nexport const COMMIT_BOUNDARY = ' \u00F2\u00F2';\n\nexport const SPLITTER = ' \u00F2 ';\n\nconst defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email'];\n\nfunction lineBuilder(tokens: string[], fields: string[]): any {\n return fields.reduce(\n (line, field, index) => {\n line[field] = tokens[index] || '';\n return line;\n },\n Object.create({ diff: null }) as any\n );\n}\n\nexport function createListLogSummaryParser(\n splitter = SPLITTER,\n fields = defaultFieldNames,\n logFormat = LogFormat.NONE\n) {\n const parseDiffResult = getDiffParser(logFormat);\n\n return function (stdOut: string): LogResult {\n const all: ReadonlyArray = toLinesWithContent(\n stdOut.trim(),\n false,\n START_BOUNDARY\n ).map(function (item) {\n const lineDetail = item.split(COMMIT_BOUNDARY);\n const listLogLine: T & ListLogLine = lineBuilder(lineDetail[0].split(splitter), fields);\n\n if (lineDetail.length > 1 && !!lineDetail[1].trim()) {\n listLogLine.diff = parseDiffResult(lineDetail[1]);\n }\n\n return listLogLine;\n });\n\n return {\n all,\n latest: (all.length && all[0]) || null,\n total: all.length,\n };\n };\n}\n", "import { StringTask } from '../types';\nimport { DiffResult } from '../../../typings';\nimport { isLogFormat, LogFormat, logFormatFromCommand } from '../args/log-format';\nimport { getDiffParser } from '../parsers/parse-diff-summary';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function diffSummaryTask(customArgs: string[]): StringTask | EmptyTask {\n let logFormat = logFormatFromCommand(customArgs);\n\n const commands = ['diff'];\n\n if (logFormat === LogFormat.NONE) {\n logFormat = LogFormat.STAT;\n commands.push('--stat=4096');\n }\n\n commands.push(...customArgs);\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser: getDiffParser(logFormat),\n }\n );\n}\n\nexport function validateLogFormatConfig(customArgs: unknown[]): EmptyTask | void {\n const flags = customArgs.filter(isLogFormat);\n\n if (flags.length > 1) {\n return configurationErrorTask(\n `Summary flags are mutually exclusive - pick one of ${flags.join(',')}`\n );\n }\n\n if (flags.length && customArgs.includes('-z')) {\n return configurationErrorTask(\n `Summary flag ${flags} parsing is not compatible with null termination option '-z'`\n );\n }\n}\n", "import type { LogResult, Options, SimpleGit } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { pathspec } from '../args/pathspec';\nimport {\n COMMIT_BOUNDARY,\n createListLogSummaryParser,\n SPLITTER,\n START_BOUNDARY,\n} from '../parsers/parse-list-log-summary';\nimport {\n appendTaskOptions,\n asStringArray,\n filterArray,\n filterPlainObject,\n filterString,\n filterType,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} from '../utils';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { configurationErrorTask } from './task';\nimport { validateLogFormatConfig } from './diff';\nimport { StringTask } from '../types';\n\nenum excludeOptions {\n '--pretty',\n 'max-count',\n 'maxCount',\n 'n',\n 'file',\n 'format',\n 'from',\n 'to',\n 'splitter',\n 'symmetric',\n 'mailMap',\n 'multiLine',\n 'strictDate',\n}\n\nexport interface DefaultLogFields {\n hash: string;\n date: string;\n message: string;\n refs: string;\n body: string;\n author_name: string;\n author_email: string;\n}\n\nexport type LogOptions = {\n file?: string;\n format?: T;\n from?: string;\n mailMap?: boolean;\n maxCount?: number;\n multiLine?: boolean;\n splitter?: string;\n strictDate?: boolean;\n symmetric?: boolean;\n to?: string;\n};\n\ninterface ParsedLogOptions {\n fields: string[];\n splitter: string;\n commands: string[];\n}\n\nfunction prettyFormat(\n format: Record,\n splitter: string\n): [string[], string] {\n const fields: string[] = [];\n const formatStr: string[] = [];\n\n Object.keys(format).forEach((field) => {\n fields.push(field);\n formatStr.push(String(format[field]));\n });\n\n return [fields, formatStr.join(splitter)];\n}\n\nfunction userOptions(input: T): Options {\n return Object.keys(input).reduce((out, key) => {\n if (!(key in excludeOptions)) {\n out[key] = input[key];\n }\n return out;\n }, {} as Options);\n}\n\nexport function parseLogOptions(\n opt: Options | LogOptions = {},\n customArgs: string[] = []\n): ParsedLogOptions {\n const splitter = filterType(opt.splitter, filterString, SPLITTER);\n const format = filterPlainObject(opt.format)\n ? opt.format\n : {\n hash: '%H',\n date: opt.strictDate === false ? '%ai' : '%aI',\n message: '%s',\n refs: '%D',\n body: opt.multiLine ? '%B' : '%b',\n author_name: opt.mailMap !== false ? '%aN' : '%an',\n author_email: opt.mailMap !== false ? '%aE' : '%ae',\n };\n\n const [fields, formatStr] = prettyFormat(format, splitter);\n\n const suffix: string[] = [];\n const command: string[] = [\n `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`,\n ...customArgs,\n ];\n\n const maxCount: number | undefined = (opt as any).n || (opt as any)['max-count'] || opt.maxCount;\n if (maxCount) {\n command.push(`--max-count=${maxCount}`);\n }\n\n if (opt.from || opt.to) {\n const rangeOperator = opt.symmetric !== false ? '...' : '..';\n suffix.push(`${opt.from || ''}${rangeOperator}${opt.to || ''}`);\n }\n\n if (filterString(opt.file)) {\n command.push('--follow', pathspec(opt.file));\n }\n\n appendTaskOptions(userOptions(opt as Options), command);\n\n return {\n fields,\n splitter,\n commands: [...command, ...suffix],\n };\n}\n\nexport function logTask(\n splitter: string,\n fields: string[],\n customArgs: string[]\n): StringTask> {\n const parser = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs));\n\n return {\n commands: ['log', ...customArgs],\n format: 'utf-8',\n parser,\n };\n}\n\nexport default function (): Pick {\n return {\n log(this: SimpleGitApi, ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const options = parseLogOptions(\n trailingOptionsArgument(arguments),\n asStringArray(filterType(arguments[0], filterArray, []))\n );\n const task =\n rejectDeprecatedSignatures(...rest) ||\n validateLogFormatConfig(options.commands) ||\n createLogTask(options);\n\n return this._runTask(task, next);\n },\n };\n\n function createLogTask(options: ParsedLogOptions) {\n return logTask(options.splitter, options.fields, options.commands);\n }\n\n function rejectDeprecatedSignatures(from?: unknown, to?: unknown) {\n return (\n filterString(from) &&\n filterString(to) &&\n configurationErrorTask(\n `git.log(string, string) should be replaced with git.log({ from: string, to: string })`\n )\n );\n }\n}\n", "import {\n MergeConflict,\n MergeConflictDeletion,\n MergeDetail,\n MergeResultStatus,\n} from '../../../typings';\n\nexport class MergeSummaryConflict implements MergeConflict {\n constructor(\n public readonly reason: string,\n public readonly file: string | null = null,\n public readonly meta?: MergeConflictDeletion\n ) {}\n\n toString() {\n return `${this.file}:${this.reason}`;\n }\n}\n\nexport class MergeSummaryDetail implements MergeDetail {\n public conflicts: MergeConflict[] = [];\n public merges: string[] = [];\n public result: MergeResultStatus = 'success';\n\n get failed() {\n return this.conflicts.length > 0;\n }\n\n get reason() {\n return this.result;\n }\n\n toString() {\n if (this.conflicts.length) {\n return `CONFLICTS: ${this.conflicts.join(', ')}`;\n }\n\n return 'OK';\n }\n}\n", "import {\n PullDetailFileChanges,\n PullDetailSummary,\n PullFailedResult,\n PullResult,\n} from '../../../typings';\n\nexport class PullSummary implements PullResult {\n public remoteMessages = {\n all: [],\n };\n public created = [];\n public deleted: string[] = [];\n public files: string[] = [];\n public deletions: PullDetailFileChanges = {};\n public insertions: PullDetailFileChanges = {};\n public summary: PullDetailSummary = {\n changes: 0,\n deletions: 0,\n insertions: 0,\n };\n}\n\nexport class PullFailedSummary implements PullFailedResult {\n remote = '';\n hash = {\n local: '',\n remote: '',\n };\n branch = {\n local: '',\n remote: '',\n };\n message = '';\n\n toString() {\n return this.message;\n }\n}\n", "import {\n RemoteMessageResult,\n RemoteMessages,\n RemoteMessagesObjectEnumeration,\n} from '../../../typings';\nimport { asNumber, RemoteLineParser } from '../utils';\n\nfunction objectEnumerationResult(\n remoteMessages: T\n): RemoteMessagesObjectEnumeration {\n return (remoteMessages.objects = remoteMessages.objects || {\n compressing: 0,\n counting: 0,\n enumerating: 0,\n packReused: 0,\n reused: { count: 0, delta: 0 },\n total: { count: 0, delta: 0 },\n });\n}\n\nfunction asObjectCount(source: string) {\n const count = /^\\s*(\\d+)/.exec(source);\n const delta = /delta (\\d+)/i.exec(source);\n\n return {\n count: asNumber((count && count[1]) || '0'),\n delta: asNumber((delta && delta[1]) || '0'),\n };\n}\n\nexport const remoteMessagesObjectParsers: RemoteLineParser>[] =\n [\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: (\\d+),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: \\d+% \\(\\d+\\/(\\d+)\\),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /total ([^,]+), reused ([^,]+), pack-reused (\\d+)/i,\n (result, [total, reused, packReused]) => {\n const objects = objectEnumerationResult(result.remoteMessages);\n objects.total = asObjectCount(total);\n objects.reused = asObjectCount(reused);\n objects.packReused = asNumber(packReused);\n }\n ),\n ];\n", "import { PushResultRemoteMessages, RemoteMessageResult, RemoteMessages } from '../../../typings';\nimport { asNumber, parseStringResponse, RemoteLineParser } from '../utils';\nimport { remoteMessagesObjectParsers } from './parse-remote-objects';\n\nconst parsers: RemoteLineParser>[] =\n [\n new RemoteLineParser(/^remote:\\s*(.+)$/, (result, [text]) => {\n result.remoteMessages.all.push(text.trim());\n return false;\n }),\n ...remoteMessagesObjectParsers,\n new RemoteLineParser(\n [/create a (?:pull|merge) request/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [pullRequestUrl]) => {\n (result.remoteMessages as PushResultRemoteMessages).pullRequestUrl = pullRequestUrl;\n }\n ),\n new RemoteLineParser(\n [/found (\\d+) vulnerabilities.+\\(([^)]+)\\)/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [count, summary, url]) => {\n (result.remoteMessages as PushResultRemoteMessages).vulnerabilities = {\n count: asNumber(count),\n summary,\n url,\n };\n }\n ),\n ];\n\nexport function parseRemoteMessages(\n _stdOut: string,\n stdErr: string\n): RemoteMessageResult {\n return parseStringResponse({ remoteMessages: new RemoteMessageSummary() as T }, parsers, stdErr);\n}\n\nexport class RemoteMessageSummary implements RemoteMessages {\n public readonly all: string[] = [];\n}\n", "import { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings';\nimport { PullFailedSummary, PullSummary } from '../responses/PullSummary';\nimport { TaskParser } from '../types';\nimport { append, LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nconst FILE_UPDATE_REGEX = /^\\s*(.+?)\\s+\\|\\s+\\d+\\s*(\\+*)(-*)/;\nconst SUMMARY_REGEX = /(\\d+)\\D+((\\d+)\\D+\\(\\+\\))?(\\D+(\\d+)\\D+\\(-\\))?/;\nconst ACTION_REGEX = /^(create|delete) mode \\d+ (.+)/;\n\nconst parsers: LineParser[] = [\n new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => {\n result.files.push(file);\n\n if (insertions) {\n result.insertions[file] = insertions.length;\n }\n\n if (deletions) {\n result.deletions[file] = deletions.length;\n }\n }),\n new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => {\n if (insertions !== undefined || deletions !== undefined) {\n result.summary.changes = +changes || 0;\n result.summary.insertions = +insertions || 0;\n result.summary.deletions = +deletions || 0;\n return true;\n }\n return false;\n }),\n new LineParser(ACTION_REGEX, (result, [action, file]) => {\n append(result.files, file);\n append(action === 'create' ? result.created : result.deleted, file);\n }),\n];\n\nconst errorParsers: LineParser[] = [\n new LineParser(/^from\\s(.+)$/i, (result, [remote]) => void (result.remote = remote)),\n new LineParser(/^fatal:\\s(.+)$/, (result, [message]) => void (result.message = message)),\n new LineParser(\n /([a-z0-9]+)\\.\\.([a-z0-9]+)\\s+(\\S+)\\s+->\\s+(\\S+)$/,\n (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => {\n result.branch.local = branchLocal;\n result.hash.local = hashLocal;\n result.branch.remote = branchRemote;\n result.hash.remote = hashRemote;\n }\n ),\n];\n\nexport const parsePullDetail: TaskParser = (stdOut, stdErr) => {\n return parseStringResponse(new PullSummary(), parsers, [stdOut, stdErr]);\n};\n\nexport const parsePullResult: TaskParser = (stdOut, stdErr) => {\n return Object.assign(\n new PullSummary(),\n parsePullDetail(stdOut, stdErr),\n parseRemoteMessages(stdOut, stdErr)\n );\n};\n\nexport function parsePullErrorResult(stdOut: string, stdErr: string) {\n const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]);\n\n return pullError.message && pullError;\n}\n", "import { MergeDetail, MergeResult } from '../../../typings';\nimport { MergeSummaryConflict, MergeSummaryDetail } from '../responses/MergeSummary';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parsePullResult } from './parse-pull';\n\nconst parsers: LineParser[] = [\n new LineParser(/^Auto-merging\\s+(.+)$/, (summary, [autoMerge]) => {\n summary.merges.push(autoMerge);\n }),\n new LineParser(/^CONFLICT\\s+\\((.+)\\): Merge conflict in (.+)$/, (summary, [reason, file]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file));\n }),\n new LineParser(\n /^CONFLICT\\s+\\((.+\\/delete)\\): (.+) deleted in (.+) and/,\n (summary, [reason, file, deleteRef]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef }));\n }\n ),\n new LineParser(/^CONFLICT\\s+\\((.+)\\):/, (summary, [reason]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, null));\n }),\n new LineParser(/^Automatic merge failed;\\s+(.+)$/, (summary, [result]) => {\n summary.result = result;\n }),\n];\n\n/**\n * Parse the complete response from `git.merge`\n */\nexport const parseMergeResult: TaskParser = (stdOut, stdErr) => {\n return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr));\n};\n\n/**\n * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge`\n * @param stdOut\n */\nexport const parseMergeDetail: TaskParser = (stdOut) => {\n return parseStringResponse(new MergeSummaryDetail(), parsers, stdOut);\n};\n", "import { MergeResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parseMergeResult } from '../parsers/parse-merge';\nimport { StringTask } from '../types';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function mergeTask(customArgs: string[]): EmptyTask | StringTask {\n if (!customArgs.length) {\n return configurationErrorTask('Git.merge requires at least one option');\n }\n\n return {\n commands: ['merge', ...customArgs],\n format: 'utf-8',\n parser(stdOut, stdErr): MergeResult {\n const merge = parseMergeResult(stdOut, stdErr);\n if (merge.failed) {\n throw new GitResponseError(merge);\n }\n\n return merge;\n },\n };\n}\n", "import {\n PushDetail,\n PushResult,\n PushResultPushedItem,\n PushResultRemoteMessages,\n} from '../../../typings';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nfunction pushResultPushedItem(local: string, remote: string, status: string): PushResultPushedItem {\n const deleted = status.includes('deleted');\n const tag = status.includes('tag') || /^refs\\/tags/.test(local);\n const alreadyUpdated = !status.includes('new');\n\n return {\n deleted,\n tag,\n branch: !tag,\n new: !alreadyUpdated,\n alreadyUpdated,\n local,\n remote,\n };\n}\n\nconst parsers: LineParser[] = [\n new LineParser(/^Pushing to (.+)$/, (result, [repo]) => {\n result.repo = repo;\n }),\n new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => {\n result.ref = {\n ...(result.ref || {}),\n local,\n };\n }),\n new LineParser(/^[=*-]\\s+([^:]+):(\\S+)\\s+\\[(.+)]$/, (result, [local, remote, type]) => {\n result.pushed.push(pushResultPushedItem(local, remote, type));\n }),\n new LineParser(\n /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/,\n (result, [local, remote, remoteName]) => {\n result.branch = {\n ...(result.branch || {}),\n local,\n remote,\n remoteName,\n };\n }\n ),\n new LineParser(\n /^([^:]+):(\\S+)\\s+([a-z0-9]+)\\.\\.([a-z0-9]+)$/,\n (result, [local, remote, from, to]) => {\n result.update = {\n head: {\n local,\n remote,\n },\n hash: {\n from,\n to,\n },\n };\n }\n ),\n];\n\nexport const parsePushResult: TaskParser = (stdOut, stdErr) => {\n const pushDetail = parsePushDetail(stdOut, stdErr);\n const responseDetail = parseRemoteMessages(stdOut, stdErr);\n\n return {\n ...pushDetail,\n ...responseDetail,\n };\n};\n\nexport const parsePushDetail: TaskParser = (stdOut, stdErr) => {\n return parseStringResponse({ pushed: [] }, parsers, [stdOut, stdErr]);\n};\n", "import { PushResult } from '../../../typings';\nimport { parsePushResult as parser } from '../parsers/parse-push';\nimport { StringTask } from '../types';\nimport { append, remove } from '../utils';\n\ntype PushRef = { remote?: string; branch?: string };\n\nexport function pushTagsTask(ref: PushRef = {}, customArgs: string[]): StringTask {\n append(customArgs, '--tags');\n return pushTask(ref, customArgs);\n}\n\nexport function pushTask(ref: PushRef = {}, customArgs: string[]): StringTask {\n const commands = ['push', ...customArgs];\n if (ref.branch) {\n commands.splice(1, 0, ref.branch);\n }\n if (ref.remote) {\n commands.splice(1, 0, ref.remote);\n }\n\n remove(commands, '-v');\n append(commands, '--verbose');\n append(commands, '--porcelain');\n\n return {\n commands,\n format: 'utf-8',\n parser,\n };\n}\n", "import { SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, trailingFunctionArgument } from '../utils';\nimport { straightThroughBufferTask, straightThroughStringTask } from './task';\n\nexport default function (): Pick {\n return {\n showBuffer(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n if (!commands.includes('--binary')) {\n commands.splice(1, 0, '--binary');\n }\n\n return this._runTask(\n straightThroughBufferTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n\n show(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n return this._runTask(\n straightThroughStringTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import { FileStatusResult } from '../../../typings';\n\nexport const fromPathRegex = /^(.+)\\0(.+)$/;\n\nexport class FileStatusSummary implements FileStatusResult {\n public readonly from: string | undefined;\n\n constructor(\n public path: string,\n public index: string,\n public working_dir: string\n ) {\n if (index === 'R' || working_dir === 'R') {\n const detail = fromPathRegex.exec(path) || [null, path, path];\n this.from = detail[2] || '';\n this.path = detail[1] || '';\n }\n }\n}\n", "import { StatusResult } from '../../../typings';\nimport { filterString, filterType, NULL } from '../utils';\nimport { FileStatusSummary } from './FileStatusSummary';\n\ntype StatusLineParser = (result: StatusResult, file: string) => void;\n\nexport class StatusSummary implements StatusResult {\n public not_added = [];\n public conflicted = [];\n public created = [];\n public deleted = [];\n public ignored = undefined;\n public modified = [];\n public renamed = [];\n public files = [];\n public staged = [];\n public ahead = 0;\n public behind = 0;\n public current = null;\n public tracking = null;\n public detached = false;\n\n public isClean = () => {\n return !this.files.length;\n };\n}\n\nenum PorcelainFileStatus {\n ADDED = 'A',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n COPIED = 'C',\n UNMERGED = 'U',\n UNTRACKED = '?',\n IGNORED = '!',\n NONE = ' ',\n}\n\nfunction renamedFile(line: string) {\n const [to, from] = line.split(NULL);\n\n return {\n from: from || to,\n to,\n };\n}\n\nfunction parser(\n indexX: PorcelainFileStatus,\n indexY: PorcelainFileStatus,\n handler: StatusLineParser\n): [string, StatusLineParser] {\n return [`${indexX}${indexY}`, handler];\n}\n\nfunction conflicts(indexX: PorcelainFileStatus, ...indexY: PorcelainFileStatus[]) {\n return indexY.map((y) => parser(indexX, y, (result, file) => result.conflicted.push(file)));\n}\n\nconst parsers: Map = new Map([\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) =>\n result.created.push(file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) =>\n result.deleted.push(file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) =>\n result.modified.push(file)\n ),\n\n parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.NONE, (result, file) => {\n result.created.push(file);\n result.staged.push(file);\n }),\n parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.MODIFIED, (result, file) => {\n result.created.push(file);\n result.staged.push(file);\n result.modified.push(file);\n }),\n\n parser(PorcelainFileStatus.DELETED, PorcelainFileStatus.NONE, (result, file) => {\n result.deleted.push(file);\n result.staged.push(file);\n }),\n\n parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.NONE, (result, file) => {\n result.modified.push(file);\n result.staged.push(file);\n }),\n parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.MODIFIED, (result, file) => {\n result.modified.push(file);\n result.staged.push(file);\n }),\n\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => {\n result.renamed.push(renamedFile(file));\n }),\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => {\n const renamed = renamedFile(file);\n result.renamed.push(renamed);\n result.modified.push(renamed.to);\n }),\n parser(PorcelainFileStatus.IGNORED, PorcelainFileStatus.IGNORED, (_result, _file) => {\n (_result.ignored = _result.ignored || []).push(_file);\n }),\n\n parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) =>\n result.not_added.push(file)\n ),\n\n ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED),\n ...conflicts(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n ...conflicts(\n PorcelainFileStatus.UNMERGED,\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n\n [\n '##',\n (result, line) => {\n const aheadReg = /ahead (\\d+)/;\n const behindReg = /behind (\\d+)/;\n const currentReg = /^(.+?(?=(?:\\.{3}|\\s|$)))/;\n const trackingReg = /\\.{3}(\\S*)/;\n const onEmptyBranchReg = /\\son\\s(\\S+?)(?=\\.{3}|$)/;\n\n let regexResult = aheadReg.exec(line);\n result.ahead = (regexResult && +regexResult[1]) || 0;\n\n regexResult = behindReg.exec(line);\n result.behind = (regexResult && +regexResult[1]) || 0;\n\n regexResult = currentReg.exec(line);\n result.current = filterType(regexResult?.[1], filterString, null);\n\n regexResult = trackingReg.exec(line);\n result.tracking = filterType(regexResult?.[1], filterString, null);\n\n regexResult = onEmptyBranchReg.exec(line);\n if (regexResult) {\n result.current = filterType(regexResult?.[1], filterString, result.current);\n }\n\n result.detached = /\\(no branch\\)/.test(line);\n },\n ],\n]);\n\nexport const parseStatusSummary = function (text: string): StatusResult {\n const lines = text.split(NULL);\n const status = new StatusSummary();\n\n for (let i = 0, l = lines.length; i < l; ) {\n let line = lines[i++].trim();\n\n if (!line) {\n continue;\n }\n\n if (line.charAt(0) === PorcelainFileStatus.RENAMED) {\n line += NULL + (lines[i++] || '');\n }\n\n splitLine(status, line);\n }\n\n return status;\n};\n\nfunction splitLine(result: StatusResult, lineStr: string) {\n const trimmed = lineStr.trim();\n switch (' ') {\n case trimmed.charAt(2):\n return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.slice(3));\n case trimmed.charAt(1):\n return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.slice(2));\n default:\n return;\n }\n\n function data(index: string, workingDir: string, path: string) {\n const raw = `${index}${workingDir}`;\n const handler = parsers.get(raw);\n\n if (handler) {\n handler(result, path);\n }\n\n if (raw !== '##' && raw !== '!!') {\n result.files.push(new FileStatusSummary(path, index, workingDir));\n }\n }\n}\n", "import { StatusResult } from '../../../typings';\nimport { parseStatusSummary } from '../responses/StatusSummary';\nimport { StringTask } from '../types';\n\nconst ignoredOptions = ['--null', '-z'];\n\nexport function statusTask(customArgs: string[]): StringTask {\n const commands = [\n 'status',\n '--porcelain',\n '-b',\n '-u',\n '--null',\n ...customArgs.filter((arg) => !ignoredOptions.includes(arg)),\n ];\n\n return {\n format: 'utf-8',\n commands,\n parser(text: string) {\n return parseStatusSummary(text);\n },\n };\n}\n", "import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asNumber, ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nexport interface VersionResult {\n major: number;\n minor: number;\n patch: number | string;\n agent: string;\n installed: boolean;\n}\n\nconst NOT_INSTALLED = 'installed=false';\n\nfunction versionResponse(\n major = 0,\n minor = 0,\n patch: string | number = 0,\n agent = '',\n installed = true\n): VersionResult {\n return Object.defineProperty(\n {\n major,\n minor,\n patch,\n agent,\n installed,\n },\n 'toString',\n {\n value() {\n return `${this.major}.${this.minor}.${this.patch}`;\n },\n configurable: false,\n enumerable: false,\n }\n );\n}\n\nfunction notInstalledResponse() {\n return versionResponse(0, 0, 0, '', false);\n}\n\nexport default function (): Pick {\n return {\n version(this: SimpleGitApi) {\n return this._runTask({\n commands: ['--version'],\n format: 'utf-8',\n parser: versionParser,\n onError(result, error, done, fail) {\n if (result.exitCode === ExitCodes.NOT_FOUND) {\n return done(Buffer.from(NOT_INSTALLED));\n }\n\n fail(error);\n },\n });\n },\n };\n}\n\nconst parsers: LineParser[] = [\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*\\((.+)\\))?/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(\n result,\n versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)\n );\n }\n ),\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\D+)(.+)?$/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent));\n }\n ),\n];\n\nfunction versionParser(stdOut: string) {\n if (stdOut === NOT_INSTALLED) {\n return notInstalledResponse();\n }\n\n return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers, stdOut);\n}\n", "import { SimpleGitBase } from '../../typings';\nimport { taskCallback } from './task-callback';\nimport { changeWorkingDirectoryTask } from './tasks/change-working-directory';\nimport checkout from './tasks/checkout';\nimport countObjects from './tasks/count-objects';\nimport commit from './tasks/commit';\nimport config from './tasks/config';\nimport firstCommit from './tasks/first-commit';\nimport grep from './tasks/grep';\nimport { hashObjectTask } from './tasks/hash-object';\nimport { initTask } from './tasks/init';\nimport log from './tasks/log';\nimport { mergeTask } from './tasks/merge';\nimport { pushTask } from './tasks/push';\nimport show from './tasks/show';\nimport { statusTask } from './tasks/status';\nimport { configurationErrorTask, straightThroughStringTask } from './tasks/task';\nimport version from './tasks/version';\nimport { outputHandler, SimpleGitExecutor, SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport {\n asArray,\n filterString,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n} from './utils';\n\nexport class SimpleGitApi implements SimpleGitBase {\n constructor(private _executor: SimpleGitExecutor) {}\n\n protected _runTask(task: SimpleGitTask, then?: SimpleGitTaskCallback) {\n const chain = this._executor.chain();\n const promise = chain.push(task);\n\n if (then) {\n taskCallback(task, promise, then);\n }\n\n return Object.create(this, {\n then: { value: promise.then.bind(promise) },\n catch: { value: promise.catch.bind(promise) },\n _executor: { value: chain },\n });\n }\n\n add(files: string | string[]) {\n return this._runTask(\n straightThroughStringTask(['add', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n cwd(directory: string | { path: string; root?: boolean }) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof directory === 'string') {\n return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next);\n }\n\n if (typeof directory?.path === 'string') {\n return this._runTask(\n changeWorkingDirectoryTask(\n directory.path,\n (directory.root && this._executor) || undefined\n ),\n next\n );\n }\n\n return this._runTask(\n configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string'),\n next\n );\n }\n\n hashObject(path: string, write: boolean | unknown) {\n return this._runTask(\n hashObjectTask(path, write === true),\n trailingFunctionArgument(arguments)\n );\n }\n\n init(bare?: boolean | unknown) {\n return this._runTask(\n initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n merge() {\n return this._runTask(\n mergeTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n mergeFromTo(remote: string, branch: string) {\n if (!(filterString(remote) && filterString(branch))) {\n return this._runTask(\n configurationErrorTask(\n `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`\n )\n );\n }\n\n return this._runTask(\n mergeTask([remote, branch, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments, false)\n );\n }\n\n outputHandler(handler: outputHandler) {\n this._executor.outputHandler = handler;\n return this;\n }\n\n push() {\n const task = pushTask(\n {\n remote: filterType(arguments[0], filterString),\n branch: filterType(arguments[1], filterString),\n },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n }\n\n stash() {\n return this._runTask(\n straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n status() {\n return this._runTask(\n statusTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n}\n\nObject.assign(\n SimpleGitApi.prototype,\n checkout(),\n commit(),\n config(),\n countObjects(),\n firstCommit(),\n grep(),\n log(),\n show(),\n version()\n);\n", "import { append, remove } from '../utils';\nimport { createDeferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { createLogger } from '../git-logger';\n\ntype ScheduleCompleteCallback = () => void;\ntype ScheduledTask = Pick, 'promise' | 'done'> & {\n id: number;\n};\n\nconst createScheduledTask: () => ScheduledTask = (() => {\n let id = 0;\n return () => {\n id++;\n const { promise, done } = createDeferred();\n\n return {\n promise,\n done,\n id,\n };\n };\n})();\n\nexport class Scheduler {\n private logger = createLogger('', 'scheduler');\n private pending: ScheduledTask[] = [];\n private running: ScheduledTask[] = [];\n\n constructor(private concurrency = 2) {\n this.logger(`Constructed, concurrency=%s`, concurrency);\n }\n\n private schedule() {\n if (!this.pending.length || this.running.length >= this.concurrency) {\n this.logger(\n `Schedule attempt ignored, pending=%s running=%s concurrency=%s`,\n this.pending.length,\n this.running.length,\n this.concurrency\n );\n return;\n }\n\n const task = append(this.running, this.pending.shift()!);\n this.logger(`Attempting id=%s`, task.id);\n task.done(() => {\n this.logger(`Completing id=`, task.id);\n remove(this.running, task);\n this.schedule();\n });\n }\n\n next(): Promise {\n const { promise, id } = append(this.pending, createScheduledTask());\n this.logger(`Scheduling id=%s`, id);\n\n this.schedule();\n\n return promise;\n }\n}\n", "import { straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\n\nexport type ApplyOptions = Options &\n OptionFlags<\n | '--stat'\n | '--numstat'\n | '--summary'\n | '--check'\n | '--index'\n | '--intent-to-add'\n | '--3way'\n | '--apply'\n | '--no-add'\n | '-R'\n | '--reverse'\n | '--allow-binary-replacement'\n | '--binary'\n | '--reject'\n | '-z'\n | '--inaccurate-eof'\n | '--recount'\n | '--cached'\n | '--ignore-space-change'\n | '--ignore-whitespace'\n | '--verbose'\n | '--unsafe-paths'\n > &\n OptionFlags<'--whitespace', 'nowarn' | 'warn' | 'fix' | 'error' | 'error-all'> &\n OptionFlags<'--build-fake-ancestor' | '--exclude' | '--include' | '--directory', string> &\n OptionFlags<'-p' | '-C', number>;\n\nexport function applyPatchTask(patches: string[], customArgs: string[]): StringTask {\n return straightThroughStringTask(['apply', ...customArgs, ...patches]);\n}\n", "import {\n BranchMultiDeleteResult,\n BranchSingleDeleteFailure,\n BranchSingleDeleteResult,\n BranchSingleDeleteSuccess,\n} from '../../../typings';\n\nexport class BranchDeletionBatch implements BranchMultiDeleteResult {\n all: BranchSingleDeleteResult[] = [];\n branches: { [branchName: string]: BranchSingleDeleteResult } = {};\n errors: BranchSingleDeleteResult[] = [];\n\n get success(): boolean {\n return !this.errors.length;\n }\n}\n\nexport function branchDeletionSuccess(branch: string, hash: string): BranchSingleDeleteSuccess {\n return {\n branch,\n hash,\n success: true,\n };\n}\n\nexport function branchDeletionFailure(branch: string): BranchSingleDeleteFailure {\n return {\n branch,\n hash: null,\n success: false,\n };\n}\n\nexport function isSingleBranchDeleteFailure(\n test: BranchSingleDeleteResult\n): test is BranchSingleDeleteSuccess {\n return test.success;\n}\n", "import { BranchMultiDeleteResult } from '../../../typings';\nimport {\n BranchDeletionBatch,\n branchDeletionFailure,\n branchDeletionSuccess,\n} from '../responses/BranchDeleteSummary';\nimport { TaskParser } from '../types';\nimport { ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nconst deleteSuccessRegex = /(\\S+)\\s+\\(\\S+\\s([^)]+)\\)/;\nconst deleteErrorRegex = /^error[^']+'([^']+)'/m;\n\nconst parsers: LineParser[] = [\n new LineParser(deleteSuccessRegex, (result, [branch, hash]) => {\n const deletion = branchDeletionSuccess(branch, hash);\n\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n new LineParser(deleteErrorRegex, (result, [branch]) => {\n const deletion = branchDeletionFailure(branch);\n\n result.errors.push(deletion);\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n];\n\nexport const parseBranchDeletions: TaskParser = (\n stdOut,\n stdErr\n) => {\n return parseStringResponse(new BranchDeletionBatch(), parsers, [stdOut, stdErr]);\n};\n\nexport function hasBranchDeletionError(data: string, processExitCode: ExitCodes): boolean {\n return processExitCode === ExitCodes.ERROR && deleteErrorRegex.test(data);\n}\n", "import type { BranchSummary, BranchSummaryBranch } from '../../../typings';\n\nexport enum BranchStatusIdentifier {\n CURRENT = '*',\n LINKED = '+',\n}\n\nexport class BranchSummaryResult implements BranchSummary {\n public all: string[] = [];\n public branches: { [p: string]: BranchSummaryBranch } = {};\n public current: string = '';\n public detached: boolean = false;\n\n push(\n status: BranchStatusIdentifier | unknown,\n detached: boolean,\n name: string,\n commit: string,\n label: string\n ) {\n if (status === BranchStatusIdentifier.CURRENT) {\n this.detached = detached;\n this.current = name;\n }\n\n this.all.push(name);\n this.branches[name] = {\n current: status === BranchStatusIdentifier.CURRENT,\n linkedWorkTree: status === BranchStatusIdentifier.LINKED,\n name,\n commit,\n label,\n };\n }\n}\n", "import type { BranchSummary } from '../../../typings';\nimport { BranchStatusIdentifier, BranchSummaryResult } from '../responses/BranchSummary';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(\n /^([*+]\\s)?\\((?:HEAD )?detached (?:from|at) (\\S+)\\)\\s+([a-z0-9]+)\\s(.*)$/,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), true, name, commit, label);\n }\n ),\n new LineParser(\n /^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$/s,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), false, name, commit, label);\n }\n ),\n];\n\nconst currentBranchParser = new LineParser(/^(\\S+)$/s, (result, [name]) => {\n result.push(BranchStatusIdentifier.CURRENT, false, name, '', '');\n});\n\nfunction branchStatus(input?: string) {\n return input ? input.charAt(0) : '';\n}\n\nexport function parseBranchSummary(stdOut: string, currentOnly = false): BranchSummary {\n return parseStringResponse(\n new BranchSummaryResult(),\n currentOnly ? [currentBranchParser] : parsers,\n stdOut\n );\n}\n", "import { BranchMultiDeleteResult, BranchSingleDeleteResult, BranchSummary } from '../../../typings';\nimport { StringTask } from '../types';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete';\nimport { parseBranchSummary } from '../parsers/parse-branch';\nimport { bufferToString } from '../utils';\n\nexport function containsDeleteBranchCommand(commands: string[]) {\n const deleteCommands = ['-d', '-D', '--delete'];\n return commands.some((command) => deleteCommands.includes(command));\n}\n\nexport function branchTask(\n customArgs: string[]\n): StringTask {\n const isDelete = containsDeleteBranchCommand(customArgs);\n const isCurrentOnly = customArgs.includes('--show-current');\n\n const commands = ['branch', ...customArgs];\n\n if (commands.length === 1) {\n commands.push('-a');\n }\n\n if (!commands.includes('-v')) {\n commands.splice(1, 0, '-v');\n }\n\n return {\n format: 'utf-8',\n commands,\n parser(stdOut, stdErr) {\n if (isDelete) {\n return parseBranchDeletions(stdOut, stdErr).all[0];\n }\n\n return parseBranchSummary(stdOut, isCurrentOnly);\n },\n };\n}\n\nexport function branchLocalTask(): StringTask {\n return {\n format: 'utf-8',\n commands: ['branch', '-v'],\n parser(stdOut) {\n return parseBranchSummary(stdOut);\n },\n };\n}\n\nexport function deleteBranchesTask(\n branches: string[],\n forceDelete = false\n): StringTask {\n return {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr);\n },\n onError({ exitCode, stdOut }, error, done, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n done(stdOut);\n },\n };\n}\n\nexport function deleteBranchTask(\n branch: string,\n forceDelete = false\n): StringTask {\n const task: StringTask = {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr).branches[branch]!;\n },\n onError({ exitCode, stdErr, stdOut }, error, _, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n throw new GitResponseError(\n task.parser(bufferToString(stdOut), bufferToString(stdErr)),\n String(error)\n );\n },\n };\n\n return task;\n}\n", "import { normalize } from 'node:path';\n\n/**\n * Parser for the `check-ignore` command - returns each file as a string array\n */\nexport const parseCheckIgnore = (text: string): string[] => {\n return text.split(/\\n/g).map(toPath).filter(Boolean);\n};\n\nfunction toPath(input: string) {\n const path = input.trim().replace(/^[\"']|[\"']$/g, '');\n return path && normalize(path);\n}\n", "import { StringTask } from '../types';\nimport { parseCheckIgnore } from '../responses/CheckIgnore';\n\nexport function checkIgnoreTask(paths: string[]): StringTask {\n return {\n commands: ['check-ignore', ...paths],\n format: 'utf-8',\n parser: parseCheckIgnore,\n };\n}\n", "import { configurationErrorTask, EmptyTask, straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\nimport { append, filterString } from '../utils';\n\nexport type CloneOptions = Options &\n OptionFlags<\n | '--bare'\n | '--dissociate'\n | '--mirror'\n | '--no-checkout'\n | '--no-remote-submodules'\n | '--no-shallow-submodules'\n | '--no-single-branch'\n | '--no-tags'\n | '--remote-submodules'\n | '--single-branch'\n | '--shallow-submodules'\n | '--verbose'\n > &\n OptionFlags<'--depth' | '-j' | '--jobs', number> &\n OptionFlags<\n | '--branch'\n | '--origin'\n | '--recurse-submodules'\n | '--separate-git-dir'\n | '--shallow-exclude'\n | '--shallow-since'\n | '--template',\n string\n >;\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function cloneTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n): StringTask | EmptyTask {\n const commands = ['clone', ...customArgs];\n\n filterString(repo) && commands.push(repo);\n filterString(directory) && commands.push(directory);\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function cloneMirrorTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n) {\n append(customArgs, '--mirror');\n\n return cloneTask(repo, directory, customArgs);\n}\n", "import { FetchResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/From (.+)$/, (result, [remote]) => {\n result.remote = remote;\n }),\n new LineParser(/\\* \\[new branch]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.branches.push({\n name,\n tracking,\n });\n }),\n new LineParser(/\\* \\[new tag]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.tags.push({\n name,\n tracking,\n });\n }),\n new LineParser(/- \\[deleted]\\s+\\S+\\s*-> (.+)$/, (result, [tracking]) => {\n result.deleted.push({\n tracking,\n });\n }),\n new LineParser(\n /\\s*([^.]+)\\.\\.(\\S+)\\s+(\\S+)\\s*-> (.+)$/,\n (result, [from, to, name, tracking]) => {\n result.updated.push({\n name,\n tracking,\n to,\n from,\n });\n }\n ),\n];\n\nexport function parseFetchResult(stdOut: string, stdErr: string): FetchResult {\n const result: FetchResult = {\n raw: stdOut,\n remote: null,\n branches: [],\n tags: [],\n updated: [],\n deleted: [],\n };\n return parseStringResponse(result, parsers, [stdOut, stdErr]);\n}\n", "import { FetchResult } from '../../../typings';\nimport { parseFetchResult } from '../parsers/parse-fetch';\nimport { StringTask } from '../types';\n\nimport { configurationErrorTask, EmptyTask } from './task';\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function fetchTask(\n remote: string,\n branch: string,\n customArgs: string[]\n): StringTask | EmptyTask {\n const commands = ['fetch', ...customArgs];\n if (remote && branch) {\n commands.push(remote, branch);\n }\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: parseFetchResult,\n };\n}\n", "import { MoveResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => {\n result.moves.push({ from, to });\n }),\n];\n\nexport function parseMoveResult(stdOut: string): MoveResult {\n return parseStringResponse({ moves: [] }, parsers, stdOut);\n}\n", "import { MoveResult } from '../../../typings';\nimport { parseMoveResult } from '../parsers/parse-move';\nimport { StringTask } from '../types';\nimport { asArray } from '../utils';\n\nexport function moveTask(from: string | string[], to: string): StringTask {\n return {\n commands: ['mv', '-v', ...asArray(from), to],\n format: 'utf-8',\n parser: parseMoveResult,\n };\n}\n", "import { PullResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parsePullErrorResult, parsePullResult } from '../parsers/parse-pull';\nimport { Maybe, StringTask } from '../types';\nimport { bufferToString } from '../utils';\n\nexport function pullTask(\n remote: Maybe,\n branch: Maybe,\n customArgs: string[]\n): StringTask {\n const commands: string[] = ['pull', ...customArgs];\n if (remote && branch) {\n commands.splice(1, 0, remote, branch);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(stdOut, stdErr): PullResult {\n return parsePullResult(stdOut, stdErr);\n },\n onError(result, _error, _done, fail) {\n const pullError = parsePullErrorResult(\n bufferToString(result.stdOut),\n bufferToString(result.stdErr)\n );\n if (pullError) {\n return fail(new GitResponseError(pullError));\n }\n\n fail(_error);\n },\n };\n}\n", "import { forEachLineWithContent } from '../utils';\n\nexport interface RemoteWithoutRefs {\n name: string;\n}\n\nexport interface RemoteWithRefs extends RemoteWithoutRefs {\n refs: {\n fetch: string;\n push: string;\n };\n}\n\nexport function parseGetRemotes(text: string): RemoteWithoutRefs[] {\n const remotes: { [name: string]: RemoteWithoutRefs } = {};\n\n forEach(text, ([name]) => (remotes[name] = { name }));\n\n return Object.values(remotes);\n}\n\nexport function parseGetRemotesVerbose(text: string): RemoteWithRefs[] {\n const remotes: { [name: string]: RemoteWithRefs } = {};\n\n forEach(text, ([name, url, purpose]) => {\n if (!Object.hasOwn(remotes, name)) {\n remotes[name] = {\n name: name,\n refs: { fetch: '', push: '' },\n };\n }\n\n if (purpose && url) {\n remotes[name].refs[purpose.replace(/[^a-z]/g, '') as keyof RemoteWithRefs['refs']] = url;\n }\n });\n\n return Object.values(remotes);\n}\n\nfunction forEach(text: string, handler: (line: string[]) => void) {\n forEachLineWithContent(text, (line) => handler(line.split(/\\s+/)));\n}\n", "import {\n parseGetRemotes,\n parseGetRemotesVerbose,\n type RemoteWithoutRefs,\n type RemoteWithRefs,\n} from '../responses/GetRemoteSummary';\nimport type { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addRemoteTask(\n remoteName: string,\n remoteRepo: string,\n customArgs: string[]\n): StringTask {\n return straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]);\n}\n\nexport function getRemotesTask(verbose: true): StringTask;\nexport function getRemotesTask(verbose: false): StringTask;\nexport function getRemotesTask(\n verbose: boolean\n): StringTask {\n const commands = ['remote'];\n if (verbose) {\n commands.push('-v');\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: verbose ? parseGetRemotesVerbose : parseGetRemotes,\n };\n}\n\nexport function listRemotesTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'ls-remote') {\n commands.unshift('ls-remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function remoteTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'remote') {\n commands.unshift('remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function removeRemoteTask(remoteName: string) {\n return straightThroughStringTask(['remote', 'remove', remoteName]);\n}\n", "import { LogOptions, LogResult } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { createListLogSummaryParser } from '../parsers/parse-list-log-summary';\nimport type { StringTask } from '../types';\nimport { validateLogFormatConfig } from './diff';\nimport { parseLogOptions } from './log';\nimport type { EmptyTask } from './task';\n\nexport function stashListTask(\n opt: LogOptions = {},\n customArgs: string[]\n): EmptyTask | StringTask {\n const options = parseLogOptions(opt);\n const commands = ['stash', 'list', ...options.commands, ...customArgs];\n const parser = createListLogSummaryParser(\n options.splitter,\n options.fields,\n logFormatFromCommand(commands)\n );\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser,\n }\n );\n}\n", "import { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addSubModuleTask(repo: string, path: string): StringTask {\n return subModuleTask(['add', repo, path]);\n}\n\nexport function initSubModuleTask(customArgs: string[]): StringTask {\n return subModuleTask(['init', ...customArgs]);\n}\n\nexport function subModuleTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'submodule') {\n commands.unshift('submodule');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function updateSubModuleTask(customArgs: string[]): StringTask {\n return subModuleTask(['update', ...customArgs]);\n}\n", "import { TagResult } from '../../../typings';\n\nexport class TagList implements TagResult {\n constructor(\n public readonly all: string[],\n public readonly latest: string | undefined\n ) {}\n}\n\nexport const parseTagList = function (data: string, customSort = false) {\n const tags = data.split('\\n').map(trimmed).filter(Boolean);\n\n if (!customSort) {\n tags.sort(function (tagA, tagB) {\n const partsA = tagA.split('.');\n const partsB = tagB.split('.');\n\n if (partsA.length === 1 || partsB.length === 1) {\n return singleSorted(toNumber(partsA[0]), toNumber(partsB[0]));\n }\n\n for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) {\n const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i]));\n\n if (diff) {\n return diff;\n }\n }\n\n return 0;\n });\n }\n\n const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0);\n\n return new TagList(tags, latest);\n};\n\nfunction singleSorted(a: number, b: number): number {\n const aIsNum = Number.isNaN(a);\n const bIsNum = Number.isNaN(b);\n\n if (aIsNum !== bIsNum) {\n return aIsNum ? 1 : -1;\n }\n\n return aIsNum ? sorted(a, b) : 0;\n}\n\nfunction sorted(a: number, b: number) {\n return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction trimmed(input: string) {\n return input.trim();\n}\n\nfunction toNumber(input: string | undefined) {\n if (typeof input === 'string') {\n return parseInt(input.replace(/^\\D+/g, ''), 10) || 0;\n }\n\n return 0;\n}\n", "import { TagResult } from '../../../typings';\nimport { parseTagList } from '../responses/TagList';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.tags`\n */\nexport function tagListTask(customArgs: string[] = []): StringTask {\n const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option));\n\n return {\n format: 'utf-8',\n commands: ['tag', '-l', ...customArgs],\n parser(text: string) {\n return parseTagList(text, hasCustomSort);\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addTagTask(name: string): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', name],\n parser() {\n return { name };\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addAnnotatedTagTask(\n name: string,\n tagMessage: string\n): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', '-a', '-m', tagMessage, name],\n parser() {\n return { name };\n },\n };\n}\n", "const { GitExecutor } = require('./lib/runners/git-executor');\nconst { SimpleGitApi } = require('./lib/simple-git-api');\n\nconst { Scheduler } = require('./lib/runners/scheduler');\nconst { configurationErrorTask } = require('./lib/tasks/task');\nconst {\n asArray,\n filterArray,\n filterPrimitives,\n filterString,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} = require('./lib/utils');\nconst { applyPatchTask } = require('./lib/tasks/apply-patch');\nconst {\n branchTask,\n branchLocalTask,\n deleteBranchesTask,\n deleteBranchTask,\n} = require('./lib/tasks/branch');\nconst { checkIgnoreTask } = require('./lib/tasks/check-ignore');\nconst { checkIsRepoTask } = require('./lib/tasks/check-is-repo');\nconst { cloneTask, cloneMirrorTask } = require('./lib/tasks/clone');\nconst { cleanWithOptionsTask, isCleanOptionsArray } = require('./lib/tasks/clean');\nconst { diffSummaryTask } = require('./lib/tasks/diff');\nconst { fetchTask } = require('./lib/tasks/fetch');\nconst { moveTask } = require('./lib/tasks/move');\nconst { pullTask } = require('./lib/tasks/pull');\nconst { pushTagsTask } = require('./lib/tasks/push');\nconst {\n addRemoteTask,\n getRemotesTask,\n listRemotesTask,\n remoteTask,\n removeRemoteTask,\n} = require('./lib/tasks/remote');\nconst { getResetMode, resetTask } = require('./lib/tasks/reset');\nconst { stashListTask } = require('./lib/tasks/stash-list');\nconst {\n addSubModuleTask,\n initSubModuleTask,\n subModuleTask,\n updateSubModuleTask,\n} = require('./lib/tasks/sub-module');\nconst { addAnnotatedTagTask, addTagTask, tagListTask } = require('./lib/tasks/tag');\nconst { straightThroughBufferTask, straightThroughStringTask } = require('./lib/tasks/task');\n\nfunction Git(options, plugins) {\n this._plugins = plugins;\n this._executor = new GitExecutor(\n options.baseDir,\n new Scheduler(options.maxConcurrentProcesses),\n plugins\n );\n\n this._trimmed = options.trimmed;\n}\n\n(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git;\n\n/**\n * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on\n * the system path, or a fully qualified path to the executable.\n */\nGit.prototype.customBinary = function (command) {\n this._plugins.reconfigure('binary', command);\n return this;\n};\n\n/**\n * Sets an environment variable for the spawned child process, either supply both a name and value as strings or\n * a single object to entirely replace the current environment variables.\n *\n * @param {string|Object} name\n * @param {string} [value]\n * @returns {Git}\n */\nGit.prototype.env = function (name, value) {\n if (arguments.length === 1 && typeof name === 'object') {\n this._executor.env = name;\n } else {\n (this._executor.env = this._executor.env || {})[name] = value;\n }\n\n return this;\n};\n\n/**\n * List the stash(s) of the local repo\n */\nGit.prototype.stashList = function (options) {\n return this._runTask(\n stashListTask(\n trailingOptionsArgument(arguments) || {},\n (filterArray(options) && options) || []\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\nfunction createCloneTask(api, task, repoPath, localPath) {\n if (typeof repoPath !== 'string') {\n return configurationErrorTask(`git.${api}() requires a string 'repoPath'`);\n }\n\n return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments));\n}\n\n/**\n * Clone a git repo\n */\nGit.prototype.clone = function () {\n return this._runTask(\n createCloneTask('clone', cloneTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Mirror a git repo\n */\nGit.prototype.mirror = function () {\n return this._runTask(\n createCloneTask('mirror', cloneMirrorTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Moves one or more files to a new destination.\n *\n * @see https://git-scm.com/docs/git-mv\n *\n * @param {string|string[]} from\n * @param {string} to\n */\nGit.prototype.mv = function (from, to) {\n return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments));\n};\n\n/**\n * Internally uses pull and tags to get the list of tags then checks out the latest tag.\n *\n * @param {Function} [then]\n */\nGit.prototype.checkoutLatestTag = function (then) {\n var git = this;\n return this.pull(function () {\n git.tags(function (err, tags) {\n git.checkout(tags.latest, then);\n });\n });\n};\n\n/**\n * Pull the updated contents of the current repo\n */\nGit.prototype.pull = function (remote, branch, options, then) {\n return this._runTask(\n pullTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Fetch the updated contents of the current repo.\n *\n * @example\n * .fetch('upstream', 'master') // fetches from master on remote named upstream\n * .fetch(function () {}) // runs fetch against default remote and branch and calls function\n *\n * @param {string} [remote]\n * @param {string} [branch]\n */\nGit.prototype.fetch = function (remote, branch) {\n return this._runTask(\n fetchTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in\n * a production environment.\n *\n * @param {boolean} silence\n * @returns {Git}\n */\nGit.prototype.silent = function (silence) {\n console.warn(\n 'simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'\n );\n return this;\n};\n\n/**\n * List all tags. When using git 2.7.0 or above, include an options object with `\"--sort\": \"property-name\"` to\n * sort the tags by that property instead of using the default semantic versioning sort.\n *\n * Note, supplying this option when it is not supported by your Git version will cause the operation to fail.\n *\n * @param {Object} [options]\n * @param {Function} [then]\n */\nGit.prototype.tags = function (options, then) {\n return this._runTask(\n tagListTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Rebases the current working copy. Options can be supplied either as an array of string parameters\n * to be sent to the `git rebase` command, or a standard options object.\n */\nGit.prototype.rebase = function () {\n return this._runTask(\n straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Reset a repo\n */\nGit.prototype.reset = function (mode) {\n return this._runTask(\n resetTask(getResetMode(mode), getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Revert one or more commits in the local working copy\n */\nGit.prototype.revert = function (commit) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof commit !== 'string') {\n return this._runTask(configurationErrorTask('Commit must be a string'), next);\n }\n\n return this._runTask(\n straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]),\n next\n );\n};\n\n/**\n * Add a lightweight tag to the head of the current branch\n */\nGit.prototype.addTag = function (name) {\n const task =\n typeof name === 'string'\n ? addTagTask(name)\n : configurationErrorTask('Git.addTag requires a tag name');\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Add an annotated tag to the head of the current branch\n */\nGit.prototype.addAnnotatedTag = function (tagName, tagMessage) {\n return this._runTask(\n addAnnotatedTagTask(tagName, tagMessage),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete a local branch\n */\nGit.prototype.deleteLocalBranch = function (branchName, forceDelete, then) {\n return this._runTask(\n deleteBranchTask(branchName, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete one or more local branches\n */\nGit.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) {\n return this._runTask(\n deleteBranchesTask(branchNames, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * List all branches\n *\n * @param {Object | string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.branch = function (options, then) {\n return this._runTask(\n branchTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Return list of local branches\n *\n * @param {Function} [then]\n */\nGit.prototype.branchLocal = function (then) {\n return this._runTask(branchLocalTask(), trailingFunctionArgument(arguments));\n};\n\n/**\n * Executes any command against the git binary.\n */\nGit.prototype.raw = function (commands) {\n const createRestCommands = !Array.isArray(commands);\n const command = [].slice.call(createRestCommands ? arguments : commands, 0);\n\n for (let i = 0; i < command.length && createRestCommands; i++) {\n if (!filterPrimitives(command[i])) {\n command.splice(i, command.length - i);\n break;\n }\n }\n\n command.push(...getTrailingOptions(arguments, 0, true));\n\n var next = trailingFunctionArgument(arguments);\n\n if (!command.length) {\n return this._runTask(\n configurationErrorTask('Raw: must supply one or more command to execute'),\n next\n );\n }\n\n return this._runTask(straightThroughStringTask(command, this._trimmed), next);\n};\n\nGit.prototype.submoduleAdd = function (repo, path, then) {\n return this._runTask(addSubModuleTask(repo, path), trailingFunctionArgument(arguments));\n};\n\nGit.prototype.submoduleUpdate = function (args, then) {\n return this._runTask(\n updateSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.submoduleInit = function (args, then) {\n return this._runTask(\n initSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.subModule = function (options, then) {\n return this._runTask(\n subModuleTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.listRemote = function () {\n return this._runTask(\n listRemotesTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Adds a remote to the list of remotes.\n */\nGit.prototype.addRemote = function (remoteName, remoteRepo, then) {\n return this._runTask(\n addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes an entry by name from the list of remotes.\n */\nGit.prototype.removeRemote = function (remoteName, then) {\n return this._runTask(removeRemoteTask(remoteName), trailingFunctionArgument(arguments));\n};\n\n/**\n * Gets the currently available remotes, setting the optional verbose argument to true includes additional\n * detail on the remotes themselves.\n */\nGit.prototype.getRemotes = function (verbose, then) {\n return this._runTask(getRemotesTask(verbose === true), trailingFunctionArgument(arguments));\n};\n\n/**\n * Call any `git remote` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.remote = function (options, then) {\n return this._runTask(\n remoteTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Call any `git tag` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.tag = function (options, then) {\n const command = getTrailingOptions(arguments);\n\n if (command[0] !== 'tag') {\n command.unshift('tag');\n }\n\n return this._runTask(straightThroughStringTask(command), trailingFunctionArgument(arguments));\n};\n\n/**\n * Updates repository server info\n *\n * @param {Function} [then]\n */\nGit.prototype.updateServerInfo = function (then) {\n return this._runTask(\n straightThroughStringTask(['update-server-info']),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the\n * default configured remote spec.\n *\n * @param {string} [remote]\n * @param {Function} [then]\n */\nGit.prototype.pushTags = function (remote, then) {\n const task = pushTagsTask(\n { remote: filterType(remote, filterString) },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Removes the named files from source control.\n */\nGit.prototype.rm = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '-f', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To\n * completely remove the files, use `rm`.\n *\n * @param {string|string[]} files\n */\nGit.prototype.rmKeepLocal = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '--cached', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content,\n * size, and type.\n *\n * Passing \"-p\" will instruct cat-file to determine the object type, and display its formatted contents.\n *\n * @param {string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.catFile = function (options, then) {\n return this._catFile('utf-8', arguments);\n};\n\nGit.prototype.binaryCatFile = function () {\n return this._catFile('buffer', arguments);\n};\n\nGit.prototype._catFile = function (format, args) {\n var handler = trailingFunctionArgument(args);\n var command = ['cat-file'];\n var options = args[0];\n\n if (typeof options === 'string') {\n return this._runTask(\n configurationErrorTask('Git.catFile: options must be supplied as an array of strings'),\n handler\n );\n }\n\n if (Array.isArray(options)) {\n command.push.apply(command, options);\n }\n\n const task =\n format === 'buffer' ? straightThroughBufferTask(command) : straightThroughStringTask(command);\n\n return this._runTask(task, handler);\n};\n\nGit.prototype.diff = function (options, then) {\n const task = filterString(options)\n ? configurationErrorTask(\n 'git.diff: supplying options as a single string is no longer supported, switch to an array of strings'\n )\n : straightThroughStringTask(['diff', ...getTrailingOptions(arguments)]);\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.diffSummary = function () {\n return this._runTask(\n diffSummaryTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.applyPatch = function (patches) {\n const task = !filterStringOrStringArray(patches)\n ? configurationErrorTask(\n `git.applyPatch requires one or more string patches as the first argument`\n )\n : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1)));\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.revparse = function () {\n const commands = ['rev-parse', ...getTrailingOptions(arguments, true)];\n return this._runTask(\n straightThroughStringTask(commands, true),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n */\nGit.prototype.clean = function (mode, options, then) {\n const usingCleanOptionsArray = isCleanOptionsArray(mode);\n const cleanMode =\n (usingCleanOptionsArray && mode.join('')) || filterType(mode, filterString) || '';\n const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0));\n\n return this._runTask(\n cleanWithOptionsTask(cleanMode, customArgs),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.exec = function (then) {\n const task = {\n commands: [],\n format: 'utf-8',\n parser() {\n if (typeof then === 'function') {\n then();\n }\n },\n };\n\n return this._runTask(task);\n};\n\n/**\n * Clears the queue of pending commands and returns the wrapper instance for chaining.\n *\n * @returns {Git}\n */\nGit.prototype.clearQueue = function () {\n // TODO:\n // this._executor.clear();\n return this;\n};\n\n/**\n * Check if a pathname or pathnames are excluded by .gitignore\n *\n * @param {string|string[]} pathnames\n * @param {Function} [then]\n */\nGit.prototype.checkIgnore = function (pathnames, then) {\n return this._runTask(\n checkIgnoreTask(asArray(filterType(pathnames, filterStringOrStringArray, []))),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.checkIsRepo = function (checkType, then) {\n return this._runTask(\n checkIsRepoTask(filterType(checkType, filterString)),\n trailingFunctionArgument(arguments)\n );\n};\n\nmodule.exports = Git;\n", "import { pathspec } from './args/pathspec';\nimport { GitConstructError } from './errors/git-construct-error';\nimport { GitError } from './errors/git-error';\nimport { GitPluginError } from './errors/git-plugin-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { TaskConfigurationError } from './errors/task-configuration-error';\nimport { CheckRepoActions } from './tasks/check-is-repo';\nimport { CleanOptions } from './tasks/clean';\nimport { GitConfigScope } from './tasks/config';\nimport { DiffNameStatus } from './tasks/diff-name-status';\nimport { grepQueryBuilder } from './tasks/grep';\nimport { ResetMode } from './tasks/reset';\n\nexport {\n CheckRepoActions,\n CleanOptions,\n DiffNameStatus,\n GitConfigScope,\n GitConstructError,\n GitError,\n GitPluginError,\n GitResponseError,\n ResetMode,\n TaskConfigurationError,\n grepQueryBuilder,\n pathspec,\n};\n", "import { GitError } from './git-error';\nimport { SimpleGitOptions } from '../types';\n\n/**\n * The `GitConstructError` is thrown when an error occurs in the constructor\n * of the `simple-git` instance itself. Most commonly as a result of using\n * a `baseDir` option that points to a folder that either does not exist,\n * or cannot be read by the user the node script is running as.\n *\n * Check the `.message` property for more detail including the properties\n * passed to the constructor.\n */\nexport class GitConstructError extends GitError {\n constructor(\n public readonly config: SimpleGitOptions,\n message: string\n ) {\n super(undefined, message);\n }\n}\n", "import { SimpleGitOptions, SimpleGitTask } from '../types';\nimport { GitError } from './git-error';\n\nexport class GitPluginError extends GitError {\n constructor(\n public task?: SimpleGitTask,\n public readonly plugin?: keyof SimpleGitOptions,\n message?: string\n ) {\n super(task, message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n", "import { SimpleGitOptions } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function abortPlugin(signal: SimpleGitOptions['abort']) {\n if (!signal) {\n return;\n }\n\n const onSpawnAfter: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n function kill() {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort signal received'));\n }\n\n signal.addEventListener('abort', kill);\n\n context.spawned.on('close', () => signal.removeEventListener('abort', kill));\n },\n };\n\n const onSpawnBefore: SimpleGitPlugin<'spawn.before'> = {\n type: 'spawn.before',\n action(_data, context) {\n if (signal.aborted) {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort already signaled'));\n }\n },\n };\n\n return [onSpawnBefore, onSpawnAfter];\n}\n", "import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport type { SimpleGitPluginConfig } from '../types';\n\nfunction isConfigSwitch(arg: string | unknown) {\n return typeof arg === 'string' && arg.trim().toLowerCase() === '-c';\n}\n\nfunction preventProtocolOverride(arg: string, next: string) {\n if (!isConfigSwitch(arg)) {\n return;\n }\n\n if (!/^\\s*protocol(.[a-z]+)?.allow/.test(next)) {\n return;\n }\n\n throw new GitPluginError(\n undefined,\n 'unsafe',\n 'Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol'\n );\n}\n\nfunction preventUploadPack(arg: string, method: string) {\n if (/^\\s*--(upload|receive)-pack/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'clone' && /^\\s*-u\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of clone with option -u is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'push' && /^\\s*--exec\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of push with option --exec is not permitted without enabling allowUnsafePack`\n );\n }\n}\n\nexport function blockUnsafeOperationsPlugin({\n allowUnsafeProtocolOverride = false,\n allowUnsafePack = false,\n}: SimpleGitPluginConfig['unsafe'] = {}): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(args, context) {\n args.forEach((current, index) => {\n const next = index < args.length ? args[index + 1] : '';\n\n allowUnsafeProtocolOverride || preventProtocolOverride(current, next);\n allowUnsafePack || preventUploadPack(current, context.method);\n });\n\n return args;\n },\n };\n}\n", "import { prefixedArray } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function commandConfigPrefixingPlugin(\n configuration: string[]\n): SimpleGitPlugin<'spawn.args'> {\n const prefix = prefixedArray(configuration, '-c');\n\n return {\n type: 'spawn.args',\n action(data) {\n return [...prefix, ...data];\n },\n };\n}\n", "import { deferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { SimpleGitPluginConfig } from '../types';\nimport { delay } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nconst never = deferred().promise;\n\nexport function completionDetectionPlugin({\n onClose = true,\n onExit = 50,\n}: SimpleGitPluginConfig['completion'] = {}): SimpleGitPlugin<'spawn.after'> {\n function createEvents() {\n let exitCode = -1;\n const events = {\n close: deferred(),\n closeTimeout: deferred(),\n exit: deferred(),\n exitTimeout: deferred(),\n };\n\n const result = Promise.race([\n onClose === false ? never : events.closeTimeout.promise,\n onExit === false ? never : events.exitTimeout.promise,\n ]);\n\n configureTimeout(onClose, events.close, events.closeTimeout);\n configureTimeout(onExit, events.exit, events.exitTimeout);\n\n return {\n close(code: number) {\n exitCode = code;\n events.close.done();\n },\n exit(code: number) {\n exitCode = code;\n events.exit.done();\n },\n get exitCode() {\n return exitCode;\n },\n result,\n };\n }\n\n function configureTimeout(\n flag: boolean | number,\n event: DeferredPromise,\n timeout: DeferredPromise\n ) {\n if (flag === false) {\n return;\n }\n\n (flag === true ? event.promise : event.promise.then(() => delay(flag))).then(timeout.done);\n }\n\n return {\n type: 'spawn.after',\n async action(_data, { spawned, close }) {\n const events = createEvents();\n\n let deferClose = true;\n let quickClose = () => void (deferClose = false);\n\n spawned.stdout?.on('data', quickClose);\n spawned.stderr?.on('data', quickClose);\n spawned.on('error', quickClose);\n\n spawned.on('close', (code: number) => events.close(code));\n spawned.on('exit', (code: number) => events.exit(code));\n\n try {\n await events.result;\n if (deferClose) {\n await delay(50);\n }\n close(events.exitCode);\n } catch (err) {\n close(events.exitCode, err as Error);\n }\n },\n };\n}\n", "import type { SimpleGitOptions } from '../types';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport { asArray } from '../utils';\nimport { PluginStore } from './plugin-store';\n\nconst WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`;\nconst WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`;\n\nfunction isBadArgument(arg: string) {\n return !arg || !/^([a-z]:)?([a-z0-9/.\\\\_~-]+)$/i.test(arg);\n}\n\nfunction toBinaryConfig(\n input: string[],\n allowUnsafe: boolean\n): { binary: string; prefix?: string } {\n if (input.length < 1 || input.length > 2) {\n throw new GitPluginError(undefined, 'binary', WRONG_NUMBER_ERR);\n }\n\n const isBad = input.some(isBadArgument);\n if (isBad) {\n if (allowUnsafe) {\n console.warn(WRONG_CHARS_ERR);\n } else {\n throw new GitPluginError(undefined, 'binary', WRONG_CHARS_ERR);\n }\n }\n\n const [binary, prefix] = input;\n return {\n binary,\n prefix,\n };\n}\n\nexport function customBinaryPlugin(\n plugins: PluginStore,\n input: SimpleGitOptions['binary'] = ['git'],\n allowUnsafe = false\n) {\n let config = toBinaryConfig(asArray(input), allowUnsafe);\n\n plugins.on('binary', (input) => {\n config = toBinaryConfig(asArray(input), allowUnsafe);\n });\n\n plugins.append('spawn.binary', () => {\n return config.binary;\n });\n\n plugins.append('spawn.args', (data) => {\n return config.prefix ? [config.prefix, ...data] : data;\n });\n}\n", "import { GitError } from '../errors/git-error';\nimport { GitExecutorResult, SimpleGitPluginConfig } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\ntype TaskResult = Omit;\n\nfunction isTaskError(result: TaskResult) {\n return !!(result.exitCode && result.stdErr.length);\n}\n\nfunction getErrorMessage(result: TaskResult) {\n return Buffer.concat([...result.stdOut, ...result.stdErr]);\n}\n\nexport function errorDetectionHandler(\n overwrite = false,\n isError = isTaskError,\n errorMessage: (result: TaskResult) => Buffer | Error = getErrorMessage\n) {\n return (error: Buffer | Error | undefined, result: TaskResult) => {\n if ((!overwrite && error) || !isError(result)) {\n return error;\n }\n\n return errorMessage(result);\n };\n}\n\nexport function errorDetectionPlugin(\n config: SimpleGitPluginConfig['errors']\n): SimpleGitPlugin<'task.error'> {\n return {\n type: 'task.error',\n action(data, context) {\n const error = config(data.error, {\n stdErr: context.stdErr,\n stdOut: context.stdOut,\n exitCode: context.exitCode,\n });\n\n if (Buffer.isBuffer(error)) {\n return { error: new GitError(undefined, error.toString('utf-8')) };\n }\n\n return {\n error,\n };\n },\n };\n}\n", "import { EventEmitter } from 'node:events';\n\nimport type {\n SimpleGitPlugin,\n SimpleGitPluginType,\n SimpleGitPluginTypes,\n} from './simple-git-plugin';\nimport { append, asArray } from '../utils';\nimport type { SimpleGitPluginConfig } from '../types';\n\nexport class PluginStore {\n private plugins: Set> = new Set();\n private events = new EventEmitter();\n\n on(\n type: K,\n listener: (data: SimpleGitPluginConfig[K]) => void\n ) {\n this.events.on(type, listener);\n }\n\n reconfigure(type: K, data: SimpleGitPluginConfig[K]) {\n this.events.emit(type, data);\n }\n\n public append(type: T, action: SimpleGitPlugin['action']) {\n const plugin = append(this.plugins, { type, action });\n\n return () => this.plugins.delete(plugin);\n }\n\n public add(\n plugin: void | SimpleGitPlugin | SimpleGitPlugin[]\n ) {\n const plugins: SimpleGitPlugin[] = [];\n\n asArray(plugin).forEach((plugin) => plugin && this.plugins.add(append(plugins, plugin)));\n\n return () => {\n plugins.forEach((plugin) => this.plugins.delete(plugin));\n };\n }\n\n public exec(\n type: T,\n data: SimpleGitPluginTypes[T]['data'],\n context: SimpleGitPluginTypes[T]['context']\n ): typeof data {\n let output = data;\n const contextual = Object.freeze(Object.create(context));\n\n for (const plugin of this.plugins) {\n if (plugin.type === type) {\n output = plugin.action(output, contextual);\n }\n }\n\n return output;\n }\n}\n", "import { SimpleGitOptions } from '../types';\nimport { asNumber, including } from '../utils';\n\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function progressMonitorPlugin(progress: Exclude) {\n const progressCommand = '--progress';\n const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push'];\n\n const onProgress: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n if (!context.commands.includes(progressCommand)) {\n return;\n }\n\n context.spawned.stderr?.on('data', (chunk: Buffer) => {\n const message = /^([\\s\\S]+?):\\s*(\\d+)% \\((\\d+)\\/(\\d+)\\)/.exec(chunk.toString('utf8'));\n if (!message) {\n return;\n }\n\n progress({\n method: context.method,\n stage: progressEventStage(message[1]),\n progress: asNumber(message[2]),\n processed: asNumber(message[3]),\n total: asNumber(message[4]),\n });\n });\n },\n };\n\n const onArgs: SimpleGitPlugin<'spawn.args'> = {\n type: 'spawn.args',\n action(args, context) {\n if (!progressMethods.includes(context.method)) {\n return args;\n }\n\n return including(args, progressCommand);\n },\n };\n\n return [onArgs, onProgress];\n}\n\nfunction progressEventStage(input: string) {\n return String(input.toLowerCase().split(' ', 1)) || 'unknown';\n}\n", "import { SpawnOptions } from 'child_process';\nimport { pick } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function spawnOptionsPlugin(\n spawnOptions: Partial\n): SimpleGitPlugin<'spawn.options'> {\n const options = pick(spawnOptions, ['uid', 'gid']);\n\n return {\n type: 'spawn.options',\n action(data) {\n return { ...options, ...data };\n },\n };\n}\n", "import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport type { SimpleGitOptions } from '../types';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function timeoutPlugin({\n block,\n stdErr = true,\n stdOut = true,\n}: Exclude): SimpleGitPlugin<'spawn.after'> | void {\n if (block > 0) {\n return {\n type: 'spawn.after',\n action(_data, context) {\n let timeout: NodeJS.Timeout;\n\n function wait() {\n timeout && clearTimeout(timeout);\n timeout = setTimeout(kill, block);\n }\n\n function stop() {\n context.spawned.stdout?.off('data', wait);\n context.spawned.stderr?.off('data', wait);\n context.spawned.off('exit', stop);\n context.spawned.off('close', stop);\n timeout && clearTimeout(timeout);\n }\n\n function kill() {\n stop();\n context.kill(new GitPluginError(undefined, 'timeout', `block timeout reached`));\n }\n\n stdOut && context.spawned.stdout?.on('data', wait);\n stdErr && context.spawned.stderr?.on('data', wait);\n context.spawned.on('exit', stop);\n context.spawned.on('close', stop);\n\n wait();\n },\n };\n }\n}\n", "import { SimpleGitPlugin } from './simple-git-plugin';\nimport { isPathSpec, toPaths } from '../args/pathspec';\n\nexport function suffixPathsPlugin(): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(data) {\n const prefix: string[] = [];\n let suffix: undefined | string[];\n function append(args: string[]) {\n (suffix = suffix || []).push(...args);\n }\n\n for (let i = 0; i < data.length; i++) {\n const param = data[i];\n\n if (isPathSpec(param)) {\n append(toPaths(param));\n continue;\n }\n\n if (param === '--') {\n append(\n data.slice(i + 1).flatMap((item) => (isPathSpec(item) && toPaths(item)) || item)\n );\n break;\n }\n\n prefix.push(param);\n }\n\n return !suffix ? prefix : [...prefix, '--', ...suffix.map(String)];\n },\n };\n}\n", "import { SimpleGitFactory } from '../../typings';\n\nimport * as api from './api';\nimport {\n abortPlugin,\n blockUnsafeOperationsPlugin,\n commandConfigPrefixingPlugin,\n completionDetectionPlugin,\n customBinaryPlugin,\n errorDetectionHandler,\n errorDetectionPlugin,\n PluginStore,\n progressMonitorPlugin,\n spawnOptionsPlugin,\n timeoutPlugin,\n} from './plugins';\nimport { suffixPathsPlugin } from './plugins/suffix-paths.plugin';\nimport { createInstanceConfig, folderExists } from './utils';\nimport { SimpleGitOptions } from './types';\n\nconst Git = require('../git');\n\n/**\n * Adds the necessary properties to the supplied object to enable it for use as\n * the default export of a module.\n *\n * Eg: `module.exports = esModuleFactory({ something () {} })`\n */\nexport function esModuleFactory(defaultExport: T) {\n return Object.defineProperties(defaultExport, {\n __esModule: { value: true },\n default: { value: defaultExport },\n }) as T & { __esModule: true; default: T };\n}\n\nexport function gitExportFactory(factory: SimpleGitFactory) {\n return Object.assign(factory.bind(null), api);\n}\n\nexport function gitInstanceFactory(\n baseDir?: string | Partial,\n options?: Partial\n) {\n const plugins = new PluginStore();\n const config = createInstanceConfig(\n (baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir)) || {},\n options\n );\n\n if (!folderExists(config.baseDir)) {\n throw new api.GitConstructError(\n config,\n `Cannot use simple-git on a directory that does not exist`\n );\n }\n\n if (Array.isArray(config.config)) {\n plugins.add(commandConfigPrefixingPlugin(config.config));\n }\n\n plugins.add(blockUnsafeOperationsPlugin(config.unsafe));\n plugins.add(suffixPathsPlugin());\n plugins.add(completionDetectionPlugin(config.completion));\n config.abort && plugins.add(abortPlugin(config.abort));\n config.progress && plugins.add(progressMonitorPlugin(config.progress));\n config.timeout && plugins.add(timeoutPlugin(config.timeout));\n config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions));\n\n plugins.add(errorDetectionPlugin(errorDetectionHandler(true)));\n config.errors && plugins.add(errorDetectionPlugin(config.errors));\n\n customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary);\n\n return new Git(config, plugins);\n}\n", "import { SimpleGit, SimpleGitOptions } from '../../../typings';\n\nimport { GitResponseError } from '../errors/git-response-error';\nimport { gitInstanceFactory } from '../git-factory';\nimport { SimpleGitTaskCallback } from '../types';\n\nconst functionNamesBuilderApi = ['customBinary', 'env', 'outputHandler', 'silent'];\n\nconst functionNamesPromiseApi = [\n 'add',\n 'addAnnotatedTag',\n 'addConfig',\n 'addRemote',\n 'addTag',\n 'applyPatch',\n 'binaryCatFile',\n 'branch',\n 'branchLocal',\n 'catFile',\n 'checkIgnore',\n 'checkIsRepo',\n 'checkout',\n 'checkoutBranch',\n 'checkoutLatestTag',\n 'checkoutLocalBranch',\n 'clean',\n 'clone',\n 'commit',\n 'cwd',\n 'deleteLocalBranch',\n 'deleteLocalBranches',\n 'diff',\n 'diffSummary',\n 'exec',\n 'fetch',\n 'getRemotes',\n 'init',\n 'listConfig',\n 'listRemote',\n 'log',\n 'merge',\n 'mergeFromTo',\n 'mirror',\n 'mv',\n 'pull',\n 'push',\n 'pushTags',\n 'raw',\n 'rebase',\n 'remote',\n 'removeRemote',\n 'reset',\n 'revert',\n 'revparse',\n 'rm',\n 'rmKeepLocal',\n 'show',\n 'stash',\n 'stashList',\n 'status',\n 'subModule',\n 'submoduleAdd',\n 'submoduleInit',\n 'submoduleUpdate',\n 'tag',\n 'tags',\n 'updateServerInfo',\n];\n\nexport function gitP(\n ...args: [] | [string] | [Partial] | [string, Partial]\n): SimpleGit {\n let git: any;\n\n let chain = Promise.resolve();\n\n try {\n git = gitInstanceFactory(...args);\n } catch (e) {\n chain = Promise.reject(e);\n }\n\n function builderReturn() {\n return promiseApi;\n }\n\n function chainReturn() {\n return chain;\n }\n\n const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce(\n (api: any, name: string) => {\n const isAsync = functionNamesPromiseApi.includes(name);\n\n const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api);\n const alternative = isAsync ? chainReturn : builderReturn;\n\n Object.defineProperty(api, name, {\n enumerable: false,\n configurable: false,\n value: git ? valid : alternative,\n });\n\n return api;\n },\n {}\n );\n\n return promiseApi as SimpleGit;\n\n function asyncWrapper(fn: string, git: any): (...args: any[]) => Promise {\n return function (...args: any[]) {\n if (typeof args[args.length] === 'function') {\n throw new TypeError(\n 'Promise interface requires that handlers are not supplied inline, ' +\n 'trailing function not allowed in call to ' +\n fn\n );\n }\n\n return chain.then(function () {\n return new Promise(function (resolve, reject) {\n const callback: SimpleGitTaskCallback = (err: Error | null, result?: any) => {\n if (err) {\n return reject(toError(err));\n }\n\n resolve(result);\n };\n args.push(callback);\n\n git[fn].apply(git, args);\n });\n });\n };\n }\n\n function syncWrapper(fn: string, git: any, api: SimpleGit) {\n return (...args: any[]) => {\n git[fn](...args);\n\n return api;\n };\n }\n}\n\nfunction toError(error: Error | string | any): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n return new GitResponseError(error);\n}\n", "import { gitInstanceFactory } from './lib/git-factory';\n\nexport { gitP } from './lib/runners/promise-wrapped';\nexport * from './lib/api';\n\nexport const simpleGit = gitInstanceFactory;\n\nexport default gitInstanceFactory;\n"], + "mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAiIM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAAA;AAAA;AAAA,WAME,WAAW,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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B;IACF;IACA,iBAAiB,CAAC,kDAAkD;IACpE,mBAAmB,CAAC,6CAA6C;IACjE,kBAAkB;MAChB;IACF;IACA,oBAAoB;MAClB;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,gCAAgC;MAC9B;IACF;IACA,mBAAmB,CAAC,oDAAoD;IACxE,uBAAuB;MACrB;IACF;IACA,oDAAoD;MAClD;IACF;IACA,iBAAiB;MACf;IACF;IACA,kBAAkB;MAChB;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,gCAAgC;MAC9B;IACF;IACA,yBAAyB;MACvB;IACF;IACA,mDAAmD;MACjD;IACF;IACA,gBAAgB;MACd;IACF;IACA,wBAAwB;MACtB;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,gCAAgC;MAC9B;IACF;IACA,qBAAqB,CAAC,0CAA0C;IAChE,sBAAsB,CAAC,+CAA+C;IACtE,kCAAkC;MAChC;IACF;IACA,4BAA4B,CAAC,qCAAqC;IAClE,+BAA+B;MAC7B;IACF;IACA,6BAA6B;MAC3B;IACF;IACA,aAAa,CAAC,2DAA2D;IACzE,sBAAsB;MACpB;IACF;IACA,6BAA6B;MAC3B;IACF;IACA,8BAA8B;MAC5B;IACF;IACA,yBAAyB;MACvB;IACF;IACA,sBAAsB;MACpB;IACF;IACA,wBAAwB;MACtB;IACF;IACA,wDAAwD;MACtD;IACF;IACA,sDAAsD;MACpD;IACF;IACA,yCAAyC;MACvC;IACF;IACA,uCAAuC;MACrC;IACF;IACA,uBAAuB;MACrB;IACF;IACA,yCAAyC;MACvC;IACF;IACA,8BAA8B;MAC5B;IACF;IACA,oCAAoC;MAClC;IACF;IACA,qCAAqC;MACnC;IACF;IACA,iCAAiC;MAC/B;IACF;IACA,sBAAsB,CAAC,iDAAiD;IACxE,iBAAiB,CAAC,4CAA4C;IAC9D,cAAc,CAAC,+CAA+C;IAC9D,gBAAgB,CAAC,0CAA0C;IAC3D,6BAA6B;MAC3B;IACF;IACA,oBAAoB;MAClB;MACA,CAAC;MACD,EAAE,SAAS,CAAC,WAAW,uCAAuC,EAAE;IAClE;IACA,kBAAkB,CAAC,sDAAsD;I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CF;IACA,qBAAqB;MACnB;IACF;IACA,kCAAkC;MAChC;IACF;IACA,qBAAqB;MACnB;IACF;IACA,kBAAkB;MAChB;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,gCAAgC;MAC9B;IACF;IACA,yBAAyB,CAAC,8CAA8C;IACxE,0BAA0B;MACxB;IACF;IACA,uCAAuC;MACrC;IACF;IACA,iCAAiC;MAC/B;IACF;IACA,2CAA2C;MACzC;IACF;IACA,qCAAqC;MACnC;IACF;IACA,2BAA2B;MACzB;IACF;IACA,wCAAwC;MACtC;IACF;IACA,qBAAqB;MACnB;IACF;IACA,+BAA+B;MAC7B;IACF;EACF;EACA,gBAAgB;IACd,sBAAsB,CAAC,uBAAuB;IAC9C,gBAAgB,CAAC,6BAA6B;EAChD;EACA,YAAY;IACV,4CAA4C;MAC1C;IACF;IACA,4BAA4B;MAC1B;IACF;IACA,iCAAiC;MAC/B;IACF;IACA,uCAAuC;MACrC;IACF;IACA,4BAA4B,CAAC,uBAAuB;IACpD,yBAAyB;MACvB;IACF;IACA,0BAA0B;MACxB;IACF;IACA,0CAA0C;MACxC;IACF;IACA,kCAAkC;MAChC;IACF;IACA,oCAAoC;MAClC;IACF;IACA,4BAA4B,CAAC,0CAA0C;IACvE,wBAAwB;MACtB;IACF;IACA,iBAAiB,CAAC,qDAAqD;IACvE,kBAAkB;MAChB;IACF;IACA,kCAAkC;MAChC;IACF;IACA,4BAA4B;MAC1B;IACF;IACA,2BAA2B;MACzB;IACF;IACA,sCAAsC;MACpC;IACF;IACA,yBAAyB,CAAC,uCAAuC;IACjE,iBAAiB,CAAC,+CAA+C;IACjE,cAAc,CAAC,kDAAkD;IACjE,kCAAkC;MAChC;IACF;IACA,kBAAkB;MAChB;IACF;IACA,eAAe;MACb;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,mDAAmD;MACjD;IACF;IACA,0BAA0B,CAAC,sBAAsB;IACjD,oBAAoB;MAClB;MACA,CAAC;MACD,EAAE,mBAAmB,EAAE,QAAQ,MAAM,EAAE;IACzC;IACA,sCAAsC;MACpC;IACF;IACA,gBAAgB,CAAC,oCAA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", + "names": ["exports", "exports", "exports", "exports", "path", "exports", "module", "exports", "module", "exports", "module", "exports", "node", "exports", "module", "exports", "module", "exports", "module", "max", "exports", "module", "toNumber", "exports", "module", "exports", "module", "append", "expand", "exports", "module", "exports", "module", "parse", "index", "exports", "module", "expand", "parse", "require_constants", "exports", "module", "path", "require_utils", "exports", "path", "append", "exports", "module", "require_parse", "exports", "module", "parse", "opts", "value", "append", "first", "rest", "source", "exports", "module", "path", "parse", "state", "append", "require_picomatch", "exports", "module", "exports", "module", "omit", "exports", "path", "pattern", "exports", "module", "exports", "merge", "exports", "require_utils", "exports", "fs", "path", "exports", "exports", "path", "exports", "path", "require_fs", "exports", "fs", "exports", "fs", "exports", "path", "exports", "module", "exports", "module", "queueMicrotask", "require_constants", "exports", "require_fs", "exports", "require_utils", "exports", "fs", "exports", "require_async", "exports", "path", "require_sync", "exports", "require_fs", "exports", "fs", "require_settings", "exports", "path", "fs", "require_out", "exports", "path", "exports", "module", "exports", "module", "cache", "noop", "errorHandler", "context", "handler", "require_common", "exports", "exports", "require_async", "exports", "require_async", "exports", "require_stream", "exports", "require_sync", "exports", "require_sync", "exports", "require_settings", "exports", "path", "require_out", "exports", "require_reader", "exports", "path", "require_stream", "exports", "require_async", "exports", "exports", "exports", "exports", "exports", "exports", "require_entry", "exports", "exports", "path", "require_async", "exports", "require_stream", "exports", "require_sync", "exports", "require_sync", "exports", "require_settings", "exports", "fs", "require_out", "exports", "module", "FastGlob", "posix", "escapePath", "convertPathToPattern", "win32", "exports", "module", "parse", "require_common", "exports", "module", "env", "debug", "exports", "module", "exports", "module", "exports", "module", "env", "exports", "module", "useColors", "debug", "exports", "module", "path", "exists", "exports", "__export", "deferred", "exports", "exports", "module", "NullObject", "parse", "safeParse", "require_ms", "exports", "module", "parse", "require_common", "exports", "module", "env", "debug", "require_browser", "exports", "module", "require_node", "exports", "module", "useColors", "debug", "require_src", "exports", "module", "path", "exists", "exports", "__export", "deferred", "exports", "vscode", "import_promises", "import_path", "fs", "path", "fs", "import_promises", "import_path", "import_promise_deferred", "path", "trimmed", "path", "Buffer", "omit", "ExitCodes", "commands", "parser", "parsers", "parse", "__export", "CheckRepoActions", "CleanOptions", "append", "GitConfigScope", "DiffNameStatus", "ResetMode", "debug", "onError", "excludeOptions", "merge", "handler", "disallowedCommand", "__commonJS", "exports", "module", "GitExecutor", "__toCommonJS", "SimpleGitApi", "Scheduler", "configurationErrorTask", "asArray", "filterArray", "filterPrimitives", "filterString", "filterStringOrStringArray", "filterType", "getTrailingOptions", "trailingFunctionArgument", "trailingOptionsArgument", "applyPatchTask", "branchTask", "branchLocalTask", "deleteBranchesTask", "deleteBranchTask", "checkIgnoreTask", "checkIsRepoTask", "cloneTask", "cloneMirrorTask", "cleanWithOptionsTask", "isCleanOptionsArray", "diffSummaryTask", "fetchTask", "moveTask", "pullTask", "pushTagsTask", "addRemoteTask", "getRemotesTask", "listRemotesTask", "remoteTask", "removeRemoteTask", "getResetMode", "resetTask", "stashListTask", "addSubModuleTask", "initSubModuleTask", "subModuleTask", "updateSubModuleTask", "addAnnotatedTagTask", "addTagTask", "tagListTask", "straightThroughBufferTask", "straightThroughStringTask", "Git", "fs", "path", "path", "workspace", "fs", "fg", "trimmed", "import_path", "path", "import_promises", "import_path", "import_fast_glob", "path", "fs", "fg", "import_promises", "import_path", "path", "fs", "import_promises", "import_path", "import_promises", "import_path", "path", "fs", "path", "areas", "fs", "import_node_child_process", "import_node_util", "name", "method", "hook", "hook", "VERSION", "isPlainObject", "withDefaults", "VERSION", "withDefaults", "request", "endpoint", "VERSION", "noop", "createLogger", "VERSION", "hook", "auth", "VERSION", "request", "path", "VERSION", "VERSION", "VERSION", "VERSION", "endpoint", "cache", "options", "VERSION", "VERSION", "Octokit", "VERSION", "execFileAsync", "Octokit", "vscode", "vscode", "vscode", "vscode", "vscode", "vscode", "vscode", "import_node_path", "path", "fs", "vscode", "import_node_path", "path", "vscode", "vscode", "import_node_buffer", "import_file_exists", "import_debug", "import_child_process", "import_promise_deferred", "import_node_path", "pathspec", "cache", "isPathSpec", "path", "init_pathspec", "__esm", "GitError", "init_git_error", "GitResponseError", "init_git_response_error", "TaskConfigurationError", "init_task_configuration_error", "asFunction", "NOOP", "isUserFunction", "splitOn", "first", "isArrayLike", "last", "filterHasLength", "toLinesWithContent", "trimmed", "forEachLineWithContent", "folderExists", "append", "including", "remove", "asArray", "asCamelCase", "asStringArray", "asNumber", "prefixedArray", "bufferToString", "Buffer", "pick", "delay", "orVoid", "NULL", "objectToString", "init_util", "init_argument_filters", "filterType", "filterPrimitives", "omit", "filterPlainObject", "filterFunction", "filterArray", "filterNumber", "filterString", "filterStringOrStringArray", "ExitCodes", "init_exit_codes", "GitOutputStreams", "init_git_output_streams", "useMatchesDefault", "LineParser", "RemoteLineParser", "init_line_parser", "createInstanceConfig", "defaultOptions", "init_simple_git_options", "appendTaskOptions", "commands", "getTrailingOptions", "trailingOptionsArgument", "trailingArrayArgument", "trailingFunctionArgument", "init_task_options", "callTaskParser", "parser", "parseStringResponse", "parsers", "parse", "init_task_parser", "utils_exports", "__export", "init_utils", "check_is_repo_exports", "CheckRepoActions", "checkIsBareRepoTask", "checkIsRepoRootTask", "checkIsRepoTask", "onError", "isNotRepoMessage", "init_check_is_repo", "cleanSummaryParser", "CleanResponse", "dryRunRemovalRegexp", "removalRegexp", "isFolderRegexp", "init_CleanSummary", "task_exports", "EMPTY_COMMANDS", "adhocExecTask", "configurationErrorTask", "isBufferTask", "isEmptyTask", "straightThroughBufferTask", "straightThroughStringTask", "init_task", "clean_exports", "CONFIG_ERROR_INTERACTIVE_MODE", "CONFIG_ERROR_MODE_REQUIRED", "CONFIG_ERROR_UNKNOWN_OPTION", "CleanOptions", "cleanTask", "cleanWithOptionsTask", "isCleanOptionsArray", "getCleanOptions", "isInteractiveMode", "CleanOptionValues", "isCleanMode", "isKnownOption", "init_clean", "configListParser", "ConfigList", "configParser", "configGetParser", "configFilePath", "init_ConfigList", "asConfigScope", "GitConfigScope", "addConfigTask", "getConfigTask", "listConfigTask", "config_default", "init_config", "isDiffNameStatus", "diffNameStatus", "DiffNameStatus", "init_diff_name_status", "grepQueryBuilder", "GrepQuery", "parseGrep", "grep_default", "disallowedOptions", "Query", "_a", "init_grep", "reset_exports", "ResetMode", "getResetMode", "resetTask", "isValidResetMode", "validResetModes", "init_reset", "createLog", "debug", "prefixedLogger", "childLoggerName", "createLogger", "init_git_logger", "TasksPendingQueue", "init_tasks_pending_queue", "pluginContext", "onErrorReceived", "onDataReceived", "GitExecutorChain", "init_git_executor_chain", "git_executor_exports", "GitExecutor", "init_git_executor", "taskCallback", "addDeprecationNoticeToError", "init_task_callback", "changeWorkingDirectoryTask", "init_change_working_directory", "checkoutTask", "checkout_default", "init_checkout", "countObjectsResponse", "count_objects_default", "init_count_objects", "parseCommitResult", "init_parse_commit", "commitTask", "commit_default", "init_commit", "first_commit_default", "init_first_commit", "hashObjectTask", "init_hash_object", "parseInit", "initResponseRegex", "InitSummary", "reInitResponseRegex", "init_InitSummary", "hasBareCommand", "bareCommand", "initTask", "init_init", "logFormatFromCommand", "logFormatRegex", "isLogFormat", "init_log_format", "DiffSummary", "init_DiffSummary", "getDiffParser", "diffSummaryParsers", "statParser", "numStatParser", "nameOnlyParser", "nameStatusParser", "init_parse_diff_summary", "lineBuilder", "createListLogSummaryParser", "SPLITTER", "defaultFieldNames", "START_BOUNDARY", "COMMIT_BOUNDARY", "init_parse_list_log_summary", "diff_exports", "diffSummaryTask", "validateLogFormatConfig", "init_diff", "prettyFormat", "userOptions", "excludeOptions", "parseLogOptions", "logTask", "log_default", "init_log", "MergeSummaryConflict", "MergeSummaryDetail", "init_MergeSummary", "PullSummary", "PullFailedSummary", "init_PullSummary", "objectEnumerationResult", "asObjectCount", "remoteMessagesObjectParsers", "init_parse_remote_objects", "parseRemoteMessages", "RemoteMessageSummary", "init_parse_remote_messages", "parsePullErrorResult", "errorParsers", "FILE_UPDATE_REGEX", "SUMMARY_REGEX", "ACTION_REGEX", "parsePullDetail", "parsePullResult", "init_parse_pull", "parseMergeResult", "parseMergeDetail", "init_parse_merge", "mergeTask", "merge", "init_merge", "pushResultPushedItem", "parsePushResult", "parsePushDetail", "init_parse_push", "push_exports", "pushTagsTask", "pushTask", "init_push", "show_default", "init_show", "fromPathRegex", "FileStatusSummary", "init_FileStatusSummary", "renamedFile", "handler", "conflicts", "splitLine", "StatusSummary", "parseStatusSummary", "init_StatusSummary", "statusTask", "ignoredOptions", "init_status", "versionResponse", "notInstalledResponse", "version_default", "versionParser", "NOT_INSTALLED", "init_version", "simple_git_api_exports", "SimpleGitApi", "init_simple_git_api", "scheduler_exports", "Scheduler", "createScheduledTask", "init_scheduler", "apply_patch_exports", "applyPatchTask", "init_apply_patch", "branchDeletionSuccess", "branchDeletionFailure", "BranchDeletionBatch", "init_BranchDeleteSummary", "hasBranchDeletionError", "deleteErrorRegex", "deleteSuccessRegex", "parseBranchDeletions", "init_parse_branch_delete", "BranchSummaryResult", "init_BranchSummary", "branchStatus", "parseBranchSummary", "currentBranchParser", "init_parse_branch", "branch_exports", "branchLocalTask", "branchTask", "containsDeleteBranchCommand", "deleteBranchTask", "deleteBranchesTask", "init_branch", "toPath", "parseCheckIgnore", "init_CheckIgnore", "check_ignore_exports", "checkIgnoreTask", "init_check_ignore", "clone_exports", "cloneMirrorTask", "cloneTask", "disallowedCommand", "init_clone", "parseFetchResult", "init_parse_fetch", "fetch_exports", "fetchTask", "init_fetch", "parseMoveResult", "init_parse_move", "move_exports", "moveTask", "init_move", "pull_exports", "pullTask", "init_pull", "parseGetRemotes", "forEach", "parseGetRemotesVerbose", "init_GetRemoteSummary", "remote_exports", "addRemoteTask", "getRemotesTask", "listRemotesTask", "remoteTask", "removeRemoteTask", "init_remote", "stash_list_exports", "stashListTask", "init_stash_list", "sub_module_exports", "addSubModuleTask", "initSubModuleTask", "subModuleTask", "updateSubModuleTask", "init_sub_module", "singleSorted", "sorted", "toNumber", "TagList", "parseTagList", "init_TagList", "tag_exports", "addAnnotatedTagTask", "addTagTask", "tagListTask", "init_tag", "require_git", "__commonJS", "exports", "module", "__toCommonJS", "Git", "never", "input", "plugin", "esm_default", "esm_default"] +} diff --git a/vscode-extension/package-lock.json b/vscode-extension/package-lock.json new file mode 100644 index 0000000..6be638c --- /dev/null +++ b/vscode-extension/package-lock.json @@ -0,0 +1,944 @@ +{ + "name": "primer-vscode", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "primer-vscode", + "version": "0.0.1", + "license": "ISC", + "dependencies": { + "@github/copilot-sdk": "^0.1.19", + "simple-git": "^3.30.0" + }, + "devDependencies": { + "@octokit/rest": "^22.0.1", + "@types/node": "^22.0.0", + "@types/vscode": "^1.100.0", + "esbuild": "^0.25.0", + "typescript": "^5.9.3" + }, + "engines": { + "vscode": "^1.100.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@github/copilot": { + "version": "0.0.403", + "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.403.tgz", + "integrity": "sha512-v5jUdtGJReLmE1rmff/LZf+50nzmYQYAaSRNtVNr9g0j0GkCd/noQExe31i1+PudvWU0ZJjltR0B8pUfDRdA9Q==", + "license": "SEE LICENSE IN LICENSE.md", + "bin": { + "copilot": "npm-loader.js" + }, + "optionalDependencies": { + "@github/copilot-darwin-arm64": "0.0.403", + "@github/copilot-darwin-x64": "0.0.403", + "@github/copilot-linux-arm64": "0.0.403", + "@github/copilot-linux-x64": "0.0.403", + "@github/copilot-win32-arm64": "0.0.403", + "@github/copilot-win32-x64": "0.0.403" + } + }, + "node_modules/@github/copilot-darwin-arm64": { + "version": "0.0.403", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.403.tgz", + "integrity": "sha512-dOw8IleA0d1soHnbr/6wc6vZiYWNTKMgfTe/NET1nCfMzyKDt/0F0I7PT5y+DLujJknTla/ZeEmmBUmliTW4Cg==", + "cpu": [ + "arm64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "copilot-darwin-arm64": "copilot" + } + }, + "node_modules/@github/copilot-darwin-x64": { + "version": "0.0.403", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.403.tgz", + "integrity": "sha512-aK2jSNWgY8eiZ+TmrvGhssMCPDTKArc0ip6Ul5OaslpytKks8hyXoRbxGD0N9sKioSUSbvKUf+1AqavbDpJO+w==", + "cpu": [ + "x64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "copilot-darwin-x64": "copilot" + } + }, + "node_modules/@github/copilot-linux-arm64": { + "version": "0.0.403", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.403.tgz", + "integrity": "sha512-KhoR2iR70O6vCkzf0h8/K+p82qAgOvMTgAPm9bVEHvbdGFR7Py9qL5v03bMbPxsA45oNaZAkzDhfTAqWhIAZsQ==", + "cpu": [ + "arm64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linux-arm64": "copilot" + } + }, + "node_modules/@github/copilot-linux-x64": { + "version": "0.0.403", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.403.tgz", + "integrity": "sha512-eoswUc9vo4TB+/9PgFJLVtzI4dPjkpJXdCsAioVuoqPdNxHxlIHFe9HaVcqMRZxUNY1YHEBZozy+IpUEGjgdfQ==", + "cpu": [ + "x64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linux-x64": "copilot" + } + }, + "node_modules/@github/copilot-sdk": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.22.tgz", + "integrity": "sha512-ZGOEBmYOfu/vLXKjjoiw4lO3Cb8QBUuAWXcW/qzmPPsM9+Qe00qVr2AuDTU/Gft9Dm/yZcPK2QuTZc7LVeom9w==", + "license": "MIT", + "dependencies": { + "@github/copilot": "^0.0.403", + "vscode-jsonrpc": "^8.2.1", + "zod": "^4.3.6" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@github/copilot-win32-arm64": { + "version": "0.0.403", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.403.tgz", + "integrity": "sha512-djWjzCsp2xPNafMyOZ/ivU328/WvWhdroGie/DugiJBTgQL2SP0quWW1fhTlDwE81a3g9CxfJonaRgOpFTJTcg==", + "cpu": [ + "arm64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "copilot-win32-arm64": "copilot.exe" + } + }, + "node_modules/@github/copilot-win32-x64": { + "version": "0.0.403", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.403.tgz", + "integrity": "sha512-lju8cHy2E6Ux7R7tWyLZeksYC2MVZu9i9ocjiBX/qfG2/pNJs7S5OlkwKJ0BSXSbZEHQYq7iHfEWp201bVfk9A==", + "cpu": [ + "x64" + ], + "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "os": [ + "win32" + ], + "bin": { + "copilot-win32-x64": "copilot.exe" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "license": "MIT" + }, + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/core": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/endpoint": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", + "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/graphql": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", + "integrity": "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", + "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/request": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", + "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^11.0.2", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "fast-content-type-parse": "^3.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/request-error": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/rest": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz", + "integrity": "sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^7.0.6", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-request-log": "^6.0.0", + "@octokit/plugin-rest-endpoint-methods": "^17.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^27.0.0" + } + }, + "node_modules/@types/node": { + "version": "22.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.11.tgz", + "integrity": "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.109.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.109.0.tgz", + "integrity": "sha512-0Pf95rnwEIwDbmXGC08r0B4TQhAbsHQ5UyTIgVgoieDe4cOnf92usuR5dEczb6bTKEp7ziZH4TV1TRGPPCExtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/simple-git": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.31.1.tgz", + "integrity": "sha512-oiWP4Q9+kO8q9hHqkX35uuHmxiEbZNTrZ5IPxgMGrJwN76pzjm/jabkZO0ItEcqxAincqGAzL3QHSaHt4+knBg==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", + "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/vscode-extension/package.json b/vscode-extension/package.json new file mode 100644 index 0000000..9eceacb --- /dev/null +++ b/vscode-extension/package.json @@ -0,0 +1,219 @@ +{ + "name": "primer-vscode", + "displayName": "Primer — AI Repository Setup", + "description": "Prime repositories for AI-assisted development: generate Copilot instructions, VS Code configs, MCP configs, and evaluate AI agent effectiveness.", + "version": "0.0.1", + "publisher": "digitarald", + "license": "ISC", + "engines": { + "vscode": "^1.100.0" + }, + "categories": [ + "Other" + ], + "activationEvents": [], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "primer.analyze", + "title": "Analyze Repository", + "category": "Primer", + "icon": "$(search)" + }, + { + "command": "primer.generate", + "title": "Generate Configs", + "category": "Primer", + "icon": "$(file-code)" + }, + { + "command": "primer.instructions", + "title": "Generate Copilot Instructions", + "category": "Primer", + "icon": "$(edit)" + }, + { + "command": "primer.readiness", + "title": "AI Readiness Report", + "category": "Primer", + "icon": "$(shield)" + }, + { + "command": "primer.eval", + "title": "Run Eval", + "category": "Primer", + "icon": "$(beaker)" + }, + { + "command": "primer.evalInit", + "title": "Scaffold Eval Config", + "category": "Primer", + "icon": "$(new-file)" + }, + { + "command": "primer.init", + "title": "Initialize Repository", + "category": "Primer", + "icon": "$(rocket)" + }, + { + "command": "primer.pr", + "title": "Create Pull Request", + "category": "Primer", + "icon": "$(git-pull-request)" + } + ], + "viewsContainers": { + "activitybar": [ + { + "id": "primer", + "title": "Primer", + "icon": "resources/primer.svg" + } + ] + }, + "views": { + "primer": [ + { + "id": "primer.analysis", + "name": "Analysis", + "contextualTitle": "Primer" + }, + { + "id": "primer.readiness", + "name": "Readiness", + "contextualTitle": "Primer" + } + ] + }, + "viewsWelcome": [ + { + "view": "primer.analysis", + "contents": "Analyze this repository to discover languages, frameworks, and project structure.\n[$(search) Analyze Repository](command:primer.analyze)", + "when": "workspaceFolderCount > 0" + }, + { + "view": "primer.analysis", + "contents": "[$(folder-opened) Open Folder](command:vscode.openFolder)", + "when": "workspaceFolderCount == 0" + }, + { + "view": "primer.readiness", + "contents": "Evaluate how ready this repository is for AI-assisted development.\n[$(shield) Run Assessment](command:primer.readiness)", + "when": "workspaceFolderCount > 0" + }, + { + "view": "primer.readiness", + "contents": "[$(folder-opened) Open Folder](command:vscode.openFolder)", + "when": "workspaceFolderCount == 0" + } + ], + "configuration": { + "title": "Primer", + "properties": { + "primer.model": { + "type": "string", + "default": "claude-sonnet-4.5", + "description": "Default Copilot model to use for generation." + }, + "primer.autoAnalyze": { + "type": "boolean", + "default": false, + "description": "Automatically analyze repository on workspace open." + } + } + }, + "menus": { + "commandPalette": [ + { + "command": "primer.analyze", + "when": "workspaceFolderCount > 0" + }, + { + "command": "primer.generate", + "when": "workspaceFolderCount > 0" + }, + { + "command": "primer.instructions", + "when": "workspaceFolderCount > 0" + }, + { + "command": "primer.readiness", + "when": "workspaceFolderCount > 0" + }, + { + "command": "primer.eval", + "when": "workspaceFolderCount > 0" + }, + { + "command": "primer.evalInit", + "when": "workspaceFolderCount > 0" + }, + { + "command": "primer.init", + "when": "workspaceFolderCount > 0" + }, + { + "command": "primer.pr", + "when": "workspaceFolderCount > 0" + } + ], + "view/title": [ + { + "command": "primer.analyze", + "when": "view == primer.analysis", + "group": "navigation@1" + }, + { + "command": "primer.instructions", + "when": "view == primer.analysis && primer.hasAnalysis", + "group": "navigation@2" + }, + { + "command": "primer.generate", + "when": "view == primer.analysis && primer.hasAnalysis", + "group": "1_actions" + }, + { + "command": "primer.init", + "when": "view == primer.analysis", + "group": "2_setup" + }, + { + "command": "primer.readiness", + "when": "view == primer.readiness", + "group": "navigation@1" + }, + { + "command": "primer.eval", + "when": "view == primer.readiness", + "group": "1_eval@1" + }, + { + "command": "primer.evalInit", + "when": "view == primer.readiness", + "group": "1_eval@2" + } + ] + } + }, + "scripts": { + "vscode:prepublish": "node esbuild.mjs --production", + "build": "node esbuild.mjs", + "watch": "node esbuild.mjs --watch", + "typecheck": "tsc --noEmit", + "package": "vsce package" + }, + "dependencies": { + "@github/copilot-sdk": "^0.1.19", + "simple-git": "^3.30.0" + }, + "devDependencies": { + "@octokit/rest": "^22.0.1", + "@types/node": "^22.0.0", + "@types/vscode": "^1.100.0", + "esbuild": "^0.25.0", + "typescript": "^5.9.3" + } +} diff --git a/vscode-extension/resources/primer.svg b/vscode-extension/resources/primer.svg new file mode 100644 index 0000000..24764ee --- /dev/null +++ b/vscode-extension/resources/primer.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/vscode-extension/src/auth.ts b/vscode-extension/src/auth.ts new file mode 100644 index 0000000..a7bd7d1 --- /dev/null +++ b/vscode-extension/src/auth.ts @@ -0,0 +1,12 @@ +import * as vscode from "vscode"; + +/** + * Acquires a GitHub token via VS Code's built-in authentication provider. + * Used by SDK-dependent services (instructions, eval) and Octokit (PR creation). + */ +export async function getGitHubToken(): Promise { + const session = await vscode.authentication.getSession("github", ["repo"], { + createIfNone: true + }); + return session.accessToken; +} diff --git a/vscode-extension/src/commands/analyze.ts b/vscode-extension/src/commands/analyze.ts new file mode 100644 index 0000000..9417d4c --- /dev/null +++ b/vscode-extension/src/commands/analyze.ts @@ -0,0 +1,42 @@ +import * as vscode from "vscode"; +import { analyzeRepo } from "../services.js"; +import type { RepoAnalysis } from "../types.js"; + +let cachedAnalysis: RepoAnalysis | undefined; + +export function getCachedAnalysis(): RepoAnalysis | undefined { + return cachedAnalysis; +} + +export function setCachedAnalysis(analysis: RepoAnalysis | undefined): void { + cachedAnalysis = analysis; + vscode.commands.executeCommand("setContext", "primer.hasAnalysis", !!analysis); +} + +export async function analyzeCommand(): Promise { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + + await vscode.window.withProgress( + { location: vscode.ProgressLocation.Notification, title: "Primer: Analyzing repository…" }, + async () => { + try { + const analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Analysis failed — ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} + +export function getWorkspacePath(): string | undefined { + const folder = vscode.workspace.workspaceFolders?.[0]; + if (!folder) { + vscode.window.showWarningMessage("Primer: No workspace folder open."); + return undefined; + } + return folder.uri.fsPath; +} diff --git a/vscode-extension/src/commands/eval.ts b/vscode-extension/src/commands/eval.ts new file mode 100644 index 0000000..7fd0626 --- /dev/null +++ b/vscode-extension/src/commands/eval.ts @@ -0,0 +1,109 @@ +import * as vscode from "vscode"; +import path from "node:path"; +import { runEval, generateEvalScaffold, analyzeRepo, safeWriteFile } from "../services.js"; +import { VscodeProgressReporter } from "../progress.js"; +import { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from "./analyze.js"; +import { createWebviewPanel } from "../webview.js"; +import fs from "node:fs"; + +export async function evalCommand(): Promise { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + + const configPath = path.join(workspacePath, "primer.eval.json"); + if (!fs.existsSync(configPath)) { + const action = await vscode.window.showWarningMessage( + "Primer: No primer.eval.json found. Create one?", + "Scaffold", + "Cancel" + ); + if (action === "Scaffold") { + await evalInitCommand(); + } + return; + } + + const config = vscode.workspace.getConfiguration("primer"); + const model = config.get("model") ?? "claude-sonnet-4.5"; + + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: "Primer: Running eval…", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + + reporter.update("Running evaluation…"); + const result = await runEval({ + configPath, + repoPath: workspacePath, + model, + judgeModel: model, + onProgress: (msg) => reporter.update(msg) + }); + + reporter.succeed(`Eval complete. ${result.summary}`); + + if (result.viewerPath && fs.existsSync(result.viewerPath)) { + const html = fs.readFileSync(result.viewerPath, "utf-8"); + createWebviewPanel("primer.evalResults", "Eval Results", html); + } + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Eval failed — ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} + +export async function evalInitCommand(): Promise { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + + const config = vscode.workspace.getConfiguration("primer"); + const model = config.get("model"); + + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: "Primer: Scaffolding eval config…", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + + let analysis = getCachedAnalysis(); + if (!analysis) { + reporter.update("Analyzing repository…"); + analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + } + + reporter.update("Generating eval cases…"); + const evalConfig = await generateEvalScaffold({ + repoPath: workspacePath, + count: 5, + model, + areas: analysis.areas, + onProgress: (msg) => reporter.update(msg) + }); + + const outputPath = path.join(workspacePath, "primer.eval.json"); + await safeWriteFile(outputPath, JSON.stringify(evalConfig, null, 2) + "\n", false); + + reporter.succeed("Eval config scaffolded."); + const doc = await vscode.workspace.openTextDocument(outputPath); + await vscode.window.showTextDocument(doc); + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Eval scaffold failed — ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} diff --git a/vscode-extension/src/commands/generate.ts b/vscode-extension/src/commands/generate.ts new file mode 100644 index 0000000..04f1154 --- /dev/null +++ b/vscode-extension/src/commands/generate.ts @@ -0,0 +1,90 @@ +import * as vscode from "vscode"; +import { generateConfigs, analyzeRepo } from "../services.js"; +import { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from "./analyze.js"; + +const GENERATE_OPTIONS = [ + { label: "MCP Config", value: "mcp", description: ".vscode/mcp.json" }, + { label: "VS Code Settings", value: "vscode", description: ".vscode/settings.json" } +] as const; + +export async function generateCommand(): Promise { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + + const picked = await vscode.window.showQuickPick( + GENERATE_OPTIONS.map((o) => ({ label: o.label, description: o.description, value: o.value })), + { placeHolder: "Select config type to generate" } + ); + if (!picked) return; + + let analysis = getCachedAnalysis(); + + const result = await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: `Primer: Generating ${picked.label}…` + }, + async () => { + try { + if (!analysis) { + analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + } + + return await generateConfigs({ + repoPath: workspacePath, + analysis, + selections: [picked.value], + force: false + }); + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Config generation failed — ${err instanceof Error ? err.message : String(err)}` + ); + return undefined; + } + } + ); + + if (!result) return; + + const wrote = result.files.filter((f) => f.action === "wrote"); + const skipped = result.files.filter((f) => f.action === "skipped"); + + if (wrote.length > 0) { + const openAction = "Open File"; + const msg = `Generated ${wrote.map((f) => f.path).join(", ")}${skipped.length ? ` (${skipped.length} skipped)` : ""}`; + const action = await vscode.window.showInformationMessage(`Primer: ${msg}`, openAction); + if (action === openAction && wrote[0]) { + const doc = await vscode.workspace.openTextDocument(wrote[0].path); + await vscode.window.showTextDocument(doc); + } + } else if (skipped.length > 0) { + const overwrite = "Overwrite"; + const action = await vscode.window.showWarningMessage( + "Primer: All config files already exist.", + overwrite + ); + if (action === overwrite) { + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: `Primer: Overwriting ${picked.label}…` + }, + async () => { + const forceResult = await generateConfigs({ + repoPath: workspacePath, + analysis: analysis!, + selections: [picked.value], + force: true + }); + const forceWrote = forceResult.files.filter((f) => f.action === "wrote"); + if (forceWrote.length > 0) { + const doc = await vscode.workspace.openTextDocument(forceWrote[0]!.path); + await vscode.window.showTextDocument(doc); + } + } + ); + } + } +} diff --git a/vscode-extension/src/commands/init.ts b/vscode-extension/src/commands/init.ts new file mode 100644 index 0000000..7f97b92 --- /dev/null +++ b/vscode-extension/src/commands/init.ts @@ -0,0 +1,67 @@ +import * as vscode from "vscode"; +import path from "node:path"; +import { analyzeRepo, generateConfigs, generateCopilotInstructions } from "../services.js"; +import { VscodeProgressReporter } from "../progress.js"; +import { getWorkspacePath, setCachedAnalysis } from "./analyze.js"; + +export async function initCommand(): Promise { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + + const config = vscode.workspace.getConfiguration("primer"); + const model = config.get("model"); + + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: "Primer: Initializing repository…", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + + reporter.update("Analyzing repository…"); + const analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + + reporter.update("Generating Copilot instructions…"); + await generateCopilotInstructions({ + repoPath: workspacePath, + model, + onProgress: (msg) => reporter.update(msg) + }); + + reporter.update("Generating configs…"); + const result = await generateConfigs({ + repoPath: workspacePath, + analysis, + selections: ["mcp", "vscode"], + force: false + }); + + const wrote = result.files.filter((f) => f.action === "wrote"); + const skipped = result.files.filter((f) => f.action === "skipped"); + const parts: string[] = []; + if (wrote.length) parts.push(`${wrote.length} files generated`); + if (skipped.length) parts.push(`${skipped.length} skipped (already exist)`); + + reporter.succeed("Repository initialized."); + + const instructionsPath = path.join(workspacePath, ".github", "copilot-instructions.md"); + try { + const doc = await vscode.workspace.openTextDocument(instructionsPath); + await vscode.window.showTextDocument(doc); + } catch { + // File may not exist if generation was skipped + } + + vscode.window.showInformationMessage(`Primer: ${parts.join(", ") || "Done."}`); + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Initialization failed — ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} diff --git a/vscode-extension/src/commands/instructions.ts b/vscode-extension/src/commands/instructions.ts new file mode 100644 index 0000000..f364cc1 --- /dev/null +++ b/vscode-extension/src/commands/instructions.ts @@ -0,0 +1,74 @@ +import * as vscode from "vscode"; +import { generateCopilotInstructions, generateAreaInstructions, analyzeRepo } from "../services.js"; +import { VscodeProgressReporter } from "../progress.js"; +import { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from "./analyze.js"; + +export async function instructionsCommand(): Promise { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + + const model = vscode.workspace.getConfiguration("primer").get("model"); + + // Ensure analysis is available before starting progress + let analysis = getCachedAnalysis(); + if (!analysis) { + await vscode.window.withProgress( + { location: vscode.ProgressLocation.Notification, title: "Primer: Analyzing repository…" }, + async () => { + analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis!); + } + ); + } + if (!analysis) return; + + // Collect area selections before starting generation progress + let selectedAreas: typeof analysis.areas = undefined; + if (analysis.areas && analysis.areas.length > 0) { + const picked = await vscode.window.showQuickPick( + analysis.areas.map((a) => ({ label: a.name, description: a.description, area: a })), + { placeHolder: "Select areas for instructions (or Escape for root only)", canPickMany: true } + ); + if (picked && picked.length > 0) { + selectedAreas = picked.map((p) => p.area); + } + } + + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: "Primer: Generating Copilot instructions…", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + + reporter.update("Generating root instructions…"); + await generateCopilotInstructions({ + repoPath: workspacePath, + model, + onProgress: (msg) => reporter.update(msg) + }); + + if (selectedAreas) { + for (const area of selectedAreas) { + reporter.update(`Generating instructions for ${area.name}…`); + await generateAreaInstructions({ + repoPath: workspacePath, + area, + model, + onProgress: (msg) => reporter.update(msg) + }); + } + } + + reporter.succeed("Instructions generated."); + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Instruction generation failed — ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} diff --git a/vscode-extension/src/commands/pr.ts b/vscode-extension/src/commands/pr.ts new file mode 100644 index 0000000..e052254 --- /dev/null +++ b/vscode-extension/src/commands/pr.ts @@ -0,0 +1,101 @@ +import * as vscode from "vscode"; +import { createPullRequest } from "../services.js"; +import { getGitHubToken } from "../auth.js"; +import { getWorkspacePath } from "./analyze.js"; +import simpleGit from "simple-git"; + +export async function prCommand(): Promise { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + + const git = simpleGit(workspacePath); + + // Detect remote owner/repo + const remotes = await git.getRemotes(true); + const origin = remotes.find((r) => r.name === "origin"); + if (!origin?.refs.push) { + vscode.window.showErrorMessage("Primer: No origin remote found."); + return; + } + + const match = origin.refs.push.match(/github\.com[:/]([^/]+)\/([^/.]+)/); + if (!match) { + vscode.window.showErrorMessage("Primer: Could not parse GitHub owner/repo from origin remote."); + return; + } + const [, owner, repo] = match; + + const branch = (await git.branch()).current; + const defaultBranch = await git + .raw(["symbolic-ref", "refs/remotes/origin/HEAD", "--short"]) + .catch(() => "origin/main"); + const base = defaultBranch.replace("origin/", "").trim(); + + if (branch === base) { + vscode.window.showErrorMessage( + "Primer: Cannot create PR from the default branch. Check out a feature branch first." + ); + return; + } + + const title = await vscode.window.showInputBox({ + prompt: "Pull request title", + value: `Add Primer AI configs for ${repo}` + }); + if (!title) return; + + await vscode.window.withProgress( + { location: vscode.ProgressLocation.Notification, title: "Primer: Creating pull request…" }, + async () => { + try { + const token = await getGitHubToken(); + + // Commit and push if there are changes + const status = await git.status(); + if (status.files.length > 0) { + const primerFiles = status.files + .map((f) => f.path) + .filter( + (p) => + p.startsWith(".github/") || + p.startsWith(".vscode/") || + p.endsWith(".instructions.md") || + p === "primer.eval.json" + ); + + if (primerFiles.length === 0) { + vscode.window.showWarningMessage("Primer: No Primer-generated files to commit."); + return; + } + + await git.add(primerFiles); + await git.commit(title); + await git.push("origin", branch); + } + + const prUrl = await createPullRequest({ + token, + owner: owner!, + repo: repo!, + title, + body: "Generated by Primer VS Code extension.", + head: branch, + base + }); + + const openAction = "Open in Browser"; + const action = await vscode.window.showInformationMessage( + `Primer: Pull request created.`, + openAction + ); + if (action === openAction && prUrl.startsWith("https://")) { + vscode.env.openExternal(vscode.Uri.parse(prUrl)); + } + } catch (err) { + vscode.window.showErrorMessage( + `Primer: PR creation failed — ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} diff --git a/vscode-extension/src/commands/readiness.ts b/vscode-extension/src/commands/readiness.ts new file mode 100644 index 0000000..a4c0684 --- /dev/null +++ b/vscode-extension/src/commands/readiness.ts @@ -0,0 +1,49 @@ +import * as vscode from "vscode"; +import { runReadinessReport, generateVisualReport, analyzeRepo } from "../services.js"; +import { VscodeProgressReporter } from "../progress.js"; +import { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from "./analyze.js"; +import { createWebviewPanel } from "../webview.js"; +import { readinessTreeProvider } from "../views/providers.js"; + +export async function readinessCommand(): Promise { + const workspacePath = getWorkspacePath(); + if (!workspacePath) return; + + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: "Primer: Running readiness assessment…", + cancellable: false + }, + async (progress) => { + try { + const reporter = new VscodeProgressReporter(progress); + + let analysis = getCachedAnalysis(); + if (!analysis) { + reporter.update("Analyzing repository…"); + analysis = await analyzeRepo(workspacePath); + setCachedAnalysis(analysis); + } + + reporter.update("Evaluating readiness pillars…"); + const report = await runReadinessReport({ repoPath: workspacePath }); + + reporter.update("Generating report…"); + const repoName = vscode.workspace.workspaceFolders?.[0]?.name ?? "Repository"; + const html = generateVisualReport({ + reports: [{ repo: repoName, report }], + title: `${repoName} — AI Readiness` + }); + + createWebviewPanel("primer.readinessReport", "AI Readiness Report", html); + readinessTreeProvider.setReport(report); + reporter.succeed(`Readiness: Level ${report.achievedLevel} achieved.`); + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Readiness assessment failed — ${err instanceof Error ? err.message : String(err)}` + ); + } + } + ); +} diff --git a/vscode-extension/src/extension.ts b/vscode-extension/src/extension.ts new file mode 100644 index 0000000..2a8138d --- /dev/null +++ b/vscode-extension/src/extension.ts @@ -0,0 +1,101 @@ +import * as vscode from "vscode"; +import { analyzeCommand, getCachedAnalysis } from "./commands/analyze.js"; +import { generateCommand } from "./commands/generate.js"; +import { instructionsCommand } from "./commands/instructions.js"; +import { readinessCommand } from "./commands/readiness.js"; +import { evalCommand, evalInitCommand } from "./commands/eval.js"; +import { initCommand } from "./commands/init.js"; +import { prCommand } from "./commands/pr.js"; +import { analysisTreeProvider, readinessTreeProvider } from "./views/providers.js"; + +export function activate(context: vscode.ExtensionContext): void { + // Status bar + const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0); + statusBar.text = "$(beaker) Primer"; + statusBar.tooltip = "Primer — click to analyze repository"; + statusBar.command = "primer.analyze"; + statusBar.show(); + context.subscriptions.push(statusBar); + + // Tree views (createTreeView for description/badge support) + const analysisView = vscode.window.createTreeView("primer.analysis", { + treeDataProvider: analysisTreeProvider + }); + const readinessView = vscode.window.createTreeView("primer.readiness", { + treeDataProvider: readinessTreeProvider + }); + context.subscriptions.push(analysisView, readinessView); + + function updateAnalysisView(): void { + const analysis = getCachedAnalysis(); + if (analysis) { + const parts = [...analysis.languages.slice(0, 3), ...analysis.frameworks.slice(0, 2)]; + analysisView.description = parts.join(", ") || undefined; + } else { + analysisView.description = undefined; + } + } + + function updateReadinessView(): void { + const report = readinessTreeProvider.getReport(); + if (report) { + readinessView.description = `Level ${report.achievedLevel}`; + } else { + readinessView.description = undefined; + } + } + + function updateStatusBar(): void { + const analysis = getCachedAnalysis(); + if (analysis) { + const parts = analysis.languages.slice(0, 2); + statusBar.text = `$(beaker) ${parts.join(", ") || "Primer"}`; + statusBar.tooltip = `Primer — ${analysis.languages.join(", ")}${analysis.isMonorepo ? " | monorepo" : ""}`; + } else { + statusBar.text = "$(beaker) Primer"; + statusBar.tooltip = "Primer — click to analyze repository"; + } + } + + // Commands + context.subscriptions.push( + vscode.commands.registerCommand("primer.analyze", async () => { + await analyzeCommand(); + analysisTreeProvider.refresh(); + updateAnalysisView(); + updateStatusBar(); + vscode.commands.executeCommand("primer.analysis.focus"); + }), + vscode.commands.registerCommand("primer.generate", generateCommand), + vscode.commands.registerCommand("primer.instructions", instructionsCommand), + vscode.commands.registerCommand("primer.readiness", async () => { + await readinessCommand(); + updateReadinessView(); + updateStatusBar(); + }), + vscode.commands.registerCommand("primer.eval", evalCommand), + vscode.commands.registerCommand("primer.evalInit", evalInitCommand), + vscode.commands.registerCommand("primer.init", async () => { + await initCommand(); + analysisTreeProvider.refresh(); + updateAnalysisView(); + updateStatusBar(); + vscode.commands.executeCommand("primer.analysis.focus"); + }), + vscode.commands.registerCommand("primer.pr", prCommand) + ); + + // Auto-analyze on activation if configured + const config = vscode.workspace.getConfiguration("primer"); + if (config.get("autoAnalyze") && vscode.workspace.workspaceFolders?.length) { + analyzeCommand() + .then(() => { + analysisTreeProvider.refresh(); + updateAnalysisView(); + updateStatusBar(); + }) + .catch(() => {}); + } +} + +export function deactivate(): void {} diff --git a/vscode-extension/src/progress.ts b/vscode-extension/src/progress.ts new file mode 100644 index 0000000..7e1ef48 --- /dev/null +++ b/vscode-extension/src/progress.ts @@ -0,0 +1,27 @@ +import type * as vscode from "vscode"; +import type { ProgressReporter } from "primer/utils/output.js"; + +/** + * Adapts VS Code's `Progress<{ message, increment }>` to Primer's `ProgressReporter` interface. + */ +export class VscodeProgressReporter implements ProgressReporter { + constructor( + private readonly progress: vscode.Progress<{ message?: string; increment?: number }> + ) {} + + update(message: string): void { + this.progress.report({ message }); + } + + succeed(message: string): void { + this.progress.report({ message: `$(check) ${message}` }); + } + + fail(message: string): void { + this.progress.report({ message: `$(error) ${message}` }); + } + + done(): void { + // VS Code progress auto-closes when the withProgress callback resolves + } +} diff --git a/vscode-extension/src/services.ts b/vscode-extension/src/services.ts new file mode 100644 index 0000000..8ff55df --- /dev/null +++ b/vscode-extension/src/services.ts @@ -0,0 +1,12 @@ +export { analyzeRepo } from "primer/services/analyzer.js"; +export { generateConfigs } from "primer/services/generator.js"; +export { + generateCopilotInstructions, + generateAreaInstructions +} from "primer/services/instructions.js"; +export { runEval } from "primer/services/evaluator.js"; +export { generateEvalScaffold } from "primer/services/evalScaffold.js"; +export { runReadinessReport } from "primer/services/readiness.js"; +export { generateVisualReport } from "primer/services/visualReport.js"; +export { createPullRequest } from "primer/services/github.js"; +export { safeWriteFile } from "primer/utils/fs.js"; diff --git a/vscode-extension/src/types.ts b/vscode-extension/src/types.ts new file mode 100644 index 0000000..ce4ecf5 --- /dev/null +++ b/vscode-extension/src/types.ts @@ -0,0 +1,10 @@ +/** + * Re-export Primer CLI types for use in the extension. + */ +export type { RepoAnalysis, Area } from "primer/services/analyzer.js"; + +export type { + ReadinessReport, + ReadinessPillarSummary, + ReadinessCriterionResult +} from "primer/services/readiness.js"; diff --git a/vscode-extension/src/views/AnalysisTreeProvider.ts b/vscode-extension/src/views/AnalysisTreeProvider.ts new file mode 100644 index 0000000..337c7f0 --- /dev/null +++ b/vscode-extension/src/views/AnalysisTreeProvider.ts @@ -0,0 +1,104 @@ +import * as vscode from "vscode"; +import type { RepoAnalysis } from "../types.js"; +import { getCachedAnalysis } from "../commands/analyze.js"; + +export class AnalysisTreeProvider implements vscode.TreeDataProvider { + private _onDidChangeTreeData = new vscode.EventEmitter(); + readonly onDidChangeTreeData = this._onDidChangeTreeData.event; + + refresh(): void { + this._onDidChangeTreeData.fire(undefined); + } + + getTreeItem(element: AnalysisItem): vscode.TreeItem { + return element; + } + + getChildren(element?: AnalysisItem): AnalysisItem[] { + if (element) return element.children ?? []; + const analysis = getCachedAnalysis(); + if (!analysis) return []; + return this.getRootItems(analysis); + } + + private getRootItems(analysis: RepoAnalysis): AnalysisItem[] { + const items: AnalysisItem[] = []; + + if (analysis.languages.length > 0) { + const langs = new AnalysisItem( + "Languages", + vscode.TreeItemCollapsibleState.Expanded, + analysis.languages.map((l) => { + const item = new AnalysisItem(l, vscode.TreeItemCollapsibleState.None); + item.contextValue = "language"; + return item; + }) + ); + langs.iconPath = new vscode.ThemeIcon("code"); + langs.description = `${analysis.languages.length}`; + langs.contextValue = "category"; + items.push(langs); + } + + if (analysis.frameworks.length > 0) { + const frameworks = new AnalysisItem( + "Frameworks", + vscode.TreeItemCollapsibleState.Expanded, + analysis.frameworks.map((f) => { + const item = new AnalysisItem(f, vscode.TreeItemCollapsibleState.None); + item.contextValue = "framework"; + return item; + }) + ); + frameworks.iconPath = new vscode.ThemeIcon("extensions"); + frameworks.description = `${analysis.frameworks.length}`; + frameworks.contextValue = "category"; + items.push(frameworks); + } + + if (analysis.isMonorepo && analysis.areas) { + const areas = new AnalysisItem( + "Monorepo", + vscode.TreeItemCollapsibleState.Expanded, + analysis.areas.map((a) => { + const item = new AnalysisItem(a.name, vscode.TreeItemCollapsibleState.None); + item.description = typeof a.applyTo === "string" ? a.applyTo : a.applyTo.join(", "); + item.iconPath = new vscode.ThemeIcon("folder"); + item.contextValue = "area"; + const md = new vscode.MarkdownString(); + md.appendMarkdown(`**${a.name}**`); + if (a.description) md.appendMarkdown(`\n\n${a.description}`); + md.appendMarkdown( + `\n\nGlobs: \`${typeof a.applyTo === "string" ? a.applyTo : a.applyTo.join("\`, \`")}\`` + ); + item.tooltip = md; + return item; + }) + ); + areas.iconPath = new vscode.ThemeIcon("folder-library"); + areas.description = analysis.workspaceType ?? undefined; + areas.contextValue = "category"; + items.push(areas); + } + + if (analysis.packageManager) { + const pm = new AnalysisItem("Package Manager", vscode.TreeItemCollapsibleState.None); + pm.description = analysis.packageManager; + pm.iconPath = new vscode.ThemeIcon("package"); + pm.contextValue = "info"; + items.push(pm); + } + + return items; + } +} + +class AnalysisItem extends vscode.TreeItem { + constructor( + label: string, + collapsibleState: vscode.TreeItemCollapsibleState, + public readonly children?: AnalysisItem[] + ) { + super(label, collapsibleState); + } +} diff --git a/vscode-extension/src/views/ReadinessTreeProvider.ts b/vscode-extension/src/views/ReadinessTreeProvider.ts new file mode 100644 index 0000000..804c81a --- /dev/null +++ b/vscode-extension/src/views/ReadinessTreeProvider.ts @@ -0,0 +1,120 @@ +import * as vscode from "vscode"; +import type { + ReadinessReport, + ReadinessPillarSummary, + ReadinessCriterionResult +} from "../types.js"; + +export class ReadinessTreeProvider implements vscode.TreeDataProvider { + private _onDidChangeTreeData = new vscode.EventEmitter(); + readonly onDidChangeTreeData = this._onDidChangeTreeData.event; + + private report: ReadinessReport | undefined; + + setReport(report: ReadinessReport): void { + this.report = report; + this._onDidChangeTreeData.fire(undefined); + } + + getReport(): ReadinessReport | undefined { + return this.report; + } + + refresh(): void { + this._onDidChangeTreeData.fire(undefined); + } + + getTreeItem(element: ReadinessItem): vscode.TreeItem { + return element; + } + + getChildren(element?: ReadinessItem): ReadinessItem[] { + if (element) return element.children ?? []; + if (!this.report) return []; + return this.getRootItems(this.report); + } + + private getRootItems(report: ReadinessReport): ReadinessItem[] { + const items: ReadinessItem[] = []; + + const levelInfo = report.levels.find((l) => l.level === report.achievedLevel); + const level = new ReadinessItem( + levelInfo?.name ?? `Level ${report.achievedLevel}`, + vscode.TreeItemCollapsibleState.None + ); + level.description = `Level ${report.achievedLevel}`; + level.iconPath = new vscode.ThemeIcon( + report.achievedLevel >= 3 ? "pass" : "warning", + new vscode.ThemeColor( + report.achievedLevel >= 3 ? "testing.iconPassed" : "problemsWarningIcon.foreground" + ) + ); + level.contextValue = "level"; + items.push(level); + + for (const pillar of report.pillars) { + const criteria = report.criteria.filter((c) => c.pillar === pillar.id); + items.push(this.createPillarItem(pillar, criteria)); + } + + return items; + } + + private createPillarItem( + pillar: ReadinessPillarSummary, + criteria: ReadinessCriterionResult[] + ): ReadinessItem { + const pct = Math.round(pillar.passRate * 100); + const item = new ReadinessItem( + pillar.name, + criteria.length > 0 + ? vscode.TreeItemCollapsibleState.Collapsed + : vscode.TreeItemCollapsibleState.None, + criteria.map((c) => { + const ci = new ReadinessItem(c.title, vscode.TreeItemCollapsibleState.None); + ci.iconPath = new vscode.ThemeIcon( + c.status === "pass" ? "pass" : c.status === "fail" ? "error" : "circle-outline", + c.status === "pass" + ? new vscode.ThemeColor("testing.iconPassed") + : c.status === "fail" + ? new vscode.ThemeColor("testing.iconFailed") + : undefined + ); + ci.description = c.reason; + ci.contextValue = `criterion.${c.status}`; + const md = new vscode.MarkdownString(); + md.appendMarkdown(`**${c.title}**\n\n`); + if (c.reason) md.appendMarkdown(`${c.reason}\n\n`); + if (c.evidence && c.evidence.length > 0) { + md.appendMarkdown("**Evidence:**\n"); + for (const e of c.evidence) { + md.appendMarkdown(`- ${e}\n`); + } + } + ci.tooltip = md; + return ci; + }) + ); + item.iconPath = new vscode.ThemeIcon( + pct === 100 ? "pass" : pct >= 50 ? "warning" : "error", + pct === 100 + ? new vscode.ThemeColor("testing.iconPassed") + : pct >= 50 + ? new vscode.ThemeColor("problemsWarningIcon.foreground") + : new vscode.ThemeColor("testing.iconFailed") + ); + item.description = `${pillar.passed}/${pillar.total} (${pct}%)`; + item.contextValue = "pillar"; + return item; + } +} + +class ReadinessItem extends vscode.TreeItem { + constructor( + label: string, + collapsibleState: vscode.TreeItemCollapsibleState, + public readonly children?: ReadinessItem[] + ) { + super(label, collapsibleState); + } +} diff --git a/vscode-extension/src/views/providers.ts b/vscode-extension/src/views/providers.ts new file mode 100644 index 0000000..68eef61 --- /dev/null +++ b/vscode-extension/src/views/providers.ts @@ -0,0 +1,5 @@ +import { AnalysisTreeProvider } from "./AnalysisTreeProvider.js"; +import { ReadinessTreeProvider } from "./ReadinessTreeProvider.js"; + +export const analysisTreeProvider = new AnalysisTreeProvider(); +export const readinessTreeProvider = new ReadinessTreeProvider(); diff --git a/vscode-extension/src/webview.ts b/vscode-extension/src/webview.ts new file mode 100644 index 0000000..6a8e514 --- /dev/null +++ b/vscode-extension/src/webview.ts @@ -0,0 +1,25 @@ +import * as vscode from "vscode"; + +const panels = new Map(); + +/** + * Create or reuse a webview panel to display HTML content. + */ +export function createWebviewPanel(id: string, title: string, html: string): vscode.WebviewPanel { + const existing = panels.get(id); + if (existing) { + existing.webview.html = html; + existing.reveal(); + return existing; + } + + const panel = vscode.window.createWebviewPanel(id, title, vscode.ViewColumn.One, { + enableScripts: true, + localResourceRoots: [] + }); + + panel.webview.html = html; + panel.onDidDispose(() => panels.delete(id)); + panels.set(id, panel); + return panel; +} diff --git a/vscode-extension/tsconfig.json b/vscode-extension/tsconfig.json new file mode 100644 index 0000000..30c487b --- /dev/null +++ b/vscode-extension/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "noEmit": true, + "resolveJsonModule": true, + "rootDir": "..", + "paths": { + "primer/*": ["../src/*"] + } + }, + "include": ["src"], + "exclude": ["node_modules", "out"] +} From 018610c920edcdd8b9930dc10835048a34df9d50 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 21:42:19 -0800 Subject: [PATCH 50/84] fix: exclude vscode-extension from root ESLint config --- eslint.config.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/eslint.config.js b/eslint.config.js index ca739a0..4f01f80 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -11,7 +11,14 @@ const sourceGlobs = ["**/*.{ts,tsx,js,jsx}"]; export default [ { - ignores: ["dist/**", "node_modules/**", "coverage/**", "eslint.config.js", "*.config.ts"] + ignores: [ + "dist/**", + "node_modules/**", + "coverage/**", + "vscode-extension/**", + "eslint.config.js", + "*.config.ts" + ] }, js.configs.recommended, { From df3630a84b3aefb6c8992fed90887246402399f7 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 21:45:07 -0800 Subject: [PATCH 51/84] style: format esbuild.mjs --- vscode-extension/esbuild.mjs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/vscode-extension/esbuild.mjs b/vscode-extension/esbuild.mjs index 6065136..1cddc54 100644 --- a/vscode-extension/esbuild.mjs +++ b/vscode-extension/esbuild.mjs @@ -11,16 +11,13 @@ const buildOptions = { platform: "node", target: "node22", outfile: "out/extension.js", - external: [ - "vscode", - "@github/copilot-sdk", - ], + external: ["vscode", "@github/copilot-sdk"], sourcemap: !production, minify: production, alias: { // Resolve Primer source imports via the parent src/ directory - "primer": "../src", - }, + primer: "../src" + } }; async function main() { From aac05611287ac6b4a7d7a6cd058a845a400a9040 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 22:11:33 -0800 Subject: [PATCH 52/84] Update code structure for clarity --- vscode-extension/out/extension.js | 23966 ------------------------ vscode-extension/out/extension.js.map | 7 - 2 files changed, 23973 deletions(-) delete mode 100644 vscode-extension/out/extension.js delete mode 100644 vscode-extension/out/extension.js.map diff --git a/vscode-extension/out/extension.js b/vscode-extension/out/extension.js deleted file mode 100644 index 8df5fc7..0000000 --- a/vscode-extension/out/extension.js +++ /dev/null @@ -1,23966 +0,0 @@ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __commonJS = (cb, mod) => - function __require() { - return ( - mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), - mod.exports - ); - }; -var __export = (target, all) => { - for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if ((from && typeof from === "object") || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { - get: () => from[key], - enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable - }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => ( - (target = mod != null ? __create(__getProtoOf(mod)) : {}), - __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule - ? __defProp(target, "default", { value: mod, enumerable: true }) - : target, - mod - ) -); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// ../node_modules/fast-glob/out/utils/array.js -var require_array = __commonJS({ - "../node_modules/fast-glob/out/utils/array.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.splitWhen = exports2.flatten = void 0; - function flatten(items) { - return items.reduce((collection, item) => [].concat(collection, item), []); - } - exports2.flatten = flatten; - function splitWhen(items, predicate) { - const result = [[]]; - let groupIndex = 0; - for (const item of items) { - if (predicate(item)) { - groupIndex++; - result[groupIndex] = []; - } else { - result[groupIndex].push(item); - } - } - return result; - } - exports2.splitWhen = splitWhen; - } -}); - -// ../node_modules/fast-glob/out/utils/errno.js -var require_errno = __commonJS({ - "../node_modules/fast-glob/out/utils/errno.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.isEnoentCodeError = void 0; - function isEnoentCodeError(error) { - return error.code === "ENOENT"; - } - exports2.isEnoentCodeError = isEnoentCodeError; - } -}); - -// ../node_modules/fast-glob/out/utils/fs.js -var require_fs = __commonJS({ - "../node_modules/fast-glob/out/utils/fs.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.createDirentFromStats = void 0; - var DirentFromStats = class { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } - }; - function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); - } - exports2.createDirentFromStats = createDirentFromStats; - } -}); - -// ../node_modules/fast-glob/out/utils/path.js -var require_path = __commonJS({ - "../node_modules/fast-glob/out/utils/path.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.convertPosixPathToPattern = - exports2.convertWindowsPathToPattern = - exports2.convertPathToPattern = - exports2.escapePosixPath = - exports2.escapeWindowsPath = - exports2.escape = - exports2.removeLeadingDotSegment = - exports2.makeAbsolute = - exports2.unixify = - void 0; - var os = require("os"); - var path11 = require("path"); - var IS_WINDOWS_PLATFORM = os.platform() === "win32"; - var LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; - var POSIX_UNESCAPED_GLOB_SYMBOLS_RE = - /(\\?)([()*?[\]{|}]|^!|[!+@](?=\()|\\(?![!()*+?@[\]{|}]))/g; - var WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()[\]{}]|^!|[!+@](?=\())/g; - var DOS_DEVICE_PATH_RE = /^\\\\([.?])/; - var WINDOWS_BACKSLASHES_RE = /\\(?![!()+@[\]{}])/g; - function unixify(filepath) { - return filepath.replace(/\\/g, "/"); - } - exports2.unixify = unixify; - function makeAbsolute(cwd, filepath) { - return path11.resolve(cwd, filepath); - } - exports2.makeAbsolute = makeAbsolute; - function removeLeadingDotSegment(entry) { - if (entry.charAt(0) === ".") { - const secondCharactery = entry.charAt(1); - if (secondCharactery === "/" || secondCharactery === "\\") { - return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT); - } - } - return entry; - } - exports2.removeLeadingDotSegment = removeLeadingDotSegment; - exports2.escape = IS_WINDOWS_PLATFORM ? escapeWindowsPath : escapePosixPath; - function escapeWindowsPath(pattern) { - return pattern.replace(WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE, "\\$2"); - } - exports2.escapeWindowsPath = escapeWindowsPath; - function escapePosixPath(pattern) { - return pattern.replace(POSIX_UNESCAPED_GLOB_SYMBOLS_RE, "\\$2"); - } - exports2.escapePosixPath = escapePosixPath; - exports2.convertPathToPattern = IS_WINDOWS_PLATFORM - ? convertWindowsPathToPattern - : convertPosixPathToPattern; - function convertWindowsPathToPattern(filepath) { - return escapeWindowsPath(filepath) - .replace(DOS_DEVICE_PATH_RE, "//$1") - .replace(WINDOWS_BACKSLASHES_RE, "/"); - } - exports2.convertWindowsPathToPattern = convertWindowsPathToPattern; - function convertPosixPathToPattern(filepath) { - return escapePosixPath(filepath); - } - exports2.convertPosixPathToPattern = convertPosixPathToPattern; - } -}); - -// ../node_modules/is-extglob/index.js -var require_is_extglob = __commonJS({ - "../node_modules/is-extglob/index.js"(exports2, module2) { - module2.exports = function isExtglob(str) { - if (typeof str !== "string" || str === "") { - return false; - } - var match; - while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { - if (match[2]) return true; - str = str.slice(match.index + match[0].length); - } - return false; - }; - } -}); - -// ../node_modules/is-glob/index.js -var require_is_glob = __commonJS({ - "../node_modules/is-glob/index.js"(exports2, module2) { - var isExtglob = require_is_extglob(); - var chars = { "{": "}", "(": ")", "[": "]" }; - var strictCheck = function (str) { - if (str[0] === "!") { - return true; - } - var index = 0; - var pipeIndex = -2; - var closeSquareIndex = -2; - var closeCurlyIndex = -2; - var closeParenIndex = -2; - var backSlashIndex = -2; - while (index < str.length) { - if (str[index] === "*") { - return true; - } - if (str[index + 1] === "?" && /[\].+)]/.test(str[index])) { - return true; - } - if (closeSquareIndex !== -1 && str[index] === "[" && str[index + 1] !== "]") { - if (closeSquareIndex < index) { - closeSquareIndex = str.indexOf("]", index); - } - if (closeSquareIndex > index) { - if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { - return true; - } - backSlashIndex = str.indexOf("\\", index); - if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { - return true; - } - } - } - if (closeCurlyIndex !== -1 && str[index] === "{" && str[index + 1] !== "}") { - closeCurlyIndex = str.indexOf("}", index); - if (closeCurlyIndex > index) { - backSlashIndex = str.indexOf("\\", index); - if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) { - return true; - } - } - } - if ( - closeParenIndex !== -1 && - str[index] === "(" && - str[index + 1] === "?" && - /[:!=]/.test(str[index + 2]) && - str[index + 3] !== ")" - ) { - closeParenIndex = str.indexOf(")", index); - if (closeParenIndex > index) { - backSlashIndex = str.indexOf("\\", index); - if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { - return true; - } - } - } - if (pipeIndex !== -1 && str[index] === "(" && str[index + 1] !== "|") { - if (pipeIndex < index) { - pipeIndex = str.indexOf("|", index); - } - if (pipeIndex !== -1 && str[pipeIndex + 1] !== ")") { - closeParenIndex = str.indexOf(")", pipeIndex); - if (closeParenIndex > pipeIndex) { - backSlashIndex = str.indexOf("\\", pipeIndex); - if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { - return true; - } - } - } - } - if (str[index] === "\\") { - var open = str[index + 1]; - index += 2; - var close = chars[open]; - if (close) { - var n = str.indexOf(close, index); - if (n !== -1) { - index = n + 1; - } - } - if (str[index] === "!") { - return true; - } - } else { - index++; - } - } - return false; - }; - var relaxedCheck = function (str) { - if (str[0] === "!") { - return true; - } - var index = 0; - while (index < str.length) { - if (/[*?{}()[\]]/.test(str[index])) { - return true; - } - if (str[index] === "\\") { - var open = str[index + 1]; - index += 2; - var close = chars[open]; - if (close) { - var n = str.indexOf(close, index); - if (n !== -1) { - index = n + 1; - } - } - if (str[index] === "!") { - return true; - } - } else { - index++; - } - } - return false; - }; - module2.exports = function isGlob(str, options) { - if (typeof str !== "string" || str === "") { - return false; - } - if (isExtglob(str)) { - return true; - } - var check = strictCheck; - if (options && options.strict === false) { - check = relaxedCheck; - } - return check(str); - }; - } -}); - -// ../node_modules/fast-glob/node_modules/glob-parent/index.js -var require_glob_parent = __commonJS({ - "../node_modules/fast-glob/node_modules/glob-parent/index.js"(exports2, module2) { - "use strict"; - var isGlob = require_is_glob(); - var pathPosixDirname = require("path").posix.dirname; - var isWin32 = require("os").platform() === "win32"; - var slash = "/"; - var backslash = /\\/g; - var enclosure = /[\{\[].*[\}\]]$/; - var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; - var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; - module2.exports = function globParent(str, opts) { - var options = Object.assign({ flipBackslashes: true }, opts); - if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { - str = str.replace(backslash, slash); - } - if (enclosure.test(str)) { - str += slash; - } - str += "a"; - do { - str = pathPosixDirname(str); - } while (isGlob(str) || globby.test(str)); - return str.replace(escaped, "$1"); - }; - } -}); - -// ../node_modules/braces/lib/utils.js -var require_utils = __commonJS({ - "../node_modules/braces/lib/utils.js"(exports2) { - "use strict"; - exports2.isInteger = (num) => { - if (typeof num === "number") { - return Number.isInteger(num); - } - if (typeof num === "string" && num.trim() !== "") { - return Number.isInteger(Number(num)); - } - return false; - }; - exports2.find = (node, type) => node.nodes.find((node2) => node2.type === type); - exports2.exceedsLimit = (min, max, step = 1, limit) => { - if (limit === false) return false; - if (!exports2.isInteger(min) || !exports2.isInteger(max)) return false; - return (Number(max) - Number(min)) / Number(step) >= limit; - }; - exports2.escapeNode = (block, n = 0, type) => { - const node = block.nodes[n]; - if (!node) return; - if ((type && node.type === type) || node.type === "open" || node.type === "close") { - if (node.escaped !== true) { - node.value = "\\" + node.value; - node.escaped = true; - } - } - }; - exports2.encloseBrace = (node) => { - if (node.type !== "brace") return false; - if ((node.commas >> (0 + node.ranges)) >> 0 === 0) { - node.invalid = true; - return true; - } - return false; - }; - exports2.isInvalidBrace = (block) => { - if (block.type !== "brace") return false; - if (block.invalid === true || block.dollar) return true; - if ((block.commas >> (0 + block.ranges)) >> 0 === 0) { - block.invalid = true; - return true; - } - if (block.open !== true || block.close !== true) { - block.invalid = true; - return true; - } - return false; - }; - exports2.isOpenOrClose = (node) => { - if (node.type === "open" || node.type === "close") { - return true; - } - return node.open === true || node.close === true; - }; - exports2.reduce = (nodes) => - nodes.reduce((acc, node) => { - if (node.type === "text") acc.push(node.value); - if (node.type === "range") node.type = "text"; - return acc; - }, []); - exports2.flatten = (...args) => { - const result = []; - const flat = (arr) => { - for (let i = 0; i < arr.length; i++) { - const ele = arr[i]; - if (Array.isArray(ele)) { - flat(ele); - continue; - } - if (ele !== void 0) { - result.push(ele); - } - } - return result; - }; - flat(args); - return result; - }; - } -}); - -// ../node_modules/braces/lib/stringify.js -var require_stringify = __commonJS({ - "../node_modules/braces/lib/stringify.js"(exports2, module2) { - "use strict"; - var utils = require_utils(); - module2.exports = (ast, options = {}) => { - const stringify = (node, parent = {}) => { - const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); - const invalidNode = node.invalid === true && options.escapeInvalid === true; - let output = ""; - if (node.value) { - if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { - return "\\" + node.value; - } - return node.value; - } - if (node.value) { - return node.value; - } - if (node.nodes) { - for (const child of node.nodes) { - output += stringify(child); - } - } - return output; - }; - return stringify(ast); - }; - } -}); - -// ../node_modules/is-number/index.js -var require_is_number = __commonJS({ - "../node_modules/is-number/index.js"(exports2, module2) { - "use strict"; - module2.exports = function (num) { - if (typeof num === "number") { - return num - num === 0; - } - if (typeof num === "string" && num.trim() !== "") { - return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); - } - return false; - }; - } -}); - -// ../node_modules/to-regex-range/index.js -var require_to_regex_range = __commonJS({ - "../node_modules/to-regex-range/index.js"(exports2, module2) { - "use strict"; - var isNumber = require_is_number(); - var toRegexRange = (min, max, options) => { - if (isNumber(min) === false) { - throw new TypeError("toRegexRange: expected the first argument to be a number"); - } - if (max === void 0 || min === max) { - return String(min); - } - if (isNumber(max) === false) { - throw new TypeError("toRegexRange: expected the second argument to be a number."); - } - let opts = { relaxZeros: true, ...options }; - if (typeof opts.strictZeros === "boolean") { - opts.relaxZeros = opts.strictZeros === false; - } - let relax = String(opts.relaxZeros); - let shorthand = String(opts.shorthand); - let capture = String(opts.capture); - let wrap = String(opts.wrap); - let cacheKey = min + ":" + max + "=" + relax + shorthand + capture + wrap; - if (toRegexRange.cache.hasOwnProperty(cacheKey)) { - return toRegexRange.cache[cacheKey].result; - } - let a = Math.min(min, max); - let b = Math.max(min, max); - if (Math.abs(a - b) === 1) { - let result = min + "|" + max; - if (opts.capture) { - return `(${result})`; - } - if (opts.wrap === false) { - return result; - } - return `(?:${result})`; - } - let isPadded = hasPadding(min) || hasPadding(max); - let state = { min, max, a, b }; - let positives = []; - let negatives = []; - if (isPadded) { - state.isPadded = isPadded; - state.maxLen = String(state.max).length; - } - if (a < 0) { - let newMin = b < 0 ? Math.abs(b) : 1; - negatives = splitToPatterns(newMin, Math.abs(a), state, opts); - a = state.a = 0; - } - if (b >= 0) { - positives = splitToPatterns(a, b, state, opts); - } - state.negatives = negatives; - state.positives = positives; - state.result = collatePatterns(negatives, positives, opts); - if (opts.capture === true) { - state.result = `(${state.result})`; - } else if (opts.wrap !== false && positives.length + negatives.length > 1) { - state.result = `(?:${state.result})`; - } - toRegexRange.cache[cacheKey] = state; - return state.result; - }; - function collatePatterns(neg, pos, options) { - let onlyNegative = filterPatterns(neg, pos, "-", false, options) || []; - let onlyPositive = filterPatterns(pos, neg, "", false, options) || []; - let intersected = filterPatterns(neg, pos, "-?", true, options) || []; - let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); - return subpatterns.join("|"); - } - function splitToRanges(min, max) { - let nines = 1; - let zeros = 1; - let stop = countNines(min, nines); - let stops = /* @__PURE__ */ new Set([max]); - while (min <= stop && stop <= max) { - stops.add(stop); - nines += 1; - stop = countNines(min, nines); - } - stop = countZeros(max + 1, zeros) - 1; - while (min < stop && stop <= max) { - stops.add(stop); - zeros += 1; - stop = countZeros(max + 1, zeros) - 1; - } - stops = [...stops]; - stops.sort(compare); - return stops; - } - function rangeToPattern(start, stop, options) { - if (start === stop) { - return { pattern: start, count: [], digits: 0 }; - } - let zipped = zip(start, stop); - let digits = zipped.length; - let pattern = ""; - let count = 0; - for (let i = 0; i < digits; i++) { - let [startDigit, stopDigit] = zipped[i]; - if (startDigit === stopDigit) { - pattern += startDigit; - } else if (startDigit !== "0" || stopDigit !== "9") { - pattern += toCharacterClass(startDigit, stopDigit, options); - } else { - count++; - } - } - if (count) { - pattern += options.shorthand === true ? "\\d" : "[0-9]"; - } - return { pattern, count: [count], digits }; - } - function splitToPatterns(min, max, tok, options) { - let ranges = splitToRanges(min, max); - let tokens = []; - let start = min; - let prev; - for (let i = 0; i < ranges.length; i++) { - let max2 = ranges[i]; - let obj = rangeToPattern(String(start), String(max2), options); - let zeros = ""; - if (!tok.isPadded && prev && prev.pattern === obj.pattern) { - if (prev.count.length > 1) { - prev.count.pop(); - } - prev.count.push(obj.count[0]); - prev.string = prev.pattern + toQuantifier(prev.count); - start = max2 + 1; - continue; - } - if (tok.isPadded) { - zeros = padZeros(max2, tok, options); - } - obj.string = zeros + obj.pattern + toQuantifier(obj.count); - tokens.push(obj); - start = max2 + 1; - prev = obj; - } - return tokens; - } - function filterPatterns(arr, comparison, prefix, intersection, options) { - let result = []; - for (let ele of arr) { - let { string } = ele; - if (!intersection && !contains(comparison, "string", string)) { - result.push(prefix + string); - } - if (intersection && contains(comparison, "string", string)) { - result.push(prefix + string); - } - } - return result; - } - function zip(a, b) { - let arr = []; - for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]); - return arr; - } - function compare(a, b) { - return a > b ? 1 : b > a ? -1 : 0; - } - function contains(arr, key, val) { - return arr.some((ele) => ele[key] === val); - } - function countNines(min, len) { - return Number(String(min).slice(0, -len) + "9".repeat(len)); - } - function countZeros(integer, zeros) { - return integer - (integer % Math.pow(10, zeros)); - } - function toQuantifier(digits) { - let [start = 0, stop = ""] = digits; - if (stop || start > 1) { - return `{${start + (stop ? "," + stop : "")}}`; - } - return ""; - } - function toCharacterClass(a, b, options) { - return `[${a}${b - a === 1 ? "" : "-"}${b}]`; - } - function hasPadding(str) { - return /^-?(0+)\d/.test(str); - } - function padZeros(value, tok, options) { - if (!tok.isPadded) { - return value; - } - let diff = Math.abs(tok.maxLen - String(value).length); - let relax = options.relaxZeros !== false; - switch (diff) { - case 0: - return ""; - case 1: - return relax ? "0?" : "0"; - case 2: - return relax ? "0{0,2}" : "00"; - default: { - return relax ? `0{0,${diff}}` : `0{${diff}}`; - } - } - } - toRegexRange.cache = {}; - toRegexRange.clearCache = () => (toRegexRange.cache = {}); - module2.exports = toRegexRange; - } -}); - -// ../node_modules/fill-range/index.js -var require_fill_range = __commonJS({ - "../node_modules/fill-range/index.js"(exports2, module2) { - "use strict"; - var util = require("util"); - var toRegexRange = require_to_regex_range(); - var isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val); - var transform = (toNumber3) => { - return (value) => (toNumber3 === true ? Number(value) : String(value)); - }; - var isValidValue = (value) => { - return typeof value === "number" || (typeof value === "string" && value !== ""); - }; - var isNumber = (num) => Number.isInteger(+num); - var zeros = (input) => { - let value = `${input}`; - let index = -1; - if (value[0] === "-") value = value.slice(1); - if (value === "0") return false; - while (value[++index] === "0"); - return index > 0; - }; - var stringify = (start, end, options) => { - if (typeof start === "string" || typeof end === "string") { - return true; - } - return options.stringify === true; - }; - var pad = (input, maxLength, toNumber3) => { - if (maxLength > 0) { - let dash = input[0] === "-" ? "-" : ""; - if (dash) input = input.slice(1); - input = dash + input.padStart(dash ? maxLength - 1 : maxLength, "0"); - } - if (toNumber3 === false) { - return String(input); - } - return input; - }; - var toMaxLen = (input, maxLength) => { - let negative = input[0] === "-" ? "-" : ""; - if (negative) { - input = input.slice(1); - maxLength--; - } - while (input.length < maxLength) input = "0" + input; - return negative ? "-" + input : input; - }; - var toSequence = (parts, options, maxLen) => { - parts.negatives.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)); - parts.positives.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)); - let prefix = options.capture ? "" : "?:"; - let positives = ""; - let negatives = ""; - let result; - if (parts.positives.length) { - positives = parts.positives.map((v) => toMaxLen(String(v), maxLen)).join("|"); - } - if (parts.negatives.length) { - negatives = `-(${prefix}${parts.negatives.map((v) => toMaxLen(String(v), maxLen)).join("|")})`; - } - if (positives && negatives) { - result = `${positives}|${negatives}`; - } else { - result = positives || negatives; - } - if (options.wrap) { - return `(${prefix}${result})`; - } - return result; - }; - var toRange = (a, b, isNumbers, options) => { - if (isNumbers) { - return toRegexRange(a, b, { wrap: false, ...options }); - } - let start = String.fromCharCode(a); - if (a === b) return start; - let stop = String.fromCharCode(b); - return `[${start}-${stop}]`; - }; - var toRegex = (start, end, options) => { - if (Array.isArray(start)) { - let wrap = options.wrap === true; - let prefix = options.capture ? "" : "?:"; - return wrap ? `(${prefix}${start.join("|")})` : start.join("|"); - } - return toRegexRange(start, end, options); - }; - var rangeError = (...args) => { - return new RangeError("Invalid range arguments: " + util.inspect(...args)); - }; - var invalidRange = (start, end, options) => { - if (options.strictRanges === true) throw rangeError([start, end]); - return []; - }; - var invalidStep = (step, options) => { - if (options.strictRanges === true) { - throw new TypeError(`Expected step "${step}" to be a number`); - } - return []; - }; - var fillNumbers = (start, end, step = 1, options = {}) => { - let a = Number(start); - let b = Number(end); - if (!Number.isInteger(a) || !Number.isInteger(b)) { - if (options.strictRanges === true) throw rangeError([start, end]); - return []; - } - if (a === 0) a = 0; - if (b === 0) b = 0; - let descending = a > b; - let startString = String(start); - let endString = String(end); - let stepString = String(step); - step = Math.max(Math.abs(step), 1); - let padded = zeros(startString) || zeros(endString) || zeros(stepString); - let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; - let toNumber3 = padded === false && stringify(start, end, options) === false; - let format = options.transform || transform(toNumber3); - if (options.toRegex && step === 1) { - return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options); - } - let parts = { negatives: [], positives: [] }; - let push = (num) => parts[num < 0 ? "negatives" : "positives"].push(Math.abs(num)); - let range = []; - let index = 0; - while (descending ? a >= b : a <= b) { - if (options.toRegex === true && step > 1) { - push(a); - } else { - range.push(pad(format(a, index), maxLen, toNumber3)); - } - a = descending ? a - step : a + step; - index++; - } - if (options.toRegex === true) { - return step > 1 - ? toSequence(parts, options, maxLen) - : toRegex(range, null, { wrap: false, ...options }); - } - return range; - }; - var fillLetters = (start, end, step = 1, options = {}) => { - if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) { - return invalidRange(start, end, options); - } - let format = options.transform || ((val) => String.fromCharCode(val)); - let a = `${start}`.charCodeAt(0); - let b = `${end}`.charCodeAt(0); - let descending = a > b; - let min = Math.min(a, b); - let max = Math.max(a, b); - if (options.toRegex && step === 1) { - return toRange(min, max, false, options); - } - let range = []; - let index = 0; - while (descending ? a >= b : a <= b) { - range.push(format(a, index)); - a = descending ? a - step : a + step; - index++; - } - if (options.toRegex === true) { - return toRegex(range, null, { wrap: false, options }); - } - return range; - }; - var fill = (start, end, step, options = {}) => { - if (end == null && isValidValue(start)) { - return [start]; - } - if (!isValidValue(start) || !isValidValue(end)) { - return invalidRange(start, end, options); - } - if (typeof step === "function") { - return fill(start, end, 1, { transform: step }); - } - if (isObject(step)) { - return fill(start, end, 0, step); - } - let opts = { ...options }; - if (opts.capture === true) opts.wrap = true; - step = step || opts.step || 1; - if (!isNumber(step)) { - if (step != null && !isObject(step)) return invalidStep(step, opts); - return fill(start, end, 1, step); - } - if (isNumber(start) && isNumber(end)) { - return fillNumbers(start, end, step, opts); - } - return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); - }; - module2.exports = fill; - } -}); - -// ../node_modules/braces/lib/compile.js -var require_compile = __commonJS({ - "../node_modules/braces/lib/compile.js"(exports2, module2) { - "use strict"; - var fill = require_fill_range(); - var utils = require_utils(); - var compile = (ast, options = {}) => { - const walk = (node, parent = {}) => { - const invalidBlock = utils.isInvalidBrace(parent); - const invalidNode = node.invalid === true && options.escapeInvalid === true; - const invalid = invalidBlock === true || invalidNode === true; - const prefix = options.escapeInvalid === true ? "\\" : ""; - let output = ""; - if (node.isOpen === true) { - return prefix + node.value; - } - if (node.isClose === true) { - console.log("node.isClose", prefix, node.value); - return prefix + node.value; - } - if (node.type === "open") { - return invalid ? prefix + node.value : "("; - } - if (node.type === "close") { - return invalid ? prefix + node.value : ")"; - } - if (node.type === "comma") { - return node.prev.type === "comma" ? "" : invalid ? node.value : "|"; - } - if (node.value) { - return node.value; - } - if (node.nodes && node.ranges > 0) { - const args = utils.reduce(node.nodes); - const range = fill(...args, { - ...options, - wrap: false, - toRegex: true, - strictZeros: true - }); - if (range.length !== 0) { - return args.length > 1 && range.length > 1 ? `(${range})` : range; - } - } - if (node.nodes) { - for (const child of node.nodes) { - output += walk(child, node); - } - } - return output; - }; - return walk(ast); - }; - module2.exports = compile; - } -}); - -// ../node_modules/braces/lib/expand.js -var require_expand = __commonJS({ - "../node_modules/braces/lib/expand.js"(exports2, module2) { - "use strict"; - var fill = require_fill_range(); - var stringify = require_stringify(); - var utils = require_utils(); - var append3 = (queue = "", stash = "", enclose = false) => { - const result = []; - queue = [].concat(queue); - stash = [].concat(stash); - if (!stash.length) return queue; - if (!queue.length) { - return enclose ? utils.flatten(stash).map((ele) => `{${ele}}`) : stash; - } - for (const item of queue) { - if (Array.isArray(item)) { - for (const value of item) { - result.push(append3(value, stash, enclose)); - } - } else { - for (let ele of stash) { - if (enclose === true && typeof ele === "string") ele = `{${ele}}`; - result.push(Array.isArray(ele) ? append3(item, ele, enclose) : item + ele); - } - } - } - return utils.flatten(result); - }; - var expand2 = (ast, options = {}) => { - const rangeLimit = options.rangeLimit === void 0 ? 1e3 : options.rangeLimit; - const walk = (node, parent = {}) => { - node.queue = []; - let p = parent; - let q = parent.queue; - while (p.type !== "brace" && p.type !== "root" && p.parent) { - p = p.parent; - q = p.queue; - } - if (node.invalid || node.dollar) { - q.push(append3(q.pop(), stringify(node, options))); - return; - } - if (node.type === "brace" && node.invalid !== true && node.nodes.length === 2) { - q.push(append3(q.pop(), ["{}"])); - return; - } - if (node.nodes && node.ranges > 0) { - const args = utils.reduce(node.nodes); - if (utils.exceedsLimit(...args, options.step, rangeLimit)) { - throw new RangeError( - "expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit." - ); - } - let range = fill(...args, options); - if (range.length === 0) { - range = stringify(node, options); - } - q.push(append3(q.pop(), range)); - node.nodes = []; - return; - } - const enclose = utils.encloseBrace(node); - let queue = node.queue; - let block = node; - while (block.type !== "brace" && block.type !== "root" && block.parent) { - block = block.parent; - queue = block.queue; - } - for (let i = 0; i < node.nodes.length; i++) { - const child = node.nodes[i]; - if (child.type === "comma" && node.type === "brace") { - if (i === 1) queue.push(""); - queue.push(""); - continue; - } - if (child.type === "close") { - q.push(append3(q.pop(), queue, enclose)); - continue; - } - if (child.value && child.type !== "open") { - queue.push(append3(queue.pop(), child.value)); - continue; - } - if (child.nodes) { - walk(child, node); - } - } - return queue; - }; - return utils.flatten(walk(ast)); - }; - module2.exports = expand2; - } -}); - -// ../node_modules/braces/lib/constants.js -var require_constants = __commonJS({ - "../node_modules/braces/lib/constants.js"(exports2, module2) { - "use strict"; - module2.exports = { - MAX_LENGTH: 1e4, - // Digits - CHAR_0: "0", - /* 0 */ - CHAR_9: "9", - /* 9 */ - // Alphabet chars. - CHAR_UPPERCASE_A: "A", - /* A */ - CHAR_LOWERCASE_A: "a", - /* a */ - CHAR_UPPERCASE_Z: "Z", - /* Z */ - CHAR_LOWERCASE_Z: "z", - /* z */ - CHAR_LEFT_PARENTHESES: "(", - /* ( */ - CHAR_RIGHT_PARENTHESES: ")", - /* ) */ - CHAR_ASTERISK: "*", - /* * */ - // Non-alphabetic chars. - CHAR_AMPERSAND: "&", - /* & */ - CHAR_AT: "@", - /* @ */ - CHAR_BACKSLASH: "\\", - /* \ */ - CHAR_BACKTICK: "`", - /* ` */ - CHAR_CARRIAGE_RETURN: "\r", - /* \r */ - CHAR_CIRCUMFLEX_ACCENT: "^", - /* ^ */ - CHAR_COLON: ":", - /* : */ - CHAR_COMMA: ",", - /* , */ - CHAR_DOLLAR: "$", - /* . */ - CHAR_DOT: ".", - /* . */ - CHAR_DOUBLE_QUOTE: '"', - /* " */ - CHAR_EQUAL: "=", - /* = */ - CHAR_EXCLAMATION_MARK: "!", - /* ! */ - CHAR_FORM_FEED: "\f", - /* \f */ - CHAR_FORWARD_SLASH: "/", - /* / */ - CHAR_HASH: "#", - /* # */ - CHAR_HYPHEN_MINUS: "-", - /* - */ - CHAR_LEFT_ANGLE_BRACKET: "<", - /* < */ - CHAR_LEFT_CURLY_BRACE: "{", - /* { */ - CHAR_LEFT_SQUARE_BRACKET: "[", - /* [ */ - CHAR_LINE_FEED: "\n", - /* \n */ - CHAR_NO_BREAK_SPACE: "\xA0", - /* \u00A0 */ - CHAR_PERCENT: "%", - /* % */ - CHAR_PLUS: "+", - /* + */ - CHAR_QUESTION_MARK: "?", - /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: ">", - /* > */ - CHAR_RIGHT_CURLY_BRACE: "}", - /* } */ - CHAR_RIGHT_SQUARE_BRACKET: "]", - /* ] */ - CHAR_SEMICOLON: ";", - /* ; */ - CHAR_SINGLE_QUOTE: "'", - /* ' */ - CHAR_SPACE: " ", - /* */ - CHAR_TAB: " ", - /* \t */ - CHAR_UNDERSCORE: "_", - /* _ */ - CHAR_VERTICAL_LINE: "|", - /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: "\uFEFF" - /* \uFEFF */ - }; - } -}); - -// ../node_modules/braces/lib/parse.js -var require_parse = __commonJS({ - "../node_modules/braces/lib/parse.js"(exports2, module2) { - "use strict"; - var stringify = require_stringify(); - var { - MAX_LENGTH, - CHAR_BACKSLASH, - /* \ */ - CHAR_BACKTICK, - /* ` */ - CHAR_COMMA, - /* , */ - CHAR_DOT, - /* . */ - CHAR_LEFT_PARENTHESES, - /* ( */ - CHAR_RIGHT_PARENTHESES, - /* ) */ - CHAR_LEFT_CURLY_BRACE, - /* { */ - CHAR_RIGHT_CURLY_BRACE, - /* } */ - CHAR_LEFT_SQUARE_BRACKET, - /* [ */ - CHAR_RIGHT_SQUARE_BRACKET, - /* ] */ - CHAR_DOUBLE_QUOTE, - /* " */ - CHAR_SINGLE_QUOTE, - /* ' */ - CHAR_NO_BREAK_SPACE, - CHAR_ZERO_WIDTH_NOBREAK_SPACE - } = require_constants(); - var parse2 = (input, options = {}) => { - if (typeof input !== "string") { - throw new TypeError("Expected a string"); - } - const opts = options || {}; - const max = - typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - if (input.length > max) { - throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); - } - const ast = { type: "root", input, nodes: [] }; - const stack = [ast]; - let block = ast; - let prev = ast; - let brackets = 0; - const length = input.length; - let index = 0; - let depth = 0; - let value; - const advance = () => input[index++]; - const push = (node) => { - if (node.type === "text" && prev.type === "dot") { - prev.type = "text"; - } - if (prev && prev.type === "text" && node.type === "text") { - prev.value += node.value; - return; - } - block.nodes.push(node); - node.parent = block; - node.prev = prev; - prev = node; - return node; - }; - push({ type: "bos" }); - while (index < length) { - block = stack[stack.length - 1]; - value = advance(); - if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { - continue; - } - if (value === CHAR_BACKSLASH) { - push({ type: "text", value: (options.keepEscaping ? value : "") + advance() }); - continue; - } - if (value === CHAR_RIGHT_SQUARE_BRACKET) { - push({ type: "text", value: "\\" + value }); - continue; - } - if (value === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - let next; - while (index < length && (next = advance())) { - value += next; - if (next === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - continue; - } - if (next === CHAR_BACKSLASH) { - value += advance(); - continue; - } - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - brackets--; - if (brackets === 0) { - break; - } - } - } - push({ type: "text", value }); - continue; - } - if (value === CHAR_LEFT_PARENTHESES) { - block = push({ type: "paren", nodes: [] }); - stack.push(block); - push({ type: "text", value }); - continue; - } - if (value === CHAR_RIGHT_PARENTHESES) { - if (block.type !== "paren") { - push({ type: "text", value }); - continue; - } - block = stack.pop(); - push({ type: "text", value }); - block = stack[stack.length - 1]; - continue; - } - if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { - const open = value; - let next; - if (options.keepQuotes !== true) { - value = ""; - } - while (index < length && (next = advance())) { - if (next === CHAR_BACKSLASH) { - value += next + advance(); - continue; - } - if (next === open) { - if (options.keepQuotes === true) value += next; - break; - } - value += next; - } - push({ type: "text", value }); - continue; - } - if (value === CHAR_LEFT_CURLY_BRACE) { - depth++; - const dollar = (prev.value && prev.value.slice(-1) === "$") || block.dollar === true; - const brace = { - type: "brace", - open: true, - close: false, - dollar, - depth, - commas: 0, - ranges: 0, - nodes: [] - }; - block = push(brace); - stack.push(block); - push({ type: "open", value }); - continue; - } - if (value === CHAR_RIGHT_CURLY_BRACE) { - if (block.type !== "brace") { - push({ type: "text", value }); - continue; - } - const type = "close"; - block = stack.pop(); - block.close = true; - push({ type, value }); - depth--; - block = stack[stack.length - 1]; - continue; - } - if (value === CHAR_COMMA && depth > 0) { - if (block.ranges > 0) { - block.ranges = 0; - const open = block.nodes.shift(); - block.nodes = [open, { type: "text", value: stringify(block) }]; - } - push({ type: "comma", value }); - block.commas++; - continue; - } - if (value === CHAR_DOT && depth > 0 && block.commas === 0) { - const siblings = block.nodes; - if (depth === 0 || siblings.length === 0) { - push({ type: "text", value }); - continue; - } - if (prev.type === "dot") { - block.range = []; - prev.value += value; - prev.type = "range"; - if (block.nodes.length !== 3 && block.nodes.length !== 5) { - block.invalid = true; - block.ranges = 0; - prev.type = "text"; - continue; - } - block.ranges++; - block.args = []; - continue; - } - if (prev.type === "range") { - siblings.pop(); - const before = siblings[siblings.length - 1]; - before.value += prev.value + value; - prev = before; - block.ranges--; - continue; - } - push({ type: "dot", value }); - continue; - } - push({ type: "text", value }); - } - do { - block = stack.pop(); - if (block.type !== "root") { - block.nodes.forEach((node) => { - if (!node.nodes) { - if (node.type === "open") node.isOpen = true; - if (node.type === "close") node.isClose = true; - if (!node.nodes) node.type = "text"; - node.invalid = true; - } - }); - const parent = stack[stack.length - 1]; - const index2 = parent.nodes.indexOf(block); - parent.nodes.splice(index2, 1, ...block.nodes); - } - } while (stack.length > 0); - push({ type: "eos" }); - return ast; - }; - module2.exports = parse2; - } -}); - -// ../node_modules/braces/index.js -var require_braces = __commonJS({ - "../node_modules/braces/index.js"(exports2, module2) { - "use strict"; - var stringify = require_stringify(); - var compile = require_compile(); - var expand2 = require_expand(); - var parse2 = require_parse(); - var braces = (input, options = {}) => { - let output = []; - if (Array.isArray(input)) { - for (const pattern of input) { - const result = braces.create(pattern, options); - if (Array.isArray(result)) { - output.push(...result); - } else { - output.push(result); - } - } - } else { - output = [].concat(braces.create(input, options)); - } - if (options && options.expand === true && options.nodupes === true) { - output = [...new Set(output)]; - } - return output; - }; - braces.parse = (input, options = {}) => parse2(input, options); - braces.stringify = (input, options = {}) => { - if (typeof input === "string") { - return stringify(braces.parse(input, options), options); - } - return stringify(input, options); - }; - braces.compile = (input, options = {}) => { - if (typeof input === "string") { - input = braces.parse(input, options); - } - return compile(input, options); - }; - braces.expand = (input, options = {}) => { - if (typeof input === "string") { - input = braces.parse(input, options); - } - let result = expand2(input, options); - if (options.noempty === true) { - result = result.filter(Boolean); - } - if (options.nodupes === true) { - result = [...new Set(result)]; - } - return result; - }; - braces.create = (input, options = {}) => { - if (input === "" || input.length < 3) { - return [input]; - } - return options.expand !== true - ? braces.compile(input, options) - : braces.expand(input, options); - }; - module2.exports = braces; - } -}); - -// ../node_modules/picomatch/lib/constants.js -var require_constants2 = __commonJS({ - "../node_modules/picomatch/lib/constants.js"(exports2, module2) { - "use strict"; - var path11 = require("path"); - var WIN_SLASH = "\\\\/"; - var WIN_NO_SLASH = `[^${WIN_SLASH}]`; - var DOT_LITERAL = "\\."; - var PLUS_LITERAL = "\\+"; - var QMARK_LITERAL = "\\?"; - var SLASH_LITERAL = "\\/"; - var ONE_CHAR = "(?=.)"; - var QMARK = "[^/]"; - var END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; - var START_ANCHOR = `(?:^|${SLASH_LITERAL})`; - var DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; - var NO_DOT = `(?!${DOT_LITERAL})`; - var NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; - var NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; - var NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; - var QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; - var STAR = `${QMARK}*?`; - var POSIX_CHARS = { - DOT_LITERAL, - PLUS_LITERAL, - QMARK_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - QMARK, - END_ANCHOR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK_NO_DOT, - STAR, - START_ANCHOR - }; - var WINDOWS_CHARS = { - ...POSIX_CHARS, - SLASH_LITERAL: `[${WIN_SLASH}]`, - QMARK: WIN_NO_SLASH, - STAR: `${WIN_NO_SLASH}*?`, - DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, - NO_DOT: `(?!${DOT_LITERAL})`, - NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, - NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - QMARK_NO_DOT: `[^.${WIN_SLASH}]`, - START_ANCHOR: `(?:^|[${WIN_SLASH}])`, - END_ANCHOR: `(?:[${WIN_SLASH}]|$)` - }; - var POSIX_REGEX_SOURCE = { - alnum: "a-zA-Z0-9", - alpha: "a-zA-Z", - ascii: "\\x00-\\x7F", - blank: " \\t", - cntrl: "\\x00-\\x1F\\x7F", - digit: "0-9", - graph: "\\x21-\\x7E", - lower: "a-z", - print: "\\x20-\\x7E ", - punct: "\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~", - space: " \\t\\r\\n\\v\\f", - upper: "A-Z", - word: "A-Za-z0-9_", - xdigit: "A-Fa-f0-9" - }; - module2.exports = { - MAX_LENGTH: 1024 * 64, - POSIX_REGEX_SOURCE, - // regular expressions - REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, - REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, - REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, - REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, - REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, - REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, - // Replace globs with equivalent patterns to reduce parsing time. - REPLACEMENTS: { - "***": "*", - "**/**": "**", - "**/**/**": "**" - }, - // Digits - CHAR_0: 48, - /* 0 */ - CHAR_9: 57, - /* 9 */ - // Alphabet chars. - CHAR_UPPERCASE_A: 65, - /* A */ - CHAR_LOWERCASE_A: 97, - /* a */ - CHAR_UPPERCASE_Z: 90, - /* Z */ - CHAR_LOWERCASE_Z: 122, - /* z */ - CHAR_LEFT_PARENTHESES: 40, - /* ( */ - CHAR_RIGHT_PARENTHESES: 41, - /* ) */ - CHAR_ASTERISK: 42, - /* * */ - // Non-alphabetic chars. - CHAR_AMPERSAND: 38, - /* & */ - CHAR_AT: 64, - /* @ */ - CHAR_BACKWARD_SLASH: 92, - /* \ */ - CHAR_CARRIAGE_RETURN: 13, - /* \r */ - CHAR_CIRCUMFLEX_ACCENT: 94, - /* ^ */ - CHAR_COLON: 58, - /* : */ - CHAR_COMMA: 44, - /* , */ - CHAR_DOT: 46, - /* . */ - CHAR_DOUBLE_QUOTE: 34, - /* " */ - CHAR_EQUAL: 61, - /* = */ - CHAR_EXCLAMATION_MARK: 33, - /* ! */ - CHAR_FORM_FEED: 12, - /* \f */ - CHAR_FORWARD_SLASH: 47, - /* / */ - CHAR_GRAVE_ACCENT: 96, - /* ` */ - CHAR_HASH: 35, - /* # */ - CHAR_HYPHEN_MINUS: 45, - /* - */ - CHAR_LEFT_ANGLE_BRACKET: 60, - /* < */ - CHAR_LEFT_CURLY_BRACE: 123, - /* { */ - CHAR_LEFT_SQUARE_BRACKET: 91, - /* [ */ - CHAR_LINE_FEED: 10, - /* \n */ - CHAR_NO_BREAK_SPACE: 160, - /* \u00A0 */ - CHAR_PERCENT: 37, - /* % */ - CHAR_PLUS: 43, - /* + */ - CHAR_QUESTION_MARK: 63, - /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: 62, - /* > */ - CHAR_RIGHT_CURLY_BRACE: 125, - /* } */ - CHAR_RIGHT_SQUARE_BRACKET: 93, - /* ] */ - CHAR_SEMICOLON: 59, - /* ; */ - CHAR_SINGLE_QUOTE: 39, - /* ' */ - CHAR_SPACE: 32, - /* */ - CHAR_TAB: 9, - /* \t */ - CHAR_UNDERSCORE: 95, - /* _ */ - CHAR_VERTICAL_LINE: 124, - /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, - /* \uFEFF */ - SEP: path11.sep, - /** - * Create EXTGLOB_CHARS - */ - extglobChars(chars) { - return { - "!": { type: "negate", open: "(?:(?!(?:", close: `))${chars.STAR})` }, - "?": { type: "qmark", open: "(?:", close: ")?" }, - "+": { type: "plus", open: "(?:", close: ")+" }, - "*": { type: "star", open: "(?:", close: ")*" }, - "@": { type: "at", open: "(?:", close: ")" } - }; - }, - /** - * Create GLOB_CHARS - */ - globChars(win32) { - return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; - } - }; - } -}); - -// ../node_modules/picomatch/lib/utils.js -var require_utils2 = __commonJS({ - "../node_modules/picomatch/lib/utils.js"(exports2) { - "use strict"; - var path11 = require("path"); - var win32 = process.platform === "win32"; - var { - REGEX_BACKSLASH, - REGEX_REMOVE_BACKSLASH, - REGEX_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_GLOBAL - } = require_constants2(); - exports2.isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val); - exports2.hasRegexChars = (str) => REGEX_SPECIAL_CHARS.test(str); - exports2.isRegexChar = (str) => str.length === 1 && exports2.hasRegexChars(str); - exports2.escapeRegex = (str) => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, "\\$1"); - exports2.toPosixSlashes = (str) => str.replace(REGEX_BACKSLASH, "/"); - exports2.removeBackslashes = (str) => { - return str.replace(REGEX_REMOVE_BACKSLASH, (match) => { - return match === "\\" ? "" : match; - }); - }; - exports2.supportsLookbehinds = () => { - const segs = process.version.slice(1).split(".").map(Number); - if ((segs.length === 3 && segs[0] >= 9) || (segs[0] === 8 && segs[1] >= 10)) { - return true; - } - return false; - }; - exports2.isWindows = (options) => { - if (options && typeof options.windows === "boolean") { - return options.windows; - } - return win32 === true || path11.sep === "\\"; - }; - exports2.escapeLast = (input, char, lastIdx) => { - const idx = input.lastIndexOf(char, lastIdx); - if (idx === -1) return input; - if (input[idx - 1] === "\\") return exports2.escapeLast(input, char, idx - 1); - return `${input.slice(0, idx)}\\${input.slice(idx)}`; - }; - exports2.removePrefix = (input, state = {}) => { - let output = input; - if (output.startsWith("./")) { - output = output.slice(2); - state.prefix = "./"; - } - return output; - }; - exports2.wrapOutput = (input, state = {}, options = {}) => { - const prepend = options.contains ? "" : "^"; - const append3 = options.contains ? "" : "$"; - let output = `${prepend}(?:${input})${append3}`; - if (state.negated === true) { - output = `(?:^(?!${output}).*$)`; - } - return output; - }; - } -}); - -// ../node_modules/picomatch/lib/scan.js -var require_scan = __commonJS({ - "../node_modules/picomatch/lib/scan.js"(exports2, module2) { - "use strict"; - var utils = require_utils2(); - var { - CHAR_ASTERISK, - /* * */ - CHAR_AT, - /* @ */ - CHAR_BACKWARD_SLASH, - /* \ */ - CHAR_COMMA, - /* , */ - CHAR_DOT, - /* . */ - CHAR_EXCLAMATION_MARK, - /* ! */ - CHAR_FORWARD_SLASH, - /* / */ - CHAR_LEFT_CURLY_BRACE, - /* { */ - CHAR_LEFT_PARENTHESES, - /* ( */ - CHAR_LEFT_SQUARE_BRACKET, - /* [ */ - CHAR_PLUS, - /* + */ - CHAR_QUESTION_MARK, - /* ? */ - CHAR_RIGHT_CURLY_BRACE, - /* } */ - CHAR_RIGHT_PARENTHESES, - /* ) */ - CHAR_RIGHT_SQUARE_BRACKET - /* ] */ - } = require_constants2(); - var isPathSeparator = (code) => { - return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; - }; - var depth = (token) => { - if (token.isPrefix !== true) { - token.depth = token.isGlobstar ? Infinity : 1; - } - }; - var scan = (input, options) => { - const opts = options || {}; - const length = input.length - 1; - const scanToEnd = opts.parts === true || opts.scanToEnd === true; - const slashes = []; - const tokens = []; - const parts = []; - let str = input; - let index = -1; - let start = 0; - let lastIndex = 0; - let isBrace = false; - let isBracket = false; - let isGlob = false; - let isExtglob = false; - let isGlobstar = false; - let braceEscaped = false; - let backslashes = false; - let negated = false; - let negatedExtglob = false; - let finished = false; - let braces = 0; - let prev; - let code; - let token = { value: "", depth: 0, isGlob: false }; - const eos = () => index >= length; - const peek = () => str.charCodeAt(index + 1); - const advance = () => { - prev = code; - return str.charCodeAt(++index); - }; - while (index < length) { - code = advance(); - let next; - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); - if (code === CHAR_LEFT_CURLY_BRACE) { - braceEscaped = true; - } - continue; - } - if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { - braces++; - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } - if (code === CHAR_LEFT_CURLY_BRACE) { - braces++; - continue; - } - if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; - if (scanToEnd === true) { - continue; - } - break; - } - if (braceEscaped !== true && code === CHAR_COMMA) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; - if (scanToEnd === true) { - continue; - } - break; - } - if (code === CHAR_RIGHT_CURLY_BRACE) { - braces--; - if (braces === 0) { - braceEscaped = false; - isBrace = token.isBrace = true; - finished = true; - break; - } - } - } - if (scanToEnd === true) { - continue; - } - break; - } - if (code === CHAR_FORWARD_SLASH) { - slashes.push(index); - tokens.push(token); - token = { value: "", depth: 0, isGlob: false }; - if (finished === true) continue; - if (prev === CHAR_DOT && index === start + 1) { - start += 2; - continue; - } - lastIndex = index + 1; - continue; - } - if (opts.noext !== true) { - const isExtglobChar = - code === CHAR_PLUS || - code === CHAR_AT || - code === CHAR_ASTERISK || - code === CHAR_QUESTION_MARK || - code === CHAR_EXCLAMATION_MARK; - if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; - isExtglob = token.isExtglob = true; - finished = true; - if (code === CHAR_EXCLAMATION_MARK && index === start) { - negatedExtglob = true; - } - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - if (code === CHAR_RIGHT_PARENTHESES) { - isGlob = token.isGlob = true; - finished = true; - break; - } - } - continue; - } - break; - } - } - if (code === CHAR_ASTERISK) { - if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true; - isGlob = token.isGlob = true; - finished = true; - if (scanToEnd === true) { - continue; - } - break; - } - if (code === CHAR_QUESTION_MARK) { - isGlob = token.isGlob = true; - finished = true; - if (scanToEnd === true) { - continue; - } - break; - } - if (code === CHAR_LEFT_SQUARE_BRACKET) { - while (eos() !== true && (next = advance())) { - if (next === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - isBracket = token.isBracket = true; - isGlob = token.isGlob = true; - finished = true; - break; - } - } - if (scanToEnd === true) { - continue; - } - break; - } - if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { - negated = token.negated = true; - start++; - continue; - } - if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_LEFT_PARENTHESES) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - if (code === CHAR_RIGHT_PARENTHESES) { - finished = true; - break; - } - } - continue; - } - break; - } - if (isGlob === true) { - finished = true; - if (scanToEnd === true) { - continue; - } - break; - } - } - if (opts.noext === true) { - isExtglob = false; - isGlob = false; - } - let base = str; - let prefix = ""; - let glob = ""; - if (start > 0) { - prefix = str.slice(0, start); - str = str.slice(start); - lastIndex -= start; - } - if (base && isGlob === true && lastIndex > 0) { - base = str.slice(0, lastIndex); - glob = str.slice(lastIndex); - } else if (isGlob === true) { - base = ""; - glob = str; - } else { - base = str; - } - if (base && base !== "" && base !== "/" && base !== str) { - if (isPathSeparator(base.charCodeAt(base.length - 1))) { - base = base.slice(0, -1); - } - } - if (opts.unescape === true) { - if (glob) glob = utils.removeBackslashes(glob); - if (base && backslashes === true) { - base = utils.removeBackslashes(base); - } - } - const state = { - prefix, - input, - start, - base, - glob, - isBrace, - isBracket, - isGlob, - isExtglob, - isGlobstar, - negated, - negatedExtglob - }; - if (opts.tokens === true) { - state.maxDepth = 0; - if (!isPathSeparator(code)) { - tokens.push(token); - } - state.tokens = tokens; - } - if (opts.parts === true || opts.tokens === true) { - let prevIndex; - for (let idx = 0; idx < slashes.length; idx++) { - const n = prevIndex ? prevIndex + 1 : start; - const i = slashes[idx]; - const value = input.slice(n, i); - if (opts.tokens) { - if (idx === 0 && start !== 0) { - tokens[idx].isPrefix = true; - tokens[idx].value = prefix; - } else { - tokens[idx].value = value; - } - depth(tokens[idx]); - state.maxDepth += tokens[idx].depth; - } - if (idx !== 0 || value !== "") { - parts.push(value); - } - prevIndex = i; - } - if (prevIndex && prevIndex + 1 < input.length) { - const value = input.slice(prevIndex + 1); - parts.push(value); - if (opts.tokens) { - tokens[tokens.length - 1].value = value; - depth(tokens[tokens.length - 1]); - state.maxDepth += tokens[tokens.length - 1].depth; - } - } - state.slashes = slashes; - state.parts = parts; - } - return state; - }; - module2.exports = scan; - } -}); - -// ../node_modules/picomatch/lib/parse.js -var require_parse2 = __commonJS({ - "../node_modules/picomatch/lib/parse.js"(exports2, module2) { - "use strict"; - var constants = require_constants2(); - var utils = require_utils2(); - var { - MAX_LENGTH, - POSIX_REGEX_SOURCE, - REGEX_NON_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_BACKREF, - REPLACEMENTS - } = constants; - var expandRange = (args, options) => { - if (typeof options.expandRange === "function") { - return options.expandRange(...args, options); - } - args.sort(); - const value = `[${args.join("-")}]`; - try { - new RegExp(value); - } catch (ex) { - return args.map((v) => utils.escapeRegex(v)).join(".."); - } - return value; - }; - var syntaxError = (type, char) => { - return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; - }; - var parse2 = (input, options) => { - if (typeof input !== "string") { - throw new TypeError("Expected a string"); - } - input = REPLACEMENTS[input] || input; - const opts = { ...options }; - const max = - typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - let len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } - const bos = { type: "bos", value: "", output: opts.prepend || "" }; - const tokens = [bos]; - const capture = opts.capture ? "" : "?:"; - const win32 = utils.isWindows(options); - const PLATFORM_CHARS = constants.globChars(win32); - const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); - const { - DOT_LITERAL, - PLUS_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK, - QMARK_NO_DOT, - STAR, - START_ANCHOR - } = PLATFORM_CHARS; - const globstar = (opts2) => { - return `(${capture}(?:(?!${START_ANCHOR}${opts2.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; - const nodot = opts.dot ? "" : NO_DOT; - const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; - let star = opts.bash === true ? globstar(opts) : STAR; - if (opts.capture) { - star = `(${star})`; - } - if (typeof opts.noext === "boolean") { - opts.noextglob = opts.noext; - } - const state = { - input, - index: -1, - start: 0, - dot: opts.dot === true, - consumed: "", - output: "", - prefix: "", - backtrack: false, - negated: false, - brackets: 0, - braces: 0, - parens: 0, - quotes: 0, - globstar: false, - tokens - }; - input = utils.removePrefix(input, state); - len = input.length; - const extglobs = []; - const braces = []; - const stack = []; - let prev = bos; - let value; - const eos = () => state.index === len - 1; - const peek = (state.peek = (n = 1) => input[state.index + n]); - const advance = (state.advance = () => input[++state.index] || ""); - const remaining = () => input.slice(state.index + 1); - const consume = (value2 = "", num = 0) => { - state.consumed += value2; - state.index += num; - }; - const append3 = (token) => { - state.output += token.output != null ? token.output : token.value; - consume(token.value); - }; - const negate = () => { - let count = 1; - while (peek() === "!" && (peek(2) !== "(" || peek(3) === "?")) { - advance(); - state.start++; - count++; - } - if (count % 2 === 0) { - return false; - } - state.negated = true; - state.start++; - return true; - }; - const increment = (type) => { - state[type]++; - stack.push(type); - }; - const decrement = (type) => { - state[type]--; - stack.pop(); - }; - const push = (tok) => { - if (prev.type === "globstar") { - const isBrace = state.braces > 0 && (tok.type === "comma" || tok.type === "brace"); - const isExtglob = - tok.extglob === true || - (extglobs.length && (tok.type === "pipe" || tok.type === "paren")); - if (tok.type !== "slash" && tok.type !== "paren" && !isBrace && !isExtglob) { - state.output = state.output.slice(0, -prev.output.length); - prev.type = "star"; - prev.value = "*"; - prev.output = star; - state.output += prev.output; - } - } - if (extglobs.length && tok.type !== "paren") { - extglobs[extglobs.length - 1].inner += tok.value; - } - if (tok.value || tok.output) append3(tok); - if (prev && prev.type === "text" && tok.type === "text") { - prev.value += tok.value; - prev.output = (prev.output || "") + tok.value; - return; - } - tok.prev = prev; - tokens.push(tok); - prev = tok; - }; - const extglobOpen = (type, value2) => { - const token = { ...EXTGLOB_CHARS[value2], conditions: 1, inner: "" }; - token.prev = prev; - token.parens = state.parens; - token.output = state.output; - const output = (opts.capture ? "(" : "") + token.open; - increment("parens"); - push({ type, value: value2, output: state.output ? "" : ONE_CHAR }); - push({ type: "paren", extglob: true, value: advance(), output }); - extglobs.push(token); - }; - const extglobClose = (token) => { - let output = token.close + (opts.capture ? ")" : ""); - let rest; - if (token.type === "negate") { - let extglobStar = star; - if (token.inner && token.inner.length > 1 && token.inner.includes("/")) { - extglobStar = globstar(opts); - } - if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { - output = token.close = `)$))${extglobStar}`; - } - if (token.inner.includes("*") && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) { - const expression = parse2(rest, { ...options, fastpaths: false }).output; - output = token.close = `)${expression})${extglobStar})`; - } - if (token.prev.type === "bos") { - state.negatedExtglob = true; - } - } - push({ type: "paren", extglob: true, value, output }); - decrement("parens"); - }; - if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { - let backslashes = false; - let output = input.replace( - REGEX_SPECIAL_CHARS_BACKREF, - (m, esc, chars, first3, rest, index) => { - if (first3 === "\\") { - backslashes = true; - return m; - } - if (first3 === "?") { - if (esc) { - return esc + first3 + (rest ? QMARK.repeat(rest.length) : ""); - } - if (index === 0) { - return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ""); - } - return QMARK.repeat(chars.length); - } - if (first3 === ".") { - return DOT_LITERAL.repeat(chars.length); - } - if (first3 === "*") { - if (esc) { - return esc + first3 + (rest ? star : ""); - } - return star; - } - return esc ? m : `\\${m}`; - } - ); - if (backslashes === true) { - if (opts.unescape === true) { - output = output.replace(/\\/g, ""); - } else { - output = output.replace(/\\+/g, (m) => { - return m.length % 2 === 0 ? "\\\\" : m ? "\\" : ""; - }); - } - } - if (output === input && opts.contains === true) { - state.output = input; - return state; - } - state.output = utils.wrapOutput(output, state, options); - return state; - } - while (!eos()) { - value = advance(); - if (value === "\0") { - continue; - } - if (value === "\\") { - const next = peek(); - if (next === "/" && opts.bash !== true) { - continue; - } - if (next === "." || next === ";") { - continue; - } - if (!next) { - value += "\\"; - push({ type: "text", value }); - continue; - } - const match = /^\\+/.exec(remaining()); - let slashes = 0; - if (match && match[0].length > 2) { - slashes = match[0].length; - state.index += slashes; - if (slashes % 2 !== 0) { - value += "\\"; - } - } - if (opts.unescape === true) { - value = advance(); - } else { - value += advance(); - } - if (state.brackets === 0) { - push({ type: "text", value }); - continue; - } - } - if (state.brackets > 0 && (value !== "]" || prev.value === "[" || prev.value === "[^")) { - if (opts.posix !== false && value === ":") { - const inner = prev.value.slice(1); - if (inner.includes("[")) { - prev.posix = true; - if (inner.includes(":")) { - const idx = prev.value.lastIndexOf("["); - const pre = prev.value.slice(0, idx); - const rest2 = prev.value.slice(idx + 2); - const posix = POSIX_REGEX_SOURCE[rest2]; - if (posix) { - prev.value = pre + posix; - state.backtrack = true; - advance(); - if (!bos.output && tokens.indexOf(prev) === 1) { - bos.output = ONE_CHAR; - } - continue; - } - } - } - } - if ((value === "[" && peek() !== ":") || (value === "-" && peek() === "]")) { - value = `\\${value}`; - } - if (value === "]" && (prev.value === "[" || prev.value === "[^")) { - value = `\\${value}`; - } - if (opts.posix === true && value === "!" && prev.value === "[") { - value = "^"; - } - prev.value += value; - append3({ value }); - continue; - } - if (state.quotes === 1 && value !== '"') { - value = utils.escapeRegex(value); - prev.value += value; - append3({ value }); - continue; - } - if (value === '"') { - state.quotes = state.quotes === 1 ? 0 : 1; - if (opts.keepQuotes === true) { - push({ type: "text", value }); - } - continue; - } - if (value === "(") { - increment("parens"); - push({ type: "paren", value }); - continue; - } - if (value === ")") { - if (state.parens === 0 && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError("opening", "(")); - } - const extglob = extglobs[extglobs.length - 1]; - if (extglob && state.parens === extglob.parens + 1) { - extglobClose(extglobs.pop()); - continue; - } - push({ type: "paren", value, output: state.parens ? ")" : "\\)" }); - decrement("parens"); - continue; - } - if (value === "[") { - if (opts.nobracket === true || !remaining().includes("]")) { - if (opts.nobracket !== true && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError("closing", "]")); - } - value = `\\${value}`; - } else { - increment("brackets"); - } - push({ type: "bracket", value }); - continue; - } - if (value === "]") { - if ( - opts.nobracket === true || - (prev && prev.type === "bracket" && prev.value.length === 1) - ) { - push({ type: "text", value, output: `\\${value}` }); - continue; - } - if (state.brackets === 0) { - if (opts.strictBrackets === true) { - throw new SyntaxError(syntaxError("opening", "[")); - } - push({ type: "text", value, output: `\\${value}` }); - continue; - } - decrement("brackets"); - const prevValue = prev.value.slice(1); - if (prev.posix !== true && prevValue[0] === "^" && !prevValue.includes("/")) { - value = `/${value}`; - } - prev.value += value; - append3({ value }); - if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { - continue; - } - const escaped = utils.escapeRegex(prev.value); - state.output = state.output.slice(0, -prev.value.length); - if (opts.literalBrackets === true) { - state.output += escaped; - prev.value = escaped; - continue; - } - prev.value = `(${capture}${escaped}|${prev.value})`; - state.output += prev.value; - continue; - } - if (value === "{" && opts.nobrace !== true) { - increment("braces"); - const open = { - type: "brace", - value, - output: "(", - outputIndex: state.output.length, - tokensIndex: state.tokens.length - }; - braces.push(open); - push(open); - continue; - } - if (value === "}") { - const brace = braces[braces.length - 1]; - if (opts.nobrace === true || !brace) { - push({ type: "text", value, output: value }); - continue; - } - let output = ")"; - if (brace.dots === true) { - const arr = tokens.slice(); - const range = []; - for (let i = arr.length - 1; i >= 0; i--) { - tokens.pop(); - if (arr[i].type === "brace") { - break; - } - if (arr[i].type !== "dots") { - range.unshift(arr[i].value); - } - } - output = expandRange(range, opts); - state.backtrack = true; - } - if (brace.comma !== true && brace.dots !== true) { - const out = state.output.slice(0, brace.outputIndex); - const toks = state.tokens.slice(brace.tokensIndex); - brace.value = brace.output = "\\{"; - value = output = "\\}"; - state.output = out; - for (const t of toks) { - state.output += t.output || t.value; - } - } - push({ type: "brace", value, output }); - decrement("braces"); - braces.pop(); - continue; - } - if (value === "|") { - if (extglobs.length > 0) { - extglobs[extglobs.length - 1].conditions++; - } - push({ type: "text", value }); - continue; - } - if (value === ",") { - let output = value; - const brace = braces[braces.length - 1]; - if (brace && stack[stack.length - 1] === "braces") { - brace.comma = true; - output = "|"; - } - push({ type: "comma", value, output }); - continue; - } - if (value === "/") { - if (prev.type === "dot" && state.index === state.start + 1) { - state.start = state.index + 1; - state.consumed = ""; - state.output = ""; - tokens.pop(); - prev = bos; - continue; - } - push({ type: "slash", value, output: SLASH_LITERAL }); - continue; - } - if (value === ".") { - if (state.braces > 0 && prev.type === "dot") { - if (prev.value === ".") prev.output = DOT_LITERAL; - const brace = braces[braces.length - 1]; - prev.type = "dots"; - prev.output += value; - prev.value += value; - brace.dots = true; - continue; - } - if (state.braces + state.parens === 0 && prev.type !== "bos" && prev.type !== "slash") { - push({ type: "text", value, output: DOT_LITERAL }); - continue; - } - push({ type: "dot", value, output: DOT_LITERAL }); - continue; - } - if (value === "?") { - const isGroup = prev && prev.value === "("; - if (!isGroup && opts.noextglob !== true && peek() === "(" && peek(2) !== "?") { - extglobOpen("qmark", value); - continue; - } - if (prev && prev.type === "paren") { - const next = peek(); - let output = value; - if (next === "<" && !utils.supportsLookbehinds()) { - throw new Error("Node.js v10 or higher is required for regex lookbehinds"); - } - if ( - (prev.value === "(" && !/[!=<:]/.test(next)) || - (next === "<" && !/<([!=]|\w+>)/.test(remaining())) - ) { - output = `\\${value}`; - } - push({ type: "text", value, output }); - continue; - } - if (opts.dot !== true && (prev.type === "slash" || prev.type === "bos")) { - push({ type: "qmark", value, output: QMARK_NO_DOT }); - continue; - } - push({ type: "qmark", value, output: QMARK }); - continue; - } - if (value === "!") { - if (opts.noextglob !== true && peek() === "(") { - if (peek(2) !== "?" || !/[!=<:]/.test(peek(3))) { - extglobOpen("negate", value); - continue; - } - } - if (opts.nonegate !== true && state.index === 0) { - negate(); - continue; - } - } - if (value === "+") { - if (opts.noextglob !== true && peek() === "(" && peek(2) !== "?") { - extglobOpen("plus", value); - continue; - } - if ((prev && prev.value === "(") || opts.regex === false) { - push({ type: "plus", value, output: PLUS_LITERAL }); - continue; - } - if ( - (prev && (prev.type === "bracket" || prev.type === "paren" || prev.type === "brace")) || - state.parens > 0 - ) { - push({ type: "plus", value }); - continue; - } - push({ type: "plus", value: PLUS_LITERAL }); - continue; - } - if (value === "@") { - if (opts.noextglob !== true && peek() === "(" && peek(2) !== "?") { - push({ type: "at", extglob: true, value, output: "" }); - continue; - } - push({ type: "text", value }); - continue; - } - if (value !== "*") { - if (value === "$" || value === "^") { - value = `\\${value}`; - } - const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); - if (match) { - value += match[0]; - state.index += match[0].length; - } - push({ type: "text", value }); - continue; - } - if (prev && (prev.type === "globstar" || prev.star === true)) { - prev.type = "star"; - prev.star = true; - prev.value += value; - prev.output = star; - state.backtrack = true; - state.globstar = true; - consume(value); - continue; - } - let rest = remaining(); - if (opts.noextglob !== true && /^\([^?]/.test(rest)) { - extglobOpen("star", value); - continue; - } - if (prev.type === "star") { - if (opts.noglobstar === true) { - consume(value); - continue; - } - const prior = prev.prev; - const before = prior.prev; - const isStart = prior.type === "slash" || prior.type === "bos"; - const afterStar = before && (before.type === "star" || before.type === "globstar"); - if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== "/"))) { - push({ type: "star", value, output: "" }); - continue; - } - const isBrace = state.braces > 0 && (prior.type === "comma" || prior.type === "brace"); - const isExtglob = extglobs.length && (prior.type === "pipe" || prior.type === "paren"); - if (!isStart && prior.type !== "paren" && !isBrace && !isExtglob) { - push({ type: "star", value, output: "" }); - continue; - } - while (rest.slice(0, 3) === "/**") { - const after = input[state.index + 4]; - if (after && after !== "/") { - break; - } - rest = rest.slice(3); - consume("/**", 3); - } - if (prior.type === "bos" && eos()) { - prev.type = "globstar"; - prev.value += value; - prev.output = globstar(opts); - state.output = prev.output; - state.globstar = true; - consume(value); - continue; - } - if (prior.type === "slash" && prior.prev.type !== "bos" && !afterStar && eos()) { - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - prev.type = "globstar"; - prev.output = globstar(opts) + (opts.strictSlashes ? ")" : "|$)"); - prev.value += value; - state.globstar = true; - state.output += prior.output + prev.output; - consume(value); - continue; - } - if (prior.type === "slash" && prior.prev.type !== "bos" && rest[0] === "/") { - const end = rest[1] !== void 0 ? "|$" : ""; - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - prev.type = "globstar"; - prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; - prev.value += value; - state.output += prior.output + prev.output; - state.globstar = true; - consume(value + advance()); - push({ type: "slash", value: "/", output: "" }); - continue; - } - if (prior.type === "bos" && rest[0] === "/") { - prev.type = "globstar"; - prev.value += value; - prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state.output = prev.output; - state.globstar = true; - consume(value + advance()); - push({ type: "slash", value: "/", output: "" }); - continue; - } - state.output = state.output.slice(0, -prev.output.length); - prev.type = "globstar"; - prev.output = globstar(opts); - prev.value += value; - state.output += prev.output; - state.globstar = true; - consume(value); - continue; - } - const token = { type: "star", value, output: star }; - if (opts.bash === true) { - token.output = ".*?"; - if (prev.type === "bos" || prev.type === "slash") { - token.output = nodot + token.output; - } - push(token); - continue; - } - if (prev && (prev.type === "bracket" || prev.type === "paren") && opts.regex === true) { - token.output = value; - push(token); - continue; - } - if (state.index === state.start || prev.type === "slash" || prev.type === "dot") { - if (prev.type === "dot") { - state.output += NO_DOT_SLASH; - prev.output += NO_DOT_SLASH; - } else if (opts.dot === true) { - state.output += NO_DOTS_SLASH; - prev.output += NO_DOTS_SLASH; - } else { - state.output += nodot; - prev.output += nodot; - } - if (peek() !== "*") { - state.output += ONE_CHAR; - prev.output += ONE_CHAR; - } - } - push(token); - } - while (state.brackets > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", "]")); - state.output = utils.escapeLast(state.output, "["); - decrement("brackets"); - } - while (state.parens > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", ")")); - state.output = utils.escapeLast(state.output, "("); - decrement("parens"); - } - while (state.braces > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", "}")); - state.output = utils.escapeLast(state.output, "{"); - decrement("braces"); - } - if (opts.strictSlashes !== true && (prev.type === "star" || prev.type === "bracket")) { - push({ type: "maybe_slash", value: "", output: `${SLASH_LITERAL}?` }); - } - if (state.backtrack === true) { - state.output = ""; - for (const token of state.tokens) { - state.output += token.output != null ? token.output : token.value; - if (token.suffix) { - state.output += token.suffix; - } - } - } - return state; - }; - parse2.fastpaths = (input, options) => { - const opts = { ...options }; - const max = - typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - const len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } - input = REPLACEMENTS[input] || input; - const win32 = utils.isWindows(options); - const { - DOT_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOTS_SLASH, - STAR, - START_ANCHOR - } = constants.globChars(win32); - const nodot = opts.dot ? NO_DOTS : NO_DOT; - const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; - const capture = opts.capture ? "" : "?:"; - const state = { negated: false, prefix: "" }; - let star = opts.bash === true ? ".*?" : STAR; - if (opts.capture) { - star = `(${star})`; - } - const globstar = (opts2) => { - if (opts2.noglobstar === true) return star; - return `(${capture}(?:(?!${START_ANCHOR}${opts2.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; - const create = (str) => { - switch (str) { - case "*": - return `${nodot}${ONE_CHAR}${star}`; - case ".*": - return `${DOT_LITERAL}${ONE_CHAR}${star}`; - case "*.*": - return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - case "*/*": - return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; - case "**": - return nodot + globstar(opts); - case "**/*": - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; - case "**/*.*": - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - case "**/.*": - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; - default: { - const match = /^(.*?)\.(\w+)$/.exec(str); - if (!match) return; - const source2 = create(match[1]); - if (!source2) return; - return source2 + DOT_LITERAL + match[2]; - } - } - }; - const output = utils.removePrefix(input, state); - let source = create(output); - if (source && opts.strictSlashes !== true) { - source += `${SLASH_LITERAL}?`; - } - return source; - }; - module2.exports = parse2; - } -}); - -// ../node_modules/picomatch/lib/picomatch.js -var require_picomatch = __commonJS({ - "../node_modules/picomatch/lib/picomatch.js"(exports2, module2) { - "use strict"; - var path11 = require("path"); - var scan = require_scan(); - var parse2 = require_parse2(); - var utils = require_utils2(); - var constants = require_constants2(); - var isObject = (val) => val && typeof val === "object" && !Array.isArray(val); - var picomatch = (glob, options, returnState = false) => { - if (Array.isArray(glob)) { - const fns = glob.map((input) => picomatch(input, options, returnState)); - const arrayMatcher = (str) => { - for (const isMatch of fns) { - const state2 = isMatch(str); - if (state2) return state2; - } - return false; - }; - return arrayMatcher; - } - const isState = isObject(glob) && glob.tokens && glob.input; - if (glob === "" || (typeof glob !== "string" && !isState)) { - throw new TypeError("Expected pattern to be a non-empty string"); - } - const opts = options || {}; - const posix = utils.isWindows(options); - const regex = isState - ? picomatch.compileRe(glob, options) - : picomatch.makeRe(glob, options, false, true); - const state = regex.state; - delete regex.state; - let isIgnored = () => false; - if (opts.ignore) { - const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; - isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); - } - const matcher = (input, returnObject = false) => { - const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); - const result = { glob, state, regex, posix, input, output, match, isMatch }; - if (typeof opts.onResult === "function") { - opts.onResult(result); - } - if (isMatch === false) { - result.isMatch = false; - return returnObject ? result : false; - } - if (isIgnored(input)) { - if (typeof opts.onIgnore === "function") { - opts.onIgnore(result); - } - result.isMatch = false; - return returnObject ? result : false; - } - if (typeof opts.onMatch === "function") { - opts.onMatch(result); - } - return returnObject ? result : true; - }; - if (returnState) { - matcher.state = state; - } - return matcher; - }; - picomatch.test = (input, regex, options, { glob, posix } = {}) => { - if (typeof input !== "string") { - throw new TypeError("Expected input to be a string"); - } - if (input === "") { - return { isMatch: false, output: "" }; - } - const opts = options || {}; - const format = opts.format || (posix ? utils.toPosixSlashes : null); - let match = input === glob; - let output = match && format ? format(input) : input; - if (match === false) { - output = format ? format(input) : input; - match = output === glob; - } - if (match === false || opts.capture === true) { - if (opts.matchBase === true || opts.basename === true) { - match = picomatch.matchBase(input, regex, options, posix); - } else { - match = regex.exec(output); - } - } - return { isMatch: Boolean(match), match, output }; - }; - picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { - const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); - return regex.test(path11.basename(input)); - }; - picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); - picomatch.parse = (pattern, options) => { - if (Array.isArray(pattern)) return pattern.map((p) => picomatch.parse(p, options)); - return parse2(pattern, { ...options, fastpaths: false }); - }; - picomatch.scan = (input, options) => scan(input, options); - picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => { - if (returnOutput === true) { - return state.output; - } - const opts = options || {}; - const prepend = opts.contains ? "" : "^"; - const append3 = opts.contains ? "" : "$"; - let source = `${prepend}(?:${state.output})${append3}`; - if (state && state.negated === true) { - source = `^(?!${source}).*$`; - } - const regex = picomatch.toRegex(source, options); - if (returnState === true) { - regex.state = state; - } - return regex; - }; - picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => { - if (!input || typeof input !== "string") { - throw new TypeError("Expected a non-empty string"); - } - let parsed = { negated: false, fastpaths: true }; - if (options.fastpaths !== false && (input[0] === "." || input[0] === "*")) { - parsed.output = parse2.fastpaths(input, options); - } - if (!parsed.output) { - parsed = parse2(input, options); - } - return picomatch.compileRe(parsed, options, returnOutput, returnState); - }; - picomatch.toRegex = (source, options) => { - try { - const opts = options || {}; - return new RegExp(source, opts.flags || (opts.nocase ? "i" : "")); - } catch (err) { - if (options && options.debug === true) throw err; - return /$^/; - } - }; - picomatch.constants = constants; - module2.exports = picomatch; - } -}); - -// ../node_modules/picomatch/index.js -var require_picomatch2 = __commonJS({ - "../node_modules/picomatch/index.js"(exports2, module2) { - "use strict"; - module2.exports = require_picomatch(); - } -}); - -// ../node_modules/micromatch/index.js -var require_micromatch = __commonJS({ - "../node_modules/micromatch/index.js"(exports2, module2) { - "use strict"; - var util = require("util"); - var braces = require_braces(); - var picomatch = require_picomatch2(); - var utils = require_utils2(); - var isEmptyString = (v) => v === "" || v === "./"; - var hasBraces = (v) => { - const index = v.indexOf("{"); - return index > -1 && v.indexOf("}", index) > -1; - }; - var micromatch = (list, patterns, options) => { - patterns = [].concat(patterns); - list = [].concat(list); - let omit2 = /* @__PURE__ */ new Set(); - let keep = /* @__PURE__ */ new Set(); - let items = /* @__PURE__ */ new Set(); - let negatives = 0; - let onResult = (state) => { - items.add(state.output); - if (options && options.onResult) { - options.onResult(state); - } - }; - for (let i = 0; i < patterns.length; i++) { - let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true); - let negated = isMatch.state.negated || isMatch.state.negatedExtglob; - if (negated) negatives++; - for (let item of list) { - let matched = isMatch(item, true); - let match = negated ? !matched.isMatch : matched.isMatch; - if (!match) continue; - if (negated) { - omit2.add(matched.output); - } else { - omit2.delete(matched.output); - keep.add(matched.output); - } - } - } - let result = negatives === patterns.length ? [...items] : [...keep]; - let matches = result.filter((item) => !omit2.has(item)); - if (options && matches.length === 0) { - if (options.failglob === true) { - throw new Error(`No matches found for "${patterns.join(", ")}"`); - } - if (options.nonull === true || options.nullglob === true) { - return options.unescape ? patterns.map((p) => p.replace(/\\/g, "")) : patterns; - } - } - return matches; - }; - micromatch.match = micromatch; - micromatch.matcher = (pattern, options) => picomatch(pattern, options); - micromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); - micromatch.any = micromatch.isMatch; - micromatch.not = (list, patterns, options = {}) => { - patterns = [].concat(patterns).map(String); - let result = /* @__PURE__ */ new Set(); - let items = []; - let onResult = (state) => { - if (options.onResult) options.onResult(state); - items.push(state.output); - }; - let matches = new Set(micromatch(list, patterns, { ...options, onResult })); - for (let item of items) { - if (!matches.has(item)) { - result.add(item); - } - } - return [...result]; - }; - micromatch.contains = (str, pattern, options) => { - if (typeof str !== "string") { - throw new TypeError(`Expected a string: "${util.inspect(str)}"`); - } - if (Array.isArray(pattern)) { - return pattern.some((p) => micromatch.contains(str, p, options)); - } - if (typeof pattern === "string") { - if (isEmptyString(str) || isEmptyString(pattern)) { - return false; - } - if (str.includes(pattern) || (str.startsWith("./") && str.slice(2).includes(pattern))) { - return true; - } - } - return micromatch.isMatch(str, pattern, { ...options, contains: true }); - }; - micromatch.matchKeys = (obj, patterns, options) => { - if (!utils.isObject(obj)) { - throw new TypeError("Expected the first argument to be an object"); - } - let keys = micromatch(Object.keys(obj), patterns, options); - let res = {}; - for (let key of keys) res[key] = obj[key]; - return res; - }; - micromatch.some = (list, patterns, options) => { - let items = [].concat(list); - for (let pattern of [].concat(patterns)) { - let isMatch = picomatch(String(pattern), options); - if (items.some((item) => isMatch(item))) { - return true; - } - } - return false; - }; - micromatch.every = (list, patterns, options) => { - let items = [].concat(list); - for (let pattern of [].concat(patterns)) { - let isMatch = picomatch(String(pattern), options); - if (!items.every((item) => isMatch(item))) { - return false; - } - } - return true; - }; - micromatch.all = (str, patterns, options) => { - if (typeof str !== "string") { - throw new TypeError(`Expected a string: "${util.inspect(str)}"`); - } - return [].concat(patterns).every((p) => picomatch(p, options)(str)); - }; - micromatch.capture = (glob, input, options) => { - let posix = utils.isWindows(options); - let regex = picomatch.makeRe(String(glob), { ...options, capture: true }); - let match = regex.exec(posix ? utils.toPosixSlashes(input) : input); - if (match) { - return match.slice(1).map((v) => (v === void 0 ? "" : v)); - } - }; - micromatch.makeRe = (...args) => picomatch.makeRe(...args); - micromatch.scan = (...args) => picomatch.scan(...args); - micromatch.parse = (patterns, options) => { - let res = []; - for (let pattern of [].concat(patterns || [])) { - for (let str of braces(String(pattern), options)) { - res.push(picomatch.parse(str, options)); - } - } - return res; - }; - micromatch.braces = (pattern, options) => { - if (typeof pattern !== "string") throw new TypeError("Expected a string"); - if ((options && options.nobrace === true) || !hasBraces(pattern)) { - return [pattern]; - } - return braces(pattern, options); - }; - micromatch.braceExpand = (pattern, options) => { - if (typeof pattern !== "string") throw new TypeError("Expected a string"); - return micromatch.braces(pattern, { ...options, expand: true }); - }; - micromatch.hasBraces = hasBraces; - module2.exports = micromatch; - } -}); - -// ../node_modules/fast-glob/out/utils/pattern.js -var require_pattern = __commonJS({ - "../node_modules/fast-glob/out/utils/pattern.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.isAbsolute = - exports2.partitionAbsoluteAndRelative = - exports2.removeDuplicateSlashes = - exports2.matchAny = - exports2.convertPatternsToRe = - exports2.makeRe = - exports2.getPatternParts = - exports2.expandBraceExpansion = - exports2.expandPatternsWithBraceExpansion = - exports2.isAffectDepthOfReadingPattern = - exports2.endsWithSlashGlobStar = - exports2.hasGlobStar = - exports2.getBaseDirectory = - exports2.isPatternRelatedToParentDirectory = - exports2.getPatternsOutsideCurrentDirectory = - exports2.getPatternsInsideCurrentDirectory = - exports2.getPositivePatterns = - exports2.getNegativePatterns = - exports2.isPositivePattern = - exports2.isNegativePattern = - exports2.convertToNegativePattern = - exports2.convertToPositivePattern = - exports2.isDynamicPattern = - exports2.isStaticPattern = - void 0; - var path11 = require("path"); - var globParent = require_glob_parent(); - var micromatch = require_micromatch(); - var GLOBSTAR = "**"; - var ESCAPE_SYMBOL = "\\"; - var COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; - var REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[[^[]*]/; - var REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\([^(]*\|[^|]*\)/; - var GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\([^(]*\)/; - var BRACE_EXPANSION_SEPARATORS_RE = /,|\.\./; - var DOUBLE_SLASH_RE = /(?!^)\/{2,}/g; - function isStaticPattern(pattern, options = {}) { - return !isDynamicPattern(pattern, options); - } - exports2.isStaticPattern = isStaticPattern; - function isDynamicPattern(pattern, options = {}) { - if (pattern === "") { - return false; - } - if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) { - return true; - } - if ( - COMMON_GLOB_SYMBOLS_RE.test(pattern) || - REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || - REGEX_GROUP_SYMBOLS_RE.test(pattern) - ) { - return true; - } - if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) { - return true; - } - if (options.braceExpansion !== false && hasBraceExpansion(pattern)) { - return true; - } - return false; - } - exports2.isDynamicPattern = isDynamicPattern; - function hasBraceExpansion(pattern) { - const openingBraceIndex = pattern.indexOf("{"); - if (openingBraceIndex === -1) { - return false; - } - const closingBraceIndex = pattern.indexOf("}", openingBraceIndex + 1); - if (closingBraceIndex === -1) { - return false; - } - const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex); - return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent); - } - function convertToPositivePattern(pattern) { - return isNegativePattern(pattern) ? pattern.slice(1) : pattern; - } - exports2.convertToPositivePattern = convertToPositivePattern; - function convertToNegativePattern(pattern) { - return "!" + pattern; - } - exports2.convertToNegativePattern = convertToNegativePattern; - function isNegativePattern(pattern) { - return pattern.startsWith("!") && pattern[1] !== "("; - } - exports2.isNegativePattern = isNegativePattern; - function isPositivePattern(pattern) { - return !isNegativePattern(pattern); - } - exports2.isPositivePattern = isPositivePattern; - function getNegativePatterns(patterns) { - return patterns.filter(isNegativePattern); - } - exports2.getNegativePatterns = getNegativePatterns; - function getPositivePatterns(patterns) { - return patterns.filter(isPositivePattern); - } - exports2.getPositivePatterns = getPositivePatterns; - function getPatternsInsideCurrentDirectory(patterns) { - return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern)); - } - exports2.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory; - function getPatternsOutsideCurrentDirectory(patterns) { - return patterns.filter(isPatternRelatedToParentDirectory); - } - exports2.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory; - function isPatternRelatedToParentDirectory(pattern) { - return pattern.startsWith("..") || pattern.startsWith("./.."); - } - exports2.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory; - function getBaseDirectory(pattern) { - return globParent(pattern, { flipBackslashes: false }); - } - exports2.getBaseDirectory = getBaseDirectory; - function hasGlobStar(pattern) { - return pattern.includes(GLOBSTAR); - } - exports2.hasGlobStar = hasGlobStar; - function endsWithSlashGlobStar(pattern) { - return pattern.endsWith("/" + GLOBSTAR); - } - exports2.endsWithSlashGlobStar = endsWithSlashGlobStar; - function isAffectDepthOfReadingPattern(pattern) { - const basename = path11.basename(pattern); - return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); - } - exports2.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; - function expandPatternsWithBraceExpansion(patterns) { - return patterns.reduce((collection, pattern) => { - return collection.concat(expandBraceExpansion(pattern)); - }, []); - } - exports2.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion; - function expandBraceExpansion(pattern) { - const patterns = micromatch.braces(pattern, { - expand: true, - nodupes: true, - keepEscaping: true - }); - patterns.sort((a, b) => a.length - b.length); - return patterns.filter((pattern2) => pattern2 !== ""); - } - exports2.expandBraceExpansion = expandBraceExpansion; - function getPatternParts(pattern, options) { - let { parts } = micromatch.scan( - pattern, - Object.assign(Object.assign({}, options), { parts: true }) - ); - if (parts.length === 0) { - parts = [pattern]; - } - if (parts[0].startsWith("/")) { - parts[0] = parts[0].slice(1); - parts.unshift(""); - } - return parts; - } - exports2.getPatternParts = getPatternParts; - function makeRe(pattern, options) { - return micromatch.makeRe(pattern, options); - } - exports2.makeRe = makeRe; - function convertPatternsToRe(patterns, options) { - return patterns.map((pattern) => makeRe(pattern, options)); - } - exports2.convertPatternsToRe = convertPatternsToRe; - function matchAny(entry, patternsRe) { - return patternsRe.some((patternRe) => patternRe.test(entry)); - } - exports2.matchAny = matchAny; - function removeDuplicateSlashes(pattern) { - return pattern.replace(DOUBLE_SLASH_RE, "/"); - } - exports2.removeDuplicateSlashes = removeDuplicateSlashes; - function partitionAbsoluteAndRelative(patterns) { - const absolute = []; - const relative = []; - for (const pattern of patterns) { - if (isAbsolute(pattern)) { - absolute.push(pattern); - } else { - relative.push(pattern); - } - } - return [absolute, relative]; - } - exports2.partitionAbsoluteAndRelative = partitionAbsoluteAndRelative; - function isAbsolute(pattern) { - return path11.isAbsolute(pattern); - } - exports2.isAbsolute = isAbsolute; - } -}); - -// ../node_modules/merge2/index.js -var require_merge2 = __commonJS({ - "../node_modules/merge2/index.js"(exports2, module2) { - "use strict"; - var Stream = require("stream"); - var PassThrough = Stream.PassThrough; - var slice = Array.prototype.slice; - module2.exports = merge2; - function merge2() { - const streamsQueue = []; - const args = slice.call(arguments); - let merging = false; - let options = args[args.length - 1]; - if (options && !Array.isArray(options) && options.pipe == null) { - args.pop(); - } else { - options = {}; - } - const doEnd = options.end !== false; - const doPipeError = options.pipeError === true; - if (options.objectMode == null) { - options.objectMode = true; - } - if (options.highWaterMark == null) { - options.highWaterMark = 64 * 1024; - } - const mergedStream = PassThrough(options); - function addStream() { - for (let i = 0, len = arguments.length; i < len; i++) { - streamsQueue.push(pauseStreams(arguments[i], options)); - } - mergeStream(); - return this; - } - function mergeStream() { - if (merging) { - return; - } - merging = true; - let streams = streamsQueue.shift(); - if (!streams) { - process.nextTick(endStream); - return; - } - if (!Array.isArray(streams)) { - streams = [streams]; - } - let pipesCount = streams.length + 1; - function next() { - if (--pipesCount > 0) { - return; - } - merging = false; - mergeStream(); - } - function pipe(stream) { - function onend() { - stream.removeListener("merge2UnpipeEnd", onend); - stream.removeListener("end", onend); - if (doPipeError) { - stream.removeListener("error", onerror); - } - next(); - } - function onerror(err) { - mergedStream.emit("error", err); - } - if (stream._readableState.endEmitted) { - return next(); - } - stream.on("merge2UnpipeEnd", onend); - stream.on("end", onend); - if (doPipeError) { - stream.on("error", onerror); - } - stream.pipe(mergedStream, { end: false }); - stream.resume(); - } - for (let i = 0; i < streams.length; i++) { - pipe(streams[i]); - } - next(); - } - function endStream() { - merging = false; - mergedStream.emit("queueDrain"); - if (doEnd) { - mergedStream.end(); - } - } - mergedStream.setMaxListeners(0); - mergedStream.add = addStream; - mergedStream.on("unpipe", function (stream) { - stream.emit("merge2UnpipeEnd"); - }); - if (args.length) { - addStream.apply(null, args); - } - return mergedStream; - } - function pauseStreams(streams, options) { - if (!Array.isArray(streams)) { - if (!streams._readableState && streams.pipe) { - streams = streams.pipe(PassThrough(options)); - } - if (!streams._readableState || !streams.pause || !streams.pipe) { - throw new Error("Only readable stream can be merged."); - } - streams.pause(); - } else { - for (let i = 0, len = streams.length; i < len; i++) { - streams[i] = pauseStreams(streams[i], options); - } - } - return streams; - } - } -}); - -// ../node_modules/fast-glob/out/utils/stream.js -var require_stream = __commonJS({ - "../node_modules/fast-glob/out/utils/stream.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.merge = void 0; - var merge2 = require_merge2(); - function merge3(streams) { - const mergedStream = merge2(streams); - streams.forEach((stream) => { - stream.once("error", (error) => mergedStream.emit("error", error)); - }); - mergedStream.once("close", () => propagateCloseEventToSources(streams)); - mergedStream.once("end", () => propagateCloseEventToSources(streams)); - return mergedStream; - } - exports2.merge = merge3; - function propagateCloseEventToSources(streams) { - streams.forEach((stream) => stream.emit("close")); - } - } -}); - -// ../node_modules/fast-glob/out/utils/string.js -var require_string = __commonJS({ - "../node_modules/fast-glob/out/utils/string.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.isEmpty = exports2.isString = void 0; - function isString(input) { - return typeof input === "string"; - } - exports2.isString = isString; - function isEmpty(input) { - return input === ""; - } - exports2.isEmpty = isEmpty; - } -}); - -// ../node_modules/fast-glob/out/utils/index.js -var require_utils3 = __commonJS({ - "../node_modules/fast-glob/out/utils/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.string = - exports2.stream = - exports2.pattern = - exports2.path = - exports2.fs = - exports2.errno = - exports2.array = - void 0; - var array = require_array(); - exports2.array = array; - var errno = require_errno(); - exports2.errno = errno; - var fs9 = require_fs(); - exports2.fs = fs9; - var path11 = require_path(); - exports2.path = path11; - var pattern = require_pattern(); - exports2.pattern = pattern; - var stream = require_stream(); - exports2.stream = stream; - var string = require_string(); - exports2.string = string; - } -}); - -// ../node_modules/fast-glob/out/managers/tasks.js -var require_tasks = __commonJS({ - "../node_modules/fast-glob/out/managers/tasks.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.convertPatternGroupToTask = - exports2.convertPatternGroupsToTasks = - exports2.groupPatternsByBaseDirectory = - exports2.getNegativePatternsAsPositive = - exports2.getPositivePatterns = - exports2.convertPatternsToTasks = - exports2.generate = - void 0; - var utils = require_utils3(); - function generate(input, settings) { - const patterns = processPatterns(input, settings); - const ignore = processPatterns(settings.ignore, settings); - const positivePatterns = getPositivePatterns(patterns); - const negativePatterns = getNegativePatternsAsPositive(patterns, ignore); - const staticPatterns = positivePatterns.filter((pattern) => - utils.pattern.isStaticPattern(pattern, settings) - ); - const dynamicPatterns = positivePatterns.filter((pattern) => - utils.pattern.isDynamicPattern(pattern, settings) - ); - const staticTasks = convertPatternsToTasks( - staticPatterns, - negativePatterns, - /* dynamic */ - false - ); - const dynamicTasks = convertPatternsToTasks( - dynamicPatterns, - negativePatterns, - /* dynamic */ - true - ); - return staticTasks.concat(dynamicTasks); - } - exports2.generate = generate; - function processPatterns(input, settings) { - let patterns = input; - if (settings.braceExpansion) { - patterns = utils.pattern.expandPatternsWithBraceExpansion(patterns); - } - if (settings.baseNameMatch) { - patterns = patterns.map((pattern) => (pattern.includes("/") ? pattern : `**/${pattern}`)); - } - return patterns.map((pattern) => utils.pattern.removeDuplicateSlashes(pattern)); - } - function convertPatternsToTasks(positive, negative, dynamic) { - const tasks = []; - const patternsOutsideCurrentDirectory = - utils.pattern.getPatternsOutsideCurrentDirectory(positive); - const patternsInsideCurrentDirectory = - utils.pattern.getPatternsInsideCurrentDirectory(positive); - const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory( - patternsOutsideCurrentDirectory - ); - const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory( - patternsInsideCurrentDirectory - ); - tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic)); - if ("." in insideCurrentDirectoryGroup) { - tasks.push( - convertPatternGroupToTask(".", patternsInsideCurrentDirectory, negative, dynamic) - ); - } else { - tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic)); - } - return tasks; - } - exports2.convertPatternsToTasks = convertPatternsToTasks; - function getPositivePatterns(patterns) { - return utils.pattern.getPositivePatterns(patterns); - } - exports2.getPositivePatterns = getPositivePatterns; - function getNegativePatternsAsPositive(patterns, ignore) { - const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); - const positive = negative.map(utils.pattern.convertToPositivePattern); - return positive; - } - exports2.getNegativePatternsAsPositive = getNegativePatternsAsPositive; - function groupPatternsByBaseDirectory(patterns) { - const group = {}; - return patterns.reduce((collection, pattern) => { - const base = utils.pattern.getBaseDirectory(pattern); - if (base in collection) { - collection[base].push(pattern); - } else { - collection[base] = [pattern]; - } - return collection; - }, group); - } - exports2.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; - function convertPatternGroupsToTasks(positive, negative, dynamic) { - return Object.keys(positive).map((base) => { - return convertPatternGroupToTask(base, positive[base], negative, dynamic); - }); - } - exports2.convertPatternGroupsToTasks = convertPatternGroupsToTasks; - function convertPatternGroupToTask(base, positive, negative, dynamic) { - return { - dynamic, - positive, - negative, - base, - patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) - }; - } - exports2.convertPatternGroupToTask = convertPatternGroupToTask; - } -}); - -// ../node_modules/@nodelib/fs.stat/out/providers/async.js -var require_async = __commonJS({ - "../node_modules/@nodelib/fs.stat/out/providers/async.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.read = void 0; - function read(path11, settings, callback) { - settings.fs.lstat(path11, (lstatError, lstat) => { - if (lstatError !== null) { - callFailureCallback(callback, lstatError); - return; - } - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - callSuccessCallback(callback, lstat); - return; - } - settings.fs.stat(path11, (statError, stat) => { - if (statError !== null) { - if (settings.throwErrorOnBrokenSymbolicLink) { - callFailureCallback(callback, statError); - return; - } - callSuccessCallback(callback, lstat); - return; - } - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - callSuccessCallback(callback, stat); - }); - }); - } - exports2.read = read; - function callFailureCallback(callback, error) { - callback(error); - } - function callSuccessCallback(callback, result) { - callback(null, result); - } - } -}); - -// ../node_modules/@nodelib/fs.stat/out/providers/sync.js -var require_sync = __commonJS({ - "../node_modules/@nodelib/fs.stat/out/providers/sync.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.read = void 0; - function read(path11, settings) { - const lstat = settings.fs.lstatSync(path11); - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return lstat; - } - try { - const stat = settings.fs.statSync(path11); - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - return stat; - } catch (error) { - if (!settings.throwErrorOnBrokenSymbolicLink) { - return lstat; - } - throw error; - } - } - exports2.read = read; - } -}); - -// ../node_modules/@nodelib/fs.stat/out/adapters/fs.js -var require_fs2 = __commonJS({ - "../node_modules/@nodelib/fs.stat/out/adapters/fs.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.createFileSystemAdapter = exports2.FILE_SYSTEM_ADAPTER = void 0; - var fs9 = require("fs"); - exports2.FILE_SYSTEM_ADAPTER = { - lstat: fs9.lstat, - stat: fs9.stat, - lstatSync: fs9.lstatSync, - statSync: fs9.statSync - }; - function createFileSystemAdapter(fsMethods) { - if (fsMethods === void 0) { - return exports2.FILE_SYSTEM_ADAPTER; - } - return Object.assign(Object.assign({}, exports2.FILE_SYSTEM_ADAPTER), fsMethods); - } - exports2.createFileSystemAdapter = createFileSystemAdapter; - } -}); - -// ../node_modules/@nodelib/fs.stat/out/settings.js -var require_settings = __commonJS({ - "../node_modules/@nodelib/fs.stat/out/settings.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var fs9 = require_fs2(); - var Settings = class { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); - this.fs = fs9.createFileSystemAdapter(this._options.fs); - this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue( - this._options.throwErrorOnBrokenSymbolicLink, - true - ); - } - _getValue(option, value) { - return option !== null && option !== void 0 ? option : value; - } - }; - exports2.default = Settings; - } -}); - -// ../node_modules/@nodelib/fs.stat/out/index.js -var require_out = __commonJS({ - "../node_modules/@nodelib/fs.stat/out/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.statSync = exports2.stat = exports2.Settings = void 0; - var async = require_async(); - var sync = require_sync(); - var settings_1 = require_settings(); - exports2.Settings = settings_1.default; - function stat(path11, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === "function") { - async.read(path11, getSettings(), optionsOrSettingsOrCallback); - return; - } - async.read(path11, getSettings(optionsOrSettingsOrCallback), callback); - } - exports2.stat = stat; - function statSync(path11, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path11, settings); - } - exports2.statSync = statSync; - function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); - } - } -}); - -// ../node_modules/queue-microtask/index.js -var require_queue_microtask = __commonJS({ - "../node_modules/queue-microtask/index.js"(exports2, module2) { - var promise; - module2.exports = - typeof queueMicrotask === "function" - ? queueMicrotask.bind(typeof window !== "undefined" ? window : global) - : (cb) => - (promise || (promise = Promise.resolve())).then(cb).catch((err) => - setTimeout(() => { - throw err; - }, 0) - ); - } -}); - -// ../node_modules/run-parallel/index.js -var require_run_parallel = __commonJS({ - "../node_modules/run-parallel/index.js"(exports2, module2) { - module2.exports = runParallel; - var queueMicrotask2 = require_queue_microtask(); - function runParallel(tasks, cb) { - let results, pending, keys; - let isSync = true; - if (Array.isArray(tasks)) { - results = []; - pending = tasks.length; - } else { - keys = Object.keys(tasks); - results = {}; - pending = keys.length; - } - function done(err) { - function end() { - if (cb) cb(err, results); - cb = null; - } - if (isSync) queueMicrotask2(end); - else end(); - } - function each(i, err, result) { - results[i] = result; - if (--pending === 0 || err) { - done(err); - } - } - if (!pending) { - done(null); - } else if (keys) { - keys.forEach(function (key) { - tasks[key](function (err, result) { - each(key, err, result); - }); - }); - } else { - tasks.forEach(function (task, i) { - task(function (err, result) { - each(i, err, result); - }); - }); - } - isSync = false; - } - } -}); - -// ../node_modules/@nodelib/fs.scandir/out/constants.js -var require_constants3 = __commonJS({ - "../node_modules/@nodelib/fs.scandir/out/constants.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0; - var NODE_PROCESS_VERSION_PARTS = process.versions.node.split("."); - if (NODE_PROCESS_VERSION_PARTS[0] === void 0 || NODE_PROCESS_VERSION_PARTS[1] === void 0) { - throw new Error( - `Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}` - ); - } - var MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); - var MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); - var SUPPORTED_MAJOR_VERSION = 10; - var SUPPORTED_MINOR_VERSION = 10; - var IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION; - var IS_MATCHED_BY_MAJOR_AND_MINOR = - MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION; - exports2.IS_SUPPORT_READDIR_WITH_FILE_TYPES = - IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR; - } -}); - -// ../node_modules/@nodelib/fs.scandir/out/utils/fs.js -var require_fs3 = __commonJS({ - "../node_modules/@nodelib/fs.scandir/out/utils/fs.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.createDirentFromStats = void 0; - var DirentFromStats = class { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } - }; - function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); - } - exports2.createDirentFromStats = createDirentFromStats; - } -}); - -// ../node_modules/@nodelib/fs.scandir/out/utils/index.js -var require_utils4 = __commonJS({ - "../node_modules/@nodelib/fs.scandir/out/utils/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.fs = void 0; - var fs9 = require_fs3(); - exports2.fs = fs9; - } -}); - -// ../node_modules/@nodelib/fs.scandir/out/providers/common.js -var require_common = __commonJS({ - "../node_modules/@nodelib/fs.scandir/out/providers/common.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.joinPathSegments = void 0; - function joinPathSegments(a, b, separator) { - if (a.endsWith(separator)) { - return a + b; - } - return a + separator + b; - } - exports2.joinPathSegments = joinPathSegments; - } -}); - -// ../node_modules/@nodelib/fs.scandir/out/providers/async.js -var require_async2 = __commonJS({ - "../node_modules/@nodelib/fs.scandir/out/providers/async.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.readdir = exports2.readdirWithFileTypes = exports2.read = void 0; - var fsStat = require_out(); - var rpl = require_run_parallel(); - var constants_1 = require_constants3(); - var utils = require_utils4(); - var common = require_common(); - function read(directory, settings, callback) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - readdirWithFileTypes(directory, settings, callback); - return; - } - readdir(directory, settings, callback); - } - exports2.read = read; - function readdirWithFileTypes(directory, settings, callback) { - settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => { - if (readdirError !== null) { - callFailureCallback(callback, readdirError); - return; - } - const entries = dirents.map((dirent) => ({ - dirent, - name: dirent.name, - path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator) - })); - if (!settings.followSymbolicLinks) { - callSuccessCallback(callback, entries); - return; - } - const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); - rpl(tasks, (rplError, rplEntries) => { - if (rplError !== null) { - callFailureCallback(callback, rplError); - return; - } - callSuccessCallback(callback, rplEntries); - }); - }); - } - exports2.readdirWithFileTypes = readdirWithFileTypes; - function makeRplTaskEntry(entry, settings) { - return (done) => { - if (!entry.dirent.isSymbolicLink()) { - done(null, entry); - return; - } - settings.fs.stat(entry.path, (statError, stats) => { - if (statError !== null) { - if (settings.throwErrorOnBrokenSymbolicLink) { - done(statError); - return; - } - done(null, entry); - return; - } - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - done(null, entry); - }); - }; - } - function readdir(directory, settings, callback) { - settings.fs.readdir(directory, (readdirError, names) => { - if (readdirError !== null) { - callFailureCallback(callback, readdirError); - return; - } - const tasks = names.map((name) => { - const path11 = common.joinPathSegments(directory, name, settings.pathSegmentSeparator); - return (done) => { - fsStat.stat(path11, settings.fsStatSettings, (error, stats) => { - if (error !== null) { - done(error); - return; - } - const entry = { - name, - path: path11, - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - done(null, entry); - }); - }; - }); - rpl(tasks, (rplError, entries) => { - if (rplError !== null) { - callFailureCallback(callback, rplError); - return; - } - callSuccessCallback(callback, entries); - }); - }); - } - exports2.readdir = readdir; - function callFailureCallback(callback, error) { - callback(error); - } - function callSuccessCallback(callback, result) { - callback(null, result); - } - } -}); - -// ../node_modules/@nodelib/fs.scandir/out/providers/sync.js -var require_sync2 = __commonJS({ - "../node_modules/@nodelib/fs.scandir/out/providers/sync.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.readdir = exports2.readdirWithFileTypes = exports2.read = void 0; - var fsStat = require_out(); - var constants_1 = require_constants3(); - var utils = require_utils4(); - var common = require_common(); - function read(directory, settings) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(directory, settings); - } - return readdir(directory, settings); - } - exports2.read = read; - function readdirWithFileTypes(directory, settings) { - const dirents = settings.fs.readdirSync(directory, { withFileTypes: true }); - return dirents.map((dirent) => { - const entry = { - dirent, - name: dirent.name, - path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator) - }; - if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { - try { - const stats = settings.fs.statSync(entry.path); - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - } catch (error) { - if (settings.throwErrorOnBrokenSymbolicLink) { - throw error; - } - } - } - return entry; - }); - } - exports2.readdirWithFileTypes = readdirWithFileTypes; - function readdir(directory, settings) { - const names = settings.fs.readdirSync(directory); - return names.map((name) => { - const entryPath = common.joinPathSegments(directory, name, settings.pathSegmentSeparator); - const stats = fsStat.statSync(entryPath, settings.fsStatSettings); - const entry = { - name, - path: entryPath, - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - return entry; - }); - } - exports2.readdir = readdir; - } -}); - -// ../node_modules/@nodelib/fs.scandir/out/adapters/fs.js -var require_fs4 = __commonJS({ - "../node_modules/@nodelib/fs.scandir/out/adapters/fs.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.createFileSystemAdapter = exports2.FILE_SYSTEM_ADAPTER = void 0; - var fs9 = require("fs"); - exports2.FILE_SYSTEM_ADAPTER = { - lstat: fs9.lstat, - stat: fs9.stat, - lstatSync: fs9.lstatSync, - statSync: fs9.statSync, - readdir: fs9.readdir, - readdirSync: fs9.readdirSync - }; - function createFileSystemAdapter(fsMethods) { - if (fsMethods === void 0) { - return exports2.FILE_SYSTEM_ADAPTER; - } - return Object.assign(Object.assign({}, exports2.FILE_SYSTEM_ADAPTER), fsMethods); - } - exports2.createFileSystemAdapter = createFileSystemAdapter; - } -}); - -// ../node_modules/@nodelib/fs.scandir/out/settings.js -var require_settings2 = __commonJS({ - "../node_modules/@nodelib/fs.scandir/out/settings.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var path11 = require("path"); - var fsStat = require_out(); - var fs9 = require_fs4(); - var Settings = class { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); - this.fs = fs9.createFileSystemAdapter(this._options.fs); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path11.sep); - this.stats = this._getValue(this._options.stats, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue( - this._options.throwErrorOnBrokenSymbolicLink, - true - ); - this.fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this.followSymbolicLinks, - fs: this.fs, - throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option !== null && option !== void 0 ? option : value; - } - }; - exports2.default = Settings; - } -}); - -// ../node_modules/@nodelib/fs.scandir/out/index.js -var require_out2 = __commonJS({ - "../node_modules/@nodelib/fs.scandir/out/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Settings = exports2.scandirSync = exports2.scandir = void 0; - var async = require_async2(); - var sync = require_sync2(); - var settings_1 = require_settings2(); - exports2.Settings = settings_1.default; - function scandir(path11, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === "function") { - async.read(path11, getSettings(), optionsOrSettingsOrCallback); - return; - } - async.read(path11, getSettings(optionsOrSettingsOrCallback), callback); - } - exports2.scandir = scandir; - function scandirSync(path11, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path11, settings); - } - exports2.scandirSync = scandirSync; - function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); - } - } -}); - -// ../node_modules/reusify/reusify.js -var require_reusify = __commonJS({ - "../node_modules/reusify/reusify.js"(exports2, module2) { - "use strict"; - function reusify(Constructor) { - var head = new Constructor(); - var tail = head; - function get() { - var current = head; - if (current.next) { - head = current.next; - } else { - head = new Constructor(); - tail = head; - } - current.next = null; - return current; - } - function release(obj) { - tail.next = obj; - tail = obj; - } - return { - get, - release - }; - } - module2.exports = reusify; - } -}); - -// ../node_modules/fastq/queue.js -var require_queue = __commonJS({ - "../node_modules/fastq/queue.js"(exports2, module2) { - "use strict"; - var reusify = require_reusify(); - function fastqueue(context, worker, _concurrency) { - if (typeof context === "function") { - _concurrency = worker; - worker = context; - context = null; - } - if (!(_concurrency >= 1)) { - throw new Error("fastqueue concurrency must be equal to or greater than 1"); - } - var cache3 = reusify(Task); - var queueHead = null; - var queueTail = null; - var _running = 0; - var errorHandler = null; - var self = { - push, - drain: noop3, - saturated: noop3, - pause, - paused: false, - get concurrency() { - return _concurrency; - }, - set concurrency(value) { - if (!(value >= 1)) { - throw new Error("fastqueue concurrency must be equal to or greater than 1"); - } - _concurrency = value; - if (self.paused) return; - for (; queueHead && _running < _concurrency; ) { - _running++; - release(); - } - }, - running, - resume, - idle, - length, - getQueue, - unshift, - empty: noop3, - kill, - killAndDrain, - error, - abort - }; - return self; - function running() { - return _running; - } - function pause() { - self.paused = true; - } - function length() { - var current = queueHead; - var counter = 0; - while (current) { - current = current.next; - counter++; - } - return counter; - } - function getQueue() { - var current = queueHead; - var tasks = []; - while (current) { - tasks.push(current.value); - current = current.next; - } - return tasks; - } - function resume() { - if (!self.paused) return; - self.paused = false; - if (queueHead === null) { - _running++; - release(); - return; - } - for (; queueHead && _running < _concurrency; ) { - _running++; - release(); - } - } - function idle() { - return _running === 0 && self.length() === 0; - } - function push(value, done) { - var current = cache3.get(); - current.context = context; - current.release = release; - current.value = value; - current.callback = done || noop3; - current.errorHandler = errorHandler; - if (_running >= _concurrency || self.paused) { - if (queueTail) { - queueTail.next = current; - queueTail = current; - } else { - queueHead = current; - queueTail = current; - self.saturated(); - } - } else { - _running++; - worker.call(context, current.value, current.worked); - } - } - function unshift(value, done) { - var current = cache3.get(); - current.context = context; - current.release = release; - current.value = value; - current.callback = done || noop3; - current.errorHandler = errorHandler; - if (_running >= _concurrency || self.paused) { - if (queueHead) { - current.next = queueHead; - queueHead = current; - } else { - queueHead = current; - queueTail = current; - self.saturated(); - } - } else { - _running++; - worker.call(context, current.value, current.worked); - } - } - function release(holder) { - if (holder) { - cache3.release(holder); - } - var next = queueHead; - if (next && _running <= _concurrency) { - if (!self.paused) { - if (queueTail === queueHead) { - queueTail = null; - } - queueHead = next.next; - next.next = null; - worker.call(context, next.value, next.worked); - if (queueTail === null) { - self.empty(); - } - } else { - _running--; - } - } else if (--_running === 0) { - self.drain(); - } - } - function kill() { - queueHead = null; - queueTail = null; - self.drain = noop3; - } - function killAndDrain() { - queueHead = null; - queueTail = null; - self.drain(); - self.drain = noop3; - } - function abort() { - var current = queueHead; - queueHead = null; - queueTail = null; - while (current) { - var next = current.next; - var callback = current.callback; - var errorHandler2 = current.errorHandler; - var val = current.value; - var context2 = current.context; - current.value = null; - current.callback = noop3; - current.errorHandler = null; - if (errorHandler2) { - errorHandler2(new Error("abort"), val); - } - callback.call(context2, new Error("abort")); - current.release(current); - current = next; - } - self.drain = noop3; - } - function error(handler2) { - errorHandler = handler2; - } - } - function noop3() {} - function Task() { - this.value = null; - this.callback = noop3; - this.next = null; - this.release = noop3; - this.context = null; - this.errorHandler = null; - var self = this; - this.worked = function worked(err, result) { - var callback = self.callback; - var errorHandler = self.errorHandler; - var val = self.value; - self.value = null; - self.callback = noop3; - if (self.errorHandler) { - errorHandler(err, val); - } - callback.call(self.context, err, result); - self.release(self); - }; - } - function queueAsPromised(context, worker, _concurrency) { - if (typeof context === "function") { - _concurrency = worker; - worker = context; - context = null; - } - function asyncWrapper(arg, cb) { - worker.call(this, arg).then(function (res) { - cb(null, res); - }, cb); - } - var queue = fastqueue(context, asyncWrapper, _concurrency); - var pushCb = queue.push; - var unshiftCb = queue.unshift; - queue.push = push; - queue.unshift = unshift; - queue.drained = drained; - return queue; - function push(value) { - var p = new Promise(function (resolve, reject) { - pushCb(value, function (err, result) { - if (err) { - reject(err); - return; - } - resolve(result); - }); - }); - p.catch(noop3); - return p; - } - function unshift(value) { - var p = new Promise(function (resolve, reject) { - unshiftCb(value, function (err, result) { - if (err) { - reject(err); - return; - } - resolve(result); - }); - }); - p.catch(noop3); - return p; - } - function drained() { - var p = new Promise(function (resolve) { - process.nextTick(function () { - if (queue.idle()) { - resolve(); - } else { - var previousDrain = queue.drain; - queue.drain = function () { - if (typeof previousDrain === "function") previousDrain(); - resolve(); - queue.drain = previousDrain; - }; - } - }); - }); - return p; - } - } - module2.exports = fastqueue; - module2.exports.promise = queueAsPromised; - } -}); - -// ../node_modules/@nodelib/fs.walk/out/readers/common.js -var require_common2 = __commonJS({ - "../node_modules/@nodelib/fs.walk/out/readers/common.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.joinPathSegments = - exports2.replacePathSegmentSeparator = - exports2.isAppliedFilter = - exports2.isFatalError = - void 0; - function isFatalError(settings, error) { - if (settings.errorFilter === null) { - return true; - } - return !settings.errorFilter(error); - } - exports2.isFatalError = isFatalError; - function isAppliedFilter(filter, value) { - return filter === null || filter(value); - } - exports2.isAppliedFilter = isAppliedFilter; - function replacePathSegmentSeparator(filepath, separator) { - return filepath.split(/[/\\]/).join(separator); - } - exports2.replacePathSegmentSeparator = replacePathSegmentSeparator; - function joinPathSegments(a, b, separator) { - if (a === "") { - return b; - } - if (a.endsWith(separator)) { - return a + b; - } - return a + separator + b; - } - exports2.joinPathSegments = joinPathSegments; - } -}); - -// ../node_modules/@nodelib/fs.walk/out/readers/reader.js -var require_reader = __commonJS({ - "../node_modules/@nodelib/fs.walk/out/readers/reader.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var common = require_common2(); - var Reader = class { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); - } - }; - exports2.default = Reader; - } -}); - -// ../node_modules/@nodelib/fs.walk/out/readers/async.js -var require_async3 = __commonJS({ - "../node_modules/@nodelib/fs.walk/out/readers/async.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var events_1 = require("events"); - var fsScandir = require_out2(); - var fastq = require_queue(); - var common = require_common2(); - var reader_1 = require_reader(); - var AsyncReader = class extends reader_1.default { - constructor(_root, _settings) { - super(_root, _settings); - this._settings = _settings; - this._scandir = fsScandir.scandir; - this._emitter = new events_1.EventEmitter(); - this._queue = fastq(this._worker.bind(this), this._settings.concurrency); - this._isFatalError = false; - this._isDestroyed = false; - this._queue.drain = () => { - if (!this._isFatalError) { - this._emitter.emit("end"); - } - }; - } - read() { - this._isFatalError = false; - this._isDestroyed = false; - setImmediate(() => { - this._pushToQueue(this._root, this._settings.basePath); - }); - return this._emitter; - } - get isDestroyed() { - return this._isDestroyed; - } - destroy() { - if (this._isDestroyed) { - throw new Error("The reader is already destroyed"); - } - this._isDestroyed = true; - this._queue.killAndDrain(); - } - onEntry(callback) { - this._emitter.on("entry", callback); - } - onError(callback) { - this._emitter.once("error", callback); - } - onEnd(callback) { - this._emitter.once("end", callback); - } - _pushToQueue(directory, base) { - const queueItem = { directory, base }; - this._queue.push(queueItem, (error) => { - if (error !== null) { - this._handleError(error); - } - }); - } - _worker(item, done) { - this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => { - if (error !== null) { - done(error, void 0); - return; - } - for (const entry of entries) { - this._handleEntry(entry, item.base); - } - done(null, void 0); - }); - } - _handleError(error) { - if (this._isDestroyed || !common.isFatalError(this._settings, error)) { - return; - } - this._isFatalError = true; - this._isDestroyed = true; - this._emitter.emit("error", error); - } - _handleEntry(entry, base) { - if (this._isDestroyed || this._isFatalError) { - return; - } - const fullpath = entry.path; - if (base !== void 0) { - entry.path = common.joinPathSegments( - base, - entry.name, - this._settings.pathSegmentSeparator - ); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._emitEntry(entry); - } - if ( - entry.dirent.isDirectory() && - common.isAppliedFilter(this._settings.deepFilter, entry) - ) { - this._pushToQueue(fullpath, base === void 0 ? void 0 : entry.path); - } - } - _emitEntry(entry) { - this._emitter.emit("entry", entry); - } - }; - exports2.default = AsyncReader; - } -}); - -// ../node_modules/@nodelib/fs.walk/out/providers/async.js -var require_async4 = __commonJS({ - "../node_modules/@nodelib/fs.walk/out/providers/async.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var async_1 = require_async3(); - var AsyncProvider = class { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._storage = []; - } - read(callback) { - this._reader.onError((error) => { - callFailureCallback(callback, error); - }); - this._reader.onEntry((entry) => { - this._storage.push(entry); - }); - this._reader.onEnd(() => { - callSuccessCallback(callback, this._storage); - }); - this._reader.read(); - } - }; - exports2.default = AsyncProvider; - function callFailureCallback(callback, error) { - callback(error); - } - function callSuccessCallback(callback, entries) { - callback(null, entries); - } - } -}); - -// ../node_modules/@nodelib/fs.walk/out/providers/stream.js -var require_stream2 = __commonJS({ - "../node_modules/@nodelib/fs.walk/out/providers/stream.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var stream_1 = require("stream"); - var async_1 = require_async3(); - var StreamProvider = class { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._stream = new stream_1.Readable({ - objectMode: true, - read: () => {}, - destroy: () => { - if (!this._reader.isDestroyed) { - this._reader.destroy(); - } - } - }); - } - read() { - this._reader.onError((error) => { - this._stream.emit("error", error); - }); - this._reader.onEntry((entry) => { - this._stream.push(entry); - }); - this._reader.onEnd(() => { - this._stream.push(null); - }); - this._reader.read(); - return this._stream; - } - }; - exports2.default = StreamProvider; - } -}); - -// ../node_modules/@nodelib/fs.walk/out/readers/sync.js -var require_sync3 = __commonJS({ - "../node_modules/@nodelib/fs.walk/out/readers/sync.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var fsScandir = require_out2(); - var common = require_common2(); - var reader_1 = require_reader(); - var SyncReader = class extends reader_1.default { - constructor() { - super(...arguments); - this._scandir = fsScandir.scandirSync; - this._storage = []; - this._queue = /* @__PURE__ */ new Set(); - } - read() { - this._pushToQueue(this._root, this._settings.basePath); - this._handleQueue(); - return this._storage; - } - _pushToQueue(directory, base) { - this._queue.add({ directory, base }); - } - _handleQueue() { - for (const item of this._queue.values()) { - this._handleDirectory(item.directory, item.base); - } - } - _handleDirectory(directory, base) { - try { - const entries = this._scandir(directory, this._settings.fsScandirSettings); - for (const entry of entries) { - this._handleEntry(entry, base); - } - } catch (error) { - this._handleError(error); - } - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - throw error; - } - _handleEntry(entry, base) { - const fullpath = entry.path; - if (base !== void 0) { - entry.path = common.joinPathSegments( - base, - entry.name, - this._settings.pathSegmentSeparator - ); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._pushToStorage(entry); - } - if ( - entry.dirent.isDirectory() && - common.isAppliedFilter(this._settings.deepFilter, entry) - ) { - this._pushToQueue(fullpath, base === void 0 ? void 0 : entry.path); - } - } - _pushToStorage(entry) { - this._storage.push(entry); - } - }; - exports2.default = SyncReader; - } -}); - -// ../node_modules/@nodelib/fs.walk/out/providers/sync.js -var require_sync4 = __commonJS({ - "../node_modules/@nodelib/fs.walk/out/providers/sync.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var sync_1 = require_sync3(); - var SyncProvider = class { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new sync_1.default(this._root, this._settings); - } - read() { - return this._reader.read(); - } - }; - exports2.default = SyncProvider; - } -}); - -// ../node_modules/@nodelib/fs.walk/out/settings.js -var require_settings3 = __commonJS({ - "../node_modules/@nodelib/fs.walk/out/settings.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var path11 = require("path"); - var fsScandir = require_out2(); - var Settings = class { - constructor(_options = {}) { - this._options = _options; - this.basePath = this._getValue(this._options.basePath, void 0); - this.concurrency = this._getValue(this._options.concurrency, Number.POSITIVE_INFINITY); - this.deepFilter = this._getValue(this._options.deepFilter, null); - this.entryFilter = this._getValue(this._options.entryFilter, null); - this.errorFilter = this._getValue(this._options.errorFilter, null); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path11.sep); - this.fsScandirSettings = new fsScandir.Settings({ - followSymbolicLinks: this._options.followSymbolicLinks, - fs: this._options.fs, - pathSegmentSeparator: this._options.pathSegmentSeparator, - stats: this._options.stats, - throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option !== null && option !== void 0 ? option : value; - } - }; - exports2.default = Settings; - } -}); - -// ../node_modules/@nodelib/fs.walk/out/index.js -var require_out3 = __commonJS({ - "../node_modules/@nodelib/fs.walk/out/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Settings = exports2.walkStream = exports2.walkSync = exports2.walk = void 0; - var async_1 = require_async4(); - var stream_1 = require_stream2(); - var sync_1 = require_sync4(); - var settings_1 = require_settings3(); - exports2.Settings = settings_1.default; - function walk(directory, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === "function") { - new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback); - return; - } - new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback); - } - exports2.walk = walk; - function walkSync(directory, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new sync_1.default(directory, settings); - return provider.read(); - } - exports2.walkSync = walkSync; - function walkStream(directory, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new stream_1.default(directory, settings); - return provider.read(); - } - exports2.walkStream = walkStream; - function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; - } - return new settings_1.default(settingsOrOptions); - } - } -}); - -// ../node_modules/fast-glob/out/readers/reader.js -var require_reader2 = __commonJS({ - "../node_modules/fast-glob/out/readers/reader.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var path11 = require("path"); - var fsStat = require_out(); - var utils = require_utils3(); - var Reader = class { - constructor(_settings) { - this._settings = _settings; - this._fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this._settings.followSymbolicLinks, - fs: this._settings.fs, - throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks - }); - } - _getFullEntryPath(filepath) { - return path11.resolve(this._settings.cwd, filepath); - } - _makeEntry(stats, pattern) { - const entry = { - name: pattern, - path: pattern, - dirent: utils.fs.createDirentFromStats(pattern, stats) - }; - if (this._settings.stats) { - entry.stats = stats; - } - return entry; - } - _isFatalError(error) { - return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; - } - }; - exports2.default = Reader; - } -}); - -// ../node_modules/fast-glob/out/readers/stream.js -var require_stream3 = __commonJS({ - "../node_modules/fast-glob/out/readers/stream.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var stream_1 = require("stream"); - var fsStat = require_out(); - var fsWalk = require_out3(); - var reader_1 = require_reader2(); - var ReaderStream = class extends reader_1.default { - constructor() { - super(...arguments); - this._walkStream = fsWalk.walkStream; - this._stat = fsStat.stat; - } - dynamic(root, options) { - return this._walkStream(root, options); - } - static(patterns, options) { - const filepaths = patterns.map(this._getFullEntryPath, this); - const stream = new stream_1.PassThrough({ objectMode: true }); - stream._write = (index, _enc, done) => { - return this._getEntry(filepaths[index], patterns[index], options) - .then((entry) => { - if (entry !== null && options.entryFilter(entry)) { - stream.push(entry); - } - if (index === filepaths.length - 1) { - stream.end(); - } - done(); - }) - .catch(done); - }; - for (let i = 0; i < filepaths.length; i++) { - stream.write(i); - } - return stream; - } - _getEntry(filepath, pattern, options) { - return this._getStat(filepath) - .then((stats) => this._makeEntry(stats, pattern)) - .catch((error) => { - if (options.errorFilter(error)) { - return null; - } - throw error; - }); - } - _getStat(filepath) { - return new Promise((resolve, reject) => { - this._stat(filepath, this._fsStatSettings, (error, stats) => { - return error === null ? resolve(stats) : reject(error); - }); - }); - } - }; - exports2.default = ReaderStream; - } -}); - -// ../node_modules/fast-glob/out/readers/async.js -var require_async5 = __commonJS({ - "../node_modules/fast-glob/out/readers/async.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var fsWalk = require_out3(); - var reader_1 = require_reader2(); - var stream_1 = require_stream3(); - var ReaderAsync = class extends reader_1.default { - constructor() { - super(...arguments); - this._walkAsync = fsWalk.walk; - this._readerStream = new stream_1.default(this._settings); - } - dynamic(root, options) { - return new Promise((resolve, reject) => { - this._walkAsync(root, options, (error, entries) => { - if (error === null) { - resolve(entries); - } else { - reject(error); - } - }); - }); - } - async static(patterns, options) { - const entries = []; - const stream = this._readerStream.static(patterns, options); - return new Promise((resolve, reject) => { - stream.once("error", reject); - stream.on("data", (entry) => entries.push(entry)); - stream.once("end", () => resolve(entries)); - }); - } - }; - exports2.default = ReaderAsync; - } -}); - -// ../node_modules/fast-glob/out/providers/matchers/matcher.js -var require_matcher = __commonJS({ - "../node_modules/fast-glob/out/providers/matchers/matcher.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var utils = require_utils3(); - var Matcher = class { - constructor(_patterns, _settings, _micromatchOptions) { - this._patterns = _patterns; - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this._storage = []; - this._fillStorage(); - } - _fillStorage() { - for (const pattern of this._patterns) { - const segments = this._getPatternSegments(pattern); - const sections = this._splitSegmentsIntoSections(segments); - this._storage.push({ - complete: sections.length <= 1, - pattern, - segments, - sections - }); - } - } - _getPatternSegments(pattern) { - const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions); - return parts.map((part) => { - const dynamic = utils.pattern.isDynamicPattern(part, this._settings); - if (!dynamic) { - return { - dynamic: false, - pattern: part - }; - } - return { - dynamic: true, - pattern: part, - patternRe: utils.pattern.makeRe(part, this._micromatchOptions) - }; - }); - } - _splitSegmentsIntoSections(segments) { - return utils.array.splitWhen( - segments, - (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern) - ); - } - }; - exports2.default = Matcher; - } -}); - -// ../node_modules/fast-glob/out/providers/matchers/partial.js -var require_partial = __commonJS({ - "../node_modules/fast-glob/out/providers/matchers/partial.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var matcher_1 = require_matcher(); - var PartialMatcher = class extends matcher_1.default { - match(filepath) { - const parts = filepath.split("/"); - const levels = parts.length; - const patterns = this._storage.filter( - (info) => !info.complete || info.segments.length > levels - ); - for (const pattern of patterns) { - const section = pattern.sections[0]; - if (!pattern.complete && levels > section.length) { - return true; - } - const match = parts.every((part, index) => { - const segment = pattern.segments[index]; - if (segment.dynamic && segment.patternRe.test(part)) { - return true; - } - if (!segment.dynamic && segment.pattern === part) { - return true; - } - return false; - }); - if (match) { - return true; - } - } - return false; - } - }; - exports2.default = PartialMatcher; - } -}); - -// ../node_modules/fast-glob/out/providers/filters/deep.js -var require_deep = __commonJS({ - "../node_modules/fast-glob/out/providers/filters/deep.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var utils = require_utils3(); - var partial_1 = require_partial(); - var DeepFilter = class { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - } - getFilter(basePath, positive, negative) { - const matcher = this._getMatcher(positive); - const negativeRe = this._getNegativePatternsRe(negative); - return (entry) => this._filter(basePath, entry, matcher, negativeRe); - } - _getMatcher(patterns) { - return new partial_1.default(patterns, this._settings, this._micromatchOptions); - } - _getNegativePatternsRe(patterns) { - const affectDepthOfReadingPatterns = patterns.filter( - utils.pattern.isAffectDepthOfReadingPattern - ); - return utils.pattern.convertPatternsToRe( - affectDepthOfReadingPatterns, - this._micromatchOptions - ); - } - _filter(basePath, entry, matcher, negativeRe) { - if (this._isSkippedByDeep(basePath, entry.path)) { - return false; - } - if (this._isSkippedSymbolicLink(entry)) { - return false; - } - const filepath = utils.path.removeLeadingDotSegment(entry.path); - if (this._isSkippedByPositivePatterns(filepath, matcher)) { - return false; - } - return this._isSkippedByNegativePatterns(filepath, negativeRe); - } - _isSkippedByDeep(basePath, entryPath) { - if (this._settings.deep === Infinity) { - return false; - } - return this._getEntryLevel(basePath, entryPath) >= this._settings.deep; - } - _getEntryLevel(basePath, entryPath) { - const entryPathDepth = entryPath.split("/").length; - if (basePath === "") { - return entryPathDepth; - } - const basePathDepth = basePath.split("/").length; - return entryPathDepth - basePathDepth; - } - _isSkippedSymbolicLink(entry) { - return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); - } - _isSkippedByPositivePatterns(entryPath, matcher) { - return !this._settings.baseNameMatch && !matcher.match(entryPath); - } - _isSkippedByNegativePatterns(entryPath, patternsRe) { - return !utils.pattern.matchAny(entryPath, patternsRe); - } - }; - exports2.default = DeepFilter; - } -}); - -// ../node_modules/fast-glob/out/providers/filters/entry.js -var require_entry = __commonJS({ - "../node_modules/fast-glob/out/providers/filters/entry.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var utils = require_utils3(); - var EntryFilter = class { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this.index = /* @__PURE__ */ new Map(); - } - getFilter(positive, negative) { - const [absoluteNegative, relativeNegative] = - utils.pattern.partitionAbsoluteAndRelative(negative); - const patterns = { - positive: { - all: utils.pattern.convertPatternsToRe(positive, this._micromatchOptions) - }, - negative: { - absolute: utils.pattern.convertPatternsToRe( - absoluteNegative, - Object.assign(Object.assign({}, this._micromatchOptions), { dot: true }) - ), - relative: utils.pattern.convertPatternsToRe( - relativeNegative, - Object.assign(Object.assign({}, this._micromatchOptions), { dot: true }) - ) - } - }; - return (entry) => this._filter(entry, patterns); - } - _filter(entry, patterns) { - const filepath = utils.path.removeLeadingDotSegment(entry.path); - if (this._settings.unique && this._isDuplicateEntry(filepath)) { - return false; - } - if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { - return false; - } - const isMatched = this._isMatchToPatternsSet( - filepath, - patterns, - entry.dirent.isDirectory() - ); - if (this._settings.unique && isMatched) { - this._createIndexRecord(filepath); - } - return isMatched; - } - _isDuplicateEntry(filepath) { - return this.index.has(filepath); - } - _createIndexRecord(filepath) { - this.index.set(filepath, void 0); - } - _onlyFileFilter(entry) { - return this._settings.onlyFiles && !entry.dirent.isFile(); - } - _onlyDirectoryFilter(entry) { - return this._settings.onlyDirectories && !entry.dirent.isDirectory(); - } - _isMatchToPatternsSet(filepath, patterns, isDirectory) { - const isMatched = this._isMatchToPatterns(filepath, patterns.positive.all, isDirectory); - if (!isMatched) { - return false; - } - const isMatchedByRelativeNegative = this._isMatchToPatterns( - filepath, - patterns.negative.relative, - isDirectory - ); - if (isMatchedByRelativeNegative) { - return false; - } - const isMatchedByAbsoluteNegative = this._isMatchToAbsoluteNegative( - filepath, - patterns.negative.absolute, - isDirectory - ); - if (isMatchedByAbsoluteNegative) { - return false; - } - return true; - } - _isMatchToAbsoluteNegative(filepath, patternsRe, isDirectory) { - if (patternsRe.length === 0) { - return false; - } - const fullpath = utils.path.makeAbsolute(this._settings.cwd, filepath); - return this._isMatchToPatterns(fullpath, patternsRe, isDirectory); - } - _isMatchToPatterns(filepath, patternsRe, isDirectory) { - if (patternsRe.length === 0) { - return false; - } - const isMatched = utils.pattern.matchAny(filepath, patternsRe); - if (!isMatched && isDirectory) { - return utils.pattern.matchAny(filepath + "/", patternsRe); - } - return isMatched; - } - }; - exports2.default = EntryFilter; - } -}); - -// ../node_modules/fast-glob/out/providers/filters/error.js -var require_error = __commonJS({ - "../node_modules/fast-glob/out/providers/filters/error.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var utils = require_utils3(); - var ErrorFilter = class { - constructor(_settings) { - this._settings = _settings; - } - getFilter() { - return (error) => this._isNonFatalError(error); - } - _isNonFatalError(error) { - return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; - } - }; - exports2.default = ErrorFilter; - } -}); - -// ../node_modules/fast-glob/out/providers/transformers/entry.js -var require_entry2 = __commonJS({ - "../node_modules/fast-glob/out/providers/transformers/entry.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var utils = require_utils3(); - var EntryTransformer = class { - constructor(_settings) { - this._settings = _settings; - } - getTransformer() { - return (entry) => this._transform(entry); - } - _transform(entry) { - let filepath = entry.path; - if (this._settings.absolute) { - filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); - filepath = utils.path.unixify(filepath); - } - if (this._settings.markDirectories && entry.dirent.isDirectory()) { - filepath += "/"; - } - if (!this._settings.objectMode) { - return filepath; - } - return Object.assign(Object.assign({}, entry), { path: filepath }); - } - }; - exports2.default = EntryTransformer; - } -}); - -// ../node_modules/fast-glob/out/providers/provider.js -var require_provider = __commonJS({ - "../node_modules/fast-glob/out/providers/provider.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var path11 = require("path"); - var deep_1 = require_deep(); - var entry_1 = require_entry(); - var error_1 = require_error(); - var entry_2 = require_entry2(); - var Provider = class { - constructor(_settings) { - this._settings = _settings; - this.errorFilter = new error_1.default(this._settings); - this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); - this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); - this.entryTransformer = new entry_2.default(this._settings); - } - _getRootDirectory(task) { - return path11.resolve(this._settings.cwd, task.base); - } - _getReaderOptions(task) { - const basePath = task.base === "." ? "" : task.base; - return { - basePath, - pathSegmentSeparator: "/", - concurrency: this._settings.concurrency, - deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), - entryFilter: this.entryFilter.getFilter(task.positive, task.negative), - errorFilter: this.errorFilter.getFilter(), - followSymbolicLinks: this._settings.followSymbolicLinks, - fs: this._settings.fs, - stats: this._settings.stats, - throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, - transform: this.entryTransformer.getTransformer() - }; - } - _getMicromatchOptions() { - return { - dot: this._settings.dot, - matchBase: this._settings.baseNameMatch, - nobrace: !this._settings.braceExpansion, - nocase: !this._settings.caseSensitiveMatch, - noext: !this._settings.extglob, - noglobstar: !this._settings.globstar, - posix: true, - strictSlashes: false - }; - } - }; - exports2.default = Provider; - } -}); - -// ../node_modules/fast-glob/out/providers/async.js -var require_async6 = __commonJS({ - "../node_modules/fast-glob/out/providers/async.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var async_1 = require_async5(); - var provider_1 = require_provider(); - var ProviderAsync = class extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new async_1.default(this._settings); - } - async read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = await this.api(root, task, options); - return entries.map((entry) => options.transform(entry)); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } - }; - exports2.default = ProviderAsync; - } -}); - -// ../node_modules/fast-glob/out/providers/stream.js -var require_stream4 = __commonJS({ - "../node_modules/fast-glob/out/providers/stream.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var stream_1 = require("stream"); - var stream_2 = require_stream3(); - var provider_1 = require_provider(); - var ProviderStream = class extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_2.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const source = this.api(root, task, options); - const destination = new stream_1.Readable({ objectMode: true, read: () => {} }); - source - .once("error", (error) => destination.emit("error", error)) - .on("data", (entry) => destination.emit("data", options.transform(entry))) - .once("end", () => destination.emit("end")); - destination.once("close", () => source.destroy()); - return destination; - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } - }; - exports2.default = ProviderStream; - } -}); - -// ../node_modules/fast-glob/out/readers/sync.js -var require_sync5 = __commonJS({ - "../node_modules/fast-glob/out/readers/sync.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var fsStat = require_out(); - var fsWalk = require_out3(); - var reader_1 = require_reader2(); - var ReaderSync = class extends reader_1.default { - constructor() { - super(...arguments); - this._walkSync = fsWalk.walkSync; - this._statSync = fsStat.statSync; - } - dynamic(root, options) { - return this._walkSync(root, options); - } - static(patterns, options) { - const entries = []; - for (const pattern of patterns) { - const filepath = this._getFullEntryPath(pattern); - const entry = this._getEntry(filepath, pattern, options); - if (entry === null || !options.entryFilter(entry)) { - continue; - } - entries.push(entry); - } - return entries; - } - _getEntry(filepath, pattern, options) { - try { - const stats = this._getStat(filepath); - return this._makeEntry(stats, pattern); - } catch (error) { - if (options.errorFilter(error)) { - return null; - } - throw error; - } - } - _getStat(filepath) { - return this._statSync(filepath, this._fsStatSettings); - } - }; - exports2.default = ReaderSync; - } -}); - -// ../node_modules/fast-glob/out/providers/sync.js -var require_sync6 = __commonJS({ - "../node_modules/fast-glob/out/providers/sync.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var sync_1 = require_sync5(); - var provider_1 = require_provider(); - var ProviderSync = class extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new sync_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = this.api(root, task, options); - return entries.map(options.transform); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } - }; - exports2.default = ProviderSync; - } -}); - -// ../node_modules/fast-glob/out/settings.js -var require_settings4 = __commonJS({ - "../node_modules/fast-glob/out/settings.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.DEFAULT_FILE_SYSTEM_ADAPTER = void 0; - var fs9 = require("fs"); - var os = require("os"); - var CPU_COUNT = Math.max(os.cpus().length, 1); - exports2.DEFAULT_FILE_SYSTEM_ADAPTER = { - lstat: fs9.lstat, - lstatSync: fs9.lstatSync, - stat: fs9.stat, - statSync: fs9.statSync, - readdir: fs9.readdir, - readdirSync: fs9.readdirSync - }; - var Settings = class { - constructor(_options = {}) { - this._options = _options; - this.absolute = this._getValue(this._options.absolute, false); - this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); - this.braceExpansion = this._getValue(this._options.braceExpansion, true); - this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); - this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); - this.cwd = this._getValue(this._options.cwd, process.cwd()); - this.deep = this._getValue(this._options.deep, Infinity); - this.dot = this._getValue(this._options.dot, false); - this.extglob = this._getValue(this._options.extglob, true); - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); - this.fs = this._getFileSystemMethods(this._options.fs); - this.globstar = this._getValue(this._options.globstar, true); - this.ignore = this._getValue(this._options.ignore, []); - this.markDirectories = this._getValue(this._options.markDirectories, false); - this.objectMode = this._getValue(this._options.objectMode, false); - this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); - this.onlyFiles = this._getValue(this._options.onlyFiles, true); - this.stats = this._getValue(this._options.stats, false); - this.suppressErrors = this._getValue(this._options.suppressErrors, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue( - this._options.throwErrorOnBrokenSymbolicLink, - false - ); - this.unique = this._getValue(this._options.unique, true); - if (this.onlyDirectories) { - this.onlyFiles = false; - } - if (this.stats) { - this.objectMode = true; - } - this.ignore = [].concat(this.ignore); - } - _getValue(option, value) { - return option === void 0 ? value : option; - } - _getFileSystemMethods(methods = {}) { - return Object.assign(Object.assign({}, exports2.DEFAULT_FILE_SYSTEM_ADAPTER), methods); - } - }; - exports2.default = Settings; - } -}); - -// ../node_modules/fast-glob/out/index.js -var require_out4 = __commonJS({ - "../node_modules/fast-glob/out/index.js"(exports2, module2) { - "use strict"; - var taskManager = require_tasks(); - var async_1 = require_async6(); - var stream_1 = require_stream4(); - var sync_1 = require_sync6(); - var settings_1 = require_settings4(); - var utils = require_utils3(); - async function FastGlob(source, options) { - assertPatternsInput(source); - const works = getWorks(source, async_1.default, options); - const result = await Promise.all(works); - return utils.array.flatten(result); - } - (function (FastGlob2) { - FastGlob2.glob = FastGlob2; - FastGlob2.globSync = sync; - FastGlob2.globStream = stream; - FastGlob2.async = FastGlob2; - function sync(source, options) { - assertPatternsInput(source); - const works = getWorks(source, sync_1.default, options); - return utils.array.flatten(works); - } - FastGlob2.sync = sync; - function stream(source, options) { - assertPatternsInput(source); - const works = getWorks(source, stream_1.default, options); - return utils.stream.merge(works); - } - FastGlob2.stream = stream; - function generateTasks(source, options) { - assertPatternsInput(source); - const patterns = [].concat(source); - const settings = new settings_1.default(options); - return taskManager.generate(patterns, settings); - } - FastGlob2.generateTasks = generateTasks; - function isDynamicPattern(source, options) { - assertPatternsInput(source); - const settings = new settings_1.default(options); - return utils.pattern.isDynamicPattern(source, settings); - } - FastGlob2.isDynamicPattern = isDynamicPattern; - function escapePath(source) { - assertPatternsInput(source); - return utils.path.escape(source); - } - FastGlob2.escapePath = escapePath; - function convertPathToPattern(source) { - assertPatternsInput(source); - return utils.path.convertPathToPattern(source); - } - FastGlob2.convertPathToPattern = convertPathToPattern; - let posix; - (function (posix2) { - function escapePath2(source) { - assertPatternsInput(source); - return utils.path.escapePosixPath(source); - } - posix2.escapePath = escapePath2; - function convertPathToPattern2(source) { - assertPatternsInput(source); - return utils.path.convertPosixPathToPattern(source); - } - posix2.convertPathToPattern = convertPathToPattern2; - })((posix = FastGlob2.posix || (FastGlob2.posix = {}))); - let win32; - (function (win322) { - function escapePath2(source) { - assertPatternsInput(source); - return utils.path.escapeWindowsPath(source); - } - win322.escapePath = escapePath2; - function convertPathToPattern2(source) { - assertPatternsInput(source); - return utils.path.convertWindowsPathToPattern(source); - } - win322.convertPathToPattern = convertPathToPattern2; - })((win32 = FastGlob2.win32 || (FastGlob2.win32 = {}))); - })(FastGlob || (FastGlob = {})); - function getWorks(source, _Provider, options) { - const patterns = [].concat(source); - const settings = new settings_1.default(options); - const tasks = taskManager.generate(patterns, settings); - const provider = new _Provider(settings); - return tasks.map(provider.read, provider); - } - function assertPatternsInput(input) { - const source = [].concat(input); - const isValidSource = source.every( - (item) => utils.string.isString(item) && !utils.string.isEmpty(item) - ); - if (!isValidSource) { - throw new TypeError("Patterns must be a string (non empty) or an array of strings"); - } - } - module2.exports = FastGlob; - } -}); - -// ../node_modules/ms/index.js -var require_ms = __commonJS({ - "../node_modules/ms/index.js"(exports2, module2) { - var s = 1e3; - var m = s * 60; - var h = m * 60; - var d = h * 24; - var w = d * 7; - var y = d * 365.25; - module2.exports = function (val, options) { - options = options || {}; - var type = typeof val; - if (type === "string" && val.length > 0) { - return parse2(val); - } else if (type === "number" && isFinite(val)) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) - ); - }; - function parse2(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = - /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || "ms").toLowerCase(); - switch (type) { - case "years": - case "year": - case "yrs": - case "yr": - case "y": - return n * y; - case "weeks": - case "week": - case "w": - return n * w; - case "days": - case "day": - case "d": - return n * d; - case "hours": - case "hour": - case "hrs": - case "hr": - case "h": - return n * h; - case "minutes": - case "minute": - case "mins": - case "min": - case "m": - return n * m; - case "seconds": - case "second": - case "secs": - case "sec": - case "s": - return n * s; - case "milliseconds": - case "millisecond": - case "msecs": - case "msec": - case "ms": - return n; - default: - return void 0; - } - } - function fmtShort(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return Math.round(ms / d) + "d"; - } - if (msAbs >= h) { - return Math.round(ms / h) + "h"; - } - if (msAbs >= m) { - return Math.round(ms / m) + "m"; - } - if (msAbs >= s) { - return Math.round(ms / s) + "s"; - } - return ms + "ms"; - } - function fmtLong(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return plural(ms, msAbs, d, "day"); - } - if (msAbs >= h) { - return plural(ms, msAbs, h, "hour"); - } - if (msAbs >= m) { - return plural(ms, msAbs, m, "minute"); - } - if (msAbs >= s) { - return plural(ms, msAbs, s, "second"); - } - return ms + " ms"; - } - function plural(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + " " + name + (isPlural ? "s" : ""); - } - } -}); - -// ../node_modules/debug/src/common.js -var require_common3 = __commonJS({ - "../node_modules/debug/src/common.js"(exports2, module2) { - function setup(env2) { - createDebug.debug = createDebug; - createDebug.default = createDebug; - createDebug.coerce = coerce; - createDebug.disable = disable; - createDebug.enable = enable; - createDebug.enabled = enabled; - createDebug.humanize = require_ms(); - createDebug.destroy = destroy; - Object.keys(env2).forEach((key) => { - createDebug[key] = env2[key]; - }); - createDebug.names = []; - createDebug.skips = []; - createDebug.formatters = {}; - function selectColor(namespace) { - let hash = 0; - for (let i = 0; i < namespace.length; i++) { - hash = (hash << 5) - hash + namespace.charCodeAt(i); - hash |= 0; - } - return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; - } - createDebug.selectColor = selectColor; - function createDebug(namespace) { - let prevTime; - let enableOverride = null; - let namespacesCache; - let enabledCache; - function debug3(...args) { - if (!debug3.enabled) { - return; - } - const self = debug3; - const curr = Number(/* @__PURE__ */ new Date()); - const ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - args[0] = createDebug.coerce(args[0]); - if (typeof args[0] !== "string") { - args.unshift("%O"); - } - let index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { - if (match === "%%") { - return "%"; - } - index++; - const formatter = createDebug.formatters[format]; - if (typeof formatter === "function") { - const val = args[index]; - match = formatter.call(self, val); - args.splice(index, 1); - index--; - } - return match; - }); - createDebug.formatArgs.call(self, args); - const logFn = self.log || createDebug.log; - logFn.apply(self, args); - } - debug3.namespace = namespace; - debug3.useColors = createDebug.useColors(); - debug3.color = createDebug.selectColor(namespace); - debug3.extend = extend; - debug3.destroy = createDebug.destroy; - Object.defineProperty(debug3, "enabled", { - enumerable: true, - configurable: false, - get: () => { - if (enableOverride !== null) { - return enableOverride; - } - if (namespacesCache !== createDebug.namespaces) { - namespacesCache = createDebug.namespaces; - enabledCache = createDebug.enabled(namespace); - } - return enabledCache; - }, - set: (v) => { - enableOverride = v; - } - }); - if (typeof createDebug.init === "function") { - createDebug.init(debug3); - } - return debug3; - } - function extend(namespace, delimiter) { - const newDebug = createDebug( - this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace - ); - newDebug.log = this.log; - return newDebug; - } - function enable(namespaces) { - createDebug.save(namespaces); - createDebug.namespaces = namespaces; - createDebug.names = []; - createDebug.skips = []; - const split = (typeof namespaces === "string" ? namespaces : "") - .trim() - .replace(/\s+/g, ",") - .split(",") - .filter(Boolean); - for (const ns of split) { - if (ns[0] === "-") { - createDebug.skips.push(ns.slice(1)); - } else { - createDebug.names.push(ns); - } - } - } - function matchesTemplate(search, template) { - let searchIndex = 0; - let templateIndex = 0; - let starIndex = -1; - let matchIndex = 0; - while (searchIndex < search.length) { - if ( - templateIndex < template.length && - (template[templateIndex] === search[searchIndex] || template[templateIndex] === "*") - ) { - if (template[templateIndex] === "*") { - starIndex = templateIndex; - matchIndex = searchIndex; - templateIndex++; - } else { - searchIndex++; - templateIndex++; - } - } else if (starIndex !== -1) { - templateIndex = starIndex + 1; - matchIndex++; - searchIndex = matchIndex; - } else { - return false; - } - } - while (templateIndex < template.length && template[templateIndex] === "*") { - templateIndex++; - } - return templateIndex === template.length; - } - function disable() { - const namespaces = [ - ...createDebug.names, - ...createDebug.skips.map((namespace) => "-" + namespace) - ].join(","); - createDebug.enable(""); - return namespaces; - } - function enabled(name) { - for (const skip of createDebug.skips) { - if (matchesTemplate(name, skip)) { - return false; - } - } - for (const ns of createDebug.names) { - if (matchesTemplate(name, ns)) { - return true; - } - } - return false; - } - function coerce(val) { - if (val instanceof Error) { - return val.stack || val.message; - } - return val; - } - function destroy() { - console.warn( - "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." - ); - } - createDebug.enable(createDebug.load()); - return createDebug; - } - module2.exports = setup; - } -}); - -// ../node_modules/debug/src/browser.js -var require_browser = __commonJS({ - "../node_modules/debug/src/browser.js"(exports2, module2) { - exports2.formatArgs = formatArgs; - exports2.save = save; - exports2.load = load; - exports2.useColors = useColors; - exports2.storage = localstorage(); - exports2.destroy = /* @__PURE__ */ (() => { - let warned = false; - return () => { - if (!warned) { - warned = true; - console.warn( - "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." - ); - } - }; - })(); - exports2.colors = [ - "#0000CC", - "#0000FF", - "#0033CC", - "#0033FF", - "#0066CC", - "#0066FF", - "#0099CC", - "#0099FF", - "#00CC00", - "#00CC33", - "#00CC66", - "#00CC99", - "#00CCCC", - "#00CCFF", - "#3300CC", - "#3300FF", - "#3333CC", - "#3333FF", - "#3366CC", - "#3366FF", - "#3399CC", - "#3399FF", - "#33CC00", - "#33CC33", - "#33CC66", - "#33CC99", - "#33CCCC", - "#33CCFF", - "#6600CC", - "#6600FF", - "#6633CC", - "#6633FF", - "#66CC00", - "#66CC33", - "#9900CC", - "#9900FF", - "#9933CC", - "#9933FF", - "#99CC00", - "#99CC33", - "#CC0000", - "#CC0033", - "#CC0066", - "#CC0099", - "#CC00CC", - "#CC00FF", - "#CC3300", - "#CC3333", - "#CC3366", - "#CC3399", - "#CC33CC", - "#CC33FF", - "#CC6600", - "#CC6633", - "#CC9900", - "#CC9933", - "#CCCC00", - "#CCCC33", - "#FF0000", - "#FF0033", - "#FF0066", - "#FF0099", - "#FF00CC", - "#FF00FF", - "#FF3300", - "#FF3333", - "#FF3366", - "#FF3399", - "#FF33CC", - "#FF33FF", - "#FF6600", - "#FF6633", - "#FF9900", - "#FF9933", - "#FFCC00", - "#FFCC33" - ]; - function useColors() { - if ( - typeof window !== "undefined" && - window.process && - (window.process.type === "renderer" || window.process.__nwjs) - ) { - return true; - } - if ( - typeof navigator !== "undefined" && - navigator.userAgent && - navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/) - ) { - return false; - } - let m; - return ( - (typeof document !== "undefined" && - document.documentElement && - document.documentElement.style && - document.documentElement.style.WebkitAppearance) || // Is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== "undefined" && - window.console && - (window.console.firebug || (window.console.exception && window.console.table))) || // Is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== "undefined" && - navigator.userAgent && - (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && - parseInt(m[1], 10) >= 31) || // Double check webkit in userAgent just in case we are in a worker - (typeof navigator !== "undefined" && - navigator.userAgent && - navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)) - ); - } - function formatArgs(args) { - args[0] = - (this.useColors ? "%c" : "") + - this.namespace + - (this.useColors ? " %c" : " ") + - args[0] + - (this.useColors ? "%c " : " ") + - "+" + - module2.exports.humanize(this.diff); - if (!this.useColors) { - return; - } - const c = "color: " + this.color; - args.splice(1, 0, c, "color: inherit"); - let index = 0; - let lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, (match) => { - if (match === "%%") { - return; - } - index++; - if (match === "%c") { - lastC = index; - } - }); - args.splice(lastC, 0, c); - } - exports2.log = console.debug || console.log || (() => {}); - function save(namespaces) { - try { - if (namespaces) { - exports2.storage.setItem("debug", namespaces); - } else { - exports2.storage.removeItem("debug"); - } - } catch (error) {} - } - function load() { - let r; - try { - r = exports2.storage.getItem("debug") || exports2.storage.getItem("DEBUG"); - } catch (error) {} - if (!r && typeof process !== "undefined" && "env" in process) { - r = process.env.DEBUG; - } - return r; - } - function localstorage() { - try { - return localStorage; - } catch (error) {} - } - module2.exports = require_common3()(exports2); - var { formatters } = module2.exports; - formatters.j = function (v) { - try { - return JSON.stringify(v); - } catch (error) { - return "[UnexpectedJSONParseError]: " + error.message; - } - }; - } -}); - -// ../node_modules/has-flag/index.js -var require_has_flag = __commonJS({ - "../node_modules/has-flag/index.js"(exports2, module2) { - "use strict"; - module2.exports = (flag, argv = process.argv) => { - const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--"; - const position = argv.indexOf(prefix + flag); - const terminatorPosition = argv.indexOf("--"); - return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); - }; - } -}); - -// ../node_modules/supports-color/index.js -var require_supports_color = __commonJS({ - "../node_modules/supports-color/index.js"(exports2, module2) { - "use strict"; - var os = require("os"); - var tty = require("tty"); - var hasFlag = require_has_flag(); - var { env: env2 } = process; - var forceColor; - if ( - hasFlag("no-color") || - hasFlag("no-colors") || - hasFlag("color=false") || - hasFlag("color=never") - ) { - forceColor = 0; - } else if ( - hasFlag("color") || - hasFlag("colors") || - hasFlag("color=true") || - hasFlag("color=always") - ) { - forceColor = 1; - } - if ("FORCE_COLOR" in env2) { - if (env2.FORCE_COLOR === "true") { - forceColor = 1; - } else if (env2.FORCE_COLOR === "false") { - forceColor = 0; - } else { - forceColor = - env2.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env2.FORCE_COLOR, 10), 3); - } - } - function translateLevel(level) { - if (level === 0) { - return false; - } - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; - } - function supportsColor(haveStream, streamIsTTY) { - if (forceColor === 0) { - return 0; - } - if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) { - return 3; - } - if (hasFlag("color=256")) { - return 2; - } - if (haveStream && !streamIsTTY && forceColor === void 0) { - return 0; - } - const min = forceColor || 0; - if (env2.TERM === "dumb") { - return min; - } - if (process.platform === "win32") { - const osRelease = os.release().split("."); - if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } - return 1; - } - if ("CI" in env2) { - if ( - ["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some( - (sign) => sign in env2 - ) || - env2.CI_NAME === "codeship" - ) { - return 1; - } - return min; - } - if ("TEAMCITY_VERSION" in env2) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env2.TEAMCITY_VERSION) ? 1 : 0; - } - if (env2.COLORTERM === "truecolor") { - return 3; - } - if ("TERM_PROGRAM" in env2) { - const version = parseInt((env2.TERM_PROGRAM_VERSION || "").split(".")[0], 10); - switch (env2.TERM_PROGRAM) { - case "iTerm.app": - return version >= 3 ? 3 : 2; - case "Apple_Terminal": - return 2; - } - } - if (/-256(color)?$/i.test(env2.TERM)) { - return 2; - } - if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env2.TERM)) { - return 1; - } - if ("COLORTERM" in env2) { - return 1; - } - return min; - } - function getSupportLevel(stream) { - const level = supportsColor(stream, stream && stream.isTTY); - return translateLevel(level); - } - module2.exports = { - supportsColor: getSupportLevel, - stdout: translateLevel(supportsColor(true, tty.isatty(1))), - stderr: translateLevel(supportsColor(true, tty.isatty(2))) - }; - } -}); - -// ../node_modules/debug/src/node.js -var require_node = __commonJS({ - "../node_modules/debug/src/node.js"(exports2, module2) { - var tty = require("tty"); - var util = require("util"); - exports2.init = init; - exports2.log = log; - exports2.formatArgs = formatArgs; - exports2.save = save; - exports2.load = load; - exports2.useColors = useColors; - exports2.destroy = util.deprecate( - () => {}, - "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." - ); - exports2.colors = [6, 2, 3, 4, 5, 1]; - try { - const supportsColor = require_supports_color(); - if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { - exports2.colors = [ - 20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, 69, 74, 75, - 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, 135, 148, 149, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 178, 179, 184, 185, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 214, 215, 220, 221 - ]; - } - } catch (error) {} - exports2.inspectOpts = Object.keys(process.env) - .filter((key) => { - return /^debug_/i.test(key); - }) - .reduce((obj, key) => { - const prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, (_, k) => { - return k.toUpperCase(); - }); - let val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) { - val = true; - } else if (/^(no|off|false|disabled)$/i.test(val)) { - val = false; - } else if (val === "null") { - val = null; - } else { - val = Number(val); - } - obj[prop] = val; - return obj; - }, {}); - function useColors() { - return "colors" in exports2.inspectOpts - ? Boolean(exports2.inspectOpts.colors) - : tty.isatty(process.stderr.fd); - } - function formatArgs(args) { - const { namespace: name, useColors: useColors2 } = this; - if (useColors2) { - const c = this.color; - const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c); - const prefix = ` ${colorCode};1m${name} \x1B[0m`; - args[0] = prefix + args[0].split("\n").join("\n" + prefix); - args.push(colorCode + "m+" + module2.exports.humanize(this.diff) + "\x1B[0m"); - } else { - args[0] = getDate() + name + " " + args[0]; - } - } - function getDate() { - if (exports2.inspectOpts.hideDate) { - return ""; - } - return /* @__PURE__ */ new Date().toISOString() + " "; - } - function log(...args) { - return process.stderr.write(util.formatWithOptions(exports2.inspectOpts, ...args) + "\n"); - } - function save(namespaces) { - if (namespaces) { - process.env.DEBUG = namespaces; - } else { - delete process.env.DEBUG; - } - } - function load() { - return process.env.DEBUG; - } - function init(debug3) { - debug3.inspectOpts = {}; - const keys = Object.keys(exports2.inspectOpts); - for (let i = 0; i < keys.length; i++) { - debug3.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; - } - } - module2.exports = require_common3()(exports2); - var { formatters } = module2.exports; - formatters.o = function (v) { - this.inspectOpts.colors = this.useColors; - return util - .inspect(v, this.inspectOpts) - .split("\n") - .map((str) => str.trim()) - .join(" "); - }; - formatters.O = function (v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); - }; - } -}); - -// ../node_modules/debug/src/index.js -var require_src = __commonJS({ - "../node_modules/debug/src/index.js"(exports2, module2) { - if ( - typeof process === "undefined" || - process.type === "renderer" || - process.browser === true || - process.__nwjs - ) { - module2.exports = require_browser(); - } else { - module2.exports = require_node(); - } - } -}); - -// ../node_modules/@kwsites/file-exists/dist/src/index.js -var require_src2 = __commonJS({ - "../node_modules/@kwsites/file-exists/dist/src/index.js"(exports2) { - "use strict"; - var __importDefault = - (exports2 && exports2.__importDefault) || - function (mod) { - return mod && mod.__esModule ? mod : { default: mod }; - }; - Object.defineProperty(exports2, "__esModule", { value: true }); - var fs_1 = require("fs"); - var debug_1 = __importDefault(require_src()); - var log = debug_1.default("@kwsites/file-exists"); - function check(path11, isFile, isDirectory) { - log(`checking %s`, path11); - try { - const stat = fs_1.statSync(path11); - if (stat.isFile() && isFile) { - log(`[OK] path represents a file`); - return true; - } - if (stat.isDirectory() && isDirectory) { - log(`[OK] path represents a directory`); - return true; - } - log(`[FAIL] path represents something other than a file or directory`); - return false; - } catch (e) { - if (e.code === "ENOENT") { - log(`[FAIL] path is not accessible: %o`, e); - return false; - } - log(`[FATAL] %o`, e); - throw e; - } - } - function exists3(path11, type = exports2.READABLE) { - return check(path11, (type & exports2.FILE) > 0, (type & exports2.FOLDER) > 0); - } - exports2.exists = exists3; - exports2.FILE = 1; - exports2.FOLDER = 2; - exports2.READABLE = exports2.FILE + exports2.FOLDER; - } -}); - -// ../node_modules/@kwsites/file-exists/dist/index.js -var require_dist = __commonJS({ - "../node_modules/@kwsites/file-exists/dist/index.js"(exports2) { - "use strict"; - function __export4(m) { - for (var p in m) if (!exports2.hasOwnProperty(p)) exports2[p] = m[p]; - } - Object.defineProperty(exports2, "__esModule", { value: true }); - __export4(require_src2()); - } -}); - -// ../node_modules/@kwsites/promise-deferred/dist/index.js -var require_dist2 = __commonJS({ - "../node_modules/@kwsites/promise-deferred/dist/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.createDeferred = exports2.deferred = void 0; - function deferred3() { - let done; - let fail; - let status = "pending"; - const promise = new Promise((_done, _fail) => { - done = _done; - fail = _fail; - }); - return { - promise, - done(result) { - if (status === "pending") { - status = "resolved"; - done(result); - } - }, - fail(error) { - if (status === "pending") { - status = "rejected"; - fail(error); - } - }, - get fulfilled() { - return status !== "pending"; - }, - get status() { - return status; - } - }; - } - exports2.deferred = deferred3; - exports2.createDeferred = deferred3; - exports2.default = deferred3; - } -}); - -// ../node_modules/fast-content-type-parse/index.js -var require_fast_content_type_parse = __commonJS({ - "../node_modules/fast-content-type-parse/index.js"(exports2, module2) { - "use strict"; - var NullObject = function NullObject2() {}; - NullObject.prototype = /* @__PURE__ */ Object.create(null); - var paramRE = - /; *([!#$%&'*+.^\w`|~-]+)=("(?:[\v\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\v\u0020-\u00ff])*"|[!#$%&'*+.^\w`|~-]+) */gu; - var quotedPairRE = /\\([\v\u0020-\u00ff])/gu; - var mediaTypeRE = /^[!#$%&'*+.^\w|~-]+\/[!#$%&'*+.^\w|~-]+$/u; - var defaultContentType = { type: "", parameters: new NullObject() }; - Object.freeze(defaultContentType.parameters); - Object.freeze(defaultContentType); - function parse2(header) { - if (typeof header !== "string") { - throw new TypeError("argument header is required and must be a string"); - } - let index = header.indexOf(";"); - const type = index !== -1 ? header.slice(0, index).trim() : header.trim(); - if (mediaTypeRE.test(type) === false) { - throw new TypeError("invalid media type"); - } - const result = { - type: type.toLowerCase(), - parameters: new NullObject() - }; - if (index === -1) { - return result; - } - let key; - let match; - let value; - paramRE.lastIndex = index; - while ((match = paramRE.exec(header))) { - if (match.index !== index) { - throw new TypeError("invalid parameter format"); - } - index += match[0].length; - key = match[1].toLowerCase(); - value = match[2]; - if (value[0] === '"') { - value = value.slice(1, value.length - 1); - quotedPairRE.test(value) && (value = value.replace(quotedPairRE, "$1")); - } - result.parameters[key] = value; - } - if (index !== header.length) { - throw new TypeError("invalid parameter format"); - } - return result; - } - function safeParse2(header) { - if (typeof header !== "string") { - return defaultContentType; - } - let index = header.indexOf(";"); - const type = index !== -1 ? header.slice(0, index).trim() : header.trim(); - if (mediaTypeRE.test(type) === false) { - return defaultContentType; - } - const result = { - type: type.toLowerCase(), - parameters: new NullObject() - }; - if (index === -1) { - return result; - } - let key; - let match; - let value; - paramRE.lastIndex = index; - while ((match = paramRE.exec(header))) { - if (match.index !== index) { - return defaultContentType; - } - index += match[0].length; - key = match[1].toLowerCase(); - value = match[2]; - if (value[0] === '"') { - value = value.slice(1, value.length - 1); - quotedPairRE.test(value) && (value = value.replace(quotedPairRE, "$1")); - } - result.parameters[key] = value; - } - if (index !== header.length) { - return defaultContentType; - } - return result; - } - module2.exports.default = { parse: parse2, safeParse: safeParse2 }; - module2.exports.parse = parse2; - module2.exports.safeParse = safeParse2; - module2.exports.defaultContentType = defaultContentType; - } -}); - -// node_modules/ms/index.js -var require_ms2 = __commonJS({ - "node_modules/ms/index.js"(exports2, module2) { - var s = 1e3; - var m = s * 60; - var h = m * 60; - var d = h * 24; - var w = d * 7; - var y = d * 365.25; - module2.exports = function (val, options) { - options = options || {}; - var type = typeof val; - if (type === "string" && val.length > 0) { - return parse2(val); - } else if (type === "number" && isFinite(val)) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) - ); - }; - function parse2(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = - /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || "ms").toLowerCase(); - switch (type) { - case "years": - case "year": - case "yrs": - case "yr": - case "y": - return n * y; - case "weeks": - case "week": - case "w": - return n * w; - case "days": - case "day": - case "d": - return n * d; - case "hours": - case "hour": - case "hrs": - case "hr": - case "h": - return n * h; - case "minutes": - case "minute": - case "mins": - case "min": - case "m": - return n * m; - case "seconds": - case "second": - case "secs": - case "sec": - case "s": - return n * s; - case "milliseconds": - case "millisecond": - case "msecs": - case "msec": - case "ms": - return n; - default: - return void 0; - } - } - function fmtShort(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return Math.round(ms / d) + "d"; - } - if (msAbs >= h) { - return Math.round(ms / h) + "h"; - } - if (msAbs >= m) { - return Math.round(ms / m) + "m"; - } - if (msAbs >= s) { - return Math.round(ms / s) + "s"; - } - return ms + "ms"; - } - function fmtLong(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return plural(ms, msAbs, d, "day"); - } - if (msAbs >= h) { - return plural(ms, msAbs, h, "hour"); - } - if (msAbs >= m) { - return plural(ms, msAbs, m, "minute"); - } - if (msAbs >= s) { - return plural(ms, msAbs, s, "second"); - } - return ms + " ms"; - } - function plural(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + " " + name + (isPlural ? "s" : ""); - } - } -}); - -// node_modules/debug/src/common.js -var require_common4 = __commonJS({ - "node_modules/debug/src/common.js"(exports2, module2) { - function setup(env2) { - createDebug.debug = createDebug; - createDebug.default = createDebug; - createDebug.coerce = coerce; - createDebug.disable = disable; - createDebug.enable = enable; - createDebug.enabled = enabled; - createDebug.humanize = require_ms2(); - createDebug.destroy = destroy; - Object.keys(env2).forEach((key) => { - createDebug[key] = env2[key]; - }); - createDebug.names = []; - createDebug.skips = []; - createDebug.formatters = {}; - function selectColor(namespace) { - let hash = 0; - for (let i = 0; i < namespace.length; i++) { - hash = (hash << 5) - hash + namespace.charCodeAt(i); - hash |= 0; - } - return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; - } - createDebug.selectColor = selectColor; - function createDebug(namespace) { - let prevTime; - let enableOverride = null; - let namespacesCache; - let enabledCache; - function debug3(...args) { - if (!debug3.enabled) { - return; - } - const self = debug3; - const curr = Number(/* @__PURE__ */ new Date()); - const ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - args[0] = createDebug.coerce(args[0]); - if (typeof args[0] !== "string") { - args.unshift("%O"); - } - let index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { - if (match === "%%") { - return "%"; - } - index++; - const formatter = createDebug.formatters[format]; - if (typeof formatter === "function") { - const val = args[index]; - match = formatter.call(self, val); - args.splice(index, 1); - index--; - } - return match; - }); - createDebug.formatArgs.call(self, args); - const logFn = self.log || createDebug.log; - logFn.apply(self, args); - } - debug3.namespace = namespace; - debug3.useColors = createDebug.useColors(); - debug3.color = createDebug.selectColor(namespace); - debug3.extend = extend; - debug3.destroy = createDebug.destroy; - Object.defineProperty(debug3, "enabled", { - enumerable: true, - configurable: false, - get: () => { - if (enableOverride !== null) { - return enableOverride; - } - if (namespacesCache !== createDebug.namespaces) { - namespacesCache = createDebug.namespaces; - enabledCache = createDebug.enabled(namespace); - } - return enabledCache; - }, - set: (v) => { - enableOverride = v; - } - }); - if (typeof createDebug.init === "function") { - createDebug.init(debug3); - } - return debug3; - } - function extend(namespace, delimiter) { - const newDebug = createDebug( - this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace - ); - newDebug.log = this.log; - return newDebug; - } - function enable(namespaces) { - createDebug.save(namespaces); - createDebug.namespaces = namespaces; - createDebug.names = []; - createDebug.skips = []; - const split = (typeof namespaces === "string" ? namespaces : "") - .trim() - .replace(/\s+/g, ",") - .split(",") - .filter(Boolean); - for (const ns of split) { - if (ns[0] === "-") { - createDebug.skips.push(ns.slice(1)); - } else { - createDebug.names.push(ns); - } - } - } - function matchesTemplate(search, template) { - let searchIndex = 0; - let templateIndex = 0; - let starIndex = -1; - let matchIndex = 0; - while (searchIndex < search.length) { - if ( - templateIndex < template.length && - (template[templateIndex] === search[searchIndex] || template[templateIndex] === "*") - ) { - if (template[templateIndex] === "*") { - starIndex = templateIndex; - matchIndex = searchIndex; - templateIndex++; - } else { - searchIndex++; - templateIndex++; - } - } else if (starIndex !== -1) { - templateIndex = starIndex + 1; - matchIndex++; - searchIndex = matchIndex; - } else { - return false; - } - } - while (templateIndex < template.length && template[templateIndex] === "*") { - templateIndex++; - } - return templateIndex === template.length; - } - function disable() { - const namespaces = [ - ...createDebug.names, - ...createDebug.skips.map((namespace) => "-" + namespace) - ].join(","); - createDebug.enable(""); - return namespaces; - } - function enabled(name) { - for (const skip of createDebug.skips) { - if (matchesTemplate(name, skip)) { - return false; - } - } - for (const ns of createDebug.names) { - if (matchesTemplate(name, ns)) { - return true; - } - } - return false; - } - function coerce(val) { - if (val instanceof Error) { - return val.stack || val.message; - } - return val; - } - function destroy() { - console.warn( - "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." - ); - } - createDebug.enable(createDebug.load()); - return createDebug; - } - module2.exports = setup; - } -}); - -// node_modules/debug/src/browser.js -var require_browser2 = __commonJS({ - "node_modules/debug/src/browser.js"(exports2, module2) { - exports2.formatArgs = formatArgs; - exports2.save = save; - exports2.load = load; - exports2.useColors = useColors; - exports2.storage = localstorage(); - exports2.destroy = /* @__PURE__ */ (() => { - let warned = false; - return () => { - if (!warned) { - warned = true; - console.warn( - "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." - ); - } - }; - })(); - exports2.colors = [ - "#0000CC", - "#0000FF", - "#0033CC", - "#0033FF", - "#0066CC", - "#0066FF", - "#0099CC", - "#0099FF", - "#00CC00", - "#00CC33", - "#00CC66", - "#00CC99", - "#00CCCC", - "#00CCFF", - "#3300CC", - "#3300FF", - "#3333CC", - "#3333FF", - "#3366CC", - "#3366FF", - "#3399CC", - "#3399FF", - "#33CC00", - "#33CC33", - "#33CC66", - "#33CC99", - "#33CCCC", - "#33CCFF", - "#6600CC", - "#6600FF", - "#6633CC", - "#6633FF", - "#66CC00", - "#66CC33", - "#9900CC", - "#9900FF", - "#9933CC", - "#9933FF", - "#99CC00", - "#99CC33", - "#CC0000", - "#CC0033", - "#CC0066", - "#CC0099", - "#CC00CC", - "#CC00FF", - "#CC3300", - "#CC3333", - "#CC3366", - "#CC3399", - "#CC33CC", - "#CC33FF", - "#CC6600", - "#CC6633", - "#CC9900", - "#CC9933", - "#CCCC00", - "#CCCC33", - "#FF0000", - "#FF0033", - "#FF0066", - "#FF0099", - "#FF00CC", - "#FF00FF", - "#FF3300", - "#FF3333", - "#FF3366", - "#FF3399", - "#FF33CC", - "#FF33FF", - "#FF6600", - "#FF6633", - "#FF9900", - "#FF9933", - "#FFCC00", - "#FFCC33" - ]; - function useColors() { - if ( - typeof window !== "undefined" && - window.process && - (window.process.type === "renderer" || window.process.__nwjs) - ) { - return true; - } - if ( - typeof navigator !== "undefined" && - navigator.userAgent && - navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/) - ) { - return false; - } - let m; - return ( - (typeof document !== "undefined" && - document.documentElement && - document.documentElement.style && - document.documentElement.style.WebkitAppearance) || // Is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== "undefined" && - window.console && - (window.console.firebug || (window.console.exception && window.console.table))) || // Is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== "undefined" && - navigator.userAgent && - (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && - parseInt(m[1], 10) >= 31) || // Double check webkit in userAgent just in case we are in a worker - (typeof navigator !== "undefined" && - navigator.userAgent && - navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)) - ); - } - function formatArgs(args) { - args[0] = - (this.useColors ? "%c" : "") + - this.namespace + - (this.useColors ? " %c" : " ") + - args[0] + - (this.useColors ? "%c " : " ") + - "+" + - module2.exports.humanize(this.diff); - if (!this.useColors) { - return; - } - const c = "color: " + this.color; - args.splice(1, 0, c, "color: inherit"); - let index = 0; - let lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, (match) => { - if (match === "%%") { - return; - } - index++; - if (match === "%c") { - lastC = index; - } - }); - args.splice(lastC, 0, c); - } - exports2.log = console.debug || console.log || (() => {}); - function save(namespaces) { - try { - if (namespaces) { - exports2.storage.setItem("debug", namespaces); - } else { - exports2.storage.removeItem("debug"); - } - } catch (error) {} - } - function load() { - let r; - try { - r = exports2.storage.getItem("debug") || exports2.storage.getItem("DEBUG"); - } catch (error) {} - if (!r && typeof process !== "undefined" && "env" in process) { - r = process.env.DEBUG; - } - return r; - } - function localstorage() { - try { - return localStorage; - } catch (error) {} - } - module2.exports = require_common4()(exports2); - var { formatters } = module2.exports; - formatters.j = function (v) { - try { - return JSON.stringify(v); - } catch (error) { - return "[UnexpectedJSONParseError]: " + error.message; - } - }; - } -}); - -// node_modules/debug/src/node.js -var require_node2 = __commonJS({ - "node_modules/debug/src/node.js"(exports2, module2) { - var tty = require("tty"); - var util = require("util"); - exports2.init = init; - exports2.log = log; - exports2.formatArgs = formatArgs; - exports2.save = save; - exports2.load = load; - exports2.useColors = useColors; - exports2.destroy = util.deprecate( - () => {}, - "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." - ); - exports2.colors = [6, 2, 3, 4, 5, 1]; - try { - const supportsColor = require_supports_color(); - if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { - exports2.colors = [ - 20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, 69, 74, 75, - 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, 135, 148, 149, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 178, 179, 184, 185, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 214, 215, 220, 221 - ]; - } - } catch (error) {} - exports2.inspectOpts = Object.keys(process.env) - .filter((key) => { - return /^debug_/i.test(key); - }) - .reduce((obj, key) => { - const prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, (_, k) => { - return k.toUpperCase(); - }); - let val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) { - val = true; - } else if (/^(no|off|false|disabled)$/i.test(val)) { - val = false; - } else if (val === "null") { - val = null; - } else { - val = Number(val); - } - obj[prop] = val; - return obj; - }, {}); - function useColors() { - return "colors" in exports2.inspectOpts - ? Boolean(exports2.inspectOpts.colors) - : tty.isatty(process.stderr.fd); - } - function formatArgs(args) { - const { namespace: name, useColors: useColors2 } = this; - if (useColors2) { - const c = this.color; - const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c); - const prefix = ` ${colorCode};1m${name} \x1B[0m`; - args[0] = prefix + args[0].split("\n").join("\n" + prefix); - args.push(colorCode + "m+" + module2.exports.humanize(this.diff) + "\x1B[0m"); - } else { - args[0] = getDate() + name + " " + args[0]; - } - } - function getDate() { - if (exports2.inspectOpts.hideDate) { - return ""; - } - return /* @__PURE__ */ new Date().toISOString() + " "; - } - function log(...args) { - return process.stderr.write(util.formatWithOptions(exports2.inspectOpts, ...args) + "\n"); - } - function save(namespaces) { - if (namespaces) { - process.env.DEBUG = namespaces; - } else { - delete process.env.DEBUG; - } - } - function load() { - return process.env.DEBUG; - } - function init(debug3) { - debug3.inspectOpts = {}; - const keys = Object.keys(exports2.inspectOpts); - for (let i = 0; i < keys.length; i++) { - debug3.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; - } - } - module2.exports = require_common4()(exports2); - var { formatters } = module2.exports; - formatters.o = function (v) { - this.inspectOpts.colors = this.useColors; - return util - .inspect(v, this.inspectOpts) - .split("\n") - .map((str) => str.trim()) - .join(" "); - }; - formatters.O = function (v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); - }; - } -}); - -// node_modules/debug/src/index.js -var require_src3 = __commonJS({ - "node_modules/debug/src/index.js"(exports2, module2) { - if ( - typeof process === "undefined" || - process.type === "renderer" || - process.browser === true || - process.__nwjs - ) { - module2.exports = require_browser2(); - } else { - module2.exports = require_node2(); - } - } -}); - -// node_modules/@kwsites/file-exists/dist/src/index.js -var require_src4 = __commonJS({ - "node_modules/@kwsites/file-exists/dist/src/index.js"(exports2) { - "use strict"; - var __importDefault = - (exports2 && exports2.__importDefault) || - function (mod) { - return mod && mod.__esModule ? mod : { default: mod }; - }; - Object.defineProperty(exports2, "__esModule", { value: true }); - var fs_1 = require("fs"); - var debug_1 = __importDefault(require_src3()); - var log = debug_1.default("@kwsites/file-exists"); - function check(path11, isFile, isDirectory) { - log(`checking %s`, path11); - try { - const stat = fs_1.statSync(path11); - if (stat.isFile() && isFile) { - log(`[OK] path represents a file`); - return true; - } - if (stat.isDirectory() && isDirectory) { - log(`[OK] path represents a directory`); - return true; - } - log(`[FAIL] path represents something other than a file or directory`); - return false; - } catch (e) { - if (e.code === "ENOENT") { - log(`[FAIL] path is not accessible: %o`, e); - return false; - } - log(`[FATAL] %o`, e); - throw e; - } - } - function exists3(path11, type = exports2.READABLE) { - return check(path11, (type & exports2.FILE) > 0, (type & exports2.FOLDER) > 0); - } - exports2.exists = exists3; - exports2.FILE = 1; - exports2.FOLDER = 2; - exports2.READABLE = exports2.FILE + exports2.FOLDER; - } -}); - -// node_modules/@kwsites/file-exists/dist/index.js -var require_dist3 = __commonJS({ - "node_modules/@kwsites/file-exists/dist/index.js"(exports2) { - "use strict"; - function __export4(m) { - for (var p in m) if (!exports2.hasOwnProperty(p)) exports2[p] = m[p]; - } - Object.defineProperty(exports2, "__esModule", { value: true }); - __export4(require_src4()); - } -}); - -// node_modules/@kwsites/promise-deferred/dist/index.js -var require_dist4 = __commonJS({ - "node_modules/@kwsites/promise-deferred/dist/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.createDeferred = exports2.deferred = void 0; - function deferred3() { - let done; - let fail; - let status = "pending"; - const promise = new Promise((_done, _fail) => { - done = _done; - fail = _fail; - }); - return { - promise, - done(result) { - if (status === "pending") { - status = "resolved"; - done(result); - } - }, - fail(error) { - if (status === "pending") { - status = "rejected"; - fail(error); - } - }, - get fulfilled() { - return status !== "pending"; - }, - get status() { - return status; - } - }; - } - exports2.deferred = deferred3; - exports2.createDeferred = deferred3; - exports2.default = deferred3; - } -}); - -// src/extension.ts -var extension_exports = {}; -__export(extension_exports, { - activate: () => activate, - deactivate: () => deactivate -}); -module.exports = __toCommonJS(extension_exports); -var vscode12 = __toESM(require("vscode")); - -// src/commands/analyze.ts -var vscode = __toESM(require("vscode")); - -// ../src/services/analyzer.ts -var import_promises3 = __toESM(require("fs/promises"), 1); -var import_path3 = __toESM(require("path"), 1); -var import_fast_glob = __toESM(require_out4(), 1); - -// ../src/utils/fs.ts -var import_promises = __toESM(require("fs/promises"), 1); -var import_path = __toESM(require("path"), 1); -async function ensureDir(dirPath) { - await import_promises.default.mkdir(dirPath, { recursive: true }); -} -async function safeWriteFile(filePath, content, force) { - const resolved = import_path.default.resolve(filePath); - try { - const stat = await import_promises.default.lstat(resolved); - if (stat.isSymbolicLink()) { - return { wrote: false, reason: "symlink" }; - } - if (!force) { - return { wrote: false, reason: "exists" }; - } - } catch {} - await import_promises.default.writeFile(resolved, content, "utf8"); - return { wrote: true }; -} -async function fileExists(filePath) { - try { - await import_promises.default.access(filePath); - return true; - } catch { - return false; - } -} -async function safeReadDir(dirPath) { - try { - return await import_promises.default.readdir(dirPath); - } catch { - return []; - } -} -async function readJson(filePath) { - try { - const raw = await import_promises.default.readFile(filePath, "utf8"); - return JSON.parse(raw); - } catch { - return void 0; - } -} -function buildTimestampedName(baseName, extension = ".json") { - const stamp = /* @__PURE__ */ new Date().toISOString().replace(/[:.]/gu, "-"); - return `${baseName}-${stamp}${extension}`; -} - -// ../src/services/git.ts -var import_promises2 = __toESM(require("fs/promises"), 1); -var import_path2 = __toESM(require("path"), 1); - -// ../node_modules/simple-git/dist/esm/index.js -var import_node_buffer = require("node:buffer"); -var import_file_exists = __toESM(require_dist(), 1); -var import_debug = __toESM(require_src(), 1); -var import_child_process = require("child_process"); -var import_promise_deferred = __toESM(require_dist2(), 1); -var import_node_path = require("node:path"); -var import_promise_deferred2 = __toESM(require_dist2(), 1); -var __defProp2 = Object.defineProperty; -var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; -var __getOwnPropNames2 = Object.getOwnPropertyNames; -var __hasOwnProp2 = Object.prototype.hasOwnProperty; -var __esm = (fn, res) => - function __init() { - return (fn && (res = (0, fn[__getOwnPropNames2(fn)[0]])((fn = 0))), res); - }; -var __commonJS2 = (cb, mod) => - function __require() { - return ( - mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), - mod.exports - ); - }; -var __export2 = (target, all) => { - for (var name in all) __defProp2(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps2 = (to, from, except, desc) => { - if ((from && typeof from === "object") || typeof from === "function") { - for (let key of __getOwnPropNames2(from)) - if (!__hasOwnProp2.call(to, key) && key !== except) - __defProp2(to, key, { - get: () => from[key], - enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable - }); - } - return to; -}; -var __toCommonJS2 = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); -function pathspec(...paths) { - const key = new String(paths); - cache.set(key, paths); - return key; -} -function isPathSpec(path11) { - return path11 instanceof String && cache.has(path11); -} -var cache; -var init_pathspec = __esm({ - "src/lib/args/pathspec.ts"() { - "use strict"; - cache = /* @__PURE__ */ new WeakMap(); - } -}); -var GitError; -var init_git_error = __esm({ - "src/lib/errors/git-error.ts"() { - "use strict"; - GitError = class extends Error { - constructor(task, message) { - super(message); - this.task = task; - Object.setPrototypeOf(this, new.target.prototype); - } - }; - } -}); -var GitResponseError; -var init_git_response_error = __esm({ - "src/lib/errors/git-response-error.ts"() { - "use strict"; - init_git_error(); - GitResponseError = class extends GitError { - constructor(git, message) { - super(void 0, message || String(git)); - this.git = git; - } - }; - } -}); -var TaskConfigurationError; -var init_task_configuration_error = __esm({ - "src/lib/errors/task-configuration-error.ts"() { - "use strict"; - init_git_error(); - TaskConfigurationError = class extends GitError { - constructor(message) { - super(void 0, message); - } - }; - } -}); -function asFunction(source) { - if (typeof source !== "function") { - return NOOP; - } - return source; -} -function isUserFunction(source) { - return typeof source === "function" && source !== NOOP; -} -function splitOn(input, char) { - const index = input.indexOf(char); - if (index <= 0) { - return [input, ""]; - } - return [input.substr(0, index), input.substr(index + 1)]; -} -function first(input, offset = 0) { - return isArrayLike(input) && input.length > offset ? input[offset] : void 0; -} -function last(input, offset = 0) { - if (isArrayLike(input) && input.length > offset) { - return input[input.length - 1 - offset]; - } -} -function isArrayLike(input) { - return filterHasLength(input); -} -function toLinesWithContent(input = "", trimmed22 = true, separator = "\n") { - return input.split(separator).reduce((output, line) => { - const lineContent = trimmed22 ? line.trim() : line; - if (lineContent) { - output.push(lineContent); - } - return output; - }, []); -} -function forEachLineWithContent(input, callback) { - return toLinesWithContent(input, true).map((line) => callback(line)); -} -function folderExists(path11) { - return (0, import_file_exists.exists)(path11, import_file_exists.FOLDER); -} -function append(target, item) { - if (Array.isArray(target)) { - if (!target.includes(item)) { - target.push(item); - } - } else { - target.add(item); - } - return item; -} -function including(target, item) { - if (Array.isArray(target) && !target.includes(item)) { - target.push(item); - } - return target; -} -function remove(target, item) { - if (Array.isArray(target)) { - const index = target.indexOf(item); - if (index >= 0) { - target.splice(index, 1); - } - } else { - target.delete(item); - } - return item; -} -function asArray(source) { - return Array.isArray(source) ? source : [source]; -} -function asCamelCase(str) { - return str.replace(/[\s-]+(.)/g, (_all, chr) => { - return chr.toUpperCase(); - }); -} -function asStringArray(source) { - return asArray(source).map((item) => { - return item instanceof String ? item : String(item); - }); -} -function asNumber(source, onNaN = 0) { - if (source == null) { - return onNaN; - } - const num = parseInt(source, 10); - return Number.isNaN(num) ? onNaN : num; -} -function prefixedArray(input, prefix) { - const output = []; - for (let i = 0, max = input.length; i < max; i++) { - output.push(prefix, input[i]); - } - return output; -} -function bufferToString(input) { - return (Array.isArray(input) ? import_node_buffer.Buffer.concat(input) : input).toString("utf-8"); -} -function pick(source, properties) { - const out = {}; - properties.forEach((key) => { - if (source[key] !== void 0) { - out[key] = source[key]; - } - }); - return out; -} -function delay(duration = 0) { - return new Promise((done) => setTimeout(done, duration)); -} -function orVoid(input) { - if (input === false) { - return void 0; - } - return input; -} -var NULL; -var NOOP; -var objectToString; -var init_util = __esm({ - "src/lib/utils/util.ts"() { - "use strict"; - init_argument_filters(); - NULL = "\0"; - NOOP = () => {}; - objectToString = Object.prototype.toString.call.bind(Object.prototype.toString); - } -}); -function filterType(input, filter, def) { - if (filter(input)) { - return input; - } - return arguments.length > 2 ? def : void 0; -} -function filterPrimitives(input, omit2) { - const type = isPathSpec(input) ? "string" : typeof input; - return /number|string|boolean/.test(type) && (!omit2 || !omit2.includes(type)); -} -function filterPlainObject(input) { - return !!input && objectToString(input) === "[object Object]"; -} -function filterFunction(input) { - return typeof input === "function"; -} -var filterArray; -var filterNumber; -var filterString; -var filterStringOrStringArray; -var filterHasLength; -var init_argument_filters = __esm({ - "src/lib/utils/argument-filters.ts"() { - "use strict"; - init_pathspec(); - init_util(); - filterArray = (input) => { - return Array.isArray(input); - }; - filterNumber = (input) => { - return typeof input === "number"; - }; - filterString = (input) => { - return typeof input === "string"; - }; - filterStringOrStringArray = (input) => { - return filterString(input) || (Array.isArray(input) && input.every(filterString)); - }; - filterHasLength = (input) => { - if (input == null || "number|boolean|function".includes(typeof input)) { - return false; - } - return typeof input.length === "number"; - }; - } -}); -var ExitCodes; -var init_exit_codes = __esm({ - "src/lib/utils/exit-codes.ts"() { - "use strict"; - ExitCodes = /* @__PURE__ */ ((ExitCodes22) => { - ExitCodes22[(ExitCodes22["SUCCESS"] = 0)] = "SUCCESS"; - ExitCodes22[(ExitCodes22["ERROR"] = 1)] = "ERROR"; - ExitCodes22[(ExitCodes22["NOT_FOUND"] = -2)] = "NOT_FOUND"; - ExitCodes22[(ExitCodes22["UNCLEAN"] = 128)] = "UNCLEAN"; - return ExitCodes22; - })(ExitCodes || {}); - } -}); -var GitOutputStreams; -var init_git_output_streams = __esm({ - "src/lib/utils/git-output-streams.ts"() { - "use strict"; - GitOutputStreams = class _GitOutputStreams { - constructor(stdOut, stdErr) { - this.stdOut = stdOut; - this.stdErr = stdErr; - } - asStrings() { - return new _GitOutputStreams(this.stdOut.toString("utf8"), this.stdErr.toString("utf8")); - } - }; - } -}); -function useMatchesDefault() { - throw new Error(`LineParser:useMatches not implemented`); -} -var LineParser; -var RemoteLineParser; -var init_line_parser = __esm({ - "src/lib/utils/line-parser.ts"() { - "use strict"; - LineParser = class { - constructor(regExp, useMatches) { - this.matches = []; - this.useMatches = useMatchesDefault; - this.parse = (line, target) => { - this.resetMatches(); - if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) { - return false; - } - return this.useMatches(target, this.prepareMatches()) !== false; - }; - this._regExp = Array.isArray(regExp) ? regExp : [regExp]; - if (useMatches) { - this.useMatches = useMatches; - } - } - resetMatches() { - this.matches.length = 0; - } - prepareMatches() { - return this.matches; - } - addMatch(reg, index, line) { - const matched = line && reg.exec(line); - if (matched) { - this.pushMatch(index, matched); - } - return !!matched; - } - pushMatch(_index, matched) { - this.matches.push(...matched.slice(1)); - } - }; - RemoteLineParser = class extends LineParser { - addMatch(reg, index, line) { - return /^remote:\s/.test(String(line)) && super.addMatch(reg, index, line); - } - pushMatch(index, matched) { - if (index > 0 || matched.length > 1) { - super.pushMatch(index, matched); - } - } - }; - } -}); -function createInstanceConfig(...options) { - const baseDir = process.cwd(); - const config = Object.assign( - { baseDir, ...defaultOptions }, - ...options.filter((o) => typeof o === "object" && o) - ); - config.baseDir = config.baseDir || baseDir; - config.trimmed = config.trimmed === true; - return config; -} -var defaultOptions; -var init_simple_git_options = __esm({ - "src/lib/utils/simple-git-options.ts"() { - "use strict"; - defaultOptions = { - binary: "git", - maxConcurrentProcesses: 5, - config: [], - trimmed: false - }; - } -}); -function appendTaskOptions(options, commands3 = []) { - if (!filterPlainObject(options)) { - return commands3; - } - return Object.keys(options).reduce((commands22, key) => { - const value = options[key]; - if (isPathSpec(value)) { - commands22.push(value); - } else if (filterPrimitives(value, ["boolean"])) { - commands22.push(key + "=" + value); - } else if (Array.isArray(value)) { - for (const v of value) { - if (!filterPrimitives(v, ["string", "number"])) { - commands22.push(key + "=" + v); - } - } - } else { - commands22.push(key); - } - return commands22; - }, commands3); -} -function getTrailingOptions(args, initialPrimitive = 0, objectOnly = false) { - const command = []; - for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) { - if ("string|number".includes(typeof args[i])) { - command.push(String(args[i])); - } - } - appendTaskOptions(trailingOptionsArgument(args), command); - if (!objectOnly) { - command.push(...trailingArrayArgument(args)); - } - return command; -} -function trailingArrayArgument(args) { - const hasTrailingCallback = typeof last(args) === "function"; - return asStringArray(filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, [])); -} -function trailingOptionsArgument(args) { - const hasTrailingCallback = filterFunction(last(args)); - return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject); -} -function trailingFunctionArgument(args, includeNoop = true) { - const callback = asFunction(last(args)); - return includeNoop || isUserFunction(callback) ? callback : void 0; -} -var init_task_options = __esm({ - "src/lib/utils/task-options.ts"() { - "use strict"; - init_argument_filters(); - init_util(); - init_pathspec(); - } -}); -function callTaskParser(parser42, streams) { - return parser42(streams.stdOut, streams.stdErr); -} -function parseStringResponse(result, parsers122, texts, trim = true) { - asArray(texts).forEach((text) => { - for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) { - const line = (offset = 0) => { - if (i + offset >= max) { - return; - } - return lines[i + offset]; - }; - parsers122.some(({ parse: parse2 }) => parse2(line, result)); - } - }); - return result; -} -var init_task_parser = __esm({ - "src/lib/utils/task-parser.ts"() { - "use strict"; - init_util(); - } -}); -var utils_exports = {}; -__export2(utils_exports, { - ExitCodes: () => ExitCodes, - GitOutputStreams: () => GitOutputStreams, - LineParser: () => LineParser, - NOOP: () => NOOP, - NULL: () => NULL, - RemoteLineParser: () => RemoteLineParser, - append: () => append, - appendTaskOptions: () => appendTaskOptions, - asArray: () => asArray, - asCamelCase: () => asCamelCase, - asFunction: () => asFunction, - asNumber: () => asNumber, - asStringArray: () => asStringArray, - bufferToString: () => bufferToString, - callTaskParser: () => callTaskParser, - createInstanceConfig: () => createInstanceConfig, - delay: () => delay, - filterArray: () => filterArray, - filterFunction: () => filterFunction, - filterHasLength: () => filterHasLength, - filterNumber: () => filterNumber, - filterPlainObject: () => filterPlainObject, - filterPrimitives: () => filterPrimitives, - filterString: () => filterString, - filterStringOrStringArray: () => filterStringOrStringArray, - filterType: () => filterType, - first: () => first, - folderExists: () => folderExists, - forEachLineWithContent: () => forEachLineWithContent, - getTrailingOptions: () => getTrailingOptions, - including: () => including, - isUserFunction: () => isUserFunction, - last: () => last, - objectToString: () => objectToString, - orVoid: () => orVoid, - parseStringResponse: () => parseStringResponse, - pick: () => pick, - prefixedArray: () => prefixedArray, - remove: () => remove, - splitOn: () => splitOn, - toLinesWithContent: () => toLinesWithContent, - trailingFunctionArgument: () => trailingFunctionArgument, - trailingOptionsArgument: () => trailingOptionsArgument -}); -var init_utils = __esm({ - "src/lib/utils/index.ts"() { - "use strict"; - init_argument_filters(); - init_exit_codes(); - init_git_output_streams(); - init_line_parser(); - init_simple_git_options(); - init_task_options(); - init_task_parser(); - init_util(); - } -}); -var check_is_repo_exports = {}; -__export2(check_is_repo_exports, { - CheckRepoActions: () => CheckRepoActions, - checkIsBareRepoTask: () => checkIsBareRepoTask, - checkIsRepoRootTask: () => checkIsRepoRootTask, - checkIsRepoTask: () => checkIsRepoTask -}); -function checkIsRepoTask(action) { - switch (action) { - case "bare": - return checkIsBareRepoTask(); - case "root": - return checkIsRepoRootTask(); - } - const commands3 = ["rev-parse", "--is-inside-work-tree"]; - return { - commands: commands3, - format: "utf-8", - onError, - parser - }; -} -function checkIsRepoRootTask() { - const commands3 = ["rev-parse", "--git-dir"]; - return { - commands: commands3, - format: "utf-8", - onError, - parser(path11) { - return /^\.(git)?$/.test(path11.trim()); - } - }; -} -function checkIsBareRepoTask() { - const commands3 = ["rev-parse", "--is-bare-repository"]; - return { - commands: commands3, - format: "utf-8", - onError, - parser - }; -} -function isNotRepoMessage(error) { - return /(Not a git repository|Kein Git-Repository)/i.test(String(error)); -} -var CheckRepoActions; -var onError; -var parser; -var init_check_is_repo = __esm({ - "src/lib/tasks/check-is-repo.ts"() { - "use strict"; - init_utils(); - CheckRepoActions = /* @__PURE__ */ ((CheckRepoActions22) => { - CheckRepoActions22["BARE"] = "bare"; - CheckRepoActions22["IN_TREE"] = "tree"; - CheckRepoActions22["IS_REPO_ROOT"] = "root"; - return CheckRepoActions22; - })(CheckRepoActions || {}); - onError = ({ exitCode }, error, done, fail) => { - if (exitCode === 128 && isNotRepoMessage(error)) { - return done(Buffer.from("false")); - } - fail(error); - }; - parser = (text) => { - return text.trim() === "true"; - }; - } -}); -function cleanSummaryParser(dryRun, text) { - const summary = new CleanResponse(dryRun); - const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp; - toLinesWithContent(text).forEach((line) => { - const removed = line.replace(regexp, ""); - summary.paths.push(removed); - (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed); - }); - return summary; -} -var CleanResponse; -var removalRegexp; -var dryRunRemovalRegexp; -var isFolderRegexp; -var init_CleanSummary = __esm({ - "src/lib/responses/CleanSummary.ts"() { - "use strict"; - init_utils(); - CleanResponse = class { - constructor(dryRun) { - this.dryRun = dryRun; - this.paths = []; - this.files = []; - this.folders = []; - } - }; - removalRegexp = /^[a-z]+\s*/i; - dryRunRemovalRegexp = /^[a-z]+\s+[a-z]+\s*/i; - isFolderRegexp = /\/$/; - } -}); -var task_exports = {}; -__export2(task_exports, { - EMPTY_COMMANDS: () => EMPTY_COMMANDS, - adhocExecTask: () => adhocExecTask, - configurationErrorTask: () => configurationErrorTask, - isBufferTask: () => isBufferTask, - isEmptyTask: () => isEmptyTask, - straightThroughBufferTask: () => straightThroughBufferTask, - straightThroughStringTask: () => straightThroughStringTask -}); -function adhocExecTask(parser42) { - return { - commands: EMPTY_COMMANDS, - format: "empty", - parser: parser42 - }; -} -function configurationErrorTask(error) { - return { - commands: EMPTY_COMMANDS, - format: "empty", - parser() { - throw typeof error === "string" ? new TaskConfigurationError(error) : error; - } - }; -} -function straightThroughStringTask(commands3, trimmed22 = false) { - return { - commands: commands3, - format: "utf-8", - parser(text) { - return trimmed22 ? String(text).trim() : text; - } - }; -} -function straightThroughBufferTask(commands3) { - return { - commands: commands3, - format: "buffer", - parser(buffer) { - return buffer; - } - }; -} -function isBufferTask(task) { - return task.format === "buffer"; -} -function isEmptyTask(task) { - return task.format === "empty" || !task.commands.length; -} -var EMPTY_COMMANDS; -var init_task = __esm({ - "src/lib/tasks/task.ts"() { - "use strict"; - init_task_configuration_error(); - EMPTY_COMMANDS = []; - } -}); -var clean_exports = {}; -__export2(clean_exports, { - CONFIG_ERROR_INTERACTIVE_MODE: () => CONFIG_ERROR_INTERACTIVE_MODE, - CONFIG_ERROR_MODE_REQUIRED: () => CONFIG_ERROR_MODE_REQUIRED, - CONFIG_ERROR_UNKNOWN_OPTION: () => CONFIG_ERROR_UNKNOWN_OPTION, - CleanOptions: () => CleanOptions, - cleanTask: () => cleanTask, - cleanWithOptionsTask: () => cleanWithOptionsTask, - isCleanOptionsArray: () => isCleanOptionsArray -}); -function cleanWithOptionsTask(mode, customArgs) { - const { cleanMode, options, valid } = getCleanOptions(mode); - if (!cleanMode) { - return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED); - } - if (!valid.options) { - return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode)); - } - options.push(...customArgs); - if (options.some(isInteractiveMode)) { - return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE); - } - return cleanTask(cleanMode, options); -} -function cleanTask(mode, customArgs) { - const commands3 = ["clean", `-${mode}`, ...customArgs]; - return { - commands: commands3, - format: "utf-8", - parser(text) { - return cleanSummaryParser(mode === "n", text); - } - }; -} -function isCleanOptionsArray(input) { - return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test)); -} -function getCleanOptions(input) { - let cleanMode; - let options = []; - let valid = { cleanMode: false, options: true }; - input - .replace(/[^a-z]i/g, "") - .split("") - .forEach((char) => { - if (isCleanMode(char)) { - cleanMode = char; - valid.cleanMode = true; - } else { - valid.options = valid.options && isKnownOption((options[options.length] = `-${char}`)); - } - }); - return { - cleanMode, - options, - valid - }; -} -function isCleanMode(cleanMode) { - return cleanMode === "f" || cleanMode === "n"; -} -function isKnownOption(option) { - return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1)); -} -function isInteractiveMode(option) { - if (/^-[^\-]/.test(option)) { - return option.indexOf("i") > 0; - } - return option === "--interactive"; -} -var CONFIG_ERROR_INTERACTIVE_MODE; -var CONFIG_ERROR_MODE_REQUIRED; -var CONFIG_ERROR_UNKNOWN_OPTION; -var CleanOptions; -var CleanOptionValues; -var init_clean = __esm({ - "src/lib/tasks/clean.ts"() { - "use strict"; - init_CleanSummary(); - init_utils(); - init_task(); - CONFIG_ERROR_INTERACTIVE_MODE = "Git clean interactive mode is not supported"; - CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter ("n" or "f") is required'; - CONFIG_ERROR_UNKNOWN_OPTION = "Git clean unknown option found in: "; - CleanOptions = /* @__PURE__ */ ((CleanOptions22) => { - CleanOptions22["DRY_RUN"] = "n"; - CleanOptions22["FORCE"] = "f"; - CleanOptions22["IGNORED_INCLUDED"] = "x"; - CleanOptions22["IGNORED_ONLY"] = "X"; - CleanOptions22["EXCLUDING"] = "e"; - CleanOptions22["QUIET"] = "q"; - CleanOptions22["RECURSIVE"] = "d"; - return CleanOptions22; - })(CleanOptions || {}); - CleanOptionValues = /* @__PURE__ */ new Set([ - "i", - ...asStringArray(Object.values(CleanOptions)) - ]); - } -}); -function configListParser(text) { - const config = new ConfigList(); - for (const item of configParser(text)) { - config.addValue(item.file, String(item.key), item.value); - } - return config; -} -function configGetParser(text, key) { - let value = null; - const values = []; - const scopes = /* @__PURE__ */ new Map(); - for (const item of configParser(text, key)) { - if (item.key !== key) { - continue; - } - values.push((value = item.value)); - if (!scopes.has(item.file)) { - scopes.set(item.file, []); - } - scopes.get(item.file).push(value); - } - return { - key, - paths: Array.from(scopes.keys()), - scopes, - value, - values - }; -} -function configFilePath(filePath) { - return filePath.replace(/^(file):/, ""); -} -function* configParser(text, requestedKey = null) { - const lines = text.split("\0"); - for (let i = 0, max = lines.length - 1; i < max; ) { - const file = configFilePath(lines[i++]); - let value = lines[i++]; - let key = requestedKey; - if (value.includes("\n")) { - const line = splitOn(value, "\n"); - key = line[0]; - value = line[1]; - } - yield { file, key, value }; - } -} -var ConfigList; -var init_ConfigList = __esm({ - "src/lib/responses/ConfigList.ts"() { - "use strict"; - init_utils(); - ConfigList = class { - constructor() { - this.files = []; - this.values = /* @__PURE__ */ Object.create(null); - } - get all() { - if (!this._all) { - this._all = this.files.reduce((all, file) => { - return Object.assign(all, this.values[file]); - }, {}); - } - return this._all; - } - addFile(file) { - if (!(file in this.values)) { - const latest = last(this.files); - this.values[file] = latest ? Object.create(this.values[latest]) : {}; - this.files.push(file); - } - return this.values[file]; - } - addValue(file, key, value) { - const values = this.addFile(file); - if (!Object.hasOwn(values, key)) { - values[key] = value; - } else if (Array.isArray(values[key])) { - values[key].push(value); - } else { - values[key] = [values[key], value]; - } - this._all = void 0; - } - }; - } -}); -function asConfigScope(scope, fallback) { - if (typeof scope === "string" && Object.hasOwn(GitConfigScope, scope)) { - return scope; - } - return fallback; -} -function addConfigTask(key, value, append22, scope) { - const commands3 = ["config", `--${scope}`]; - if (append22) { - commands3.push("--add"); - } - commands3.push(key, value); - return { - commands: commands3, - format: "utf-8", - parser(text) { - return text; - } - }; -} -function getConfigTask(key, scope) { - const commands3 = ["config", "--null", "--show-origin", "--get-all", key]; - if (scope) { - commands3.splice(1, 0, `--${scope}`); - } - return { - commands: commands3, - format: "utf-8", - parser(text) { - return configGetParser(text, key); - } - }; -} -function listConfigTask(scope) { - const commands3 = ["config", "--list", "--show-origin", "--null"]; - if (scope) { - commands3.push(`--${scope}`); - } - return { - commands: commands3, - format: "utf-8", - parser(text) { - return configListParser(text); - } - }; -} -function config_default() { - return { - addConfig(key, value, ...rest) { - return this._runTask( - addConfigTask( - key, - value, - rest[0] === true, - asConfigScope( - rest[1], - "local" - /* local */ - ) - ), - trailingFunctionArgument(arguments) - ); - }, - getConfig(key, scope) { - return this._runTask( - getConfigTask(key, asConfigScope(scope, void 0)), - trailingFunctionArgument(arguments) - ); - }, - listConfig(...rest) { - return this._runTask( - listConfigTask(asConfigScope(rest[0], void 0)), - trailingFunctionArgument(arguments) - ); - } - }; -} -var GitConfigScope; -var init_config = __esm({ - "src/lib/tasks/config.ts"() { - "use strict"; - init_ConfigList(); - init_utils(); - GitConfigScope = /* @__PURE__ */ ((GitConfigScope22) => { - GitConfigScope22["system"] = "system"; - GitConfigScope22["global"] = "global"; - GitConfigScope22["local"] = "local"; - GitConfigScope22["worktree"] = "worktree"; - return GitConfigScope22; - })(GitConfigScope || {}); - } -}); -function isDiffNameStatus(input) { - return diffNameStatus.has(input); -} -var DiffNameStatus; -var diffNameStatus; -var init_diff_name_status = __esm({ - "src/lib/tasks/diff-name-status.ts"() { - "use strict"; - DiffNameStatus = /* @__PURE__ */ ((DiffNameStatus22) => { - DiffNameStatus22["ADDED"] = "A"; - DiffNameStatus22["COPIED"] = "C"; - DiffNameStatus22["DELETED"] = "D"; - DiffNameStatus22["MODIFIED"] = "M"; - DiffNameStatus22["RENAMED"] = "R"; - DiffNameStatus22["CHANGED"] = "T"; - DiffNameStatus22["UNMERGED"] = "U"; - DiffNameStatus22["UNKNOWN"] = "X"; - DiffNameStatus22["BROKEN"] = "B"; - return DiffNameStatus22; - })(DiffNameStatus || {}); - diffNameStatus = new Set(Object.values(DiffNameStatus)); - } -}); -function grepQueryBuilder(...params) { - return new GrepQuery().param(...params); -} -function parseGrep(grep) { - const paths = /* @__PURE__ */ new Set(); - const results = {}; - forEachLineWithContent(grep, (input) => { - const [path11, line, preview] = input.split(NULL); - paths.add(path11); - (results[path11] = results[path11] || []).push({ - line: asNumber(line), - path: path11, - preview - }); - }); - return { - paths, - results - }; -} -function grep_default() { - return { - grep(searchTerm) { - const then = trailingFunctionArgument(arguments); - const options = getTrailingOptions(arguments); - for (const option of disallowedOptions) { - if (options.includes(option)) { - return this._runTask( - configurationErrorTask(`git.grep: use of "${option}" is not supported.`), - then - ); - } - } - if (typeof searchTerm === "string") { - searchTerm = grepQueryBuilder().param(searchTerm); - } - const commands3 = ["grep", "--null", "-n", "--full-name", ...options, ...searchTerm]; - return this._runTask( - { - commands: commands3, - format: "utf-8", - parser(stdOut) { - return parseGrep(stdOut); - } - }, - then - ); - } - }; -} -var disallowedOptions; -var Query; -var _a; -var GrepQuery; -var init_grep = __esm({ - "src/lib/tasks/grep.ts"() { - "use strict"; - init_utils(); - init_task(); - disallowedOptions = ["-h"]; - Query = Symbol("grepQuery"); - GrepQuery = class { - constructor() { - this[_a] = []; - } - *[((_a = Query), Symbol.iterator)]() { - for (const query of this[Query]) { - yield query; - } - } - and(...and) { - and.length && this[Query].push("--and", "(", ...prefixedArray(and, "-e"), ")"); - return this; - } - param(...param) { - this[Query].push(...prefixedArray(param, "-e")); - return this; - } - }; - } -}); -var reset_exports = {}; -__export2(reset_exports, { - ResetMode: () => ResetMode, - getResetMode: () => getResetMode, - resetTask: () => resetTask -}); -function resetTask(mode, customArgs) { - const commands3 = ["reset"]; - if (isValidResetMode(mode)) { - commands3.push(`--${mode}`); - } - commands3.push(...customArgs); - return straightThroughStringTask(commands3); -} -function getResetMode(mode) { - if (isValidResetMode(mode)) { - return mode; - } - switch (typeof mode) { - case "string": - case "undefined": - return "soft"; - } - return; -} -function isValidResetMode(mode) { - return typeof mode === "string" && validResetModes.includes(mode); -} -var ResetMode; -var validResetModes; -var init_reset = __esm({ - "src/lib/tasks/reset.ts"() { - "use strict"; - init_utils(); - init_task(); - ResetMode = /* @__PURE__ */ ((ResetMode22) => { - ResetMode22["MIXED"] = "mixed"; - ResetMode22["SOFT"] = "soft"; - ResetMode22["HARD"] = "hard"; - ResetMode22["MERGE"] = "merge"; - ResetMode22["KEEP"] = "keep"; - return ResetMode22; - })(ResetMode || {}); - validResetModes = asStringArray(Object.values(ResetMode)); - } -}); -function createLog() { - return (0, import_debug.default)("simple-git"); -} -function prefixedLogger(to, prefix, forward) { - if (!prefix || !String(prefix).replace(/\s*/, "")) { - return !forward - ? to - : (message, ...args) => { - to(message, ...args); - forward(message, ...args); - }; - } - return (message, ...args) => { - to(`%s ${message}`, prefix, ...args); - if (forward) { - forward(message, ...args); - } - }; -} -function childLoggerName(name, childDebugger, { namespace: parentNamespace }) { - if (typeof name === "string") { - return name; - } - const childNamespace = (childDebugger && childDebugger.namespace) || ""; - if (childNamespace.startsWith(parentNamespace)) { - return childNamespace.substr(parentNamespace.length + 1); - } - return childNamespace || parentNamespace; -} -function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { - const labelPrefix = (label && `[${label}]`) || ""; - const spawned = []; - const debugDebugger = typeof verbose === "string" ? infoDebugger.extend(verbose) : verbose; - const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger); - return step(initialStep); - function sibling(name, initial) { - return append(spawned, createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)); - } - function step(phase) { - const stepPrefix = (phase && `[${phase}]`) || ""; - const debug22 = (debugDebugger && prefixedLogger(debugDebugger, stepPrefix)) || NOOP; - const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug22); - return Object.assign(debugDebugger ? debug22 : info, { - label, - sibling, - info, - step - }); - } -} -var init_git_logger = __esm({ - "src/lib/git-logger.ts"() { - "use strict"; - init_utils(); - import_debug.default.formatters.L = (value) => - String(filterHasLength(value) ? value.length : "-"); - import_debug.default.formatters.B = (value) => { - if (Buffer.isBuffer(value)) { - return value.toString("utf8"); - } - return objectToString(value); - }; - } -}); -var TasksPendingQueue; -var init_tasks_pending_queue = __esm({ - "src/lib/runners/tasks-pending-queue.ts"() { - "use strict"; - init_git_error(); - init_git_logger(); - TasksPendingQueue = class _TasksPendingQueue { - constructor(logLabel = "GitExecutor") { - this.logLabel = logLabel; - this._queue = /* @__PURE__ */ new Map(); - } - withProgress(task) { - return this._queue.get(task); - } - createProgress(task) { - const name = _TasksPendingQueue.getName(task.commands[0]); - const logger = createLogger(this.logLabel, name); - return { - task, - logger, - name - }; - } - push(task) { - const progress = this.createProgress(task); - progress.logger("Adding task to the queue, commands = %o", task.commands); - this._queue.set(task, progress); - return progress; - } - fatal(err) { - for (const [task, { logger }] of Array.from(this._queue.entries())) { - if (task === err.task) { - logger.info(`Failed %o`, err); - logger( - `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted` - ); - } else { - logger.info( - `A fatal exception occurred in a previous task, the queue has been purged: %o`, - err.message - ); - } - this.complete(task); - } - if (this._queue.size !== 0) { - throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`); - } - } - complete(task) { - const progress = this.withProgress(task); - if (progress) { - this._queue.delete(task); - } - } - attempt(task) { - const progress = this.withProgress(task); - if (!progress) { - throw new GitError(void 0, "TasksPendingQueue: attempt called for an unknown task"); - } - progress.logger("Starting task"); - return progress; - } - static getName(name = "empty") { - return `task:${name}:${++_TasksPendingQueue.counter}`; - } - static { - this.counter = 0; - } - }; - } -}); -function pluginContext(task, commands3) { - return { - method: first(task.commands) || "", - commands: commands3 - }; -} -function onErrorReceived(target, logger) { - return (err) => { - logger(`[ERROR] child process exception %o`, err); - target.push(Buffer.from(String(err.stack), "ascii")); - }; -} -function onDataReceived(target, name, logger, output) { - return (buffer) => { - logger(`%s received %L bytes`, name, buffer); - output(`%B`, buffer); - target.push(buffer); - }; -} -var GitExecutorChain; -var init_git_executor_chain = __esm({ - "src/lib/runners/git-executor-chain.ts"() { - "use strict"; - init_git_error(); - init_task(); - init_utils(); - init_tasks_pending_queue(); - GitExecutorChain = class { - constructor(_executor, _scheduler, _plugins) { - this._executor = _executor; - this._scheduler = _scheduler; - this._plugins = _plugins; - this._chain = Promise.resolve(); - this._queue = new TasksPendingQueue(); - } - get cwd() { - return this._cwd || this._executor.cwd; - } - set cwd(cwd) { - this._cwd = cwd; - } - get env() { - return this._executor.env; - } - get outputHandler() { - return this._executor.outputHandler; - } - chain() { - return this; - } - push(task) { - this._queue.push(task); - return (this._chain = this._chain.then(() => this.attemptTask(task))); - } - async attemptTask(task) { - const onScheduleComplete = await this._scheduler.next(); - const onQueueComplete = () => this._queue.complete(task); - try { - const { logger } = this._queue.attempt(task); - return await (isEmptyTask(task) - ? this.attemptEmptyTask(task, logger) - : this.attemptRemoteTask(task, logger)); - } catch (e) { - throw this.onFatalException(task, e); - } finally { - onQueueComplete(); - onScheduleComplete(); - } - } - onFatalException(task, e) { - const gitError = - e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e)); - this._chain = Promise.resolve(); - this._queue.fatal(gitError); - return gitError; - } - async attemptRemoteTask(task, logger) { - const binary = this._plugins.exec("spawn.binary", "", pluginContext(task, task.commands)); - const args = this._plugins.exec( - "spawn.args", - [...task.commands], - pluginContext(task, task.commands) - ); - const raw = await this.gitResponse( - task, - binary, - args, - this.outputHandler, - logger.step("SPAWN") - ); - const outputStreams = await this.handleTaskData(task, args, raw, logger.step("HANDLE")); - logger(`passing response to task's parser as a %s`, task.format); - if (isBufferTask(task)) { - return callTaskParser(task.parser, outputStreams); - } - return callTaskParser(task.parser, outputStreams.asStrings()); - } - async attemptEmptyTask(task, logger) { - logger(`empty task bypassing child process to call to task's parser`); - return task.parser(this); - } - handleTaskData(task, args, result, logger) { - const { exitCode, rejection, stdOut, stdErr } = result; - return new Promise((done, fail) => { - logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); - const { error } = this._plugins.exec( - "task.error", - { error: rejection }, - { - ...pluginContext(task, args), - ...result - } - ); - if (error && task.onError) { - logger.info(`exitCode=%s handling with custom error handler`); - return task.onError( - result, - error, - (newStdOut) => { - logger.info(`custom error handler treated as success`); - logger(`custom error returned a %s`, objectToString(newStdOut)); - done( - new GitOutputStreams( - Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, - Buffer.concat(stdErr) - ) - ); - }, - fail - ); - } - if (error) { - logger.info( - `handling as error: exitCode=%s stdErr=%s rejection=%o`, - exitCode, - stdErr.length, - rejection - ); - return fail(error); - } - logger.info(`retrieving task output complete`); - done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr))); - }); - } - async gitResponse(task, command, args, outputHandler, logger) { - const outputLogger = logger.sibling("output"); - const spawnOptions = this._plugins.exec( - "spawn.options", - { - cwd: this.cwd, - env: this.env, - windowsHide: true - }, - pluginContext(task, task.commands) - ); - return new Promise((done) => { - const stdOut = []; - const stdErr = []; - logger.info(`%s %o`, command, args); - logger("%O", spawnOptions); - let rejection = this._beforeSpawn(task, args); - if (rejection) { - return done({ - stdOut, - stdErr, - exitCode: 9901, - rejection - }); - } - this._plugins.exec("spawn.before", void 0, { - ...pluginContext(task, args), - kill(reason) { - rejection = reason || rejection; - } - }); - const spawned = (0, import_child_process.spawn)(command, args, spawnOptions); - spawned.stdout.on( - "data", - onDataReceived(stdOut, "stdOut", logger, outputLogger.step("stdOut")) - ); - spawned.stderr.on( - "data", - onDataReceived(stdErr, "stdErr", logger, outputLogger.step("stdErr")) - ); - spawned.on("error", onErrorReceived(stdErr, logger)); - if (outputHandler) { - logger(`Passing child process stdOut/stdErr to custom outputHandler`); - outputHandler(command, spawned.stdout, spawned.stderr, [...args]); - } - this._plugins.exec("spawn.after", void 0, { - ...pluginContext(task, args), - spawned, - close(exitCode, reason) { - done({ - stdOut, - stdErr, - exitCode, - rejection: rejection || reason - }); - }, - kill(reason) { - if (spawned.killed) { - return; - } - rejection = reason; - spawned.kill("SIGINT"); - } - }); - }); - } - _beforeSpawn(task, args) { - let rejection; - this._plugins.exec("spawn.before", void 0, { - ...pluginContext(task, args), - kill(reason) { - rejection = reason || rejection; - } - }); - return rejection; - } - }; - } -}); -var git_executor_exports = {}; -__export2(git_executor_exports, { - GitExecutor: () => GitExecutor -}); -var GitExecutor; -var init_git_executor = __esm({ - "src/lib/runners/git-executor.ts"() { - "use strict"; - init_git_executor_chain(); - GitExecutor = class { - constructor(cwd, _scheduler, _plugins) { - this.cwd = cwd; - this._scheduler = _scheduler; - this._plugins = _plugins; - this._chain = new GitExecutorChain(this, this._scheduler, this._plugins); - } - chain() { - return new GitExecutorChain(this, this._scheduler, this._plugins); - } - push(task) { - return this._chain.push(task); - } - }; - } -}); -function taskCallback(task, response, callback = NOOP) { - const onSuccess = (data) => { - callback(null, data); - }; - const onError22 = (err) => { - if (err?.task === task) { - callback(err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err, void 0); - } - }; - response.then(onSuccess, onError22); -} -function addDeprecationNoticeToError(err) { - let log = (name) => { - console.warn( - `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3` - ); - log = NOOP; - }; - return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); - function descriptorReducer(all, name) { - if (name in err) { - return all; - } - all[name] = { - enumerable: false, - configurable: false, - get() { - log(name); - return err.git[name]; - } - }; - return all; - } -} -var init_task_callback = __esm({ - "src/lib/task-callback.ts"() { - "use strict"; - init_git_response_error(); - init_utils(); - } -}); -function changeWorkingDirectoryTask(directory, root) { - return adhocExecTask((instance) => { - if (!folderExists(directory)) { - throw new Error(`Git.cwd: cannot change to non-directory "${directory}"`); - } - return ((root || instance).cwd = directory); - }); -} -var init_change_working_directory = __esm({ - "src/lib/tasks/change-working-directory.ts"() { - "use strict"; - init_utils(); - init_task(); - } -}); -function checkoutTask(args) { - const commands3 = ["checkout", ...args]; - if (commands3[1] === "-b" && commands3.includes("-B")) { - commands3[1] = remove(commands3, "-B"); - } - return straightThroughStringTask(commands3); -} -function checkout_default() { - return { - checkout() { - return this._runTask( - checkoutTask(getTrailingOptions(arguments, 1)), - trailingFunctionArgument(arguments) - ); - }, - checkoutBranch(branchName, startPoint) { - return this._runTask( - checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), - trailingFunctionArgument(arguments) - ); - }, - checkoutLocalBranch(branchName) { - return this._runTask( - checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), - trailingFunctionArgument(arguments) - ); - } - }; -} -var init_checkout = __esm({ - "src/lib/tasks/checkout.ts"() { - "use strict"; - init_utils(); - init_task(); - } -}); -function countObjectsResponse() { - return { - count: 0, - garbage: 0, - inPack: 0, - packs: 0, - prunePackable: 0, - size: 0, - sizeGarbage: 0, - sizePack: 0 - }; -} -function count_objects_default() { - return { - countObjects() { - return this._runTask({ - commands: ["count-objects", "--verbose"], - format: "utf-8", - parser(stdOut) { - return parseStringResponse(countObjectsResponse(), [parser2], stdOut); - } - }); - } - }; -} -var parser2; -var init_count_objects = __esm({ - "src/lib/tasks/count-objects.ts"() { - "use strict"; - init_utils(); - parser2 = new LineParser(/([a-z-]+): (\d+)$/, (result, [key, value]) => { - const property = asCamelCase(key); - if (Object.hasOwn(result, property)) { - result[property] = asNumber(value); - } - }); - } -}); -function parseCommitResult(stdOut) { - const result = { - author: null, - branch: "", - commit: "", - root: false, - summary: { - changes: 0, - insertions: 0, - deletions: 0 - } - }; - return parseStringResponse(result, parsers, stdOut); -} -var parsers; -var init_parse_commit = __esm({ - "src/lib/parsers/parse-commit.ts"() { - "use strict"; - init_utils(); - parsers = [ - new LineParser(/^\[([^\s]+)( \([^)]+\))? ([^\]]+)/, (result, [branch, root, commit]) => { - result.branch = branch; - result.commit = commit; - result.root = !!root; - }), - new LineParser(/\s*Author:\s(.+)/i, (result, [author]) => { - const parts = author.split("<"); - const email = parts.pop(); - if (!email || !email.includes("@")) { - return; - } - result.author = { - email: email.substr(0, email.length - 1), - name: parts.join("<").trim() - }; - }), - new LineParser( - /(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, - (result, [changes, insertions, deletions]) => { - result.summary.changes = parseInt(changes, 10) || 0; - result.summary.insertions = parseInt(insertions, 10) || 0; - result.summary.deletions = parseInt(deletions, 10) || 0; - } - ), - new LineParser( - /^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, - (result, [changes, lines, direction]) => { - result.summary.changes = parseInt(changes, 10) || 0; - const count = parseInt(lines, 10) || 0; - if (direction === "-") { - result.summary.deletions = count; - } else if (direction === "+") { - result.summary.insertions = count; - } - } - ) - ]; - } -}); -function commitTask(message, files, customArgs) { - const commands3 = [ - "-c", - "core.abbrev=40", - "commit", - ...prefixedArray(message, "-m"), - ...files, - ...customArgs - ]; - return { - commands: commands3, - format: "utf-8", - parser: parseCommitResult - }; -} -function commit_default() { - return { - commit(message, ...rest) { - const next = trailingFunctionArgument(arguments); - const task = - rejectDeprecatedSignatures(message) || - commitTask(asArray(message), asArray(filterType(rest[0], filterStringOrStringArray, [])), [ - ...asStringArray(filterType(rest[1], filterArray, [])), - ...getTrailingOptions(arguments, 0, true) - ]); - return this._runTask(task, next); - } - }; - function rejectDeprecatedSignatures(message) { - return ( - !filterStringOrStringArray(message) && - configurationErrorTask( - `git.commit: requires the commit message to be supplied as a string/string[]` - ) - ); - } -} -var init_commit = __esm({ - "src/lib/tasks/commit.ts"() { - "use strict"; - init_parse_commit(); - init_utils(); - init_task(); - } -}); -function first_commit_default() { - return { - firstCommit() { - return this._runTask( - straightThroughStringTask(["rev-list", "--max-parents=0", "HEAD"], true), - trailingFunctionArgument(arguments) - ); - } - }; -} -var init_first_commit = __esm({ - "src/lib/tasks/first-commit.ts"() { - "use strict"; - init_utils(); - init_task(); - } -}); -function hashObjectTask(filePath, write) { - const commands3 = ["hash-object", filePath]; - if (write) { - commands3.push("-w"); - } - return straightThroughStringTask(commands3, true); -} -var init_hash_object = __esm({ - "src/lib/tasks/hash-object.ts"() { - "use strict"; - init_task(); - } -}); -function parseInit(bare, path11, text) { - const response = String(text).trim(); - let result; - if ((result = initResponseRegex.exec(response))) { - return new InitSummary(bare, path11, false, result[1]); - } - if ((result = reInitResponseRegex.exec(response))) { - return new InitSummary(bare, path11, true, result[1]); - } - let gitDir = ""; - const tokens = response.split(" "); - while (tokens.length) { - const token = tokens.shift(); - if (token === "in") { - gitDir = tokens.join(" "); - break; - } - } - return new InitSummary(bare, path11, /^re/i.test(response), gitDir); -} -var InitSummary; -var initResponseRegex; -var reInitResponseRegex; -var init_InitSummary = __esm({ - "src/lib/responses/InitSummary.ts"() { - "use strict"; - InitSummary = class { - constructor(bare, path11, existing, gitDir) { - this.bare = bare; - this.path = path11; - this.existing = existing; - this.gitDir = gitDir; - } - }; - initResponseRegex = /^Init.+ repository in (.+)$/; - reInitResponseRegex = /^Rein.+ in (.+)$/; - } -}); -function hasBareCommand(command) { - return command.includes(bareCommand); -} -function initTask(bare = false, path11, customArgs) { - const commands3 = ["init", ...customArgs]; - if (bare && !hasBareCommand(commands3)) { - commands3.splice(1, 0, bareCommand); - } - return { - commands: commands3, - format: "utf-8", - parser(text) { - return parseInit(commands3.includes("--bare"), path11, text); - } - }; -} -var bareCommand; -var init_init = __esm({ - "src/lib/tasks/init.ts"() { - "use strict"; - init_InitSummary(); - bareCommand = "--bare"; - } -}); -function logFormatFromCommand(customArgs) { - for (let i = 0; i < customArgs.length; i++) { - const format = logFormatRegex.exec(customArgs[i]); - if (format) { - return `--${format[1]}`; - } - } - return ""; -} -function isLogFormat(customArg) { - return logFormatRegex.test(customArg); -} -var logFormatRegex; -var init_log_format = __esm({ - "src/lib/args/log-format.ts"() { - "use strict"; - logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/; - } -}); -var DiffSummary; -var init_DiffSummary = __esm({ - "src/lib/responses/DiffSummary.ts"() { - "use strict"; - DiffSummary = class { - constructor() { - this.changed = 0; - this.deletions = 0; - this.insertions = 0; - this.files = []; - } - }; - } -}); -function getDiffParser(format = "") { - const parser42 = diffSummaryParsers[format]; - return (stdOut) => parseStringResponse(new DiffSummary(), parser42, stdOut, false); -} -var statParser; -var numStatParser; -var nameOnlyParser; -var nameStatusParser; -var diffSummaryParsers; -var init_parse_diff_summary = __esm({ - "src/lib/parsers/parse-diff-summary.ts"() { - "use strict"; - init_log_format(); - init_DiffSummary(); - init_diff_name_status(); - init_utils(); - statParser = [ - new LineParser( - /^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, - (result, [file, changes, alterations = ""]) => { - result.files.push({ - file: file.trim(), - changes: asNumber(changes), - insertions: alterations.replace(/[^+]/g, "").length, - deletions: alterations.replace(/[^-]/g, "").length, - binary: false - }); - } - ), - new LineParser( - /^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, - (result, [file, before, after]) => { - result.files.push({ - file: file.trim(), - before: asNumber(before), - after: asNumber(after), - binary: true - }); - } - ), - new LineParser( - /(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, - (result, [changed, summary]) => { - const inserted = /(\d+) i/.exec(summary); - const deleted = /(\d+) d/.exec(summary); - result.changed = asNumber(changed); - result.insertions = asNumber(inserted?.[1]); - result.deletions = asNumber(deleted?.[1]); - } - ) - ]; - numStatParser = [ - new LineParser(/(\d+)\t(\d+)\t(.+)$/, (result, [changesInsert, changesDelete, file]) => { - const insertions = asNumber(changesInsert); - const deletions = asNumber(changesDelete); - result.changed++; - result.insertions += insertions; - result.deletions += deletions; - result.files.push({ - file, - changes: insertions + deletions, - insertions, - deletions, - binary: false - }); - }), - new LineParser(/-\t-\t(.+)$/, (result, [file]) => { - result.changed++; - result.files.push({ - file, - after: 0, - before: 0, - binary: true - }); - }) - ]; - nameOnlyParser = [ - new LineParser(/(.+)$/, (result, [file]) => { - result.changed++; - result.files.push({ - file, - changes: 0, - insertions: 0, - deletions: 0, - binary: false - }); - }) - ]; - nameStatusParser = [ - new LineParser( - /([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, - (result, [status, similarity, from, _to, to]) => { - result.changed++; - result.files.push({ - file: to ?? from, - changes: 0, - insertions: 0, - deletions: 0, - binary: false, - status: orVoid(isDiffNameStatus(status) && status), - from: orVoid(!!to && from !== to && from), - similarity: asNumber(similarity) - }); - } - ) - ]; - diffSummaryParsers = { - [""]: - /* NONE */ - statParser, - ["--stat"]: - /* STAT */ - statParser, - ["--numstat"]: - /* NUM_STAT */ - numStatParser, - ["--name-status"]: - /* NAME_STATUS */ - nameStatusParser, - ["--name-only"]: - /* NAME_ONLY */ - nameOnlyParser - }; - } -}); -function lineBuilder(tokens, fields) { - return fields.reduce( - (line, field, index) => { - line[field] = tokens[index] || ""; - return line; - }, - /* @__PURE__ */ Object.create({ diff: null }) - ); -} -function createListLogSummaryParser( - splitter = SPLITTER, - fields = defaultFieldNames, - logFormat = "" -) { - const parseDiffResult = getDiffParser(logFormat); - return function (stdOut) { - const all = toLinesWithContent(stdOut.trim(), false, START_BOUNDARY).map(function (item) { - const lineDetail = item.split(COMMIT_BOUNDARY); - const listLogLine = lineBuilder(lineDetail[0].split(splitter), fields); - if (lineDetail.length > 1 && !!lineDetail[1].trim()) { - listLogLine.diff = parseDiffResult(lineDetail[1]); - } - return listLogLine; - }); - return { - all, - latest: (all.length && all[0]) || null, - total: all.length - }; - }; -} -var START_BOUNDARY; -var COMMIT_BOUNDARY; -var SPLITTER; -var defaultFieldNames; -var init_parse_list_log_summary = __esm({ - "src/lib/parsers/parse-list-log-summary.ts"() { - "use strict"; - init_utils(); - init_parse_diff_summary(); - init_log_format(); - START_BOUNDARY = "\xF2\xF2\xF2\xF2\xF2\xF2 "; - COMMIT_BOUNDARY = " \xF2\xF2"; - SPLITTER = " \xF2 "; - defaultFieldNames = ["hash", "date", "message", "refs", "author_name", "author_email"]; - } -}); -var diff_exports = {}; -__export2(diff_exports, { - diffSummaryTask: () => diffSummaryTask, - validateLogFormatConfig: () => validateLogFormatConfig -}); -function diffSummaryTask(customArgs) { - let logFormat = logFormatFromCommand(customArgs); - const commands3 = ["diff"]; - if (logFormat === "") { - logFormat = "--stat"; - commands3.push("--stat=4096"); - } - commands3.push(...customArgs); - return ( - validateLogFormatConfig(commands3) || { - commands: commands3, - format: "utf-8", - parser: getDiffParser(logFormat) - } - ); -} -function validateLogFormatConfig(customArgs) { - const flags = customArgs.filter(isLogFormat); - if (flags.length > 1) { - return configurationErrorTask( - `Summary flags are mutually exclusive - pick one of ${flags.join(",")}` - ); - } - if (flags.length && customArgs.includes("-z")) { - return configurationErrorTask( - `Summary flag ${flags} parsing is not compatible with null termination option '-z'` - ); - } -} -var init_diff = __esm({ - "src/lib/tasks/diff.ts"() { - "use strict"; - init_log_format(); - init_parse_diff_summary(); - init_task(); - } -}); -function prettyFormat(format, splitter) { - const fields = []; - const formatStr = []; - Object.keys(format).forEach((field) => { - fields.push(field); - formatStr.push(String(format[field])); - }); - return [fields, formatStr.join(splitter)]; -} -function userOptions(input) { - return Object.keys(input).reduce((out, key) => { - if (!(key in excludeOptions)) { - out[key] = input[key]; - } - return out; - }, {}); -} -function parseLogOptions(opt = {}, customArgs = []) { - const splitter = filterType(opt.splitter, filterString, SPLITTER); - const format = filterPlainObject(opt.format) - ? opt.format - : { - hash: "%H", - date: opt.strictDate === false ? "%ai" : "%aI", - message: "%s", - refs: "%D", - body: opt.multiLine ? "%B" : "%b", - author_name: opt.mailMap !== false ? "%aN" : "%an", - author_email: opt.mailMap !== false ? "%aE" : "%ae" - }; - const [fields, formatStr] = prettyFormat(format, splitter); - const suffix = []; - const command = [ - `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`, - ...customArgs - ]; - const maxCount = opt.n || opt["max-count"] || opt.maxCount; - if (maxCount) { - command.push(`--max-count=${maxCount}`); - } - if (opt.from || opt.to) { - const rangeOperator = opt.symmetric !== false ? "..." : ".."; - suffix.push(`${opt.from || ""}${rangeOperator}${opt.to || ""}`); - } - if (filterString(opt.file)) { - command.push("--follow", pathspec(opt.file)); - } - appendTaskOptions(userOptions(opt), command); - return { - fields, - splitter, - commands: [...command, ...suffix] - }; -} -function logTask(splitter, fields, customArgs) { - const parser42 = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs)); - return { - commands: ["log", ...customArgs], - format: "utf-8", - parser: parser42 - }; -} -function log_default() { - return { - log(...rest) { - const next = trailingFunctionArgument(arguments); - const options = parseLogOptions( - trailingOptionsArgument(arguments), - asStringArray(filterType(arguments[0], filterArray, [])) - ); - const task = - rejectDeprecatedSignatures(...rest) || - validateLogFormatConfig(options.commands) || - createLogTask(options); - return this._runTask(task, next); - } - }; - function createLogTask(options) { - return logTask(options.splitter, options.fields, options.commands); - } - function rejectDeprecatedSignatures(from, to) { - return ( - filterString(from) && - filterString(to) && - configurationErrorTask( - `git.log(string, string) should be replaced with git.log({ from: string, to: string })` - ) - ); - } -} -var excludeOptions; -var init_log = __esm({ - "src/lib/tasks/log.ts"() { - "use strict"; - init_log_format(); - init_pathspec(); - init_parse_list_log_summary(); - init_utils(); - init_task(); - init_diff(); - excludeOptions = /* @__PURE__ */ ((excludeOptions22) => { - excludeOptions22[(excludeOptions22["--pretty"] = 0)] = "--pretty"; - excludeOptions22[(excludeOptions22["max-count"] = 1)] = "max-count"; - excludeOptions22[(excludeOptions22["maxCount"] = 2)] = "maxCount"; - excludeOptions22[(excludeOptions22["n"] = 3)] = "n"; - excludeOptions22[(excludeOptions22["file"] = 4)] = "file"; - excludeOptions22[(excludeOptions22["format"] = 5)] = "format"; - excludeOptions22[(excludeOptions22["from"] = 6)] = "from"; - excludeOptions22[(excludeOptions22["to"] = 7)] = "to"; - excludeOptions22[(excludeOptions22["splitter"] = 8)] = "splitter"; - excludeOptions22[(excludeOptions22["symmetric"] = 9)] = "symmetric"; - excludeOptions22[(excludeOptions22["mailMap"] = 10)] = "mailMap"; - excludeOptions22[(excludeOptions22["multiLine"] = 11)] = "multiLine"; - excludeOptions22[(excludeOptions22["strictDate"] = 12)] = "strictDate"; - return excludeOptions22; - })(excludeOptions || {}); - } -}); -var MergeSummaryConflict; -var MergeSummaryDetail; -var init_MergeSummary = __esm({ - "src/lib/responses/MergeSummary.ts"() { - "use strict"; - MergeSummaryConflict = class { - constructor(reason, file = null, meta) { - this.reason = reason; - this.file = file; - this.meta = meta; - } - toString() { - return `${this.file}:${this.reason}`; - } - }; - MergeSummaryDetail = class { - constructor() { - this.conflicts = []; - this.merges = []; - this.result = "success"; - } - get failed() { - return this.conflicts.length > 0; - } - get reason() { - return this.result; - } - toString() { - if (this.conflicts.length) { - return `CONFLICTS: ${this.conflicts.join(", ")}`; - } - return "OK"; - } - }; - } -}); -var PullSummary; -var PullFailedSummary; -var init_PullSummary = __esm({ - "src/lib/responses/PullSummary.ts"() { - "use strict"; - PullSummary = class { - constructor() { - this.remoteMessages = { - all: [] - }; - this.created = []; - this.deleted = []; - this.files = []; - this.deletions = {}; - this.insertions = {}; - this.summary = { - changes: 0, - deletions: 0, - insertions: 0 - }; - } - }; - PullFailedSummary = class { - constructor() { - this.remote = ""; - this.hash = { - local: "", - remote: "" - }; - this.branch = { - local: "", - remote: "" - }; - this.message = ""; - } - toString() { - return this.message; - } - }; - } -}); -function objectEnumerationResult(remoteMessages) { - return (remoteMessages.objects = remoteMessages.objects || { - compressing: 0, - counting: 0, - enumerating: 0, - packReused: 0, - reused: { count: 0, delta: 0 }, - total: { count: 0, delta: 0 } - }); -} -function asObjectCount(source) { - const count = /^\s*(\d+)/.exec(source); - const delta = /delta (\d+)/i.exec(source); - return { - count: asNumber((count && count[1]) || "0"), - delta: asNumber((delta && delta[1]) || "0") - }; -} -var remoteMessagesObjectParsers; -var init_parse_remote_objects = __esm({ - "src/lib/parsers/parse-remote-objects.ts"() { - "use strict"; - init_utils(); - remoteMessagesObjectParsers = [ - new RemoteLineParser( - /^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, - (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber(count) }); - } - ), - new RemoteLineParser( - /^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, - (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber(count) }); - } - ), - new RemoteLineParser( - /total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, - (result, [total, reused, packReused]) => { - const objects = objectEnumerationResult(result.remoteMessages); - objects.total = asObjectCount(total); - objects.reused = asObjectCount(reused); - objects.packReused = asNumber(packReused); - } - ) - ]; - } -}); -function parseRemoteMessages(_stdOut, stdErr) { - return parseStringResponse({ remoteMessages: new RemoteMessageSummary() }, parsers2, stdErr); -} -var parsers2; -var RemoteMessageSummary; -var init_parse_remote_messages = __esm({ - "src/lib/parsers/parse-remote-messages.ts"() { - "use strict"; - init_utils(); - init_parse_remote_objects(); - parsers2 = [ - new RemoteLineParser(/^remote:\s*(.+)$/, (result, [text]) => { - result.remoteMessages.all.push(text.trim()); - return false; - }), - ...remoteMessagesObjectParsers, - new RemoteLineParser( - [/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], - (result, [pullRequestUrl]) => { - result.remoteMessages.pullRequestUrl = pullRequestUrl; - } - ), - new RemoteLineParser( - [/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], - (result, [count, summary, url]) => { - result.remoteMessages.vulnerabilities = { - count: asNumber(count), - summary, - url - }; - } - ) - ]; - RemoteMessageSummary = class { - constructor() { - this.all = []; - } - }; - } -}); -function parsePullErrorResult(stdOut, stdErr) { - const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]); - return pullError.message && pullError; -} -var FILE_UPDATE_REGEX; -var SUMMARY_REGEX; -var ACTION_REGEX; -var parsers3; -var errorParsers; -var parsePullDetail; -var parsePullResult; -var init_parse_pull = __esm({ - "src/lib/parsers/parse-pull.ts"() { - "use strict"; - init_PullSummary(); - init_utils(); - init_parse_remote_messages(); - FILE_UPDATE_REGEX = /^\s*(.+?)\s+\|\s+\d+\s*(\+*)(-*)/; - SUMMARY_REGEX = /(\d+)\D+((\d+)\D+\(\+\))?(\D+(\d+)\D+\(-\))?/; - ACTION_REGEX = /^(create|delete) mode \d+ (.+)/; - parsers3 = [ - new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => { - result.files.push(file); - if (insertions) { - result.insertions[file] = insertions.length; - } - if (deletions) { - result.deletions[file] = deletions.length; - } - }), - new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => { - if (insertions !== void 0 || deletions !== void 0) { - result.summary.changes = +changes || 0; - result.summary.insertions = +insertions || 0; - result.summary.deletions = +deletions || 0; - return true; - } - return false; - }), - new LineParser(ACTION_REGEX, (result, [action, file]) => { - append(result.files, file); - append(action === "create" ? result.created : result.deleted, file); - }) - ]; - errorParsers = [ - new LineParser(/^from\s(.+)$/i, (result, [remote]) => void (result.remote = remote)), - new LineParser(/^fatal:\s(.+)$/, (result, [message]) => void (result.message = message)), - new LineParser( - /([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, - (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { - result.branch.local = branchLocal; - result.hash.local = hashLocal; - result.branch.remote = branchRemote; - result.hash.remote = hashRemote; - } - ) - ]; - parsePullDetail = (stdOut, stdErr) => { - return parseStringResponse(new PullSummary(), parsers3, [stdOut, stdErr]); - }; - parsePullResult = (stdOut, stdErr) => { - return Object.assign( - new PullSummary(), - parsePullDetail(stdOut, stdErr), - parseRemoteMessages(stdOut, stdErr) - ); - }; - } -}); -var parsers4; -var parseMergeResult; -var parseMergeDetail; -var init_parse_merge = __esm({ - "src/lib/parsers/parse-merge.ts"() { - "use strict"; - init_MergeSummary(); - init_utils(); - init_parse_pull(); - parsers4 = [ - new LineParser(/^Auto-merging\s+(.+)$/, (summary, [autoMerge]) => { - summary.merges.push(autoMerge); - }), - new LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file]) => { - summary.conflicts.push(new MergeSummaryConflict(reason, file)); - }), - new LineParser( - /^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, - (summary, [reason, file, deleteRef]) => { - summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef })); - } - ), - new LineParser(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { - summary.conflicts.push(new MergeSummaryConflict(reason, null)); - }), - new LineParser(/^Automatic merge failed;\s+(.+)$/, (summary, [result]) => { - summary.result = result; - }) - ]; - parseMergeResult = (stdOut, stdErr) => { - return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr)); - }; - parseMergeDetail = (stdOut) => { - return parseStringResponse(new MergeSummaryDetail(), parsers4, stdOut); - }; - } -}); -function mergeTask(customArgs) { - if (!customArgs.length) { - return configurationErrorTask("Git.merge requires at least one option"); - } - return { - commands: ["merge", ...customArgs], - format: "utf-8", - parser(stdOut, stdErr) { - const merge2 = parseMergeResult(stdOut, stdErr); - if (merge2.failed) { - throw new GitResponseError(merge2); - } - return merge2; - } - }; -} -var init_merge = __esm({ - "src/lib/tasks/merge.ts"() { - "use strict"; - init_git_response_error(); - init_parse_merge(); - init_task(); - } -}); -function pushResultPushedItem(local, remote, status) { - const deleted = status.includes("deleted"); - const tag = status.includes("tag") || /^refs\/tags/.test(local); - const alreadyUpdated = !status.includes("new"); - return { - deleted, - tag, - branch: !tag, - new: !alreadyUpdated, - alreadyUpdated, - local, - remote - }; -} -var parsers5; -var parsePushResult; -var parsePushDetail; -var init_parse_push = __esm({ - "src/lib/parsers/parse-push.ts"() { - "use strict"; - init_utils(); - init_parse_remote_messages(); - parsers5 = [ - new LineParser(/^Pushing to (.+)$/, (result, [repo]) => { - result.repo = repo; - }), - new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => { - result.ref = { - ...(result.ref || {}), - local - }; - }), - new LineParser(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { - result.pushed.push(pushResultPushedItem(local, remote, type)); - }), - new LineParser( - /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, - (result, [local, remote, remoteName]) => { - result.branch = { - ...(result.branch || {}), - local, - remote, - remoteName - }; - } - ), - new LineParser( - /^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, - (result, [local, remote, from, to]) => { - result.update = { - head: { - local, - remote - }, - hash: { - from, - to - } - }; - } - ) - ]; - parsePushResult = (stdOut, stdErr) => { - const pushDetail = parsePushDetail(stdOut, stdErr); - const responseDetail = parseRemoteMessages(stdOut, stdErr); - return { - ...pushDetail, - ...responseDetail - }; - }; - parsePushDetail = (stdOut, stdErr) => { - return parseStringResponse({ pushed: [] }, parsers5, [stdOut, stdErr]); - }; - } -}); -var push_exports = {}; -__export2(push_exports, { - pushTagsTask: () => pushTagsTask, - pushTask: () => pushTask -}); -function pushTagsTask(ref = {}, customArgs) { - append(customArgs, "--tags"); - return pushTask(ref, customArgs); -} -function pushTask(ref = {}, customArgs) { - const commands3 = ["push", ...customArgs]; - if (ref.branch) { - commands3.splice(1, 0, ref.branch); - } - if (ref.remote) { - commands3.splice(1, 0, ref.remote); - } - remove(commands3, "-v"); - append(commands3, "--verbose"); - append(commands3, "--porcelain"); - return { - commands: commands3, - format: "utf-8", - parser: parsePushResult - }; -} -var init_push = __esm({ - "src/lib/tasks/push.ts"() { - "use strict"; - init_parse_push(); - init_utils(); - } -}); -function show_default() { - return { - showBuffer() { - const commands3 = ["show", ...getTrailingOptions(arguments, 1)]; - if (!commands3.includes("--binary")) { - commands3.splice(1, 0, "--binary"); - } - return this._runTask( - straightThroughBufferTask(commands3), - trailingFunctionArgument(arguments) - ); - }, - show() { - const commands3 = ["show", ...getTrailingOptions(arguments, 1)]; - return this._runTask( - straightThroughStringTask(commands3), - trailingFunctionArgument(arguments) - ); - } - }; -} -var init_show = __esm({ - "src/lib/tasks/show.ts"() { - "use strict"; - init_utils(); - init_task(); - } -}); -var fromPathRegex; -var FileStatusSummary; -var init_FileStatusSummary = __esm({ - "src/lib/responses/FileStatusSummary.ts"() { - "use strict"; - fromPathRegex = /^(.+)\0(.+)$/; - FileStatusSummary = class { - constructor(path11, index, working_dir) { - this.path = path11; - this.index = index; - this.working_dir = working_dir; - if (index === "R" || working_dir === "R") { - const detail = fromPathRegex.exec(path11) || [null, path11, path11]; - this.from = detail[2] || ""; - this.path = detail[1] || ""; - } - } - }; - } -}); -function renamedFile(line) { - const [to, from] = line.split(NULL); - return { - from: from || to, - to - }; -} -function parser3(indexX, indexY, handler2) { - return [`${indexX}${indexY}`, handler2]; -} -function conflicts(indexX, ...indexY) { - return indexY.map((y) => parser3(indexX, y, (result, file) => result.conflicted.push(file))); -} -function splitLine(result, lineStr) { - const trimmed22 = lineStr.trim(); - switch (" ") { - case trimmed22.charAt(2): - return data(trimmed22.charAt(0), trimmed22.charAt(1), trimmed22.slice(3)); - case trimmed22.charAt(1): - return data(" ", trimmed22.charAt(0), trimmed22.slice(2)); - default: - return; - } - function data(index, workingDir, path11) { - const raw = `${index}${workingDir}`; - const handler2 = parsers6.get(raw); - if (handler2) { - handler2(result, path11); - } - if (raw !== "##" && raw !== "!!") { - result.files.push(new FileStatusSummary(path11, index, workingDir)); - } - } -} -var StatusSummary; -var parsers6; -var parseStatusSummary; -var init_StatusSummary = __esm({ - "src/lib/responses/StatusSummary.ts"() { - "use strict"; - init_utils(); - init_FileStatusSummary(); - StatusSummary = class { - constructor() { - this.not_added = []; - this.conflicted = []; - this.created = []; - this.deleted = []; - this.ignored = void 0; - this.modified = []; - this.renamed = []; - this.files = []; - this.staged = []; - this.ahead = 0; - this.behind = 0; - this.current = null; - this.tracking = null; - this.detached = false; - this.isClean = () => { - return !this.files.length; - }; - } - }; - parsers6 = new Map([ - parser3(" ", "A", (result, file) => result.created.push(file)), - parser3(" ", "D", (result, file) => result.deleted.push(file)), - parser3(" ", "M", (result, file) => result.modified.push(file)), - parser3("A", " ", (result, file) => { - result.created.push(file); - result.staged.push(file); - }), - parser3("A", "M", (result, file) => { - result.created.push(file); - result.staged.push(file); - result.modified.push(file); - }), - parser3("D", " ", (result, file) => { - result.deleted.push(file); - result.staged.push(file); - }), - parser3("M", " ", (result, file) => { - result.modified.push(file); - result.staged.push(file); - }), - parser3("M", "M", (result, file) => { - result.modified.push(file); - result.staged.push(file); - }), - parser3("R", " ", (result, file) => { - result.renamed.push(renamedFile(file)); - }), - parser3("R", "M", (result, file) => { - const renamed = renamedFile(file); - result.renamed.push(renamed); - result.modified.push(renamed.to); - }), - parser3("!", "!", (_result, _file) => { - (_result.ignored = _result.ignored || []).push(_file); - }), - parser3("?", "?", (result, file) => result.not_added.push(file)), - ...conflicts( - "A", - "A", - "U" - /* UNMERGED */ - ), - ...conflicts( - "D", - "D", - "U" - /* UNMERGED */ - ), - ...conflicts( - "U", - "A", - "D", - "U" - /* UNMERGED */ - ), - [ - "##", - (result, line) => { - const aheadReg = /ahead (\d+)/; - const behindReg = /behind (\d+)/; - const currentReg = /^(.+?(?=(?:\.{3}|\s|$)))/; - const trackingReg = /\.{3}(\S*)/; - const onEmptyBranchReg = /\son\s(\S+?)(?=\.{3}|$)/; - let regexResult = aheadReg.exec(line); - result.ahead = (regexResult && +regexResult[1]) || 0; - regexResult = behindReg.exec(line); - result.behind = (regexResult && +regexResult[1]) || 0; - regexResult = currentReg.exec(line); - result.current = filterType(regexResult?.[1], filterString, null); - regexResult = trackingReg.exec(line); - result.tracking = filterType(regexResult?.[1], filterString, null); - regexResult = onEmptyBranchReg.exec(line); - if (regexResult) { - result.current = filterType(regexResult?.[1], filterString, result.current); - } - result.detached = /\(no branch\)/.test(line); - } - ] - ]); - parseStatusSummary = function (text) { - const lines = text.split(NULL); - const status = new StatusSummary(); - for (let i = 0, l = lines.length; i < l; ) { - let line = lines[i++].trim(); - if (!line) { - continue; - } - if (line.charAt(0) === "R") { - line += NULL + (lines[i++] || ""); - } - splitLine(status, line); - } - return status; - }; - } -}); -function statusTask(customArgs) { - const commands3 = [ - "status", - "--porcelain", - "-b", - "-u", - "--null", - ...customArgs.filter((arg) => !ignoredOptions.includes(arg)) - ]; - return { - format: "utf-8", - commands: commands3, - parser(text) { - return parseStatusSummary(text); - } - }; -} -var ignoredOptions; -var init_status = __esm({ - "src/lib/tasks/status.ts"() { - "use strict"; - init_StatusSummary(); - ignoredOptions = ["--null", "-z"]; - } -}); -function versionResponse(major = 0, minor = 0, patch = 0, agent = "", installed = true) { - return Object.defineProperty( - { - major, - minor, - patch, - agent, - installed - }, - "toString", - { - value() { - return `${this.major}.${this.minor}.${this.patch}`; - }, - configurable: false, - enumerable: false - } - ); -} -function notInstalledResponse() { - return versionResponse(0, 0, 0, "", false); -} -function version_default() { - return { - version() { - return this._runTask({ - commands: ["--version"], - format: "utf-8", - parser: versionParser, - onError(result, error, done, fail) { - if (result.exitCode === -2) { - return done(Buffer.from(NOT_INSTALLED)); - } - fail(error); - } - }); - } - }; -} -function versionParser(stdOut) { - if (stdOut === NOT_INSTALLED) { - return notInstalledResponse(); - } - return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers7, stdOut); -} -var NOT_INSTALLED; -var parsers7; -var init_version = __esm({ - "src/lib/tasks/version.ts"() { - "use strict"; - init_utils(); - NOT_INSTALLED = "installed=false"; - parsers7 = [ - new LineParser( - /version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, - (result, [major, minor, patch, agent = ""]) => { - Object.assign( - result, - versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent) - ); - } - ), - new LineParser( - /version (\d+)\.(\d+)\.(\D+)(.+)?$/, - (result, [major, minor, patch, agent = ""]) => { - Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent)); - } - ) - ]; - } -}); -var simple_git_api_exports = {}; -__export2(simple_git_api_exports, { - SimpleGitApi: () => SimpleGitApi -}); -var SimpleGitApi; -var init_simple_git_api = __esm({ - "src/lib/simple-git-api.ts"() { - "use strict"; - init_task_callback(); - init_change_working_directory(); - init_checkout(); - init_count_objects(); - init_commit(); - init_config(); - init_first_commit(); - init_grep(); - init_hash_object(); - init_init(); - init_log(); - init_merge(); - init_push(); - init_show(); - init_status(); - init_task(); - init_version(); - init_utils(); - SimpleGitApi = class { - constructor(_executor) { - this._executor = _executor; - } - _runTask(task, then) { - const chain = this._executor.chain(); - const promise = chain.push(task); - if (then) { - taskCallback(task, promise, then); - } - return Object.create(this, { - then: { value: promise.then.bind(promise) }, - catch: { value: promise.catch.bind(promise) }, - _executor: { value: chain } - }); - } - add(files) { - return this._runTask( - straightThroughStringTask(["add", ...asArray(files)]), - trailingFunctionArgument(arguments) - ); - } - cwd(directory) { - const next = trailingFunctionArgument(arguments); - if (typeof directory === "string") { - return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next); - } - if (typeof directory?.path === "string") { - return this._runTask( - changeWorkingDirectoryTask( - directory.path, - (directory.root && this._executor) || void 0 - ), - next - ); - } - return this._runTask( - configurationErrorTask("Git.cwd: workingDirectory must be supplied as a string"), - next - ); - } - hashObject(path11, write) { - return this._runTask( - hashObjectTask(path11, write === true), - trailingFunctionArgument(arguments) - ); - } - init(bare) { - return this._runTask( - initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), - trailingFunctionArgument(arguments) - ); - } - merge() { - return this._runTask( - mergeTask(getTrailingOptions(arguments)), - trailingFunctionArgument(arguments) - ); - } - mergeFromTo(remote, branch) { - if (!(filterString(remote) && filterString(branch))) { - return this._runTask( - configurationErrorTask( - `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings` - ) - ); - } - return this._runTask( - mergeTask([remote, branch, ...getTrailingOptions(arguments)]), - trailingFunctionArgument(arguments, false) - ); - } - outputHandler(handler2) { - this._executor.outputHandler = handler2; - return this; - } - push() { - const task = pushTask( - { - remote: filterType(arguments[0], filterString), - branch: filterType(arguments[1], filterString) - }, - getTrailingOptions(arguments) - ); - return this._runTask(task, trailingFunctionArgument(arguments)); - } - stash() { - return this._runTask( - straightThroughStringTask(["stash", ...getTrailingOptions(arguments)]), - trailingFunctionArgument(arguments) - ); - } - status() { - return this._runTask( - statusTask(getTrailingOptions(arguments)), - trailingFunctionArgument(arguments) - ); - } - }; - Object.assign( - SimpleGitApi.prototype, - checkout_default(), - commit_default(), - config_default(), - count_objects_default(), - first_commit_default(), - grep_default(), - log_default(), - show_default(), - version_default() - ); - } -}); -var scheduler_exports = {}; -__export2(scheduler_exports, { - Scheduler: () => Scheduler -}); -var createScheduledTask; -var Scheduler; -var init_scheduler = __esm({ - "src/lib/runners/scheduler.ts"() { - "use strict"; - init_utils(); - init_git_logger(); - createScheduledTask = /* @__PURE__ */ (() => { - let id = 0; - return () => { - id++; - const { promise, done } = (0, import_promise_deferred.createDeferred)(); - return { - promise, - done, - id - }; - }; - })(); - Scheduler = class { - constructor(concurrency = 2) { - this.concurrency = concurrency; - this.logger = createLogger("", "scheduler"); - this.pending = []; - this.running = []; - this.logger(`Constructed, concurrency=%s`, concurrency); - } - schedule() { - if (!this.pending.length || this.running.length >= this.concurrency) { - this.logger( - `Schedule attempt ignored, pending=%s running=%s concurrency=%s`, - this.pending.length, - this.running.length, - this.concurrency - ); - return; - } - const task = append(this.running, this.pending.shift()); - this.logger(`Attempting id=%s`, task.id); - task.done(() => { - this.logger(`Completing id=`, task.id); - remove(this.running, task); - this.schedule(); - }); - } - next() { - const { promise, id } = append(this.pending, createScheduledTask()); - this.logger(`Scheduling id=%s`, id); - this.schedule(); - return promise; - } - }; - } -}); -var apply_patch_exports = {}; -__export2(apply_patch_exports, { - applyPatchTask: () => applyPatchTask -}); -function applyPatchTask(patches, customArgs) { - return straightThroughStringTask(["apply", ...customArgs, ...patches]); -} -var init_apply_patch = __esm({ - "src/lib/tasks/apply-patch.ts"() { - "use strict"; - init_task(); - } -}); -function branchDeletionSuccess(branch, hash) { - return { - branch, - hash, - success: true - }; -} -function branchDeletionFailure(branch) { - return { - branch, - hash: null, - success: false - }; -} -var BranchDeletionBatch; -var init_BranchDeleteSummary = __esm({ - "src/lib/responses/BranchDeleteSummary.ts"() { - "use strict"; - BranchDeletionBatch = class { - constructor() { - this.all = []; - this.branches = {}; - this.errors = []; - } - get success() { - return !this.errors.length; - } - }; - } -}); -function hasBranchDeletionError(data, processExitCode) { - return processExitCode === 1 && deleteErrorRegex.test(data); -} -var deleteSuccessRegex; -var deleteErrorRegex; -var parsers8; -var parseBranchDeletions; -var init_parse_branch_delete = __esm({ - "src/lib/parsers/parse-branch-delete.ts"() { - "use strict"; - init_BranchDeleteSummary(); - init_utils(); - deleteSuccessRegex = /(\S+)\s+\(\S+\s([^)]+)\)/; - deleteErrorRegex = /^error[^']+'([^']+)'/m; - parsers8 = [ - new LineParser(deleteSuccessRegex, (result, [branch, hash]) => { - const deletion = branchDeletionSuccess(branch, hash); - result.all.push(deletion); - result.branches[branch] = deletion; - }), - new LineParser(deleteErrorRegex, (result, [branch]) => { - const deletion = branchDeletionFailure(branch); - result.errors.push(deletion); - result.all.push(deletion); - result.branches[branch] = deletion; - }) - ]; - parseBranchDeletions = (stdOut, stdErr) => { - return parseStringResponse(new BranchDeletionBatch(), parsers8, [stdOut, stdErr]); - }; - } -}); -var BranchSummaryResult; -var init_BranchSummary = __esm({ - "src/lib/responses/BranchSummary.ts"() { - "use strict"; - BranchSummaryResult = class { - constructor() { - this.all = []; - this.branches = {}; - this.current = ""; - this.detached = false; - } - push(status, detached, name, commit, label) { - if (status === "*") { - this.detached = detached; - this.current = name; - } - this.all.push(name); - this.branches[name] = { - current: status === "*", - linkedWorkTree: status === "+", - name, - commit, - label - }; - } - }; - } -}); -function branchStatus(input) { - return input ? input.charAt(0) : ""; -} -function parseBranchSummary(stdOut, currentOnly = false) { - return parseStringResponse( - new BranchSummaryResult(), - currentOnly ? [currentBranchParser] : parsers9, - stdOut - ); -} -var parsers9; -var currentBranchParser; -var init_parse_branch = __esm({ - "src/lib/parsers/parse-branch.ts"() { - "use strict"; - init_BranchSummary(); - init_utils(); - parsers9 = [ - new LineParser( - /^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, - (result, [current, name, commit, label]) => { - result.push(branchStatus(current), true, name, commit, label); - } - ), - new LineParser( - /^([*+]\s)?(\S+)\s+([a-z0-9]+)\s?(.*)$/s, - (result, [current, name, commit, label]) => { - result.push(branchStatus(current), false, name, commit, label); - } - ) - ]; - currentBranchParser = new LineParser(/^(\S+)$/s, (result, [name]) => { - result.push("*", false, name, "", ""); - }); - } -}); -var branch_exports = {}; -__export2(branch_exports, { - branchLocalTask: () => branchLocalTask, - branchTask: () => branchTask, - containsDeleteBranchCommand: () => containsDeleteBranchCommand, - deleteBranchTask: () => deleteBranchTask, - deleteBranchesTask: () => deleteBranchesTask -}); -function containsDeleteBranchCommand(commands3) { - const deleteCommands = ["-d", "-D", "--delete"]; - return commands3.some((command) => deleteCommands.includes(command)); -} -function branchTask(customArgs) { - const isDelete = containsDeleteBranchCommand(customArgs); - const isCurrentOnly = customArgs.includes("--show-current"); - const commands3 = ["branch", ...customArgs]; - if (commands3.length === 1) { - commands3.push("-a"); - } - if (!commands3.includes("-v")) { - commands3.splice(1, 0, "-v"); - } - return { - format: "utf-8", - commands: commands3, - parser(stdOut, stdErr) { - if (isDelete) { - return parseBranchDeletions(stdOut, stdErr).all[0]; - } - return parseBranchSummary(stdOut, isCurrentOnly); - } - }; -} -function branchLocalTask() { - return { - format: "utf-8", - commands: ["branch", "-v"], - parser(stdOut) { - return parseBranchSummary(stdOut); - } - }; -} -function deleteBranchesTask(branches, forceDelete = false) { - return { - format: "utf-8", - commands: ["branch", "-v", forceDelete ? "-D" : "-d", ...branches], - parser(stdOut, stdErr) { - return parseBranchDeletions(stdOut, stdErr); - }, - onError({ exitCode, stdOut }, error, done, fail) { - if (!hasBranchDeletionError(String(error), exitCode)) { - return fail(error); - } - done(stdOut); - } - }; -} -function deleteBranchTask(branch, forceDelete = false) { - const task = { - format: "utf-8", - commands: ["branch", "-v", forceDelete ? "-D" : "-d", branch], - parser(stdOut, stdErr) { - return parseBranchDeletions(stdOut, stdErr).branches[branch]; - }, - onError({ exitCode, stdErr, stdOut }, error, _, fail) { - if (!hasBranchDeletionError(String(error), exitCode)) { - return fail(error); - } - throw new GitResponseError( - task.parser(bufferToString(stdOut), bufferToString(stdErr)), - String(error) - ); - } - }; - return task; -} -var init_branch = __esm({ - "src/lib/tasks/branch.ts"() { - "use strict"; - init_git_response_error(); - init_parse_branch_delete(); - init_parse_branch(); - init_utils(); - } -}); -function toPath(input) { - const path11 = input.trim().replace(/^["']|["']$/g, ""); - return path11 && (0, import_node_path.normalize)(path11); -} -var parseCheckIgnore; -var init_CheckIgnore = __esm({ - "src/lib/responses/CheckIgnore.ts"() { - "use strict"; - parseCheckIgnore = (text) => { - return text.split(/\n/g).map(toPath).filter(Boolean); - }; - } -}); -var check_ignore_exports = {}; -__export2(check_ignore_exports, { - checkIgnoreTask: () => checkIgnoreTask -}); -function checkIgnoreTask(paths) { - return { - commands: ["check-ignore", ...paths], - format: "utf-8", - parser: parseCheckIgnore - }; -} -var init_check_ignore = __esm({ - "src/lib/tasks/check-ignore.ts"() { - "use strict"; - init_CheckIgnore(); - } -}); -var clone_exports = {}; -__export2(clone_exports, { - cloneMirrorTask: () => cloneMirrorTask, - cloneTask: () => cloneTask -}); -function disallowedCommand(command) { - return /^--upload-pack(=|$)/.test(command); -} -function cloneTask(repo, directory, customArgs) { - const commands3 = ["clone", ...customArgs]; - filterString(repo) && commands3.push(repo); - filterString(directory) && commands3.push(directory); - const banned = commands3.find(disallowedCommand); - if (banned) { - return configurationErrorTask(`git.fetch: potential exploit argument blocked.`); - } - return straightThroughStringTask(commands3); -} -function cloneMirrorTask(repo, directory, customArgs) { - append(customArgs, "--mirror"); - return cloneTask(repo, directory, customArgs); -} -var init_clone = __esm({ - "src/lib/tasks/clone.ts"() { - "use strict"; - init_task(); - init_utils(); - } -}); -function parseFetchResult(stdOut, stdErr) { - const result = { - raw: stdOut, - remote: null, - branches: [], - tags: [], - updated: [], - deleted: [] - }; - return parseStringResponse(result, parsers10, [stdOut, stdErr]); -} -var parsers10; -var init_parse_fetch = __esm({ - "src/lib/parsers/parse-fetch.ts"() { - "use strict"; - init_utils(); - parsers10 = [ - new LineParser(/From (.+)$/, (result, [remote]) => { - result.remote = remote; - }), - new LineParser(/\* \[new branch]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { - result.branches.push({ - name, - tracking - }); - }), - new LineParser(/\* \[new tag]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { - result.tags.push({ - name, - tracking - }); - }), - new LineParser(/- \[deleted]\s+\S+\s*-> (.+)$/, (result, [tracking]) => { - result.deleted.push({ - tracking - }); - }), - new LineParser( - /\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, - (result, [from, to, name, tracking]) => { - result.updated.push({ - name, - tracking, - to, - from - }); - } - ) - ]; - } -}); -var fetch_exports = {}; -__export2(fetch_exports, { - fetchTask: () => fetchTask -}); -function disallowedCommand2(command) { - return /^--upload-pack(=|$)/.test(command); -} -function fetchTask(remote, branch, customArgs) { - const commands3 = ["fetch", ...customArgs]; - if (remote && branch) { - commands3.push(remote, branch); - } - const banned = commands3.find(disallowedCommand2); - if (banned) { - return configurationErrorTask(`git.fetch: potential exploit argument blocked.`); - } - return { - commands: commands3, - format: "utf-8", - parser: parseFetchResult - }; -} -var init_fetch = __esm({ - "src/lib/tasks/fetch.ts"() { - "use strict"; - init_parse_fetch(); - init_task(); - } -}); -function parseMoveResult(stdOut) { - return parseStringResponse({ moves: [] }, parsers11, stdOut); -} -var parsers11; -var init_parse_move = __esm({ - "src/lib/parsers/parse-move.ts"() { - "use strict"; - init_utils(); - parsers11 = [ - new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { - result.moves.push({ from, to }); - }) - ]; - } -}); -var move_exports = {}; -__export2(move_exports, { - moveTask: () => moveTask -}); -function moveTask(from, to) { - return { - commands: ["mv", "-v", ...asArray(from), to], - format: "utf-8", - parser: parseMoveResult - }; -} -var init_move = __esm({ - "src/lib/tasks/move.ts"() { - "use strict"; - init_parse_move(); - init_utils(); - } -}); -var pull_exports = {}; -__export2(pull_exports, { - pullTask: () => pullTask -}); -function pullTask(remote, branch, customArgs) { - const commands3 = ["pull", ...customArgs]; - if (remote && branch) { - commands3.splice(1, 0, remote, branch); - } - return { - commands: commands3, - format: "utf-8", - parser(stdOut, stdErr) { - return parsePullResult(stdOut, stdErr); - }, - onError(result, _error, _done, fail) { - const pullError = parsePullErrorResult( - bufferToString(result.stdOut), - bufferToString(result.stdErr) - ); - if (pullError) { - return fail(new GitResponseError(pullError)); - } - fail(_error); - } - }; -} -var init_pull = __esm({ - "src/lib/tasks/pull.ts"() { - "use strict"; - init_git_response_error(); - init_parse_pull(); - init_utils(); - } -}); -function parseGetRemotes(text) { - const remotes = {}; - forEach(text, ([name]) => (remotes[name] = { name })); - return Object.values(remotes); -} -function parseGetRemotesVerbose(text) { - const remotes = {}; - forEach(text, ([name, url, purpose]) => { - if (!Object.hasOwn(remotes, name)) { - remotes[name] = { - name, - refs: { fetch: "", push: "" } - }; - } - if (purpose && url) { - remotes[name].refs[purpose.replace(/[^a-z]/g, "")] = url; - } - }); - return Object.values(remotes); -} -function forEach(text, handler2) { - forEachLineWithContent(text, (line) => handler2(line.split(/\s+/))); -} -var init_GetRemoteSummary = __esm({ - "src/lib/responses/GetRemoteSummary.ts"() { - "use strict"; - init_utils(); - } -}); -var remote_exports = {}; -__export2(remote_exports, { - addRemoteTask: () => addRemoteTask, - getRemotesTask: () => getRemotesTask, - listRemotesTask: () => listRemotesTask, - remoteTask: () => remoteTask, - removeRemoteTask: () => removeRemoteTask -}); -function addRemoteTask(remoteName, remoteRepo, customArgs) { - return straightThroughStringTask(["remote", "add", ...customArgs, remoteName, remoteRepo]); -} -function getRemotesTask(verbose) { - const commands3 = ["remote"]; - if (verbose) { - commands3.push("-v"); - } - return { - commands: commands3, - format: "utf-8", - parser: verbose ? parseGetRemotesVerbose : parseGetRemotes - }; -} -function listRemotesTask(customArgs) { - const commands3 = [...customArgs]; - if (commands3[0] !== "ls-remote") { - commands3.unshift("ls-remote"); - } - return straightThroughStringTask(commands3); -} -function remoteTask(customArgs) { - const commands3 = [...customArgs]; - if (commands3[0] !== "remote") { - commands3.unshift("remote"); - } - return straightThroughStringTask(commands3); -} -function removeRemoteTask(remoteName) { - return straightThroughStringTask(["remote", "remove", remoteName]); -} -var init_remote = __esm({ - "src/lib/tasks/remote.ts"() { - "use strict"; - init_GetRemoteSummary(); - init_task(); - } -}); -var stash_list_exports = {}; -__export2(stash_list_exports, { - stashListTask: () => stashListTask -}); -function stashListTask(opt = {}, customArgs) { - const options = parseLogOptions(opt); - const commands3 = ["stash", "list", ...options.commands, ...customArgs]; - const parser42 = createListLogSummaryParser( - options.splitter, - options.fields, - logFormatFromCommand(commands3) - ); - return ( - validateLogFormatConfig(commands3) || { - commands: commands3, - format: "utf-8", - parser: parser42 - } - ); -} -var init_stash_list = __esm({ - "src/lib/tasks/stash-list.ts"() { - "use strict"; - init_log_format(); - init_parse_list_log_summary(); - init_diff(); - init_log(); - } -}); -var sub_module_exports = {}; -__export2(sub_module_exports, { - addSubModuleTask: () => addSubModuleTask, - initSubModuleTask: () => initSubModuleTask, - subModuleTask: () => subModuleTask, - updateSubModuleTask: () => updateSubModuleTask -}); -function addSubModuleTask(repo, path11) { - return subModuleTask(["add", repo, path11]); -} -function initSubModuleTask(customArgs) { - return subModuleTask(["init", ...customArgs]); -} -function subModuleTask(customArgs) { - const commands3 = [...customArgs]; - if (commands3[0] !== "submodule") { - commands3.unshift("submodule"); - } - return straightThroughStringTask(commands3); -} -function updateSubModuleTask(customArgs) { - return subModuleTask(["update", ...customArgs]); -} -var init_sub_module = __esm({ - "src/lib/tasks/sub-module.ts"() { - "use strict"; - init_task(); - } -}); -function singleSorted(a, b) { - const aIsNum = Number.isNaN(a); - const bIsNum = Number.isNaN(b); - if (aIsNum !== bIsNum) { - return aIsNum ? 1 : -1; - } - return aIsNum ? sorted(a, b) : 0; -} -function sorted(a, b) { - return a === b ? 0 : a > b ? 1 : -1; -} -function trimmed(input) { - return input.trim(); -} -function toNumber(input) { - if (typeof input === "string") { - return parseInt(input.replace(/^\D+/g, ""), 10) || 0; - } - return 0; -} -var TagList; -var parseTagList; -var init_TagList = __esm({ - "src/lib/responses/TagList.ts"() { - "use strict"; - TagList = class { - constructor(all, latest) { - this.all = all; - this.latest = latest; - } - }; - parseTagList = function (data, customSort = false) { - const tags = data.split("\n").map(trimmed).filter(Boolean); - if (!customSort) { - tags.sort(function (tagA, tagB) { - const partsA = tagA.split("."); - const partsB = tagB.split("."); - if (partsA.length === 1 || partsB.length === 1) { - return singleSorted(toNumber(partsA[0]), toNumber(partsB[0])); - } - for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) { - const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i])); - if (diff) { - return diff; - } - } - return 0; - }); - } - const latest = customSort - ? tags[0] - : [...tags].reverse().find((tag) => tag.indexOf(".") >= 0); - return new TagList(tags, latest); - }; - } -}); -var tag_exports = {}; -__export2(tag_exports, { - addAnnotatedTagTask: () => addAnnotatedTagTask, - addTagTask: () => addTagTask, - tagListTask: () => tagListTask -}); -function tagListTask(customArgs = []) { - const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option)); - return { - format: "utf-8", - commands: ["tag", "-l", ...customArgs], - parser(text) { - return parseTagList(text, hasCustomSort); - } - }; -} -function addTagTask(name) { - return { - format: "utf-8", - commands: ["tag", name], - parser() { - return { name }; - } - }; -} -function addAnnotatedTagTask(name, tagMessage) { - return { - format: "utf-8", - commands: ["tag", "-a", "-m", tagMessage, name], - parser() { - return { name }; - } - }; -} -var init_tag = __esm({ - "src/lib/tasks/tag.ts"() { - "use strict"; - init_TagList(); - } -}); -var require_git = __commonJS2({ - "src/git.js"(exports2, module2) { - "use strict"; - var { GitExecutor: GitExecutor22 } = (init_git_executor(), __toCommonJS2(git_executor_exports)); - var { SimpleGitApi: SimpleGitApi22 } = - (init_simple_git_api(), __toCommonJS2(simple_git_api_exports)); - var { Scheduler: Scheduler22 } = (init_scheduler(), __toCommonJS2(scheduler_exports)); - var { configurationErrorTask: configurationErrorTask22 } = - (init_task(), __toCommonJS2(task_exports)); - var { - asArray: asArray22, - filterArray: filterArray22, - filterPrimitives: filterPrimitives22, - filterString: filterString22, - filterStringOrStringArray: filterStringOrStringArray22, - filterType: filterType22, - getTrailingOptions: getTrailingOptions22, - trailingFunctionArgument: trailingFunctionArgument22, - trailingOptionsArgument: trailingOptionsArgument22 - } = (init_utils(), __toCommonJS2(utils_exports)); - var { applyPatchTask: applyPatchTask22 } = - (init_apply_patch(), __toCommonJS2(apply_patch_exports)); - var { - branchTask: branchTask22, - branchLocalTask: branchLocalTask22, - deleteBranchesTask: deleteBranchesTask22, - deleteBranchTask: deleteBranchTask22 - } = (init_branch(), __toCommonJS2(branch_exports)); - var { checkIgnoreTask: checkIgnoreTask22 } = - (init_check_ignore(), __toCommonJS2(check_ignore_exports)); - var { checkIsRepoTask: checkIsRepoTask22 } = - (init_check_is_repo(), __toCommonJS2(check_is_repo_exports)); - var { cloneTask: cloneTask22, cloneMirrorTask: cloneMirrorTask22 } = - (init_clone(), __toCommonJS2(clone_exports)); - var { - cleanWithOptionsTask: cleanWithOptionsTask22, - isCleanOptionsArray: isCleanOptionsArray22 - } = (init_clean(), __toCommonJS2(clean_exports)); - var { diffSummaryTask: diffSummaryTask22 } = (init_diff(), __toCommonJS2(diff_exports)); - var { fetchTask: fetchTask22 } = (init_fetch(), __toCommonJS2(fetch_exports)); - var { moveTask: moveTask22 } = (init_move(), __toCommonJS2(move_exports)); - var { pullTask: pullTask22 } = (init_pull(), __toCommonJS2(pull_exports)); - var { pushTagsTask: pushTagsTask22 } = (init_push(), __toCommonJS2(push_exports)); - var { - addRemoteTask: addRemoteTask22, - getRemotesTask: getRemotesTask22, - listRemotesTask: listRemotesTask22, - remoteTask: remoteTask22, - removeRemoteTask: removeRemoteTask22 - } = (init_remote(), __toCommonJS2(remote_exports)); - var { getResetMode: getResetMode22, resetTask: resetTask22 } = - (init_reset(), __toCommonJS2(reset_exports)); - var { stashListTask: stashListTask22 } = (init_stash_list(), __toCommonJS2(stash_list_exports)); - var { - addSubModuleTask: addSubModuleTask22, - initSubModuleTask: initSubModuleTask22, - subModuleTask: subModuleTask22, - updateSubModuleTask: updateSubModuleTask22 - } = (init_sub_module(), __toCommonJS2(sub_module_exports)); - var { - addAnnotatedTagTask: addAnnotatedTagTask22, - addTagTask: addTagTask22, - tagListTask: tagListTask22 - } = (init_tag(), __toCommonJS2(tag_exports)); - var { - straightThroughBufferTask: straightThroughBufferTask22, - straightThroughStringTask: straightThroughStringTask22 - } = (init_task(), __toCommonJS2(task_exports)); - function Git22(options, plugins) { - this._plugins = plugins; - this._executor = new GitExecutor22( - options.baseDir, - new Scheduler22(options.maxConcurrentProcesses), - plugins - ); - this._trimmed = options.trimmed; - } - (Git22.prototype = Object.create(SimpleGitApi22.prototype)).constructor = Git22; - Git22.prototype.customBinary = function (command) { - this._plugins.reconfigure("binary", command); - return this; - }; - Git22.prototype.env = function (name, value) { - if (arguments.length === 1 && typeof name === "object") { - this._executor.env = name; - } else { - (this._executor.env = this._executor.env || {})[name] = value; - } - return this; - }; - Git22.prototype.stashList = function (options) { - return this._runTask( - stashListTask22( - trailingOptionsArgument22(arguments) || {}, - (filterArray22(options) && options) || [] - ), - trailingFunctionArgument22(arguments) - ); - }; - function createCloneTask(api, task, repoPath, localPath) { - if (typeof repoPath !== "string") { - return configurationErrorTask22(`git.${api}() requires a string 'repoPath'`); - } - return task( - repoPath, - filterType22(localPath, filterString22), - getTrailingOptions22(arguments) - ); - } - Git22.prototype.clone = function () { - return this._runTask( - createCloneTask("clone", cloneTask22, ...arguments), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.mirror = function () { - return this._runTask( - createCloneTask("mirror", cloneMirrorTask22, ...arguments), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.mv = function (from, to) { - return this._runTask(moveTask22(from, to), trailingFunctionArgument22(arguments)); - }; - Git22.prototype.checkoutLatestTag = function (then) { - var git = this; - return this.pull(function () { - git.tags(function (err, tags) { - git.checkout(tags.latest, then); - }); - }); - }; - Git22.prototype.pull = function (remote, branch, options, then) { - return this._runTask( - pullTask22( - filterType22(remote, filterString22), - filterType22(branch, filterString22), - getTrailingOptions22(arguments) - ), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.fetch = function (remote, branch) { - return this._runTask( - fetchTask22( - filterType22(remote, filterString22), - filterType22(branch, filterString22), - getTrailingOptions22(arguments) - ), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.silent = function (silence) { - console.warn( - "simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3" - ); - return this; - }; - Git22.prototype.tags = function (options, then) { - return this._runTask( - tagListTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.rebase = function () { - return this._runTask( - straightThroughStringTask22(["rebase", ...getTrailingOptions22(arguments)]), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.reset = function (mode) { - return this._runTask( - resetTask22(getResetMode22(mode), getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.revert = function (commit) { - const next = trailingFunctionArgument22(arguments); - if (typeof commit !== "string") { - return this._runTask(configurationErrorTask22("Commit must be a string"), next); - } - return this._runTask( - straightThroughStringTask22([ - "revert", - ...getTrailingOptions22(arguments, 0, true), - commit - ]), - next - ); - }; - Git22.prototype.addTag = function (name) { - const task = - typeof name === "string" - ? addTagTask22(name) - : configurationErrorTask22("Git.addTag requires a tag name"); - return this._runTask(task, trailingFunctionArgument22(arguments)); - }; - Git22.prototype.addAnnotatedTag = function (tagName, tagMessage) { - return this._runTask( - addAnnotatedTagTask22(tagName, tagMessage), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.deleteLocalBranch = function (branchName, forceDelete, then) { - return this._runTask( - deleteBranchTask22(branchName, typeof forceDelete === "boolean" ? forceDelete : false), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) { - return this._runTask( - deleteBranchesTask22(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.branch = function (options, then) { - return this._runTask( - branchTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.branchLocal = function (then) { - return this._runTask(branchLocalTask22(), trailingFunctionArgument22(arguments)); - }; - Git22.prototype.raw = function (commands3) { - const createRestCommands = !Array.isArray(commands3); - const command = [].slice.call(createRestCommands ? arguments : commands3, 0); - for (let i = 0; i < command.length && createRestCommands; i++) { - if (!filterPrimitives22(command[i])) { - command.splice(i, command.length - i); - break; - } - } - command.push(...getTrailingOptions22(arguments, 0, true)); - var next = trailingFunctionArgument22(arguments); - if (!command.length) { - return this._runTask( - configurationErrorTask22("Raw: must supply one or more command to execute"), - next - ); - } - return this._runTask(straightThroughStringTask22(command, this._trimmed), next); - }; - Git22.prototype.submoduleAdd = function (repo, path11, then) { - return this._runTask(addSubModuleTask22(repo, path11), trailingFunctionArgument22(arguments)); - }; - Git22.prototype.submoduleUpdate = function (args, then) { - return this._runTask( - updateSubModuleTask22(getTrailingOptions22(arguments, true)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.submoduleInit = function (args, then) { - return this._runTask( - initSubModuleTask22(getTrailingOptions22(arguments, true)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.subModule = function (options, then) { - return this._runTask( - subModuleTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.listRemote = function () { - return this._runTask( - listRemotesTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.addRemote = function (remoteName, remoteRepo, then) { - return this._runTask( - addRemoteTask22(remoteName, remoteRepo, getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.removeRemote = function (remoteName, then) { - return this._runTask(removeRemoteTask22(remoteName), trailingFunctionArgument22(arguments)); - }; - Git22.prototype.getRemotes = function (verbose, then) { - return this._runTask( - getRemotesTask22(verbose === true), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.remote = function (options, then) { - return this._runTask( - remoteTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.tag = function (options, then) { - const command = getTrailingOptions22(arguments); - if (command[0] !== "tag") { - command.unshift("tag"); - } - return this._runTask( - straightThroughStringTask22(command), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.updateServerInfo = function (then) { - return this._runTask( - straightThroughStringTask22(["update-server-info"]), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.pushTags = function (remote, then) { - const task = pushTagsTask22( - { remote: filterType22(remote, filterString22) }, - getTrailingOptions22(arguments) - ); - return this._runTask(task, trailingFunctionArgument22(arguments)); - }; - Git22.prototype.rm = function (files) { - return this._runTask( - straightThroughStringTask22(["rm", "-f", ...asArray22(files)]), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.rmKeepLocal = function (files) { - return this._runTask( - straightThroughStringTask22(["rm", "--cached", ...asArray22(files)]), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.catFile = function (options, then) { - return this._catFile("utf-8", arguments); - }; - Git22.prototype.binaryCatFile = function () { - return this._catFile("buffer", arguments); - }; - Git22.prototype._catFile = function (format, args) { - var handler2 = trailingFunctionArgument22(args); - var command = ["cat-file"]; - var options = args[0]; - if (typeof options === "string") { - return this._runTask( - configurationErrorTask22("Git.catFile: options must be supplied as an array of strings"), - handler2 - ); - } - if (Array.isArray(options)) { - command.push.apply(command, options); - } - const task = - format === "buffer" - ? straightThroughBufferTask22(command) - : straightThroughStringTask22(command); - return this._runTask(task, handler2); - }; - Git22.prototype.diff = function (options, then) { - const task = filterString22(options) - ? configurationErrorTask22( - "git.diff: supplying options as a single string is no longer supported, switch to an array of strings" - ) - : straightThroughStringTask22(["diff", ...getTrailingOptions22(arguments)]); - return this._runTask(task, trailingFunctionArgument22(arguments)); - }; - Git22.prototype.diffSummary = function () { - return this._runTask( - diffSummaryTask22(getTrailingOptions22(arguments, 1)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.applyPatch = function (patches) { - const task = !filterStringOrStringArray22(patches) - ? configurationErrorTask22( - `git.applyPatch requires one or more string patches as the first argument` - ) - : applyPatchTask22(asArray22(patches), getTrailingOptions22([].slice.call(arguments, 1))); - return this._runTask(task, trailingFunctionArgument22(arguments)); - }; - Git22.prototype.revparse = function () { - const commands3 = ["rev-parse", ...getTrailingOptions22(arguments, true)]; - return this._runTask( - straightThroughStringTask22(commands3, true), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.clean = function (mode, options, then) { - const usingCleanOptionsArray = isCleanOptionsArray22(mode); - const cleanMode = - (usingCleanOptionsArray && mode.join("")) || filterType22(mode, filterString22) || ""; - const customArgs = getTrailingOptions22( - [].slice.call(arguments, usingCleanOptionsArray ? 1 : 0) - ); - return this._runTask( - cleanWithOptionsTask22(cleanMode, customArgs), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.exec = function (then) { - const task = { - commands: [], - format: "utf-8", - parser() { - if (typeof then === "function") { - then(); - } - } - }; - return this._runTask(task); - }; - Git22.prototype.clearQueue = function () { - return this; - }; - Git22.prototype.checkIgnore = function (pathnames, then) { - return this._runTask( - checkIgnoreTask22(asArray22(filterType22(pathnames, filterStringOrStringArray22, []))), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.checkIsRepo = function (checkType, then) { - return this._runTask( - checkIsRepoTask22(filterType22(checkType, filterString22)), - trailingFunctionArgument22(arguments) - ); - }; - module2.exports = Git22; - } -}); -init_pathspec(); -init_git_error(); -init_git_error(); -init_git_error(); -init_git_response_error(); -init_task_configuration_error(); -init_check_is_repo(); -init_clean(); -init_config(); -init_diff_name_status(); -init_grep(); -init_reset(); -init_utils(); -init_utils(); -var never = (0, import_promise_deferred2.deferred)().promise; -init_utils(); -init_git_error(); -init_utils(); -init_utils(); -init_utils(); -init_pathspec(); -init_utils(); -var Git = require_git(); -init_git_response_error(); - -// ../src/services/git.ts -async function isGitRepo(repoPath) { - try { - await import_promises2.default.access(import_path2.default.join(repoPath, ".git")); - return true; - } catch { - return false; - } -} - -// ../src/services/analyzer.ts -var PACKAGE_MANAGERS = [ - { file: "pnpm-lock.yaml", name: "pnpm" }, - { file: "yarn.lock", name: "yarn" }, - { file: "package-lock.json", name: "npm" }, - { file: "bun.lockb", name: "bun" } -]; -async function analyzeRepo(repoPath) { - const files = await safeReadDir(repoPath); - const analysis = { - path: repoPath, - isGitRepo: await isGitRepo(repoPath), - languages: [], - frameworks: [] - }; - const hasPackageJson = files.includes("package.json"); - const hasTsConfig = files.includes("tsconfig.json"); - const hasPyProject = files.includes("pyproject.toml"); - const hasRequirements = files.includes("requirements.txt"); - const hasGoMod = files.includes("go.mod"); - const hasCargo = files.includes("Cargo.toml"); - const hasCsproj = files.some((f) => f.endsWith(".csproj") || f.endsWith(".sln")); - const hasPomXml = files.includes("pom.xml"); - const hasBuildGradle = files.includes("build.gradle") || files.includes("build.gradle.kts"); - const hasGemfile = files.includes("Gemfile"); - const hasComposerJson = files.includes("composer.json"); - if (hasPackageJson) analysis.languages.push("JavaScript"); - if (hasTsConfig) analysis.languages.push("TypeScript"); - if (hasPyProject || hasRequirements) analysis.languages.push("Python"); - if (hasGoMod) analysis.languages.push("Go"); - if (hasCargo) analysis.languages.push("Rust"); - if (hasCsproj) analysis.languages.push("C#"); - if (hasPomXml || hasBuildGradle) analysis.languages.push("Java"); - if (hasGemfile) analysis.languages.push("Ruby"); - if (hasComposerJson) analysis.languages.push("PHP"); - analysis.packageManager = await detectPackageManager(repoPath, files); - let rootPackageJson; - if (hasPackageJson) { - rootPackageJson = await readJson(import_path3.default.join(repoPath, "package.json")); - const deps = Object.keys({ - ...(rootPackageJson?.dependencies ?? {}), - ...(rootPackageJson?.devDependencies ?? {}) - }); - analysis.frameworks.push(...detectFrameworks(deps, files)); - } - const workspace8 = await detectWorkspace(repoPath, files, rootPackageJson); - if (workspace8) { - analysis.workspaceType = workspace8.type; - analysis.workspacePatterns = workspace8.patterns; - } - let apps = await resolveWorkspaceApps(repoPath, workspace8?.patterns ?? [], rootPackageJson); - if (apps.length <= 1) { - const nonJs = await detectNonJsMonorepo(repoPath, files); - if (nonJs.apps.length > 1) { - apps = nonJs.apps; - if (nonJs.type) analysis.workspaceType = nonJs.type; - if (nonJs.patterns) analysis.workspacePatterns = nonJs.patterns; - } - } - analysis.apps = apps; - analysis.isMonorepo = apps.length > 1; - analysis.languages = unique(analysis.languages); - analysis.frameworks = unique(analysis.frameworks); - analysis.areas = await detectAreas(repoPath, analysis); - return analysis; -} -async function detectPackageManager(_repoPath, files) { - for (const manager of PACKAGE_MANAGERS) { - if (files.includes(manager.file)) return manager.name; - } - if (files.includes("package.json")) return "npm"; - if (files.includes("pyproject.toml")) return "pip"; - if (files.includes("pom.xml")) return "maven"; - if (files.includes("build.gradle") || files.includes("build.gradle.kts")) return "gradle"; - if (files.includes("Gemfile")) return "bundler"; - if (files.includes("composer.json")) return "composer"; - return void 0; -} -function detectFrameworks(deps, files) { - const frameworks = []; - const hasFile = (file) => files.includes(file); - if (deps.includes("next") || hasFile("next.config.js") || hasFile("next.config.mjs")) - frameworks.push("Next.js"); - if (deps.includes("react") || deps.includes("react-dom")) frameworks.push("React"); - if (deps.includes("vue") || hasFile("vue.config.js")) frameworks.push("Vue"); - if (deps.includes("@angular/core") || hasFile("angular.json")) frameworks.push("Angular"); - if (deps.includes("svelte") || hasFile("svelte.config.js")) frameworks.push("Svelte"); - if (deps.includes("express")) frameworks.push("Express"); - if (deps.includes("@nestjs/core")) frameworks.push("NestJS"); - if (deps.includes("fastify")) frameworks.push("Fastify"); - return frameworks; -} -async function safeReadFile(filePath) { - try { - return await import_promises3.default.readFile(filePath, "utf8"); - } catch { - return void 0; - } -} -async function detectWorkspace(repoPath, files, packageJson) { - if (files.includes("pnpm-workspace.yaml")) { - const patterns = await readPnpmWorkspace( - import_path3.default.join(repoPath, "pnpm-workspace.yaml") - ); - if (patterns.length) return { type: "pnpm", patterns }; - } - const workspaces = packageJson?.workspaces; - if (Array.isArray(workspaces)) { - return { type: files.includes("yarn.lock") ? "yarn" : "npm", patterns: workspaces.map(String) }; - } - if (workspaces && typeof workspaces === "object") { - const packages = workspaces.packages; - if (Array.isArray(packages)) { - return { type: files.includes("yarn.lock") ? "yarn" : "npm", patterns: packages.map(String) }; - } - } - return void 0; -} -async function readPnpmWorkspace(filePath) { - try { - const raw = await import_promises3.default.readFile(filePath, "utf8"); - const lines = raw.split(/\r?\n/u); - const patterns = []; - let inPackages = false; - for (const line of lines) { - if (/^\s*#/u.test(line)) continue; - if (!inPackages && /^\s*packages\s*:/u.test(line)) { - const inline = line.match(/packages\s*:\s*\[([^\]]+)\]/u); - if (inline) { - const items = inline[1].split(",").map((s) => s.trim().replace(/^['"]|['"]$/gu, "")); - return items.filter(Boolean); - } - inPackages = true; - continue; - } - if (inPackages) { - const match = line.match(/^\s*-\s*(.+)$/u); - if (match?.[1]) { - const value = match[1] - .split("#")[0] - .trim() - .replace(/^['"]|['"]$/gu, ""); - if (value) patterns.push(value); - continue; - } - if (/^\S/u.test(line) && line.trim()) break; - } - } - return patterns; - } catch { - return []; - } -} -async function resolveWorkspaceApps(repoPath, patterns, rootPackageJson) { - const workspacePatterns = patterns - .map((pattern) => pattern.replace(/\\/gu, "/")) - .map((pattern) => - pattern.endsWith("package.json") - ? pattern - : import_path3.default.posix.join(pattern, "package.json") - ); - const packageJsonPaths = workspacePatterns.length - ? ( - await (0, import_fast_glob.default)(workspacePatterns, { - cwd: repoPath, - absolute: true, - onlyFiles: true, - dot: false - }) - ).map((p) => import_path3.default.normalize(p)) - : []; - if (!packageJsonPaths.length && rootPackageJson) { - const rootPath = import_path3.default.join(repoPath, "package.json"); - return [await buildRepoApp(repoPath, rootPath, rootPackageJson)]; - } - const apps = await Promise.all( - packageJsonPaths.map(async (pkgPath) => { - const pkg = await readJson(pkgPath); - return buildRepoApp(import_path3.default.dirname(pkgPath), pkgPath, pkg); - }) - ); - return apps.filter(Boolean); -} -async function buildRepoApp(appPath, packageJsonPath, packageJson) { - const scripts = packageJson?.scripts ?? {}; - const name = - typeof packageJson?.name === "string" - ? packageJson.name - : import_path3.default.basename(appPath); - const hasTsConfig = await fileExists(import_path3.default.join(appPath, "tsconfig.json")); - return { - name, - path: appPath, - ecosystem: "node", - manifestPath: packageJsonPath, - packageJsonPath, - scripts, - hasTsConfig - }; -} -function buildNonJsApp(name, appPath, ecosystem, manifestPath) { - return { - name, - path: appPath, - ecosystem, - manifestPath, - packageJsonPath: "", - scripts: {}, - hasTsConfig: false - }; -} -async function detectNonJsMonorepo(repoPath, files) { - const cargoApps = await detectCargoWorkspace(repoPath); - if (cargoApps.length > 1) return { type: "cargo", apps: cargoApps }; - const goApps = await detectGoWorkspace(repoPath); - if (goApps.length > 1) return { type: "go", apps: goApps }; - const dotnetApps = await detectDotnetSolution(repoPath, files); - if (dotnetApps.length > 1) return { type: "dotnet", apps: dotnetApps }; - const gradleApps = await detectGradleMultiProject(repoPath, files); - if (gradleApps.length > 1) return { type: "gradle", apps: gradleApps }; - const mavenApps = await detectMavenMultiModule(repoPath); - if (mavenApps.length > 1) return { type: "maven", apps: mavenApps }; - return { apps: [] }; -} -async function detectCargoWorkspace(repoPath) { - const content = await safeReadFile(import_path3.default.join(repoPath, "Cargo.toml")); - if (!content) return []; - const workspaceSection = content.match(/\[workspace\]([\s\S]*?)(?:\n\[|$)/u); - if (!workspaceSection) return []; - const membersMatch = workspaceSection[1].match(/members\s*=\s*\[([\s\S]*?)\]/u); - if (!membersMatch) return []; - const patterns = [...membersMatch[1].matchAll(/"([^"]+)"/gu)].map((m) => m[1]); - if (!patterns.length) return []; - const tomlPaths = ( - await (0, import_fast_glob.default)( - patterns.map((p) => import_path3.default.posix.join(p, "Cargo.toml")), - { cwd: repoPath, absolute: true, onlyFiles: true } - ) - ).map((p) => import_path3.default.normalize(p)); - return Promise.all( - tomlPaths.map(async (tomlPath) => { - const dir = import_path3.default.dirname(tomlPath); - const toml = await safeReadFile(tomlPath); - const nameMatch = toml?.match(/^\s*name\s*=\s*"([^"]+)"/mu); - return buildNonJsApp( - nameMatch?.[1] ?? import_path3.default.basename(dir), - dir, - "rust", - tomlPath - ); - }) - ); -} -async function detectGoWorkspace(repoPath) { - const content = await safeReadFile(import_path3.default.join(repoPath, "go.work")); - if (!content) return []; - const modules = []; - const blockMatch = content.match(/use\s*\(([\s\S]*?)\)/u); - if (blockMatch) { - for (const line of blockMatch[1].split(/\r?\n/u)) { - const trimmed3 = line.replace(/\/\/.*$/u, "").trim(); - if (trimmed3) modules.push(trimmed3); - } - } - for (const match of content.matchAll(/^use\s+(\S+)\s*$/gmu)) { - modules.push(match[1]); - } - const apps = []; - for (const mod of modules) { - const modPath = import_path3.default.resolve(repoPath, mod); - const goModPath = import_path3.default.join(modPath, "go.mod"); - if (!(await fileExists(goModPath))) continue; - const goMod = await safeReadFile(goModPath); - const nameMatch = goMod?.match(/^module\s+(\S+)/mu); - const shortName = nameMatch?.[1]?.split("/").pop() ?? import_path3.default.basename(modPath); - apps.push(buildNonJsApp(shortName, modPath, "go", goModPath)); - } - return apps; -} -async function detectDotnetSolution(repoPath, files) { - const slnFile = files.find((f) => f.endsWith(".sln")); - if (!slnFile) return []; - const content = await safeReadFile(import_path3.default.join(repoPath, slnFile)); - if (!content) return []; - const projectRegex = /Project\("[^"]*"\)\s*=\s*"([^"]+)",\s*"([^"]+\.(?:cs|fs|vb)proj)"/giu; - const apps = []; - for (const match of content.matchAll(projectRegex)) { - const name = match[1]; - const projRelPath = match[2].replace(/\\/gu, "/"); - const projPath = import_path3.default.resolve(repoPath, projRelPath); - const appDir = import_path3.default.dirname(projPath); - if (await fileExists(projPath)) { - apps.push(buildNonJsApp(name, appDir, "dotnet", projPath)); - } - } - return apps; -} -async function detectGradleMultiProject(repoPath, files) { - const settingsFile = files.includes("settings.gradle.kts") - ? "settings.gradle.kts" - : files.includes("settings.gradle") - ? "settings.gradle" - : null; - if (!settingsFile) return []; - const content = await safeReadFile(import_path3.default.join(repoPath, settingsFile)); - if (!content) return []; - const projectNames = []; - for (const match of content.matchAll(/['"](:(?:[\w.-]+:)*[\w.-]+)['"]/gu)) { - projectNames.push(match[1].replace(/^:/u, "").replace(/:/gu, "/")); - } - const uniqueProjects = [...new Set(projectNames)]; - const apps = []; - for (const project of uniqueProjects) { - const projectDir = import_path3.default.resolve(repoPath, project); - const ktsPath = import_path3.default.join(projectDir, "build.gradle.kts"); - const groovyPath = import_path3.default.join(projectDir, "build.gradle"); - const buildFile = (await fileExists(ktsPath)) - ? ktsPath - : (await fileExists(groovyPath)) - ? groovyPath - : null; - if (buildFile) { - apps.push( - buildNonJsApp(import_path3.default.basename(project), projectDir, "java", buildFile) - ); - } - } - return apps; -} -async function detectMavenMultiModule(repoPath) { - const content = await safeReadFile(import_path3.default.join(repoPath, "pom.xml")); - if (!content) return []; - const apps = []; - for (const match of content.matchAll(/([^<]+)<\/module>/gu)) { - const modName = match[1].trim(); - const modDir = import_path3.default.resolve(repoPath, modName); - const pomPath = import_path3.default.join(modDir, "pom.xml"); - if (await fileExists(pomPath)) { - apps.push(buildNonJsApp(import_path3.default.basename(modName), modDir, "java", pomPath)); - } - } - return apps; -} -function unique(items) { - return Array.from(new Set(items)); -} -var AREA_HEURISTIC_DIRS = [ - "frontend", - "backend", - "api", - "web", - "mobile", - "app", - "server", - "client", - "infra", - "infrastructure", - "shared", - "common", - "lib", - "libs", - "packages", - "services", - "docs", - "scripts", - "tools", - "cli", - "sdk", - "core", - "admin", - "portal", - "dashboard", - "worker", - "functions" -]; -var MANIFEST_FILES = [ - "package.json", - "pyproject.toml", - "requirements.txt", - "go.mod", - "Cargo.toml", - "pom.xml", - "build.gradle", - "build.gradle.kts", - "Gemfile", - "composer.json", - "setup.py", - "setup.cfg" -]; -function areasFromApps(repoPath, apps) { - return apps.map((app) => { - const rel = import_path3.default.relative(repoPath, app.path).replace(/\\/gu, "/"); - return { - name: app.name, - applyTo: `${rel}/**`, - path: app.path, - ecosystem: app.ecosystem, - source: "auto", - scripts: Object.keys(app.scripts).length > 0 ? app.scripts : void 0, - hasTsConfig: app.hasTsConfig || void 0 - }; - }); -} -async function areasFromHeuristics(repoPath) { - const entries = await safeReadDir(repoPath); - const areas = []; - for (const entry of entries) { - const lower = entry.toLowerCase(); - if (!AREA_HEURISTIC_DIRS.includes(lower)) continue; - const fullPath = import_path3.default.join(repoPath, entry); - try { - const stat = await import_promises3.default.stat(fullPath); - if (!stat.isDirectory()) continue; - } catch { - continue; - } - const children = await safeReadDir(fullPath); - const hasManifest = children.some((c) => MANIFEST_FILES.includes(c)); - const hasCode = children.some( - (c) => - c.endsWith(".ts") || - c.endsWith(".js") || - c.endsWith(".py") || - c.endsWith(".go") || - c.endsWith(".rs") || - c.endsWith(".java") || - c.endsWith(".cs") || - c.endsWith(".rb") || - c.endsWith(".php") - ); - const hasSrcDir = children.includes("src"); - if (!hasManifest && !hasCode && !hasSrcDir) continue; - let scripts; - let hasTsConfig; - if (children.includes("package.json")) { - const pkg = await readJson(import_path3.default.join(fullPath, "package.json")); - const pkgScripts = pkg?.scripts ?? {}; - if (Object.keys(pkgScripts).length > 0) scripts = pkgScripts; - } - if (children.includes("tsconfig.json")) { - hasTsConfig = true; - } - areas.push({ - name: entry, - applyTo: `${entry}/**`, - path: fullPath, - source: "auto", - scripts, - hasTsConfig - }); - } - return areas; -} -async function detectAreas(repoPath, analysis) { - let autoAreas; - if (analysis.isMonorepo && analysis.apps && analysis.apps.length > 1) { - const appAreas = areasFromApps(repoPath, analysis.apps); - const heuristicAreas = await areasFromHeuristics(repoPath); - const byName = new Map(heuristicAreas.map((a) => [a.name.toLowerCase(), a])); - for (const a of appAreas) { - byName.set(a.name.toLowerCase(), a); - } - autoAreas = Array.from(byName.values()); - } else { - autoAreas = await areasFromHeuristics(repoPath); - } - const config = await loadPrimerConfig(repoPath); - if (!config?.areas?.length) return autoAreas; - const resolvedRoot = import_path3.default.resolve(repoPath); - const configAreas = []; - for (const ca of config.areas) { - const patterns = Array.isArray(ca.applyTo) ? ca.applyTo : [ca.applyTo]; - const firstSegment = patterns[0].split("/")[0]; - const basePath = - firstSegment.includes("*") || firstSegment.includes("?") - ? repoPath - : import_path3.default.join(repoPath, firstSegment); - const resolved = import_path3.default.resolve(basePath); - if (resolved !== resolvedRoot && !resolved.startsWith(resolvedRoot + import_path3.default.sep)) - continue; - let scripts; - let hasTsConfig; - try { - const children = await safeReadDir(basePath); - if (children.includes("package.json")) { - const pkg = await readJson(import_path3.default.join(basePath, "package.json")); - const pkgScripts = pkg?.scripts ?? {}; - if (Object.keys(pkgScripts).length > 0) scripts = pkgScripts; - } - if (children.includes("tsconfig.json")) hasTsConfig = true; - } catch {} - configAreas.push({ - name: ca.name, - description: ca.description, - applyTo: ca.applyTo, - path: basePath, - source: "config", - scripts, - hasTsConfig - }); - } - const autoByName = new Map(autoAreas.map((a) => [a.name.toLowerCase(), a])); - for (const ca of configAreas) { - autoByName.set(ca.name.toLowerCase(), ca); - } - return Array.from(autoByName.values()); -} -async function loadPrimerConfig(repoPath) { - const candidates = [ - import_path3.default.join(repoPath, "primer.config.json"), - import_path3.default.join(repoPath, ".github", "primer.config.json") - ]; - for (const candidate of candidates) { - const json = await readJson(candidate); - if (!json) continue; - if (json.areas !== void 0 && !Array.isArray(json.areas)) { - return void 0; - } - const areas = []; - if (Array.isArray(json.areas)) { - for (const entry of json.areas) { - if ( - typeof entry === "object" && - entry !== null && - typeof entry.name === "string" && - entry.applyTo !== void 0 - ) { - const e = entry; - if (!e.name.trim()) continue; - const rawApplyTo = e.applyTo; - let applyTo; - if (typeof rawApplyTo === "string") { - applyTo = rawApplyTo; - } else if (Array.isArray(rawApplyTo) && rawApplyTo.every((v) => typeof v === "string")) { - applyTo = rawApplyTo; - } else { - continue; - } - if ( - (typeof applyTo === "string" && !applyTo.trim()) || - (Array.isArray(applyTo) && applyTo.length === 0) - ) - continue; - const allPatterns = Array.isArray(applyTo) ? applyTo : [applyTo]; - if (allPatterns.some((p) => p.split("/").includes(".."))) continue; - areas.push({ - name: e.name, - applyTo, - description: typeof e.description === "string" ? e.description : void 0 - }); - } - } - } - let policies; - if (Array.isArray(json.policies)) { - policies = json.policies.filter((p) => typeof p === "string" && p.trim() !== ""); - } - return { areas, policies: policies?.length ? policies : void 0 }; - } - return void 0; -} -function sanitizeAreaName(name) { - const sanitized = name - .toLowerCase() - .replace(/[^a-z0-9-]/gu, "-") - .replace(/-+/gu, "-") - .replace(/^-|-$/gu, ""); - return sanitized || "unnamed"; -} - -// ../src/services/generator.ts -var import_path4 = __toESM(require("path"), 1); -async function generateConfigs(options) { - const { repoPath, analysis, selections, force } = options; - const files = []; - if (selections.includes("mcp")) { - const filePath = import_path4.default.join(repoPath, ".vscode", "mcp.json"); - await ensureDir(import_path4.default.dirname(filePath)); - const content = renderMcp(); - const { wrote } = await safeWriteFile(filePath, content, force); - files.push({ - path: import_path4.default.relative(process.cwd(), filePath), - action: wrote ? "wrote" : "skipped" - }); - } - if (selections.includes("vscode")) { - const filePath = import_path4.default.join(repoPath, ".vscode", "settings.json"); - await ensureDir(import_path4.default.dirname(filePath)); - const content = renderVscodeSettings(analysis); - const { wrote } = await safeWriteFile(filePath, content, force); - files.push({ - path: import_path4.default.relative(process.cwd(), filePath), - action: wrote ? "wrote" : "skipped" - }); - } - return { files }; -} -function renderMcp() { - return JSON.stringify( - { - servers: { - github: { - command: "npx", - args: ["-y", "@modelcontextprotocol/server-github"], - env: { - GITHUB_PERSONAL_ACCESS_TOKEN: "${input:github_token}" - } - }, - filesystem: { - command: "npx", - args: ["-y", "@modelcontextprotocol/server-filesystem", "${workspaceFolder}"] - } - }, - inputs: [ - { - id: "github_token", - type: "promptString", - description: "GitHub Personal Access Token" - } - ] - }, - null, - 2 - ); -} -function renderVscodeSettings(analysis) { - const reviewFocus = analysis.frameworks.length - ? `Focus on ${analysis.frameworks.join(", ")} best practices and repo conventions.` - : "Focus on repo conventions and maintainability."; - return JSON.stringify( - { - "github.copilot.chat.codeGeneration.instructions": [ - { file: ".github/copilot-instructions.md" } - ], - "github.copilot.chat.reviewSelection.instructions": [{ text: reviewFocus }], - "chat.promptFiles": true, - "chat.mcp.enabled": true - }, - null, - 2 - ); -} - -// ../src/config.ts -var DEFAULT_MODEL = "claude-sonnet-4.5"; - -// ../src/services/copilot.ts -var import_promises4 = __toESM(require("fs/promises"), 1); -var import_node_child_process = require("node:child_process"); -var import_node_util = require("node:util"); -var import_path5 = __toESM(require("path"), 1); -var import_fast_glob2 = __toESM(require_out4(), 1); -var execFileAsync = (0, import_node_util.promisify)(import_node_child_process.execFile); -var cachedCliConfig = null; -var cachedCliConfigTimestamp = 0; -var CLI_CACHE_TTL_MS = 5 * 60 * 1e3; -function cacheConfig(config) { - cachedCliConfig = config; - cachedCliConfigTimestamp = Date.now(); - return config; -} -async function assertCopilotCliReady() { - const config = await findCopilotCliConfig(); - try { - const [cmd, args] = buildExecArgs(config, ["--version"]); - await execFileAsync(cmd, args, { timeout: 5e3 }); - } catch { - const desc = config.cliArgs ? `${config.cliPath} ${config.cliArgs.join(" ")}` : config.cliPath; - throw new Error(`Copilot CLI at ${desc} is not working.`); - } - return config; -} -function buildExecArgs(config, extraArgs) { - if (config.cliArgs && config.cliArgs.length > 0) { - return [config.cliPath, [...config.cliArgs, ...extraArgs]]; - } - if ( - process.platform === "win32" && - (config.cliPath.endsWith(".bat") || config.cliPath.endsWith(".cmd")) - ) { - return ["cmd", ["/c", config.cliPath, ...extraArgs]]; - } - return [config.cliPath, extraArgs]; -} -async function findCopilotCliConfig() { - if (cachedCliConfig && Date.now() - cachedCliConfigTimestamp < CLI_CACHE_TTL_MS) { - return cachedCliConfig; - } - const isWindows = process.platform === "win32"; - const home = process.env.HOME ?? process.env.USERPROFILE ?? ""; - const appData = process.env.APPDATA ?? ""; - if (isWindows && appData) { - const npmLoaderPath = import_path5.default.join( - appData, - "npm", - "node_modules", - "@github", - "copilot", - "npm-loader.js" - ); - try { - await import_promises4.default.access(npmLoaderPath); - return cacheConfig({ cliPath: process.execPath, cliArgs: [npmLoaderPath] }); - } catch {} - } - const whichCmd = isWindows ? "where" : "which"; - try { - const { stdout } = await execFileAsync(whichCmd, ["copilot"], { timeout: 5e3 }); - const found = stdout.trim().split(/\r?\n/)[0]; - if (found) { - return cacheConfig({ cliPath: found }); - } - } catch {} - const staticLocations = []; - if (process.platform === "darwin") { - staticLocations.push( - `${home}/Library/Application Support/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`, - `${home}/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot` - ); - } else if (process.platform === "linux") { - staticLocations.push( - `${home}/.config/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`, - `${home}/.config/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot` - ); - } else if (isWindows && appData) { - staticLocations.push( - `${appData}\\Code - Insiders\\User\\globalStorage\\github.copilot-chat\\copilotCli\\copilot.bat`, - `${appData}\\Code\\User\\globalStorage\\github.copilot-chat\\copilotCli\\copilot.bat` - ); - } - for (const location of staticLocations) { - try { - await import_promises4.default.access(location); - return cacheConfig({ cliPath: location }); - } catch {} - } - const exts = isWindows ? "{.exe,.bat,.cmd}" : ""; - const normalizedHome = home.replace(/\\/g, "/"); - const globPatterns = [ - `${normalizedHome}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot${exts}`, - `${normalizedHome}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot${exts}` - ]; - for (const pattern of globPatterns) { - const matches = await (0, import_fast_glob2.default)(pattern, { onlyFiles: true }); - if (matches.length > 0) { - return cacheConfig({ cliPath: import_path5.default.normalize(matches[0]) }); - } - } - const platformHint = isWindows - ? " Searched APPDATA and VS Code extension paths." - : process.platform === "linux" - ? " Searched ~/.config/Code and VS Code extension paths." - : " Searched ~/Library/Application Support/Code and VS Code extension paths."; - throw new Error( - `Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code or run: npm install -g @github/copilot.${platformHint}` - ); -} - -// ../src/services/instructions.ts -async function generateCopilotInstructions(options) { - const repoPath = options.repoPath; - const progress = options.onProgress ?? (() => {}); - progress("Checking Copilot CLI..."); - const cliConfig = await assertCopilotCliReady(); - progress("Starting Copilot SDK..."); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient(cliConfig); - try { - progress("Creating session..."); - const preferredModel = options.model ?? DEFAULT_MODEL; - const session = await client.createSession({ - model: preferredModel, - streaming: true, - workingDirectory: repoPath, - systemMessage: { - content: - "You are an expert codebase analyst. Your task is to generate a concise .github/copilot-instructions.md file. Use the available tools (glob, view, grep) to explore the codebase. Output ONLY the final markdown content, no explanations." - }, - infiniteSessions: { enabled: false } - }); - let content = ""; - session.on((event) => { - const e = event; - if (e.type === "assistant.message_delta") { - const delta = e.data?.deltaContent; - if (delta) { - content += delta; - progress("Generating instructions..."); - } - } else if (e.type === "tool.execution_start") { - const toolName = e.data?.toolName; - progress(`Using tool: ${toolName ?? "..."}`); - } else if (e.type === "session.error") { - const errorMsg = e.data?.message ?? "Unknown error"; - if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { - throw new Error( - "Copilot CLI not logged in. Run `copilot` then `/login` to authenticate." - ); - } - } - }); - const prompt = `Analyze this codebase and generate a .github/copilot-instructions.md file. - -Use tools to explore: -1. Check for existing instruction files: glob for **/{.github/copilot-instructions.md,AGENT.md,CLAUDE.md,.cursorrules,README.md} -2. Identify the tech stack: look at package.json, tsconfig.json, pyproject.toml, Cargo.toml, go.mod, *.csproj, *.sln, build.gradle, pom.xml, etc. -3. Understand the structure: list key directories -4. Detect monorepo structures: check for workspace configs (npm/pnpm/yarn workspaces, Cargo.toml [workspace], go.work, .sln solution files, settings.gradle include directives, pom.xml modules) - -Generate concise instructions (~20-50 lines) covering: -- Tech stack and architecture -- Build/test commands -- Project-specific conventions -- Key files/directories -- Monorepo structure and per-app layout (if this is a monorepo, describe the workspace organization, how apps relate to each other, and any shared libraries) - -Output ONLY the markdown content for the instructions file.`; - progress("Analyzing codebase..."); - await session.sendAndWait({ prompt }, 18e4); - await session.destroy(); - return content.trim() || ""; - } finally { - await client.stop(); - } -} -async function generateAreaInstructions(options) { - const { repoPath, area } = options; - const progress = options.onProgress ?? (() => {}); - progress(`Checking Copilot CLI for area "${area.name}"...`); - const cliConfig = await assertCopilotCliReady(); - progress(`Starting Copilot SDK for area "${area.name}"...`); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient(cliConfig); - try { - const applyToPatterns = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo]; - const applyToStr = applyToPatterns.join(", "); - progress(`Creating session for area "${area.name}"...`); - const preferredModel = options.model ?? DEFAULT_MODEL; - const session = await client.createSession({ - model: preferredModel, - streaming: true, - workingDirectory: repoPath, - systemMessage: { - content: `You are an expert codebase analyst. Your task is to generate a concise .instructions.md file for a specific area of a codebase. This file will be used as a file-based custom instruction in VS Code Copilot, automatically applied when working on files matching certain patterns. Use the available tools (glob, view, grep) to explore the codebase. Output ONLY the final markdown content (no frontmatter, no explanations).` - }, - infiniteSessions: { enabled: false } - }); - let content = ""; - session.on((event) => { - const e = event; - if (e.type === "assistant.message_delta") { - const delta = e.data?.deltaContent; - if (delta) { - content += delta; - progress(`Generating instructions for "${area.name}"...`); - } - } else if (e.type === "tool.execution_start") { - const toolName = e.data?.toolName; - progress(`${area.name}: using tool ${toolName ?? "..."}`); - } else if (e.type === "session.error") { - const errorMsg = e.data?.message ?? "Unknown error"; - if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { - throw new Error( - "Copilot CLI not logged in. Run `copilot` then `/login` to authenticate." - ); - } - } - }); - const prompt = `Analyze the "${area.name}" area of this codebase and generate a file-based instruction file. - -This area covers files matching: ${applyToStr} -${area.description ? `Description: ${area.description}` : ""} - -Use tools to explore ONLY the files and directories within this area: -1. List the key files: glob for ${applyToPatterns.map((p) => `"${p}"`).join(", ")} -2. Identify the tech stack, dependencies, and frameworks used in this area -3. Look at key source files to understand patterns and conventions specific to this area - -Generate concise instructions (~10-30 lines) covering: -- What this area does and its role in the overall project -- Area-specific tech stack, dependencies, and frameworks -- Coding conventions and patterns specific to this area -- Build/test commands relevant to this area (if different from root) -- Key files and directory structure within this area - -IMPORTANT: -- Focus ONLY on this specific area, not the whole repo -- Do NOT repeat repo-wide information (that goes in the root copilot-instructions.md) -- Keep it complementary to root instructions -- Output ONLY the markdown content, no YAML frontmatter, no code fences`; - progress(`Analyzing area "${area.name}"...`); - await session.sendAndWait({ prompt }, 18e4); - await session.destroy(); - return content.trim() || ""; - } finally { - await client.stop(); - } -} - -// ../src/services/evaluator.ts -var import_promises5 = __toESM(require("fs/promises"), 1); -var import_path6 = __toESM(require("path"), 1); -var DEFAULT_SYSTEM_MESSAGE = - "You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them."; -async function runEval(options) { - const config = await loadConfig(options.configPath); - const instructionFile = config.instructionFile ?? ".github/copilot-instructions.md"; - const instructionPath = import_path6.default.resolve(options.repoPath, instructionFile); - const instructionText = await readOptionalFile(instructionPath); - const baseSystemMessage = config.systemMessage ?? DEFAULT_SYSTEM_MESSAGE; - const progress = options.onProgress ?? (() => {}); - const defaultOutputPath = import_path6.default.resolve( - options.repoPath, - ".primer", - "evals", - buildTimestampedName("eval-results") - ); - const outputPath = - resolveOutputPath(options.repoPath, options.outputPath, config.outputPath) ?? defaultOutputPath; - const runStartedAt = Date.now(); - progress("Starting Copilot SDK..."); - const cliConfig = await assertCopilotCliReady(); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient(cliConfig); - try { - const results = []; - const total = config.cases.length; - for (const [index, testCase] of config.cases.entries()) { - const id = testCase.id ?? `case-${index + 1}`; - const prompt = buildPrompt(options.repoPath, testCase.prompt); - const caseStartedAt = Date.now(); - progress(`Running eval ${index + 1}/${total}: ${id} (without instructions)...`); - const withoutResult = await askOnce(client, { - prompt, - model: options.model, - systemMessage: baseSystemMessage, - phase: "withoutInstructions" - }); - progress(`Running eval ${index + 1}/${total}: ${id} (with instructions)...`); - const withResult = await askOnce(client, { - prompt, - model: options.model, - systemMessage: [baseSystemMessage, instructionText].filter(Boolean).join("\n\n"), - phase: "withInstructions" - }); - progress(`Running eval ${index + 1}/${total}: ${id} (judging)...`); - const judgment = await judge(client, { - model: options.judgeModel, - prompt: testCase.prompt, - expectation: testCase.expectation, - withoutInstructions: withoutResult.content, - withInstructions: withResult.content - }); - const metrics = { - withoutInstructions: withoutResult.metrics, - withInstructions: withResult.metrics, - judge: judgment.metrics, - totalDurationMs: Date.now() - caseStartedAt - }; - const trajectory = [ - ...withoutResult.trajectory, - ...withResult.trajectory, - ...judgment.trajectory - ]; - results.push({ - id, - prompt: testCase.prompt, - expectation: testCase.expectation, - withInstructions: withResult.content, - withoutInstructions: withoutResult.content, - verdict: judgment.result.verdict, - score: judgment.result.score, - rationale: judgment.result.rationale, - metrics, - trajectory - }); - progress( - `Eval ${index + 1}/${total}: ${id} \u2192 ${judgment.result.verdict} (score: ${judgment.result.score})` - ); - } - const runFinishedAt = Date.now(); - const output = { - repoPath: options.repoPath, - model: options.model, - judgeModel: options.judgeModel, - runMetrics: { - startedAt: new Date(runStartedAt).toISOString(), - finishedAt: new Date(runFinishedAt).toISOString(), - durationMs: runFinishedAt - runStartedAt - }, - results - }; - let viewerPath; - if (outputPath) { - await import_promises5.default.mkdir(import_path6.default.dirname(outputPath), { - recursive: true - }); - await import_promises5.default.writeFile(outputPath, JSON.stringify(output, null, 2), "utf8"); - viewerPath = buildViewerPath(outputPath); - await import_promises5.default.writeFile( - viewerPath, - buildTrajectoryViewerHtml(output), - "utf8" - ); - } - const summary = formatSummary(results, runFinishedAt - runStartedAt); - return { summary, results, viewerPath }; - } finally { - await client.stop(); - } -} -async function askOnce(client, options) { - const session = await client.createSession({ - model: options.model, - streaming: true, - infiniteSessions: { enabled: false }, - systemMessage: options.systemMessage ? { content: options.systemMessage } : void 0 - }); - let content = ""; - const telemetry = createTelemetry(options.phase); - const startedAt = Date.now(); - session.on((event) => { - captureTelemetryEvent(event, telemetry); - if (event.type === "assistant.message_delta") { - const delta = event.data?.deltaContent; - if (delta) content += delta; - } - }); - await session.sendAndWait({ prompt: options.prompt }, 12e4); - await session.destroy(); - const finishedAt = Date.now(); - return { - content: content.trim(), - metrics: { - durationMs: finishedAt - startedAt, - tokenUsage: normalizeTokenUsage(telemetry.tokenUsage), - toolCalls: telemetry.toolCalls - }, - trajectory: telemetry.trajectory - }; -} -async function judge(client, options) { - const session = await client.createSession({ - model: options.model, - streaming: true, - infiniteSessions: { enabled: false }, - systemMessage: { - content: - "You are a strict evaluator. Return JSON with keys: verdict (pass|fail|unknown), score (0-100), rationale. Do not include any other text." - } - }); - let content = ""; - const telemetry = createTelemetry("judge"); - const startedAt = Date.now(); - session.on((event) => { - captureTelemetryEvent(event, telemetry); - if (event.type === "assistant.message_delta") { - const delta = event.data?.deltaContent; - if (delta) content += delta; - } - }); - const prompt = [ - "Evaluate which response best matches the expectation.", - "", - `Expectation: ${options.expectation}`, - "", - "Response A (without custom instructions):", - options.withoutInstructions, - "", - "Response B (with custom instructions):", - options.withInstructions, - "", - "Return JSON only." - ].join("\n"); - await session.sendAndWait({ prompt }, 12e4); - await session.destroy(); - const finishedAt = Date.now(); - return { - result: parseJudge(content), - metrics: { - durationMs: finishedAt - startedAt, - tokenUsage: normalizeTokenUsage(telemetry.tokenUsage), - toolCalls: telemetry.toolCalls - }, - trajectory: telemetry.trajectory - }; -} -function parseJudge(content) { - try { - const match = content.match(/\{[\s\S]*\}/); - if (!match) throw new Error("No JSON detected"); - const parsed = JSON.parse(match[0]); - if (!parsed.verdict) throw new Error("Missing verdict"); - return { - verdict: parsed.verdict, - score: Number(parsed.score ?? 0), - rationale: String(parsed.rationale ?? "") - }; - } catch { - return { - verdict: "unknown", - score: 0, - rationale: content.trim() - }; - } -} -async function loadConfig(configPath) { - const raw = await import_promises5.default.readFile(configPath, "utf8"); - const parsed = JSON.parse(raw); - if (!parsed || !Array.isArray(parsed.cases)) { - throw new Error("Eval config must have a 'cases' array."); - } - return parsed; -} -async function readOptionalFile(filePath) { - try { - return await import_promises5.default.readFile(filePath, "utf8"); - } catch { - return ""; - } -} -function buildPrompt(repoPath, userPrompt) { - return [ - "You are working in this repository:", - repoPath, - "Use the file system tools when needed to inspect the codebase.", - "", - userPrompt - ].join("\n"); -} -function formatSummary(results, runDurationMs) { - const total = results.length; - const passed = results.filter((r) => r.verdict === "pass").length; - const failed = results.filter((r) => r.verdict === "fail").length; - const unknown = results.filter((r) => r.verdict === "unknown").length; - const totalUsage = aggregateTokenUsage(results); - const hasUsage = Boolean( - totalUsage.promptTokens || totalUsage.completionTokens || totalUsage.totalTokens - ); - const lines = [ - `Eval results: ${passed}/${total} pass, ${failed} fail, ${unknown} unknown.`, - `Runtime: ${formatDuration(runDurationMs)}.`, - hasUsage ? `Token usage: ${formatTokenUsage(totalUsage)}.` : "Token usage: unavailable." - ]; - for (const result of results) { - lines.push(`- ${result.id}: ${result.verdict ?? "unknown"} (score: ${result.score ?? 0})`); - } - return ` -${lines.join("\n")}`; -} -function createTelemetry(phase) { - return { - trajectory: [], - tokenUsage: {}, - toolCalls: { count: 0, byName: {}, totalDurationMs: 0 }, - toolCallMap: /* @__PURE__ */ new Map(), - phase - }; -} -function captureTelemetryEvent(event, telemetry) { - const timestampMs = Date.now(); - telemetry.trajectory.push({ - timestampMs, - phase: telemetry.phase, - type: event.type, - data: sanitizeEventData(event.data) - }); - if (event.type === "tool.execution_start") { - const toolName = event.data?.toolName ?? "unknown"; - const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size); - telemetry.toolCallMap.set(toolId, { name: toolName, startMs: timestampMs }); - telemetry.toolCalls.count += 1; - telemetry.toolCalls.byName[toolName] = (telemetry.toolCalls.byName[toolName] ?? 0) + 1; - } else if (event.type === "tool.execution_finish" || event.type === "tool.execution_error") { - const toolName = event.data?.toolName ?? "unknown"; - const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size); - const entry = - telemetry.toolCallMap.get(toolId) ?? findLatestToolByName(telemetry.toolCallMap, toolName); - if (entry) { - const durationMs = timestampMs - entry.startMs; - telemetry.toolCalls.totalDurationMs += durationMs; - telemetry.toolCallMap.delete(toolId); - } - } - const usage = extractTokenUsage(event.data); - if (usage) { - telemetry.tokenUsage = mergeTokenUsage(telemetry.tokenUsage, usage); - } -} -function resolveToolId(data, toolName, index) { - const rawId = data?.executionId ?? data?.toolCallId ?? data?.callId ?? data?.id; - if (typeof rawId === "string" || typeof rawId === "number") { - return String(rawId); - } - return `${toolName}-${index + 1}`; -} -function findLatestToolByName(map, toolName) { - const entries = Array.from(map.values()).filter((entry) => entry.name === toolName); - return entries.at(-1); -} -function extractTokenUsage(data) { - if (!data) return null; - const usage = findUsageObject(data); - const promptTokens = getNumber( - usage?.prompt_tokens ?? usage?.promptTokens ?? data.promptTokens ?? data.inputTokens - ); - const completionTokens = getNumber( - usage?.completion_tokens ?? - usage?.completionTokens ?? - data.completionTokens ?? - data.outputTokens - ); - const totalTokens = getNumber(usage?.total_tokens ?? usage?.totalTokens ?? data.totalTokens); - if (promptTokens == null && completionTokens == null && totalTokens == null) { - return null; - } - return { - promptTokens: promptTokens ?? void 0, - completionTokens: completionTokens ?? void 0, - totalTokens: totalTokens ?? void 0 - }; -} -function findUsageObject(data) { - const direct = data.usage ?? data.tokenUsage ?? data.tokens; - if (direct) return direct; - const candidates = [data.response, data.result, data.message, data.metrics, data.output]; - for (const candidate of candidates) { - if (candidate && typeof candidate === "object") { - const nested = candidate.usage ?? candidate.tokenUsage; - if (nested && typeof nested === "object") return nested; - } - } - return scanForUsage(data, 0); -} -function scanForUsage(value, depth) { - if (!value || typeof value !== "object" || depth > 4) return void 0; - if (Array.isArray(value)) { - for (const entry of value) { - const found = scanForUsage(entry, depth + 1); - if (found) return found; - } - return void 0; - } - const record = value; - if (hasTokenFields(record)) return record; - for (const entry of Object.values(record)) { - const found = scanForUsage(entry, depth + 1); - if (found) return found; - } - return void 0; -} -function hasTokenFields(record) { - const keys = Object.keys(record); - return ( - keys.includes("prompt_tokens") || - keys.includes("completion_tokens") || - keys.includes("total_tokens") || - keys.includes("promptTokens") || - keys.includes("completionTokens") || - keys.includes("totalTokens") || - keys.includes("inputTokens") || - keys.includes("outputTokens") - ); -} -function getNumber(value) { - if (typeof value === "number" && Number.isFinite(value)) return value; - if (typeof value === "string" && value.trim()) { - const parsed = Number(value); - return Number.isFinite(parsed) ? parsed : null; - } - return null; -} -function mergeTokenUsage(existing, next) { - return { - promptTokens: Math.max(existing.promptTokens ?? 0, next.promptTokens ?? 0) || void 0, - completionTokens: - Math.max(existing.completionTokens ?? 0, next.completionTokens ?? 0) || void 0, - totalTokens: Math.max(existing.totalTokens ?? 0, next.totalTokens ?? 0) || void 0 - }; -} -function normalizeTokenUsage(usage) { - if (!usage.promptTokens && !usage.completionTokens && !usage.totalTokens) return void 0; - if (!usage.totalTokens) { - const prompt = usage.promptTokens ?? 0; - const completion = usage.completionTokens ?? 0; - const total = prompt + completion; - return { - ...usage, - totalTokens: total || void 0 - }; - } - return usage; -} -function aggregateTokenUsage(results) { - const total = { promptTokens: 0, completionTokens: 0, totalTokens: 0 }; - for (const result of results) { - const metrics = result.metrics; - if (!metrics) continue; - const usages = [ - metrics.withoutInstructions.tokenUsage, - metrics.withInstructions.tokenUsage, - metrics.judge.tokenUsage - ]; - for (const usage of usages) { - if (!usage) continue; - total.promptTokens = (total.promptTokens ?? 0) + (usage.promptTokens ?? 0); - total.completionTokens = (total.completionTokens ?? 0) + (usage.completionTokens ?? 0); - total.totalTokens = (total.totalTokens ?? 0) + (usage.totalTokens ?? 0); - } - } - return total; -} -function formatDuration(durationMs) { - const seconds = Math.round(durationMs / 100) / 10; - if (seconds < 60) return `${seconds}s`; - const minutes = Math.floor(seconds / 60); - const remaining = Math.round((seconds % 60) * 10) / 10; - return `${minutes}m ${remaining}s`; -} -function formatTokenUsage(usage) { - const prompt = usage.promptTokens ?? 0; - const completion = usage.completionTokens ?? 0; - const total = usage.totalTokens ?? prompt + completion; - return `prompt ${prompt}, completion ${completion}, total ${total}`; -} -function resolveOutputPath(repoPath, override, configValue) { - const chosen = override ?? configValue; - if (!chosen) return void 0; - return import_path6.default.isAbsolute(chosen) - ? chosen - : import_path6.default.resolve(repoPath, chosen); -} -function buildViewerPath(outputPath) { - if (outputPath.endsWith(".json")) { - return outputPath.replace(/\.json$/u, ".html"); - } - return `${outputPath}.html`; -} -function buildTrajectoryViewerHtml(data) { - const serialized = JSON.stringify(data).replace(/ - - - - - -Primer Eval Results - - - -
    -
    - -
    -

    Eval Results

    -
    -
    -
    - -
    - -
    - -
    -
    Impact of Instructions
    -
    -
    - -
    -
    Results by Case
    -
    -
    - -
    -
    Case Details
    -
    -
    - - - -`; -} -function sanitizeEventData(data) { - if (!data) return void 0; - const sanitized = {}; - for (const [key, value] of Object.entries(data)) { - if (key === "deltaContent" && typeof value === "string") { - sanitized.deltaChars = value.length; - sanitized.deltaPreview = value.slice(0, 120); - continue; - } - sanitized[key] = sanitizeValue(value, 0); - } - return sanitized; -} -function sanitizeValue(value, depth) { - if (depth > 4) return "[depth-limit]"; - if (typeof value === "string") { - return value.length > 2e3 ? `${value.slice(0, 2e3)}\u2026` : value; - } - if (Array.isArray(value)) { - return value.slice(0, 50).map((entry) => sanitizeValue(entry, depth + 1)); - } - if (value && typeof value === "object") { - const obj = {}; - for (const [key, entry] of Object.entries(value)) { - obj[key] = sanitizeValue(entry, depth + 1); - } - return obj; - } - return value; -} - -// ../src/services/evalScaffold.ts -var EVAL_SCAFFOLD_TIMEOUT_MS = 6e5; -var EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS = 9e4; -async function generateEvalScaffold(options) { - const repoPath = options.repoPath; - const count = Math.max(1, options.count); - const progress = options.onProgress ?? (() => {}); - progress("Checking Copilot CLI..."); - const cliConfig = await assertCopilotCliReady(); - progress("Starting Copilot SDK..."); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient(cliConfig); - try { - progress("Creating session..."); - const preferredModel = options.model ?? DEFAULT_MODEL; - const session = await client.createSession({ - model: preferredModel, - streaming: true, - workingDirectory: repoPath, - systemMessage: { - content: - "You are an expert codebase analyst specializing in deep architectural analysis. Generate challenging, cross-cutting eval cases for this repository that require synthesizing information from multiple files and tracing logic across layers. Avoid trivial questions answerable from a single file read or grep. Use tools (glob, view, grep) extensively to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation})." - }, - infiniteSessions: { enabled: false } - }); - let content = ""; - session.on((event) => { - if (event.type === "assistant.message_delta") { - const delta = event.data?.deltaContent; - if (delta) { - content += delta; - progress("Generating eval cases..."); - } - } else if (event.type === "tool.execution_start") { - const toolName = event.data?.toolName; - progress(`Using tool: ${toolName ?? "..."}`); - } else if (event.type === "session.error") { - const errorMsg = event.data?.message ?? "Unknown error"; - if (errorMsg.toLowerCase().includes("auth") || errorMsg.toLowerCase().includes("login")) { - throw new Error( - "Copilot CLI not logged in. Run `copilot` then `/login` to authenticate." - ); - } - } - }); - const areaContext = options.areas?.length - ? [ - "", - "AREA CONTEXT:", - "This repo has the following areas:", - ...options.areas.map((a) => { - const patterns = Array.isArray(a.applyTo) ? a.applyTo.join(", ") : a.applyTo; - return `- ${a.name} (${patterns})`; - }), - "", - "Generate a mix of:", - "- Single-area cases that go deep into one area's internals", - "- Cross-area cases that test interactions between areas", - 'Include an optional "area" field in each case to tag which area(s) it targets.' - ].join("\n") - : ""; - const prompt = [ - `Analyze this repository and generate ${count} eval cases.`, - "", - "IMPORTANT: Generate HARD eval cases that require deep, cross-cutting understanding of the codebase.", - "Each case should require synthesizing information from MULTIPLE files or tracing logic across several layers.", - "Do NOT generate simple questions that can be answered by reading a single file or running a single grep.", - "", - "Good eval case examples (adapt to this repo):", - "- Questions about how data flows end-to-end through multiple modules (e.g., 'Trace what happens when X is called \u2014 which services, transforms, and side effects are involved?')", - "- Questions about implicit conventions or patterns that span many files (e.g., 'What error-handling pattern is used across the service layer, and where does it deviate?')", - "- Questions requiring understanding of runtime behavior not obvious from static code (e.g., 'What is the order of initialization and what would break if module X loaded before Y?')", - "- Questions about non-obvious interactions between components (e.g., 'How does changing config option X affect the behavior of feature Y?')", - "- Questions about edge cases or failure modes that require reading implementation details across files", - "- Questions that require understanding the type system, generics, or shared interfaces across module boundaries", - "", - "Bad eval case examples (avoid these):", - "- 'What does this project do?' (answered by README alone)", - "- 'How do I build/test?' (answered by package.json alone)", - "- 'What is the entrypoint?' (answered by a single file)", - "- Any question answerable by reading one file or searching for one keyword", - "", - "Use tools extensively to inspect the codebase \u2014 read multiple files, trace imports, follow call chains.", - "If this is a monorepo (npm/pnpm/yarn workspaces, Cargo workspace, Go workspace, .NET solution, Gradle/Maven multi-module), generate cases that involve cross-app dependencies, shared libraries, and how changes in one app affect others.", - "Ensure cases cover cross-cutting concerns: data flow, error propagation, configuration impact, implicit coupling, architectural invariants.", - "Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).", - "Return JSON ONLY (no markdown, no commentary) in this schema:", - '{\n "instructionFile": ".github/copilot-instructions.md",\n "systemMessage": "...",\n "cases": [\n {"id": "case-1", "prompt": "...", "expectation": "...", "area": "optional-area-name"}\n ]\n}', - areaContext - ].join("\n"); - progress("Analyzing codebase..."); - let timedOutWaitingForIdle = false; - try { - await session.sendAndWait({ prompt }, EVAL_SCAFFOLD_TIMEOUT_MS); - } catch (error) { - if (!isSessionIdleTimeoutError(error)) { - throw error; - } - timedOutWaitingForIdle = true; - progress("Generation took longer than expected; requesting final JSON output..."); - try { - await session.sendAndWait( - { - prompt: - "Stop analysis and return only the final JSON scaffold now. Do not include markdown or commentary." - }, - EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS - ); - } catch (recoveryError) { - if (!isSessionIdleTimeoutError(recoveryError)) { - throw recoveryError; - } - progress("Still waiting on idle; attempting to parse partial output..."); - } - } finally { - await session.destroy(); - } - let parsed; - try { - parsed = parseEvalConfig(content); - } catch (error) { - if (timedOutWaitingForIdle) { - throw new Error( - "Timed out waiting for scaffold generation to become idle before a complete JSON payload was returned. Try again or lower `--count`." - ); - } - throw error; - } - const normalized = normalizeEvalConfig(parsed, count); - return normalized; - } finally { - await client.stop(); - } -} -function isSessionIdleTimeoutError(error) { - if (!(error instanceof Error)) { - return false; - } - const message = error.message.toLowerCase(); - return message.includes("timeout") && message.includes("session.idle"); -} -function parseEvalConfig(raw) { - const match = raw.match(/\{[\s\S]*\}/u); - if (!match) { - throw new Error("Failed to parse eval scaffold JSON."); - } - const parsed = JSON.parse(match[0]); - if (!parsed || !Array.isArray(parsed.cases)) { - throw new Error("Eval scaffold JSON is missing cases."); - } - return parsed; -} -function normalizeEvalConfig(parsed, count) { - const cases = (parsed.cases ?? []).slice(0, count).map((entry, index) => { - const id = typeof entry.id === "string" && entry.id.trim() ? entry.id : `case-${index + 1}`; - return { - id, - prompt: String(entry.prompt ?? "").trim(), - expectation: String(entry.expectation ?? "").trim(), - area: typeof entry.area === "string" && entry.area.trim() ? entry.area.trim() : void 0 - }; - }); - if (!cases.length) { - throw new Error("Eval scaffold JSON did not include any usable cases."); - } - const defaultSystemMessage = - "You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them."; - return { - instructionFile: parsed.instructionFile ?? ".github/copilot-instructions.md", - systemMessage: parsed.systemMessage ?? defaultSystemMessage, - cases - }; -} - -// ../src/services/readiness.ts -var import_promises7 = __toESM(require("fs/promises"), 1); -var import_path8 = __toESM(require("path"), 1); - -// ../src/services/policy.ts -var import_promises6 = __toESM(require("fs/promises"), 1); -var import_path7 = __toESM(require("path"), 1); -var DEFAULT_PASS_RATE = 0.8; -function validatePolicyConfig(obj, source, format = "module") { - if (typeof obj !== "object" || obj === null) { - throw new Error(`Policy "${source}" is invalid: expected an object, got ${typeof obj}`); - } - const record = obj; - if (typeof record.name !== "string" || !record.name.trim()) { - throw new Error(`Policy "${source}" is invalid: missing required field "name" at root`); - } - if (record.criteria !== void 0) { - if (typeof record.criteria !== "object") { - throw new Error(`Policy "${source}" is invalid: "criteria" must be an object`); - } - const criteria = record.criteria; - if (criteria.disable !== void 0 && !isStringArray(criteria.disable)) { - throw new Error( - `Policy "${source}" is invalid: "criteria.disable" must be an array of strings` - ); - } - if (criteria.override !== void 0) { - if ( - typeof criteria.override !== "object" || - criteria.override === null || - Array.isArray(criteria.override) - ) { - throw new Error(`Policy "${source}" is invalid: "criteria.override" must be an object`); - } - const ALLOWED_OVERRIDE_KEYS = /* @__PURE__ */ new Set([ - "title", - "pillar", - "level", - "scope", - "impact", - "effort" - ]); - for (const [id, value] of Object.entries(criteria.override)) { - if (typeof value !== "object" || value === null) continue; - for (const key of Object.keys(value)) { - if (!ALLOWED_OVERRIDE_KEYS.has(key)) { - throw new Error( - `Policy "${source}" is invalid: "criteria.override.${id}" contains disallowed key "${key}". Allowed keys: ${[...ALLOWED_OVERRIDE_KEYS].join(", ")}` - ); - } - } - } - } - if (format === "json" && criteria.add !== void 0) { - throw new Error( - `Policy "${source}" is invalid: "criteria.add" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.` - ); - } - } - if (record.extras !== void 0) { - if (typeof record.extras !== "object" || record.extras === null) { - throw new Error(`Policy "${source}" is invalid: "extras" must be an object`); - } - const extras = record.extras; - if (extras.disable !== void 0 && !isStringArray(extras.disable)) { - throw new Error( - `Policy "${source}" is invalid: "extras.disable" must be an array of strings` - ); - } - if (format === "json" && extras.add !== void 0) { - throw new Error( - `Policy "${source}" is invalid: "extras.add" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.` - ); - } - } - if (record.thresholds !== void 0) { - if (typeof record.thresholds !== "object" || record.thresholds === null) { - throw new Error(`Policy "${source}" is invalid: "thresholds" must be an object`); - } - const thresholds = record.thresholds; - if (thresholds.passRate !== void 0 && typeof thresholds.passRate !== "number") { - throw new Error(`Policy "${source}" is invalid: "thresholds.passRate" must be a number`); - } - if ( - typeof thresholds.passRate === "number" && - (thresholds.passRate < 0 || thresholds.passRate > 1) - ) { - throw new Error( - `Policy "${source}" is invalid: "thresholds.passRate" must be between 0 and 1` - ); - } - } - return record; -} -function isStringArray(value) { - return Array.isArray(value) && value.every((item) => typeof item === "string"); -} -async function loadPolicy(source, options) { - const jsonOnly = options?.jsonOnly ?? false; - if (source.startsWith(".") || import_path7.default.isAbsolute(source)) { - const resolved = import_path7.default.resolve(source); - if (resolved.endsWith(".json")) { - const data = await readJson(resolved); - if (!data) { - throw new Error(`Policy "${source}" not found at: ${resolved}`); - } - return validatePolicyConfig(data, source, "json"); - } - if (/\.[mc]?[jt]s$/u.test(resolved)) { - if (jsonOnly) { - throw new Error( - `Policy "${source}" rejected: only JSON policies are allowed from primer.config.json. Module policies (.ts/.js) must be passed via --policy.` - ); - } - try { - const mod = await import(resolved); - const config = mod.default ?? mod; - return validatePolicyConfig(config, source); - } catch (err) { - if ( - err instanceof Error && - (err.message.includes("Cannot find module") || err.message.includes("MODULE_NOT_FOUND")) - ) { - throw new Error(`Policy "${source}" not found at: ${resolved}`); - } - throw err; - } - } - try { - const raw = await import_promises6.default.readFile(resolved, "utf8"); - const data = JSON.parse(raw); - return validatePolicyConfig(data, source, "json"); - } catch { - throw new Error( - `Policy "${source}" could not be loaded from: ${resolved}. Supported formats: .json, .js, .ts, .mjs` - ); - } - } - if (jsonOnly) { - throw new Error( - `Policy "${source}" rejected: only JSON file policies are allowed from primer.config.json. npm policies must be passed via --policy.` - ); - } - try { - const mod = await import(source); - const config = mod.default ?? mod; - return validatePolicyConfig(config, source); - } catch (err) { - if ( - err instanceof Error && - (err.message.includes("Cannot find module") || - err.message.includes("Cannot find package") || - err.message.includes("MODULE_NOT_FOUND") || - err.message.includes("ERR_MODULE_NOT_FOUND")) - ) { - throw new Error(`Policy "${source}" not found. Install it with: npm install ${source}`); - } - throw err; - } -} -function resolveChain(baseCriteria, baseExtras, policies) { - const chain = []; - let criteria = [...baseCriteria]; - let extras = [...baseExtras]; - let passRate = DEFAULT_PASS_RATE; - for (const policy of policies) { - chain.push(policy.name); - if (policy.criteria) { - if (policy.criteria.disable?.length) { - const disableSet = new Set(policy.criteria.disable); - criteria = criteria.filter((c) => !disableSet.has(c.id)); - } - if (policy.criteria.override) { - for (const [id, overrides] of Object.entries(policy.criteria.override)) { - const idx = criteria.findIndex((c) => c.id === id); - if (idx >= 0) { - criteria[idx] = { ...criteria[idx], ...overrides }; - } - } - } - if (policy.criteria.add?.length) { - for (const newCriterion of policy.criteria.add) { - const existingIdx = criteria.findIndex((c) => c.id === newCriterion.id); - if (existingIdx >= 0) { - criteria[existingIdx] = newCriterion; - } else { - criteria.push(newCriterion); - } - } - } - } - if (policy.extras) { - if (policy.extras.disable?.length) { - const disableSet = new Set(policy.extras.disable); - extras = extras.filter((e) => !disableSet.has(e.id)); - } - if (policy.extras.add?.length) { - for (const newExtra of policy.extras.add) { - const existingIdx = extras.findIndex((e) => e.id === newExtra.id); - if (existingIdx >= 0) { - extras[existingIdx] = newExtra; - } else { - extras.push(newExtra); - } - } - } - } - if (policy.thresholds?.passRate !== void 0) { - passRate = policy.thresholds.passRate; - } - } - return { chain, criteria, extras, thresholds: { passRate } }; -} - -// ../src/services/readiness.ts -async function runReadinessReport(options) { - const repoPath = options.repoPath; - const analysis = await analyzeRepo(repoPath); - const rootFiles = await safeReadDir(repoPath); - const rootPackageJson = await readJson(import_path8.default.join(repoPath, "package.json")); - const apps = analysis.apps?.length ? analysis.apps : []; - const context = { - repoPath, - analysis, - apps, - rootFiles, - rootPackageJson - }; - let policySources = options.policies; - if (!policySources?.length) { - const primerConfig = await loadPrimerConfig(repoPath); - if (primerConfig?.policies?.length) { - policySources = primerConfig.policies; - } - } - const baseCriteria = buildCriteria(); - const baseExtras = buildExtras(); - let resolvedCriteria; - let resolvedExtras; - let passRateThreshold = 0.8; - let policyInfo; - if (policySources?.length) { - const policyConfigs = []; - const isConfigSourced = policySources !== options.policies; - for (const source of policySources) { - policyConfigs.push(await loadPolicy(source, { jsonOnly: isConfigSourced })); - } - const resolved = resolveChain(baseCriteria, baseExtras, policyConfigs); - resolvedCriteria = resolved.criteria; - resolvedExtras = resolved.extras; - passRateThreshold = resolved.thresholds.passRate; - policyInfo = { chain: resolved.chain, criteriaCount: resolved.criteria.length }; - } else { - resolvedCriteria = baseCriteria; - resolvedExtras = baseExtras; - } - const criteriaResults = []; - for (const criterion of resolvedCriteria) { - if (criterion.scope === "repo") { - const result = await criterion.check(context); - criteriaResults.push({ - id: criterion.id, - title: criterion.title, - pillar: criterion.pillar, - level: criterion.level, - scope: criterion.scope, - impact: criterion.impact, - effort: criterion.effort, - status: result.status, - reason: result.reason, - evidence: result.evidence - }); - continue; - } - if (criterion.scope === "area") { - if (!options.perArea) continue; - const areas2 = analysis.areas ?? []; - if (areas2.length === 0) continue; - criteriaResults.push({ - id: criterion.id, - title: criterion.title, - pillar: criterion.pillar, - level: criterion.level, - scope: criterion.scope, - impact: criterion.impact, - effort: criterion.effort, - status: "skip", - reason: "Run with --per-area for area breakdown." - }); - continue; - } - const appResults = await Promise.all( - apps.map(async (app) => ({ - app, - result: await criterion.check(context, app) - })) - ); - if (!appResults.length) { - criteriaResults.push({ - id: criterion.id, - title: criterion.title, - pillar: criterion.pillar, - level: criterion.level, - scope: criterion.scope, - impact: criterion.impact, - effort: criterion.effort, - status: "skip", - reason: "No application packages detected." - }); - continue; - } - const passed = appResults.filter((entry) => entry.result.status === "pass").length; - const total = appResults.length; - const passRate = total ? passed / total : 0; - const status = passRate >= passRateThreshold ? "pass" : "fail"; - const failures = appResults - .filter((entry) => entry.result.status !== "pass") - .map((entry) => entry.app.name); - criteriaResults.push({ - id: criterion.id, - title: criterion.title, - pillar: criterion.pillar, - level: criterion.level, - scope: criterion.scope, - impact: criterion.impact, - effort: criterion.effort, - status, - reason: status === "pass" ? void 0 : `Only ${passed}/${total} apps pass this check.`, - passRate, - appSummary: { passed, total }, - appFailures: failures - }); - } - let areaReports; - const areas = analysis.areas ?? []; - if (options.perArea && areas.length > 0) { - const areaCriteria = resolvedCriteria.filter((c) => c.scope === "area"); - areaReports = []; - for (const area of areas) { - if (!area.path) continue; - const areaFiles = await safeReadDir(area.path); - const areaContext = { - ...context, - areaPath: area.path, - areaFiles - }; - const areaResults = []; - for (const criterion of areaCriteria) { - const result = await criterion.check(areaContext, void 0, area); - areaResults.push({ - id: criterion.id, - title: criterion.title, - pillar: criterion.pillar, - level: criterion.level, - scope: criterion.scope, - impact: criterion.impact, - effort: criterion.effort, - status: result.status, - reason: result.reason, - evidence: result.evidence - }); - } - const areaPillars = summarizePillars(areaResults); - areaReports.push({ area, criteria: areaResults, pillars: areaPillars }); - } - for (const criterion of criteriaResults) { - if (criterion.scope !== "area") continue; - const perAreaResults = areaReports - .map((ar) => ar.criteria.find((c) => c.id === criterion.id)) - .filter(Boolean); - if (!perAreaResults.length) continue; - const passed = perAreaResults.filter((r) => r.status === "pass").length; - const total = perAreaResults.length; - const passRate = total ? passed / total : 0; - criterion.status = passRate >= passRateThreshold ? "pass" : "fail"; - criterion.reason = - criterion.status === "pass" ? void 0 : `Only ${passed}/${total} areas pass this check.`; - criterion.passRate = passRate; - criterion.areaSummary = { passed, total }; - criterion.areaFailures = areaReports - .filter((ar) => ar.criteria.find((c) => c.id === criterion.id)?.status !== "pass") - .map((ar) => ar.area.name); - } - } - const pillars = summarizePillars(criteriaResults); - const levels = summarizeLevels(criteriaResults, passRateThreshold); - const achievedLevel = levels - .filter((level) => level.achieved) - .reduce((acc, level) => Math.max(acc, level.level), 0); - const extras = options.includeExtras === false ? [] : await runExtras(context, resolvedExtras); - return { - repoPath, - generatedAt: /* @__PURE__ */ new Date().toISOString(), - isMonorepo: analysis.isMonorepo ?? false, - apps: apps.map((app) => ({ name: app.name, path: app.path })), - pillars, - levels, - achievedLevel, - criteria: criteriaResults, - extras, - areaReports, - policies: policyInfo - }; -} -function buildCriteria() { - return [ - { - id: "lint-config", - title: "Linting configured", - pillar: "style-validation", - level: 1, - scope: "repo", - impact: "high", - effort: "low", - check: async (context) => { - const found = await hasLintConfig(context.repoPath); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing ESLint/Biome/Prettier configuration.", - evidence: ["eslint.config.js", ".eslintrc", "biome.json", ".prettierrc"] - }; - } - }, - { - id: "typecheck-config", - title: "Type checking configured", - pillar: "style-validation", - level: 2, - scope: "repo", - impact: "medium", - effort: "low", - check: async (context) => { - const found = await hasTypecheckConfig(context.repoPath); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing type checking config (tsconfig or equivalent).", - evidence: ["tsconfig.json", "pyproject.toml", "mypy.ini"] - }; - } - }, - { - id: "build-script", - title: "Build script present", - pillar: "build-system", - level: 1, - scope: "app", - impact: "high", - effort: "low", - check: async (_context, app) => { - const found = Boolean(app?.scripts?.build); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing build script in package.json." - }; - } - }, - { - id: "ci-config", - title: "CI workflow configured", - pillar: "build-system", - level: 2, - scope: "repo", - impact: "high", - effort: "medium", - check: async (context) => { - const found = await hasGithubWorkflows(context.repoPath); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing .github/workflows CI configuration.", - evidence: [".github/workflows"] - }; - } - }, - { - id: "test-script", - title: "Test script present", - pillar: "testing", - level: 1, - scope: "app", - impact: "high", - effort: "low", - check: async (_context, app) => { - const found = Boolean(app?.scripts?.test); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing test script in package.json." - }; - } - }, - { - id: "readme", - title: "README present", - pillar: "documentation", - level: 1, - scope: "repo", - impact: "high", - effort: "low", - check: async (context) => { - const found = await hasReadme(context.repoPath); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing README documentation.", - evidence: ["README.md"] - }; - } - }, - { - id: "contributing", - title: "CONTRIBUTING guide present", - pillar: "documentation", - level: 2, - scope: "repo", - impact: "medium", - effort: "low", - check: async (context) => { - const found = await fileExists( - import_path8.default.join(context.repoPath, "CONTRIBUTING.md") - ); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing CONTRIBUTING.md for contributor workflows." - }; - } - }, - { - id: "lockfile", - title: "Lockfile present", - pillar: "dev-environment", - level: 1, - scope: "repo", - impact: "high", - effort: "low", - check: async (context) => { - const found = hasAnyFile(context.rootFiles, [ - "pnpm-lock.yaml", - "yarn.lock", - "package-lock.json", - "bun.lockb" - ]); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing package manager lockfile." - }; - } - }, - { - id: "env-example", - title: "Environment example present", - pillar: "dev-environment", - level: 2, - scope: "repo", - impact: "medium", - effort: "low", - check: async (context) => { - const found = hasAnyFile(context.rootFiles, [".env.example", ".env.sample"]); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing .env.example or .env.sample for setup guidance." - }; - } - }, - { - id: "format-config", - title: "Formatter configured", - pillar: "code-quality", - level: 2, - scope: "repo", - impact: "medium", - effort: "low", - check: async (context) => { - const found = await hasFormatterConfig(context.repoPath); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing Prettier/Biome formatting config." - }; - } - }, - { - id: "codeowners", - title: "CODEOWNERS present", - pillar: "security-governance", - level: 2, - scope: "repo", - impact: "medium", - effort: "low", - check: async (context) => { - const found = await hasCodeowners(context.repoPath); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing CODEOWNERS file." - }; - } - }, - { - id: "license", - title: "LICENSE present", - pillar: "security-governance", - level: 1, - scope: "repo", - impact: "medium", - effort: "low", - check: async (context) => { - const found = await hasLicense(context.repoPath); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing LICENSE file." - }; - } - }, - { - id: "security-policy", - title: "Security policy present", - pillar: "security-governance", - level: 3, - scope: "repo", - impact: "high", - effort: "low", - check: async (context) => { - const found = await fileExists(import_path8.default.join(context.repoPath, "SECURITY.md")); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing SECURITY.md policy." - }; - } - }, - { - id: "dependabot", - title: "Dependabot configured", - pillar: "security-governance", - level: 3, - scope: "repo", - impact: "medium", - effort: "medium", - check: async (context) => { - const found = await fileExists( - import_path8.default.join(context.repoPath, ".github", "dependabot.yml") - ); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing .github/dependabot.yml configuration." - }; - } - }, - { - id: "observability", - title: "Observability tooling present", - pillar: "observability", - level: 3, - scope: "repo", - impact: "medium", - effort: "medium", - check: async (context) => { - const deps = await readAllDependencies(context); - const has = deps.some((dep) => - ["@opentelemetry/api", "@opentelemetry/sdk", "pino", "winston", "bunyan"].includes(dep) - ); - return { - status: has ? "pass" : "fail", - reason: "No observability dependencies detected (OpenTelemetry/logging)." - }; - } - }, - { - id: "custom-instructions", - title: "Custom AI instructions or agent guidance", - pillar: "ai-tooling", - level: 1, - scope: "repo", - impact: "high", - effort: "low", - check: async (context) => { - const rootFound = await hasCustomInstructions(context.repoPath); - if (rootFound.length === 0) { - return { - status: "fail", - reason: - "Missing custom AI instructions (e.g. copilot-instructions.md, CLAUDE.md, AGENTS.md, .cursorrules).", - evidence: [ - "copilot-instructions.md", - "CLAUDE.md", - "AGENTS.md", - ".cursorrules", - ".github/copilot-instructions.md" - ] - }; - } - const fileBasedInstructions = await hasFileBasedInstructions(context.repoPath); - const areas = context.analysis.areas ?? []; - if (areas.length > 0) { - if (fileBasedInstructions.length === 0) { - return { - status: "pass", - reason: `Root instructions found, but no file-based instructions for ${areas.length} detected areas. Run \`primer instructions --areas\` to generate.`, - evidence: [...rootFound, ...areas.map((a) => `${a.name}: missing .instructions.md`)] - }; - } - return { - status: "pass", - reason: `Root + ${fileBasedInstructions.length} file-based instruction(s) found.`, - evidence: [...rootFound, ...fileBasedInstructions] - }; - } - if (context.analysis.isMonorepo && context.apps.length > 1) { - const appsMissing = []; - for (const app of context.apps) { - const appFound = await hasCustomInstructions(app.path); - if (appFound.length === 0) { - appsMissing.push(app.name); - } - } - if (appsMissing.length > 0) { - return { - status: "pass", - reason: `Root instructions found, but ${appsMissing.length}/${context.apps.length} apps missing their own: ${appsMissing.join(", ")}`, - evidence: [ - ...rootFound, - ...appsMissing.map((name) => `${name}: missing app-level instructions`) - ] - }; - } - } - return { - status: "pass", - evidence: rootFound - }; - } - }, - { - id: "mcp-config", - title: "MCP configuration present", - pillar: "ai-tooling", - level: 2, - scope: "repo", - impact: "high", - effort: "low", - check: async (context) => { - const found = await hasMcpConfig(context.repoPath); - return { - status: found.length > 0 ? "pass" : "fail", - reason: "Missing MCP (Model Context Protocol) configuration (e.g. .vscode/mcp.json).", - evidence: - found.length > 0 - ? found - : [".vscode/mcp.json", ".vscode/settings.json (mcp section)", "mcp.json"] - }; - } - }, - { - id: "custom-agents", - title: "Custom AI agents configured", - pillar: "ai-tooling", - level: 3, - scope: "repo", - impact: "medium", - effort: "medium", - check: async (context) => { - const found = await hasCustomAgents(context.repoPath); - return { - status: found.length > 0 ? "pass" : "fail", - reason: "No custom AI agents configured (e.g. .github/agents/, .copilot/agents/).", - evidence: - found.length > 0 - ? found - : [".github/agents/", ".copilot/agents/", ".github/copilot/agents/"] - }; - } - }, - { - id: "copilot-skills", - title: "Copilot/Claude skills present", - pillar: "ai-tooling", - level: 3, - scope: "repo", - impact: "medium", - effort: "medium", - check: async (context) => { - const found = await hasCopilotSkills(context.repoPath); - return { - status: found.length > 0 ? "pass" : "fail", - reason: "No Copilot or Claude skills found (e.g. .copilot/skills/, .github/skills/).", - evidence: - found.length > 0 ? found : [".copilot/skills/", ".github/skills/", ".claude/skills/"] - }; - } - }, - // ── Area-scoped criteria (only run when areaPath is set) ── - { - id: "area-readme", - title: "Area README present", - pillar: "documentation", - level: 1, - scope: "area", - impact: "medium", - effort: "low", - check: async (context) => { - if (!context.areaPath || !context.areaFiles) { - return { status: "skip", reason: "No area context." }; - } - const found = context.areaFiles.some( - (f) => f.toLowerCase() === "readme.md" || f.toLowerCase() === "readme" - ); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing README in area directory." - }; - } - }, - { - id: "area-build-script", - title: "Area build script present", - pillar: "build-system", - level: 1, - scope: "area", - impact: "high", - effort: "low", - check: async (context, _app, area) => { - if (!context.areaPath || !context.areaFiles) { - return { status: "skip", reason: "No area context." }; - } - if (area?.scripts?.build) { - return { status: "pass" }; - } - const pkgPath = import_path8.default.join(context.areaPath, "package.json"); - const pkg = await readJson(pkgPath); - const scripts = pkg?.scripts ?? {}; - const found = Boolean(scripts.build); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing build script in area." - }; - } - }, - { - id: "area-test-script", - title: "Area test script present", - pillar: "testing", - level: 1, - scope: "area", - impact: "high", - effort: "low", - check: async (context, _app, area) => { - if (!context.areaPath || !context.areaFiles) { - return { status: "skip", reason: "No area context." }; - } - if (area?.scripts?.test) { - return { status: "pass" }; - } - const pkgPath = import_path8.default.join(context.areaPath, "package.json"); - const pkg = await readJson(pkgPath); - const scripts = pkg?.scripts ?? {}; - const found = Boolean(scripts.test); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : "Missing test script in area." - }; - } - }, - { - id: "area-instructions", - title: "Area-specific instructions present", - pillar: "ai-tooling", - level: 2, - scope: "area", - impact: "high", - effort: "low", - check: async (context, _app, area) => { - if (!area) { - return { status: "skip", reason: "No area context." }; - } - const sanitized = sanitizeAreaName(area.name); - const instructionPath = import_path8.default.join( - context.repoPath, - ".github", - "instructions", - `${sanitized}.instructions.md` - ); - const found = await fileExists(instructionPath); - return { - status: found ? "pass" : "fail", - reason: found ? void 0 : `Missing .github/instructions/${sanitized}.instructions.md` - }; - } - } - ]; -} -function buildExtras() { - return [ - { - id: "agents-doc", - title: "AGENTS.md present", - check: async (context) => ({ - status: (await fileExists(import_path8.default.join(context.repoPath, "AGENTS.md"))) - ? "pass" - : "fail", - reason: "Missing AGENTS.md to guide coding agents." - }) - }, - { - id: "pr-template", - title: "Pull request template present", - check: async (context) => ({ - status: (await hasPullRequestTemplate(context.repoPath)) ? "pass" : "fail", - reason: "Missing PR template for consistent reviews." - }) - }, - { - id: "pre-commit", - title: "Pre-commit hooks configured", - check: async (context) => ({ - status: (await hasPrecommitConfig(context.repoPath)) ? "pass" : "fail", - reason: "Missing pre-commit or Husky configuration for fast feedback." - }) - }, - { - id: "architecture-doc", - title: "Architecture guide present", - check: async (context) => ({ - status: (await hasArchitectureDoc(context.repoPath)) ? "pass" : "fail", - reason: "Missing architecture documentation." - }) - } - ]; -} -async function runExtras(context, extraDefs) { - const results = []; - for (const def of extraDefs) { - const result = await def.check(context); - results.push({ - id: def.id, - title: def.title, - status: result.status, - reason: result.reason - }); - } - return results; -} -function summarizePillars(criteria) { - const pillarNames = { - "style-validation": "Style & Validation", - "build-system": "Build System", - testing: "Testing", - documentation: "Documentation", - "dev-environment": "Dev Environment", - "code-quality": "Code Quality", - observability: "Observability", - "security-governance": "Security & Governance", - "ai-tooling": "AI Tooling" - }; - return Object.keys(pillarNames).map((pillar) => { - const items = criteria.filter((criterion) => criterion.pillar === pillar); - const { passed, total } = countStatus(items); - return { - id: pillar, - name: pillarNames[pillar], - passed, - total, - passRate: total ? passed / total : 0 - }; - }); -} -function summarizeLevels(criteria, passRateThreshold = 0.8) { - const levelNames = { - 1: "Functional", - 2: "Documented", - 3: "Standardized", - 4: "Optimized", - 5: "Autonomous" - }; - const summaries = []; - for (let level = 1; level <= 5; level += 1) { - const items = criteria.filter((criterion) => criterion.level === level); - const { passed, total } = countStatus(items); - const passRate = total ? passed / total : 0; - summaries.push({ - level, - name: levelNames[level], - passed, - total, - passRate, - achieved: false - }); - } - for (const summary of summaries) { - const allPrior = summaries.filter((candidate) => candidate.level <= summary.level); - const achieved = allPrior.every( - (candidate) => candidate.total > 0 && candidate.passRate >= passRateThreshold - ); - summary.achieved = achieved; - } - return summaries; -} -function countStatus(items) { - const relevant = items.filter((item) => item.status !== "skip"); - const passed = relevant.filter((item) => item.status === "pass").length; - return { passed, total: relevant.length }; -} -function hasAnyFile(files, candidates) { - return candidates.some((candidate) => files.includes(candidate)); -} -async function hasReadme(repoPath) { - const files = await safeReadDir(repoPath); - return files.some( - (file) => file.toLowerCase() === "readme.md" || file.toLowerCase() === "readme" - ); -} -async function hasLintConfig(repoPath) { - return hasAnyFile(await safeReadDir(repoPath), [ - "eslint.config.js", - "eslint.config.mjs", - ".eslintrc", - ".eslintrc.js", - ".eslintrc.cjs", - ".eslintrc.json", - ".eslintrc.yml", - ".eslintrc.yaml", - "biome.json", - "biome.jsonc", - ".prettierrc", - ".prettierrc.json", - ".prettierrc.js", - ".prettierrc.cjs", - "prettier.config.js", - "prettier.config.cjs" - ]); -} -async function hasFormatterConfig(repoPath) { - return hasAnyFile(await safeReadDir(repoPath), [ - "biome.json", - "biome.jsonc", - ".prettierrc", - ".prettierrc.json", - ".prettierrc.js", - ".prettierrc.cjs", - "prettier.config.js", - "prettier.config.cjs" - ]); -} -async function hasTypecheckConfig(repoPath) { - return hasAnyFile(await safeReadDir(repoPath), [ - "tsconfig.json", - "tsconfig.base.json", - "pyproject.toml", - "mypy.ini" - ]); -} -async function hasGithubWorkflows(repoPath) { - return fileExists(import_path8.default.join(repoPath, ".github", "workflows")); -} -async function hasCodeowners(repoPath) { - const root = await fileExists(import_path8.default.join(repoPath, "CODEOWNERS")); - const github = await fileExists(import_path8.default.join(repoPath, ".github", "CODEOWNERS")); - return root || github; -} -async function hasLicense(repoPath) { - const files = await safeReadDir(repoPath); - return files.some((file) => file.toLowerCase().startsWith("license")); -} -async function hasPullRequestTemplate(repoPath) { - const direct = await fileExists( - import_path8.default.join(repoPath, ".github", "PULL_REQUEST_TEMPLATE.md") - ); - if (direct) return true; - const dir = import_path8.default.join(repoPath, ".github", "PULL_REQUEST_TEMPLATE"); - try { - const entries = await import_promises7.default.readdir(dir); - return entries.some((entry) => entry.toLowerCase().endsWith(".md")); - } catch { - return false; - } -} -async function hasPrecommitConfig(repoPath) { - const precommit = await fileExists( - import_path8.default.join(repoPath, ".pre-commit-config.yaml") - ); - if (precommit) return true; - return fileExists(import_path8.default.join(repoPath, ".husky")); -} -async function hasArchitectureDoc(repoPath) { - const files = await safeReadDir(repoPath); - if (files.some((file) => file.toLowerCase() === "architecture.md")) return true; - return fileExists(import_path8.default.join(repoPath, "docs", "architecture.md")); -} -async function hasCustomInstructions(repoPath) { - const found = []; - const candidates = [ - ".github/copilot-instructions.md", - "CLAUDE.md", - ".claude/CLAUDE.md", - "AGENTS.md", - ".github/AGENTS.md", - ".cursorrules", - ".cursorignore", - ".windsurfrules", - ".github/instructions.md", - "copilot-instructions.md" - ]; - for (const candidate of candidates) { - if (await fileExists(import_path8.default.join(repoPath, candidate))) { - found.push(candidate); - } - } - return found; -} -async function hasFileBasedInstructions(repoPath) { - const instructionsDir = import_path8.default.join(repoPath, ".github", "instructions"); - try { - const entries = await import_promises7.default.readdir(instructionsDir); - return entries - .filter((e) => e.endsWith(".instructions.md")) - .map((e) => `.github/instructions/${e}`); - } catch { - return []; - } -} -async function hasMcpConfig(repoPath) { - const found = []; - if (await fileExists(import_path8.default.join(repoPath, ".vscode", "mcp.json"))) { - found.push(".vscode/mcp.json"); - } - if (await fileExists(import_path8.default.join(repoPath, "mcp.json"))) { - found.push("mcp.json"); - } - const settings = await readJson(import_path8.default.join(repoPath, ".vscode", "settings.json")); - if (settings && (settings["mcp"] || settings["github.copilot.chat.mcp.enabled"])) { - found.push(".vscode/settings.json (mcp section)"); - } - if (await fileExists(import_path8.default.join(repoPath, ".claude", "mcp.json"))) { - found.push(".claude/mcp.json"); - } - return found; -} -async function hasCustomAgents(repoPath) { - const found = []; - const agentDirs = [".github/agents", ".copilot/agents", ".github/copilot/agents"]; - for (const dir of agentDirs) { - if (await fileExists(import_path8.default.join(repoPath, dir))) { - found.push(dir); - } - } - const agentFiles = [".github/copilot-agents.yml", ".github/copilot-agents.yaml"]; - for (const agentFile of agentFiles) { - if (await fileExists(import_path8.default.join(repoPath, agentFile))) { - found.push(agentFile); - } - } - return found; -} -async function hasCopilotSkills(repoPath) { - const found = []; - const skillDirs = [ - ".copilot/skills", - ".github/skills", - ".claude/skills", - ".github/copilot/skills" - ]; - for (const dir of skillDirs) { - if (await fileExists(import_path8.default.join(repoPath, dir))) { - found.push(dir); - } - } - return found; -} -async function readAllDependencies(context) { - const dependencies = []; - const apps = context.apps.length ? context.apps : []; - for (const app of apps) { - if (!app.packageJsonPath) continue; - const pkg = await readJson(app.packageJsonPath); - const deps = pkg?.dependencies ?? {}; - const devDeps = pkg?.devDependencies ?? {}; - dependencies.push( - ...Object.keys({ - ...deps, - ...devDeps - }) - ); - } - if (!apps.length && context.rootPackageJson) { - const rootDeps = context.rootPackageJson.dependencies ?? {}; - const rootDevDeps = context.rootPackageJson.devDependencies ?? {}; - dependencies.push( - ...Object.keys({ - ...rootDeps, - ...rootDevDeps - }) - ); - } - return Array.from(new Set(dependencies)); -} - -// ../src/services/visualReport.ts -function generateVisualReport(options) { - const { - reports, - title = "AI Readiness Report", - generatedAt = /* @__PURE__ */ new Date().toISOString() - } = options; - const successfulReports = reports.filter((r) => !r.error); - const failedReports = reports.filter((r) => r.error); - const totalRepos = reports.length; - const successfulRepos = successfulReports.length; - const avgLevel = - successfulReports.length > 0 - ? successfulReports.reduce((sum, r) => sum + r.report.achievedLevel, 0) / - successfulReports.length - : 0; - const pillarStats = calculatePillarStats(successfulReports); - const aiToolingData = calculateAiToolingData(successfulReports); - return ` - - - - - - ${escapeHtml(title)} - - - -
    -
    - -
    -

    ${escapeHtml(title)}

    -

    Generated ${new Date(generatedAt).toLocaleString()}

    -
    - -
    - -
    -
    -
    Repositories
    -
    ${totalRepos}
    -
    ${successfulRepos} analyzed successfully
    -
    -
    -
    Avg Maturity
    -
    ${avgLevel.toFixed(1)}
    -
    ${getLevelName(Math.round(avgLevel))}
    -
    -
    -
    Success Rate
    -
    ${totalRepos > 0 ? Math.round((successfulRepos / totalRepos) * 100) : 0}%
    -
    ${failedReports.length > 0 ? failedReports.length + " failed" : "All succeeded"}
    -
    -
    - - ${ - successfulReports.length > 0 - ? ` - ${buildAiToolingHeroHtml(aiToolingData, successfulReports)} - -
    -

    Pillar Performance

    -
    - ${pillarStats - .map( - (pillar) => ` -
    -
    ${escapeHtml(pillar.name)}
    -
    -
    -
    -
    - ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%) -
    -
    - ` - ) - .join("")} -
    -
    - -
    -

    Maturity Model

    -
    - ${[1, 2, 3, 4, 5] - .map((level) => { - const count = successfulReports.filter((r) => r.report.achievedLevel === level).length; - return ` -
    -
    - ${level} - ${getLevelName(level)} - ${count} repo${count !== 1 ? "s" : ""} -
    -
    ${getLevelDescription(level)}
    -
    - `; - }) - .join("")} -
    - -

    Distribution

    -
    - ${[1, 2, 3, 4, 5] - .map((level) => { - const count = successfulReports.filter((r) => r.report.achievedLevel === level).length; - const percent = - successfulReports.length > 0 ? (count / successfulReports.length) * 100 : 0; - const barHeight = count > 0 ? Math.max(40, percent * 2) : 0; - return ` -
    -
    ${count}
    -
    -
    ${level}
    ${getLevelName(level)}
    -
    - `; - }) - .join("")} -
    -
    - ` - : "" - } - -
    -

    Repository Details

    -
    - ${reports - .map(({ repo, report, error }) => { - if (error) { - return ` -
    -
    -
    ${escapeHtml(repo)}
    - Error -
    -
    ${escapeHtml(error)}
    -
    - `; - } - return ` -
    -
    -
    ${escapeHtml(repo)}
    -
    - Maturity ${report.achievedLevel}: ${getLevelName(report.achievedLevel)} -
    -
    - ${report.isMonorepo ? `
    Monorepo · ${report.apps.length} apps
    ` : ""} -
    - ${report.pillars - .map((pillar) => { - const pillarCriteria = report.criteria.filter((c) => c.pillar === pillar.id); - return ` -
    -
    - - ${escapeHtml(pillar.name)} - ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%) - -
    - ${pillarCriteria - .map( - (c) => ` -
    - ${escapeHtml(c.title)} - ${c.status === "pass" ? "Pass" : c.status === "fail" ? "Fail" : "Skip"} -
    - ` - ) - .join("")} - ${pillarCriteria.length === 0 ? '
    No criteria
    ' : ""} -
    -
    -
    - `; - }) - .join("")} -
    - ${getTopFixesHtml(report)} - ${buildAreaReportsHtml(report.areaReports)} -
    - `; - }) - .join("")} -
    -
    - - ${ - failedReports.length > 0 - ? ` -
    -

    Failed Repositories

    -
    - ${failedReports - .map( - ({ repo, error }) => ` -
    -
    ${escapeHtml(repo)}
    -
    ${escapeHtml(error || "Unknown error")}
    -
    - ` - ) - .join("")} -
    -
    - ` - : "" - } - - -
    - - -`; -} -function calculatePillarStats(reports) { - const pillarMap = /* @__PURE__ */ new Map(); - for (const { report } of reports) { - for (const pillar of report.pillars) { - const existing = pillarMap.get(pillar.id); - if (existing) { - existing.passed += pillar.passed; - existing.total += pillar.total; - } else { - pillarMap.set(pillar.id, { - name: pillar.name, - passed: pillar.passed, - total: pillar.total - }); - } - } - } - return Array.from(pillarMap.entries()).map(([id, stats]) => ({ - id, - name: stats.name, - passed: stats.passed, - total: stats.total, - passRate: stats.total > 0 ? stats.passed / stats.total : 0 - })); -} -function getTopFixesHtml(report) { - const failedCriteria = report.criteria - .filter((c) => c.status === "fail") - .sort((a, b) => { - const impactWeight = { high: 3, medium: 2, low: 1 }; - const effortWeight = { low: 1, medium: 2, high: 3 }; - const impactDelta = impactWeight[b.impact] - impactWeight[a.impact]; - if (impactDelta !== 0) return impactDelta; - return effortWeight[a.effort] - effortWeight[b.effort]; - }) - .slice(0, 3); - if (failedCriteria.length === 0) { - return '
    All criteria passing
    '; - } - return ` -
    -
    Top Fixes Needed
    -
      - ${failedCriteria - .map( - (c) => ` -
    • - - ${escapeHtml(c.title)} - ${c.impact} impact, ${c.effort} effort -
    • - ` - ) - .join("")} -
    -
    - `; -} -function getLevelName(level) { - const names = { - 1: "Functional", - 2: "Documented", - 3: "Standardized", - 4: "Optimized", - 5: "Autonomous" - }; - return names[level] || "Unknown"; -} -function getLevelDescription(level) { - const descriptions = { - 1: "Repo builds, tests run, and basic tooling (linter, lockfile) is in place. AI agents can clone and get started.", - 2: "README, CONTRIBUTING guide, and custom AI instructions exist. Agents understand project context and conventions.", - 3: "CI/CD, security policies, CODEOWNERS, and observability are configured. Agents operate within well-defined guardrails.", - 4: "MCP servers, custom agents, and AI skills are set up. Agents have deep integration with project-specific tools and workflows.", - 5: "Full AI-native development: agents can independently plan, implement, test, and ship changes with minimal human oversight." - }; - return descriptions[level] || ""; -} -function getProgressClass(passRate) { - if (passRate >= 0.8) return "high"; - if (passRate >= 0.5) return "medium"; - return "low"; -} -function calculateAiToolingData(reports) { - const criterionMap = /* @__PURE__ */ new Map(); - for (const { report } of reports) { - const aiCriteria = report.criteria.filter((c) => c.pillar === "ai-tooling"); - for (const c of aiCriteria) { - const existing = criterionMap.get(c.id); - if (existing) { - existing.totalRepos += 1; - if (c.status === "pass") existing.passCount += 1; - if (c.evidence) existing.evidence.push(...c.evidence); - } else { - criterionMap.set(c.id, { - id: c.id, - title: c.title, - passCount: c.status === "pass" ? 1 : 0, - totalRepos: 1, - status: c.status === "pass" ? "pass" : "fail", - evidence: c.evidence ? [...c.evidence] : [], - reason: c.reason || "" - }); - } - } - } - const criteria = Array.from(criterionMap.values()).map((c) => ({ - ...c, - status: c.passCount / c.totalRepos >= 0.5 ? "pass" : "fail", - evidence: [...new Set(c.evidence)] - })); - const passed = criteria.filter((c) => c.status === "pass").length; - return { - criteria, - passed, - total: criteria.length, - passRate: criteria.length > 0 ? passed / criteria.length : 0 - }; -} -function getAiScoreClass(passRate) { - if (passRate >= 0.6) return "score-high"; - if (passRate >= 0.3) return "score-medium"; - return "score-low"; -} -function getAiScoreLabel(passRate) { - if (passRate >= 0.8) return "Excellent"; - if (passRate >= 0.6) return "Good"; - if (passRate >= 0.4) return "Fair"; - if (passRate >= 0.2) return "Getting Started"; - return "Not Started"; -} -function getAiCriterionIcon(id) { - const icons = { - "custom-instructions": "📝", - "mcp-config": "🔌", - "custom-agents": "🤖", - "copilot-skills": "⚡" - }; - return icons[id] || "🔧"; -} -function buildAiToolingHeroHtml(data, reports) { - if (data.criteria.length === 0) return ""; - const pct = Math.round(data.passRate * 100); - const scoreClass = getAiScoreClass(data.passRate); - const scoreLabel = getAiScoreLabel(data.passRate); - const multiRepo = reports.length > 1; - const perRepoHtml = multiRepo - ? ` -
    -
    Per Repository
    -
    - ${reports - .map(({ repo, report }) => { - const aiPillar = report.pillars.find((p) => p.id === "ai-tooling"); - const repoPct = aiPillar ? Math.round(aiPillar.passRate * 100) : 0; - const repoPass = aiPillar?.passed ?? 0; - const repoTotal = aiPillar?.total ?? 0; - return `
    - ${escapeHtml(repo)} - = 30 ? "var(--color-attention-fg)" : "var(--color-danger-fg)"};">${repoPass}/${repoTotal} (${repoPct}%) -
    `; - }) - .join("")} -
    -
    - ` - : ""; - return ` -
    -

    AI Tooling Readiness

    -

    How well prepared ${multiRepo ? "your repositories are" : "this repository is"} for AI-assisted development

    - -
    -
    ${pct}%
    -
    -
    ${scoreLabel}
    -
    ${data.passed} of ${data.total} AI tooling checks passing${multiRepo ? ` across ${reports.length} repositories` : ""}
    -
    -
    - -
    - ${data.criteria - .map( - (c) => ` -
    -
    - ${c.status === "pass" ? "✓" : "✗"} -
    -
    -
    ${getAiCriterionIcon(c.id)} ${escapeHtml(c.title)}
    -
    ${c.status === "pass" ? (multiRepo ? `${c.passCount}/${c.totalRepos} repos` : "Detected") : escapeHtml(c.reason)}
    -
    -
    - ` - ) - .join("")} -
    - ${perRepoHtml} -
    - `; -} -function escapeHtml(text) { - const map = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'" - }; - return text.replace(/[&<>"']/g, (m) => map[m]); -} -function buildAreaReportsHtml(areaReports) { - if (!areaReports?.length) return ""; - return ` -
    -
    Per-Area Breakdown
    -
    - ${areaReports - .map((ar) => { - const relevant = ar.criteria.filter((c) => c.status !== "skip"); - const passed = relevant.filter((c) => c.status === "pass").length; - const total = relevant.length; - const pct = total ? Math.round((passed / total) * 100) : 0; - const sourceLabel = ar.area.source === "config" ? "config" : "auto"; - const applyTo = Array.isArray(ar.area.applyTo) - ? ar.area.applyTo.join(", ") - : ar.area.applyTo; - return ` -
    -
    - - ${escapeHtml(ar.area.name)} - - ${sourceLabel} - = 50 ? "var(--color-attention-fg)" : "var(--color-danger-fg)"};">${passed}/${total} (${pct}%) - - -
    -
    ${escapeHtml(applyTo)}
    - ${ar.criteria - .map( - (c) => ` -
    - ${escapeHtml(c.title)} - ${c.status === "pass" ? "Pass" : c.status === "fail" ? "Fail" : "Skip"} -
    - ` - ) - .join("")} -
    -
    -
    - `; - }) - .join("")} -
    -
    - `; -} - -// ../src/services/github.ts -var import_node_child_process2 = require("node:child_process"); -var import_node_util2 = require("node:util"); - -// ../node_modules/universal-user-agent/index.js -function getUserAgent() { - if (typeof navigator === "object" && "userAgent" in navigator) { - return navigator.userAgent; - } - if (typeof process === "object" && process.version !== void 0) { - return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; - } - return ""; -} - -// ../node_modules/before-after-hook/lib/register.js -function register(state, name, method, options) { - if (typeof method !== "function") { - throw new Error("method for before hook must be a function"); - } - if (!options) { - options = {}; - } - if (Array.isArray(name)) { - return name.reverse().reduce((callback, name2) => { - return register.bind(null, state, name2, callback, options); - }, method)(); - } - return Promise.resolve().then(() => { - if (!state.registry[name]) { - return method(options); - } - return state.registry[name].reduce((method2, registered) => { - return registered.hook.bind(null, method2, options); - }, method)(); - }); -} - -// ../node_modules/before-after-hook/lib/add.js -function addHook(state, kind, name, hook2) { - const orig = hook2; - if (!state.registry[name]) { - state.registry[name] = []; - } - if (kind === "before") { - hook2 = (method, options) => { - return Promise.resolve().then(orig.bind(null, options)).then(method.bind(null, options)); - }; - } - if (kind === "after") { - hook2 = (method, options) => { - let result; - return Promise.resolve() - .then(method.bind(null, options)) - .then((result_) => { - result = result_; - return orig(result, options); - }) - .then(() => { - return result; - }); - }; - } - if (kind === "error") { - hook2 = (method, options) => { - return Promise.resolve() - .then(method.bind(null, options)) - .catch((error) => { - return orig(error, options); - }); - }; - } - state.registry[name].push({ - hook: hook2, - orig - }); -} - -// ../node_modules/before-after-hook/lib/remove.js -function removeHook(state, name, method) { - if (!state.registry[name]) { - return; - } - const index = state.registry[name] - .map((registered) => { - return registered.orig; - }) - .indexOf(method); - if (index === -1) { - return; - } - state.registry[name].splice(index, 1); -} - -// ../node_modules/before-after-hook/index.js -var bind = Function.bind; -var bindable = bind.bind(bind); -function bindApi(hook2, state, name) { - const removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]); - hook2.api = { remove: removeHookRef }; - hook2.remove = removeHookRef; - ["before", "error", "after", "wrap"].forEach((kind) => { - const args = name ? [state, kind, name] : [state, kind]; - hook2[kind] = hook2.api[kind] = bindable(addHook, null).apply(null, args); - }); -} -function Singular() { - const singularHookName = Symbol("Singular"); - const singularHookState = { - registry: {} - }; - const singularHook = register.bind(null, singularHookState, singularHookName); - bindApi(singularHook, singularHookState, singularHookName); - return singularHook; -} -function Collection() { - const state = { - registry: {} - }; - const hook2 = register.bind(null, state); - bindApi(hook2, state); - return hook2; -} -var before_after_hook_default = { Singular, Collection }; - -// ../node_modules/@octokit/endpoint/dist-bundle/index.js -var VERSION = "0.0.0-development"; -var userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`; -var DEFAULTS = { - method: "GET", - baseUrl: "https://api.github.com", - headers: { - accept: "application/vnd.github.v3+json", - "user-agent": userAgent - }, - mediaType: { - format: "" - } -}; -function lowercaseKeys(object) { - if (!object) { - return {}; - } - return Object.keys(object).reduce((newObj, key) => { - newObj[key.toLowerCase()] = object[key]; - return newObj; - }, {}); -} -function isPlainObject(value) { - if (typeof value !== "object" || value === null) return false; - if (Object.prototype.toString.call(value) !== "[object Object]") return false; - const proto = Object.getPrototypeOf(value); - if (proto === null) return true; - const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor; - return ( - typeof Ctor === "function" && - Ctor instanceof Ctor && - Function.prototype.call(Ctor) === Function.prototype.call(value) - ); -} -function mergeDeep(defaults, options) { - const result = Object.assign({}, defaults); - Object.keys(options).forEach((key) => { - if (isPlainObject(options[key])) { - if (!(key in defaults)) Object.assign(result, { [key]: options[key] }); - else result[key] = mergeDeep(defaults[key], options[key]); - } else { - Object.assign(result, { [key]: options[key] }); - } - }); - return result; -} -function removeUndefinedProperties(obj) { - for (const key in obj) { - if (obj[key] === void 0) { - delete obj[key]; - } - } - return obj; -} -function merge(defaults, route, options) { - if (typeof route === "string") { - let [method, url] = route.split(" "); - options = Object.assign(url ? { method, url } : { url: method }, options); - } else { - options = Object.assign({}, route); - } - options.headers = lowercaseKeys(options.headers); - removeUndefinedProperties(options); - removeUndefinedProperties(options.headers); - const mergedOptions = mergeDeep(defaults || {}, options); - if (options.url === "/graphql") { - if (defaults && defaults.mediaType.previews?.length) { - mergedOptions.mediaType.previews = defaults.mediaType.previews - .filter((preview) => !mergedOptions.mediaType.previews.includes(preview)) - .concat(mergedOptions.mediaType.previews); - } - mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => - preview.replace(/-preview/, "") - ); - } - return mergedOptions; -} -function addQueryParameters(url, parameters) { - const separator = /\?/.test(url) ? "&" : "?"; - const names = Object.keys(parameters); - if (names.length === 0) { - return url; - } - return ( - url + - separator + - names - .map((name) => { - if (name === "q") { - return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); - } - return `${name}=${encodeURIComponent(parameters[name])}`; - }) - .join("&") - ); -} -var urlVariableRegex = /\{[^{}}]+\}/g; -function removeNonChars(variableName) { - return variableName.replace(/(?:^\W+)|(?:(? a.concat(b), []); -} -function omit(object, keysToOmit) { - const result = { __proto__: null }; - for (const key of Object.keys(object)) { - if (keysToOmit.indexOf(key) === -1) { - result[key] = object[key]; - } - } - return result; -} -function encodeReserved(str) { - return str - .split(/(%[0-9A-Fa-f]{2})/g) - .map(function (part) { - if (!/%[0-9A-Fa-f]/.test(part)) { - part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); - } - return part; - }) - .join(""); -} -function encodeUnreserved(str) { - return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { - return "%" + c.charCodeAt(0).toString(16).toUpperCase(); - }); -} -function encodeValue(operator, value, key) { - value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); - if (key) { - return encodeUnreserved(key) + "=" + value; - } else { - return value; - } -} -function isDefined(value) { - return value !== void 0 && value !== null; -} -function isKeyOperator(operator) { - return operator === ";" || operator === "&" || operator === "?"; -} -function getValues(context, operator, key, modifier) { - var value = context[key], - result = []; - if (isDefined(value) && value !== "") { - if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { - value = value.toString(); - if (modifier && modifier !== "*") { - value = value.substring(0, parseInt(modifier, 10)); - } - result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); - } else { - if (modifier === "*") { - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function (value2) { - result.push(encodeValue(operator, value2, isKeyOperator(operator) ? key : "")); - }); - } else { - Object.keys(value).forEach(function (k) { - if (isDefined(value[k])) { - result.push(encodeValue(operator, value[k], k)); - } - }); - } - } else { - const tmp = []; - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function (value2) { - tmp.push(encodeValue(operator, value2)); - }); - } else { - Object.keys(value).forEach(function (k) { - if (isDefined(value[k])) { - tmp.push(encodeUnreserved(k)); - tmp.push(encodeValue(operator, value[k].toString())); - } - }); - } - if (isKeyOperator(operator)) { - result.push(encodeUnreserved(key) + "=" + tmp.join(",")); - } else if (tmp.length !== 0) { - result.push(tmp.join(",")); - } - } - } - } else { - if (operator === ";") { - if (isDefined(value)) { - result.push(encodeUnreserved(key)); - } - } else if (value === "" && (operator === "&" || operator === "?")) { - result.push(encodeUnreserved(key) + "="); - } else if (value === "") { - result.push(""); - } - } - return result; -} -function parseUrl(template) { - return { - expand: expand.bind(null, template) - }; -} -function expand(template, context) { - var operators = ["+", "#", ".", "/", ";", "?", "&"]; - template = template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { - if (expression) { - let operator = ""; - const values = []; - if (operators.indexOf(expression.charAt(0)) !== -1) { - operator = expression.charAt(0); - expression = expression.substr(1); - } - expression.split(/,/g).forEach(function (variable) { - var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); - values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); - }); - if (operator && operator !== "+") { - var separator = ","; - if (operator === "?") { - separator = "&"; - } else if (operator !== "#") { - separator = operator; - } - return (values.length !== 0 ? operator : "") + values.join(separator); - } else { - return values.join(","); - } - } else { - return encodeReserved(literal); - } - }); - if (template === "/") { - return template; - } else { - return template.replace(/\/$/, ""); - } -} -function parse(options) { - let method = options.method.toUpperCase(); - let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); - let headers = Object.assign({}, options.headers); - let body; - let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); - const urlVariableNames = extractUrlVariableNames(url); - url = parseUrl(url).expand(parameters); - if (!/^http/.test(url)) { - url = options.baseUrl + url; - } - const omittedParameters = Object.keys(options) - .filter((option) => urlVariableNames.includes(option)) - .concat("baseUrl"); - const remainingParameters = omit(parameters, omittedParameters); - const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); - if (!isBinaryRequest) { - if (options.mediaType.format) { - headers.accept = headers.accept - .split(/,/) - .map((format) => - format.replace( - /application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, - `application/vnd$1$2.${options.mediaType.format}` - ) - ) - .join(","); - } - if (url.endsWith("/graphql")) { - if (options.mediaType.previews?.length) { - const previewsFromAcceptHeader = - headers.accept.match(/(? { - const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; - return `application/vnd.github.${preview}-preview${format}`; - }) - .join(","); - } - } - } - if (["GET", "HEAD"].includes(method)) { - url = addQueryParameters(url, remainingParameters); - } else { - if ("data" in remainingParameters) { - body = remainingParameters.data; - } else { - if (Object.keys(remainingParameters).length) { - body = remainingParameters; - } - } - } - if (!headers["content-type"] && typeof body !== "undefined") { - headers["content-type"] = "application/json; charset=utf-8"; - } - if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { - body = ""; - } - return Object.assign( - { method, url, headers }, - typeof body !== "undefined" ? { body } : null, - options.request ? { request: options.request } : null - ); -} -function endpointWithDefaults(defaults, route, options) { - return parse(merge(defaults, route, options)); -} -function withDefaults(oldDefaults, newDefaults) { - const DEFAULTS2 = merge(oldDefaults, newDefaults); - const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2); - return Object.assign(endpoint2, { - DEFAULTS: DEFAULTS2, - defaults: withDefaults.bind(null, DEFAULTS2), - merge: merge.bind(null, DEFAULTS2), - parse - }); -} -var endpoint = withDefaults(null, DEFAULTS); - -// ../node_modules/@octokit/request/dist-bundle/index.js -var import_fast_content_type_parse = __toESM(require_fast_content_type_parse(), 1); - -// ../node_modules/@octokit/request-error/dist-src/index.js -var RequestError = class extends Error { - name; - /** - * http status code - */ - status; - /** - * Request options that lead to the error. - */ - request; - /** - * Response object if a response was received - */ - response; - constructor(message, statusCode, options) { - super(message, { cause: options.cause }); - this.name = "HttpError"; - this.status = Number.parseInt(statusCode); - if (Number.isNaN(this.status)) { - this.status = 0; - } - if ("response" in options) { - this.response = options.response; - } - const requestCopy = Object.assign({}, options.request); - if (options.request.headers.authorization) { - requestCopy.headers = Object.assign({}, options.request.headers, { - authorization: options.request.headers.authorization.replace(/(? ""; -async function fetchWrapper(requestOptions) { - const fetch = requestOptions.request?.fetch || globalThis.fetch; - if (!fetch) { - throw new Error( - "fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing" - ); - } - const log = requestOptions.request?.log || console; - const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false; - const body = - isPlainObject2(requestOptions.body) || Array.isArray(requestOptions.body) - ? JSON.stringify(requestOptions.body) - : requestOptions.body; - const requestHeaders = Object.fromEntries( - Object.entries(requestOptions.headers).map(([name, value]) => [name, String(value)]) - ); - let fetchResponse; - try { - fetchResponse = await fetch(requestOptions.url, { - method: requestOptions.method, - body, - redirect: requestOptions.request?.redirect, - headers: requestHeaders, - signal: requestOptions.request?.signal, - // duplex must be set if request.body is ReadableStream or Async Iterables. - // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex. - ...(requestOptions.body && { duplex: "half" }) - }); - } catch (error) { - let message = "Unknown Error"; - if (error instanceof Error) { - if (error.name === "AbortError") { - error.status = 500; - throw error; - } - message = error.message; - if (error.name === "TypeError" && "cause" in error) { - if (error.cause instanceof Error) { - message = error.cause.message; - } else if (typeof error.cause === "string") { - message = error.cause; - } - } - } - const requestError = new RequestError(message, 500, { - request: requestOptions - }); - requestError.cause = error; - throw requestError; - } - const status = fetchResponse.status; - const url = fetchResponse.url; - const responseHeaders = {}; - for (const [key, value] of fetchResponse.headers) { - responseHeaders[key] = value; - } - const octokitResponse = { - url, - status, - headers: responseHeaders, - data: "" - }; - if ("deprecation" in responseHeaders) { - const matches = - responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel="deprecation"/); - const deprecationLink = matches && matches.pop(); - log.warn( - `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` - ); - } - if (status === 204 || status === 205) { - return octokitResponse; - } - if (requestOptions.method === "HEAD") { - if (status < 400) { - return octokitResponse; - } - throw new RequestError(fetchResponse.statusText, status, { - response: octokitResponse, - request: requestOptions - }); - } - if (status === 304) { - octokitResponse.data = await getResponseData(fetchResponse); - throw new RequestError("Not modified", status, { - response: octokitResponse, - request: requestOptions - }); - } - if (status >= 400) { - octokitResponse.data = await getResponseData(fetchResponse); - throw new RequestError(toErrorMessage(octokitResponse.data), status, { - response: octokitResponse, - request: requestOptions - }); - } - octokitResponse.data = parseSuccessResponseBody - ? await getResponseData(fetchResponse) - : fetchResponse.body; - return octokitResponse; -} -async function getResponseData(response) { - const contentType = response.headers.get("content-type"); - if (!contentType) { - return response.text().catch(noop); - } - const mimetype = (0, import_fast_content_type_parse.safeParse)(contentType); - if (isJSONResponse(mimetype)) { - let text = ""; - try { - text = await response.text(); - return JSON.parse(text); - } catch (err) { - return text; - } - } else if ( - mimetype.type.startsWith("text/") || - mimetype.parameters.charset?.toLowerCase() === "utf-8" - ) { - return response.text().catch(noop); - } else { - return response.arrayBuffer().catch( - /* v8 ignore next -- @preserve */ - () => new ArrayBuffer(0) - ); - } -} -function isJSONResponse(mimetype) { - return mimetype.type === "application/json" || mimetype.type === "application/scim+json"; -} -function toErrorMessage(data) { - if (typeof data === "string") { - return data; - } - if (data instanceof ArrayBuffer) { - return "Unknown error"; - } - if ("message" in data) { - const suffix = "documentation_url" in data ? ` - ${data.documentation_url}` : ""; - return Array.isArray(data.errors) - ? `${data.message}: ${data.errors.map((v) => JSON.stringify(v)).join(", ")}${suffix}` - : `${data.message}${suffix}`; - } - return `Unknown error: ${JSON.stringify(data)}`; -} -function withDefaults2(oldEndpoint, newDefaults) { - const endpoint2 = oldEndpoint.defaults(newDefaults); - const newApi = function (route, parameters) { - const endpointOptions = endpoint2.merge(route, parameters); - if (!endpointOptions.request || !endpointOptions.request.hook) { - return fetchWrapper(endpoint2.parse(endpointOptions)); - } - const request2 = (route2, parameters2) => { - return fetchWrapper(endpoint2.parse(endpoint2.merge(route2, parameters2))); - }; - Object.assign(request2, { - endpoint: endpoint2, - defaults: withDefaults2.bind(null, endpoint2) - }); - return endpointOptions.request.hook(request2, endpointOptions); - }; - return Object.assign(newApi, { - endpoint: endpoint2, - defaults: withDefaults2.bind(null, endpoint2) - }); -} -var request = withDefaults2(endpoint, defaults_default); - -// ../node_modules/@octokit/graphql/dist-bundle/index.js -var VERSION3 = "0.0.0-development"; -function _buildMessageForResponseErrors(data) { - return ( - `Request failed due to following response errors: -` + data.errors.map((e) => ` - ${e.message}`).join("\n") - ); -} -var GraphqlResponseError = class extends Error { - constructor(request2, headers, response) { - super(_buildMessageForResponseErrors(response)); - this.request = request2; - this.headers = headers; - this.response = response; - this.errors = response.errors; - this.data = response.data; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - } - name = "GraphqlResponseError"; - errors; - data; -}; -var NON_VARIABLE_OPTIONS = [ - "method", - "baseUrl", - "url", - "headers", - "request", - "query", - "mediaType", - "operationName" -]; -var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; -var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; -function graphql(request2, query, options) { - if (options) { - if (typeof query === "string" && "query" in options) { - return Promise.reject( - new Error(`[@octokit/graphql] "query" cannot be used as variable name`) - ); - } - for (const key in options) { - if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; - return Promise.reject( - new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`) - ); - } - } - const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; - const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { - if (NON_VARIABLE_OPTIONS.includes(key)) { - result[key] = parsedOptions[key]; - return result; - } - if (!result.variables) { - result.variables = {}; - } - result.variables[key] = parsedOptions[key]; - return result; - }, {}); - const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl; - if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { - requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); - } - return request2(requestOptions).then((response) => { - if (response.data.errors) { - const headers = {}; - for (const key of Object.keys(response.headers)) { - headers[key] = response.headers[key]; - } - throw new GraphqlResponseError(requestOptions, headers, response.data); - } - return response.data.data; - }); -} -function withDefaults3(request2, newDefaults) { - const newRequest = request2.defaults(newDefaults); - const newApi = (query, options) => { - return graphql(newRequest, query, options); - }; - return Object.assign(newApi, { - defaults: withDefaults3.bind(null, newRequest), - endpoint: newRequest.endpoint - }); -} -var graphql2 = withDefaults3(request, { - headers: { - "user-agent": `octokit-graphql.js/${VERSION3} ${getUserAgent()}` - }, - method: "POST", - url: "/graphql" -}); -function withCustomRequest(customRequest) { - return withDefaults3(customRequest, { - method: "POST", - url: "/graphql" - }); -} - -// ../node_modules/@octokit/auth-token/dist-bundle/index.js -var b64url = "(?:[a-zA-Z0-9_-]+)"; -var sep = "\\."; -var jwtRE = new RegExp(`^${b64url}${sep}${b64url}${sep}${b64url}$`); -var isJWT = jwtRE.test.bind(jwtRE); -async function auth(token) { - const isApp = isJWT(token); - const isInstallation = token.startsWith("v1.") || token.startsWith("ghs_"); - const isUserToServer = token.startsWith("ghu_"); - const tokenType = isApp - ? "app" - : isInstallation - ? "installation" - : isUserToServer - ? "user-to-server" - : "oauth"; - return { - type: "token", - token, - tokenType - }; -} -function withAuthorizationPrefix(token) { - if (token.split(/\./).length === 3) { - return `bearer ${token}`; - } - return `token ${token}`; -} -async function hook(token, request2, route, parameters) { - const endpoint2 = request2.endpoint.merge(route, parameters); - endpoint2.headers.authorization = withAuthorizationPrefix(token); - return request2(endpoint2); -} -var createTokenAuth = function createTokenAuth2(token) { - if (!token) { - throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); - } - if (typeof token !== "string") { - throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); - } - token = token.replace(/^(token|bearer) +/i, ""); - return Object.assign(auth.bind(null, token), { - hook: hook.bind(null, token) - }); -}; - -// ../node_modules/@octokit/core/dist-src/version.js -var VERSION4 = "7.0.6"; - -// ../node_modules/@octokit/core/dist-src/index.js -var noop2 = () => {}; -var consoleWarn = console.warn.bind(console); -var consoleError = console.error.bind(console); -function createLogger2(logger = {}) { - if (typeof logger.debug !== "function") { - logger.debug = noop2; - } - if (typeof logger.info !== "function") { - logger.info = noop2; - } - if (typeof logger.warn !== "function") { - logger.warn = consoleWarn; - } - if (typeof logger.error !== "function") { - logger.error = consoleError; - } - return logger; -} -var userAgentTrail = `octokit-core.js/${VERSION4} ${getUserAgent()}`; -var Octokit = class { - static VERSION = VERSION4; - static defaults(defaults) { - const OctokitWithDefaults = class extends this { - constructor(...args) { - const options = args[0] || {}; - if (typeof defaults === "function") { - super(defaults(options)); - return; - } - super( - Object.assign( - {}, - defaults, - options, - options.userAgent && defaults.userAgent - ? { - userAgent: `${options.userAgent} ${defaults.userAgent}` - } - : null - ) - ); - } - }; - return OctokitWithDefaults; - } - static plugins = []; - /** - * Attach a plugin (or many) to your Octokit instance. - * - * @example - * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) - */ - static plugin(...newPlugins) { - const currentPlugins = this.plugins; - const NewOctokit = class extends this { - static plugins = currentPlugins.concat( - newPlugins.filter((plugin) => !currentPlugins.includes(plugin)) - ); - }; - return NewOctokit; - } - constructor(options = {}) { - const hook2 = new before_after_hook_default.Collection(); - const requestDefaults = { - baseUrl: request.endpoint.DEFAULTS.baseUrl, - headers: {}, - request: Object.assign({}, options.request, { - // @ts-ignore internal usage only, no need to type - hook: hook2.bind(null, "request") - }), - mediaType: { - previews: [], - format: "" - } - }; - requestDefaults.headers["user-agent"] = options.userAgent - ? `${options.userAgent} ${userAgentTrail}` - : userAgentTrail; - if (options.baseUrl) { - requestDefaults.baseUrl = options.baseUrl; - } - if (options.previews) { - requestDefaults.mediaType.previews = options.previews; - } - if (options.timeZone) { - requestDefaults.headers["time-zone"] = options.timeZone; - } - this.request = request.defaults(requestDefaults); - this.graphql = withCustomRequest(this.request).defaults(requestDefaults); - this.log = createLogger2(options.log); - this.hook = hook2; - if (!options.authStrategy) { - if (!options.auth) { - this.auth = async () => ({ - type: "unauthenticated" - }); - } else { - const auth2 = createTokenAuth(options.auth); - hook2.wrap("request", auth2.hook); - this.auth = auth2; - } - } else { - const { authStrategy, ...otherOptions } = options; - const auth2 = authStrategy( - Object.assign( - { - request: this.request, - log: this.log, - // we pass the current octokit instance as well as its constructor options - // to allow for authentication strategies that return a new octokit instance - // that shares the same internal state as the current one. The original - // requirement for this was the "event-octokit" authentication strategy - // of https://github.com/probot/octokit-auth-probot. - octokit: this, - octokitOptions: otherOptions - }, - options.auth - ) - ); - hook2.wrap("request", auth2.hook); - this.auth = auth2; - } - const classConstructor = this.constructor; - for (let i = 0; i < classConstructor.plugins.length; ++i) { - Object.assign(this, classConstructor.plugins[i](this, options)); - } - } - // assigned during constructor - request; - graphql; - log; - hook; - // TODO: type `octokit.auth` based on passed options.authStrategy - auth; -}; - -// ../node_modules/@octokit/plugin-request-log/dist-src/version.js -var VERSION5 = "6.0.0"; - -// ../node_modules/@octokit/plugin-request-log/dist-src/index.js -function requestLog(octokit) { - octokit.hook.wrap("request", (request2, options) => { - octokit.log.debug("request", options); - const start = Date.now(); - const requestOptions = octokit.request.endpoint.parse(options); - const path11 = requestOptions.url.replace(options.baseUrl, ""); - return request2(options) - .then((response) => { - const requestId = response.headers["x-github-request-id"]; - octokit.log.info( - `${requestOptions.method} ${path11} - ${response.status} with id ${requestId} in ${Date.now() - start}ms` - ); - return response; - }) - .catch((error) => { - const requestId = error.response?.headers["x-github-request-id"] || "UNKNOWN"; - octokit.log.error( - `${requestOptions.method} ${path11} - ${error.status} with id ${requestId} in ${Date.now() - start}ms` - ); - throw error; - }); - }); -} -requestLog.VERSION = VERSION5; - -// ../node_modules/@octokit/plugin-paginate-rest/dist-bundle/index.js -var VERSION6 = "0.0.0-development"; -function normalizePaginatedListResponse(response) { - if (!response.data) { - return { - ...response, - data: [] - }; - } - const responseNeedsNormalization = - ("total_count" in response.data || "total_commits" in response.data) && - !("url" in response.data); - if (!responseNeedsNormalization) return response; - const incompleteResults = response.data.incomplete_results; - const repositorySelection = response.data.repository_selection; - const totalCount = response.data.total_count; - const totalCommits = response.data.total_commits; - delete response.data.incomplete_results; - delete response.data.repository_selection; - delete response.data.total_count; - delete response.data.total_commits; - const namespaceKey = Object.keys(response.data)[0]; - const data = response.data[namespaceKey]; - response.data = data; - if (typeof incompleteResults !== "undefined") { - response.data.incomplete_results = incompleteResults; - } - if (typeof repositorySelection !== "undefined") { - response.data.repository_selection = repositorySelection; - } - response.data.total_count = totalCount; - response.data.total_commits = totalCommits; - return response; -} -function iterator(octokit, route, parameters) { - const options = - typeof route === "function" - ? route.endpoint(parameters) - : octokit.request.endpoint(route, parameters); - const requestMethod = typeof route === "function" ? route : octokit.request; - const method = options.method; - const headers = options.headers; - let url = options.url; - return { - [Symbol.asyncIterator]: () => ({ - async next() { - if (!url) return { done: true }; - try { - const response = await requestMethod({ method, url, headers }); - const normalizedResponse = normalizePaginatedListResponse(response); - url = ((normalizedResponse.headers.link || "").match(/<([^<>]+)>;\s*rel="next"/) || - [])[1]; - if (!url && "total_commits" in normalizedResponse.data) { - const parsedUrl = new URL(normalizedResponse.url); - const params = parsedUrl.searchParams; - const page = parseInt(params.get("page") || "1", 10); - const per_page = parseInt(params.get("per_page") || "250", 10); - if (page * per_page < normalizedResponse.data.total_commits) { - params.set("page", String(page + 1)); - url = parsedUrl.toString(); - } - } - return { value: normalizedResponse }; - } catch (error) { - if (error.status !== 409) throw error; - url = ""; - return { - value: { - status: 200, - headers: {}, - data: [] - } - }; - } - } - }) - }; -} -function paginate(octokit, route, parameters, mapFn) { - if (typeof parameters === "function") { - mapFn = parameters; - parameters = void 0; - } - return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); -} -function gather(octokit, results, iterator2, mapFn) { - return iterator2.next().then((result) => { - if (result.done) { - return results; - } - let earlyExit = false; - function done() { - earlyExit = true; - } - results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); - if (earlyExit) { - return results; - } - return gather(octokit, results, iterator2, mapFn); - }); -} -var composePaginateRest = Object.assign(paginate, { - iterator -}); -function paginateRest(octokit) { - return { - paginate: Object.assign(paginate.bind(null, octokit), { - iterator: iterator.bind(null, octokit) - }) - }; -} -paginateRest.VERSION = VERSION6; - -// ../node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/version.js -var VERSION7 = "17.0.0"; - -// ../node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/generated/endpoints.js -var Endpoints = { - actions: { - addCustomLabelsToSelfHostedRunnerForOrg: [ - "POST /orgs/{org}/actions/runners/{runner_id}/labels" - ], - addCustomLabelsToSelfHostedRunnerForRepo: [ - "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" - ], - addRepoAccessToSelfHostedRunnerGroupInOrg: [ - "PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}" - ], - addSelectedRepoToOrgSecret: [ - "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" - ], - addSelectedRepoToOrgVariable: [ - "PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" - ], - approveWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"], - cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], - createEnvironmentVariable: [ - "POST /repos/{owner}/{repo}/environments/{environment_name}/variables" - ], - createHostedRunnerForOrg: ["POST /orgs/{org}/actions/hosted-runners"], - createOrUpdateEnvironmentSecret: [ - "PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" - ], - createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], - createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - createOrgVariable: ["POST /orgs/{org}/actions/variables"], - createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], - createRegistrationTokenForRepo: [ - "POST /repos/{owner}/{repo}/actions/runners/registration-token" - ], - createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], - createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], - createRepoVariable: ["POST /repos/{owner}/{repo}/actions/variables"], - createWorkflowDispatch: [ - "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches" - ], - deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"], - deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"], - deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], - deleteCustomImageFromOrg: [ - "DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}" - ], - deleteCustomImageVersionFromOrg: [ - "DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}" - ], - deleteEnvironmentSecret: [ - "DELETE /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" - ], - deleteEnvironmentVariable: [ - "DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" - ], - deleteHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"], - deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], - deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"], - deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - deleteRepoVariable: ["DELETE /repos/{owner}/{repo}/actions/variables/{name}"], - deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], - deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], - deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], - deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], - disableSelectedRepositoryGithubActionsOrganization: [ - "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}" - ], - disableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"], - downloadArtifact: [ - "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}" - ], - downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], - downloadWorkflowRunAttemptLogs: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs" - ], - downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], - enableSelectedRepositoryGithubActionsOrganization: [ - "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}" - ], - enableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"], - forceCancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel"], - generateRunnerJitconfigForOrg: ["POST /orgs/{org}/actions/runners/generate-jitconfig"], - generateRunnerJitconfigForRepo: [ - "POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig" - ], - getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], - getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], - getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"], - getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], - getAllowedActionsOrganization: ["GET /orgs/{org}/actions/permissions/selected-actions"], - getAllowedActionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"], - getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], - getCustomImageForOrg: [ - "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}" - ], - getCustomImageVersionForOrg: [ - "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}" - ], - getCustomOidcSubClaimForRepo: ["GET /repos/{owner}/{repo}/actions/oidc/customization/sub"], - getEnvironmentPublicKey: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key" - ], - getEnvironmentSecret: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" - ], - getEnvironmentVariable: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" - ], - getGithubActionsDefaultWorkflowPermissionsOrganization: [ - "GET /orgs/{org}/actions/permissions/workflow" - ], - getGithubActionsDefaultWorkflowPermissionsRepository: [ - "GET /repos/{owner}/{repo}/actions/permissions/workflow" - ], - getGithubActionsPermissionsOrganization: ["GET /orgs/{org}/actions/permissions"], - getGithubActionsPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions"], - getHostedRunnerForOrg: ["GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"], - getHostedRunnersGithubOwnedImagesForOrg: [ - "GET /orgs/{org}/actions/hosted-runners/images/github-owned" - ], - getHostedRunnersLimitsForOrg: ["GET /orgs/{org}/actions/hosted-runners/limits"], - getHostedRunnersMachineSpecsForOrg: ["GET /orgs/{org}/actions/hosted-runners/machine-sizes"], - getHostedRunnersPartnerImagesForOrg: ["GET /orgs/{org}/actions/hosted-runners/images/partner"], - getHostedRunnersPlatformsForOrg: ["GET /orgs/{org}/actions/hosted-runners/platforms"], - getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], - getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], - getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], - getOrgVariable: ["GET /orgs/{org}/actions/variables/{name}"], - getPendingDeploymentsForRun: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" - ], - getRepoPermissions: [ - "GET /repos/{owner}/{repo}/actions/permissions", - {}, - { renamed: ["actions", "getGithubActionsPermissionsRepository"] } - ], - getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], - getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - getRepoVariable: ["GET /repos/{owner}/{repo}/actions/variables/{name}"], - getReviewsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"], - getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], - getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], - getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], - getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"], - getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], - getWorkflowRunAttempt: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}" - ], - getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], - getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], - listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], - listCustomImageVersionsForOrg: [ - "GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions" - ], - listCustomImagesForOrg: ["GET /orgs/{org}/actions/hosted-runners/images/custom"], - listEnvironmentSecrets: ["GET /repos/{owner}/{repo}/environments/{environment_name}/secrets"], - listEnvironmentVariables: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/variables" - ], - listGithubHostedRunnersInGroupForOrg: [ - "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners" - ], - listHostedRunnersForOrg: ["GET /orgs/{org}/actions/hosted-runners"], - listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], - listJobsForWorkflowRunAttempt: [ - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs" - ], - listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"], - listLabelsForSelfHostedRunnerForRepo: [ - "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" - ], - listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], - listOrgVariables: ["GET /orgs/{org}/actions/variables"], - listRepoOrganizationSecrets: ["GET /repos/{owner}/{repo}/actions/organization-secrets"], - listRepoOrganizationVariables: ["GET /repos/{owner}/{repo}/actions/organization-variables"], - listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], - listRepoVariables: ["GET /repos/{owner}/{repo}/actions/variables"], - listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], - listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], - listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], - listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], - listSelectedReposForOrgVariable: ["GET /orgs/{org}/actions/variables/{name}/repositories"], - listSelectedRepositoriesEnabledGithubActionsOrganization: [ - "GET /orgs/{org}/actions/permissions/repositories" - ], - listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], - listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], - listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], - listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], - listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], - reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"], - reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], - reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"], - removeAllCustomLabelsFromSelfHostedRunnerForOrg: [ - "DELETE /orgs/{org}/actions/runners/{runner_id}/labels" - ], - removeAllCustomLabelsFromSelfHostedRunnerForRepo: [ - "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" - ], - removeCustomLabelFromSelfHostedRunnerForOrg: [ - "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}" - ], - removeCustomLabelFromSelfHostedRunnerForRepo: [ - "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}" - ], - removeSelectedRepoFromOrgSecret: [ - "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" - ], - removeSelectedRepoFromOrgVariable: [ - "DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" - ], - reviewCustomGatesForRun: [ - "POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule" - ], - reviewPendingDeploymentsForRun: [ - "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" - ], - setAllowedActionsOrganization: ["PUT /orgs/{org}/actions/permissions/selected-actions"], - setAllowedActionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"], - setCustomLabelsForSelfHostedRunnerForOrg: [ - "PUT /orgs/{org}/actions/runners/{runner_id}/labels" - ], - setCustomLabelsForSelfHostedRunnerForRepo: [ - "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" - ], - setCustomOidcSubClaimForRepo: ["PUT /repos/{owner}/{repo}/actions/oidc/customization/sub"], - setGithubActionsDefaultWorkflowPermissionsOrganization: [ - "PUT /orgs/{org}/actions/permissions/workflow" - ], - setGithubActionsDefaultWorkflowPermissionsRepository: [ - "PUT /repos/{owner}/{repo}/actions/permissions/workflow" - ], - setGithubActionsPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions"], - setGithubActionsPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions"], - setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"], - setSelectedReposForOrgVariable: ["PUT /orgs/{org}/actions/variables/{name}/repositories"], - setSelectedRepositoriesEnabledGithubActionsOrganization: [ - "PUT /orgs/{org}/actions/permissions/repositories" - ], - setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"], - updateEnvironmentVariable: [ - "PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" - ], - updateHostedRunnerForOrg: ["PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"], - updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"], - updateRepoVariable: ["PATCH /repos/{owner}/{repo}/actions/variables/{name}"] - }, - activity: { - checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], - deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], - deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], - getFeeds: ["GET /feeds"], - getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], - getThread: ["GET /notifications/threads/{thread_id}"], - getThreadSubscriptionForAuthenticatedUser: [ - "GET /notifications/threads/{thread_id}/subscription" - ], - listEventsForAuthenticatedUser: ["GET /users/{username}/events"], - listNotificationsForAuthenticatedUser: ["GET /notifications"], - listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], - listPublicEvents: ["GET /events"], - listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], - listPublicEventsForUser: ["GET /users/{username}/events/public"], - listPublicOrgEvents: ["GET /orgs/{org}/events"], - listReceivedEventsForUser: ["GET /users/{username}/received_events"], - listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], - listRepoEvents: ["GET /repos/{owner}/{repo}/events"], - listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], - listReposStarredByAuthenticatedUser: ["GET /user/starred"], - listReposStarredByUser: ["GET /users/{username}/starred"], - listReposWatchedByUser: ["GET /users/{username}/subscriptions"], - listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], - listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], - listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], - markNotificationsAsRead: ["PUT /notifications"], - markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], - markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"], - markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], - setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], - setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], - starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], - unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] - }, - apps: { - addRepoToInstallation: [ - "PUT /user/installations/{installation_id}/repositories/{repository_id}", - {}, - { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] } - ], - addRepoToInstallationForAuthenticatedUser: [ - "PUT /user/installations/{installation_id}/repositories/{repository_id}" - ], - checkToken: ["POST /applications/{client_id}/token"], - createFromManifest: ["POST /app-manifests/{code}/conversions"], - createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], - deleteAuthorization: ["DELETE /applications/{client_id}/grant"], - deleteInstallation: ["DELETE /app/installations/{installation_id}"], - deleteToken: ["DELETE /applications/{client_id}/token"], - getAuthenticated: ["GET /app"], - getBySlug: ["GET /apps/{app_slug}"], - getInstallation: ["GET /app/installations/{installation_id}"], - getOrgInstallation: ["GET /orgs/{org}/installation"], - getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], - getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], - getSubscriptionPlanForAccountStubbed: [ - "GET /marketplace_listing/stubbed/accounts/{account_id}" - ], - getUserInstallation: ["GET /users/{username}/installation"], - getWebhookConfigForApp: ["GET /app/hook/config"], - getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], - listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], - listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], - listInstallationReposForAuthenticatedUser: [ - "GET /user/installations/{installation_id}/repositories" - ], - listInstallationRequestsForAuthenticatedApp: ["GET /app/installation-requests"], - listInstallations: ["GET /app/installations"], - listInstallationsForAuthenticatedUser: ["GET /user/installations"], - listPlans: ["GET /marketplace_listing/plans"], - listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], - listReposAccessibleToInstallation: ["GET /installation/repositories"], - listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], - listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], - listWebhookDeliveries: ["GET /app/hook/deliveries"], - redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"], - removeRepoFromInstallation: [ - "DELETE /user/installations/{installation_id}/repositories/{repository_id}", - {}, - { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] } - ], - removeRepoFromInstallationForAuthenticatedUser: [ - "DELETE /user/installations/{installation_id}/repositories/{repository_id}" - ], - resetToken: ["PATCH /applications/{client_id}/token"], - revokeInstallationAccessToken: ["DELETE /installation/token"], - scopeToken: ["POST /applications/{client_id}/token/scoped"], - suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], - unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"], - updateWebhookConfigForApp: ["PATCH /app/hook/config"] - }, - billing: { - getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], - getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], - getGithubBillingPremiumRequestUsageReportOrg: [ - "GET /organizations/{org}/settings/billing/premium_request/usage" - ], - getGithubBillingPremiumRequestUsageReportUser: [ - "GET /users/{username}/settings/billing/premium_request/usage" - ], - getGithubBillingUsageReportOrg: ["GET /organizations/{org}/settings/billing/usage"], - getGithubBillingUsageReportUser: ["GET /users/{username}/settings/billing/usage"], - getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], - getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], - getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], - getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] - }, - campaigns: { - createCampaign: ["POST /orgs/{org}/campaigns"], - deleteCampaign: ["DELETE /orgs/{org}/campaigns/{campaign_number}"], - getCampaignSummary: ["GET /orgs/{org}/campaigns/{campaign_number}"], - listOrgCampaigns: ["GET /orgs/{org}/campaigns"], - updateCampaign: ["PATCH /orgs/{org}/campaigns/{campaign_number}"] - }, - checks: { - create: ["POST /repos/{owner}/{repo}/check-runs"], - createSuite: ["POST /repos/{owner}/{repo}/check-suites"], - get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], - getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], - listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"], - listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], - listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"], - listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], - rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"], - rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"], - setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences"], - update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] - }, - codeScanning: { - commitAutofix: [ - "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits" - ], - createAutofix: ["POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"], - createVariantAnalysis: ["POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses"], - deleteAnalysis: [ - "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}" - ], - deleteCodeqlDatabase: [ - "DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" - ], - getAlert: [ - "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", - {}, - { renamedParameters: { alert_id: "alert_number" } } - ], - getAnalysis: ["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"], - getAutofix: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix"], - getCodeqlDatabase: ["GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"], - getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"], - getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], - getVariantAnalysis: [ - "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}" - ], - getVariantAnalysisRepoTask: [ - "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}" - ], - listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"], - listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], - listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], - listAlertsInstances: [ - "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", - {}, - { renamed: ["codeScanning", "listAlertInstances"] } - ], - listCodeqlDatabases: ["GET /repos/{owner}/{repo}/code-scanning/codeql/databases"], - listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], - updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], - updateDefaultSetup: ["PATCH /repos/{owner}/{repo}/code-scanning/default-setup"], - uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] - }, - codeSecurity: { - attachConfiguration: [ - "POST /orgs/{org}/code-security/configurations/{configuration_id}/attach" - ], - attachEnterpriseConfiguration: [ - "POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach" - ], - createConfiguration: ["POST /orgs/{org}/code-security/configurations"], - createConfigurationForEnterprise: [ - "POST /enterprises/{enterprise}/code-security/configurations" - ], - deleteConfiguration: ["DELETE /orgs/{org}/code-security/configurations/{configuration_id}"], - deleteConfigurationForEnterprise: [ - "DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}" - ], - detachConfiguration: ["DELETE /orgs/{org}/code-security/configurations/detach"], - getConfiguration: ["GET /orgs/{org}/code-security/configurations/{configuration_id}"], - getConfigurationForRepository: ["GET /repos/{owner}/{repo}/code-security-configuration"], - getConfigurationsForEnterprise: ["GET /enterprises/{enterprise}/code-security/configurations"], - getConfigurationsForOrg: ["GET /orgs/{org}/code-security/configurations"], - getDefaultConfigurations: ["GET /orgs/{org}/code-security/configurations/defaults"], - getDefaultConfigurationsForEnterprise: [ - "GET /enterprises/{enterprise}/code-security/configurations/defaults" - ], - getRepositoriesForConfiguration: [ - "GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories" - ], - getRepositoriesForEnterpriseConfiguration: [ - "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories" - ], - getSingleConfigurationForEnterprise: [ - "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}" - ], - setConfigurationAsDefault: [ - "PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults" - ], - setConfigurationAsDefaultForEnterprise: [ - "PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults" - ], - updateConfiguration: ["PATCH /orgs/{org}/code-security/configurations/{configuration_id}"], - updateEnterpriseConfiguration: [ - "PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}" - ] - }, - codesOfConduct: { - getAllCodesOfConduct: ["GET /codes_of_conduct"], - getConductCode: ["GET /codes_of_conduct/{key}"] - }, - codespaces: { - addRepositoryForSecretForAuthenticatedUser: [ - "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" - ], - addSelectedRepoToOrgSecret: [ - "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" - ], - checkPermissionsForDevcontainer: ["GET /repos/{owner}/{repo}/codespaces/permissions_check"], - codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"], - createForAuthenticatedUser: ["POST /user/codespaces"], - createOrUpdateOrgSecret: ["PUT /orgs/{org}/codespaces/secrets/{secret_name}"], - createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], - createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"], - createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"], - createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"], - deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], - deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"], - deleteOrgSecret: ["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"], - deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], - deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"], - exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"], - getCodespacesForUserInOrg: ["GET /orgs/{org}/members/{username}/codespaces"], - getExportDetailsForAuthenticatedUser: [ - "GET /user/codespaces/{codespace_name}/exports/{export_id}" - ], - getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], - getOrgPublicKey: ["GET /orgs/{org}/codespaces/secrets/public-key"], - getOrgSecret: ["GET /orgs/{org}/codespaces/secrets/{secret_name}"], - getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"], - getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"], - getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], - getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"], - listDevcontainersInRepositoryForAuthenticatedUser: [ - "GET /repos/{owner}/{repo}/codespaces/devcontainers" - ], - listForAuthenticatedUser: ["GET /user/codespaces"], - listInOrganization: [ - "GET /orgs/{org}/codespaces", - {}, - { renamedParameters: { org_id: "org" } } - ], - listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"], - listOrgSecrets: ["GET /orgs/{org}/codespaces/secrets"], - listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], - listRepositoriesForSecretForAuthenticatedUser: [ - "GET /user/codespaces/secrets/{secret_name}/repositories" - ], - listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], - listSelectedReposForOrgSecret: [ - "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories" - ], - preFlightWithRepoForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/new"], - publishForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/publish"], - removeRepositoryForSecretForAuthenticatedUser: [ - "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" - ], - removeSelectedRepoFromOrgSecret: [ - "DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" - ], - repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"], - setRepositoriesForSecretForAuthenticatedUser: [ - "PUT /user/codespaces/secrets/{secret_name}/repositories" - ], - setSelectedReposForOrgSecret: ["PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories"], - startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], - stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], - stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"], - updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] - }, - copilot: { - addCopilotSeatsForTeams: ["POST /orgs/{org}/copilot/billing/selected_teams"], - addCopilotSeatsForUsers: ["POST /orgs/{org}/copilot/billing/selected_users"], - cancelCopilotSeatAssignmentForTeams: ["DELETE /orgs/{org}/copilot/billing/selected_teams"], - cancelCopilotSeatAssignmentForUsers: ["DELETE /orgs/{org}/copilot/billing/selected_users"], - copilotMetricsForOrganization: ["GET /orgs/{org}/copilot/metrics"], - copilotMetricsForTeam: ["GET /orgs/{org}/team/{team_slug}/copilot/metrics"], - getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"], - getCopilotSeatDetailsForUser: ["GET /orgs/{org}/members/{username}/copilot"], - listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"] - }, - credentials: { revoke: ["POST /credentials/revoke"] }, - dependabot: { - addSelectedRepoToOrgSecret: [ - "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" - ], - createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"], - createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], - deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], - deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], - getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"], - getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], - getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], - getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"], - getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], - listAlertsForEnterprise: ["GET /enterprises/{enterprise}/dependabot/alerts"], - listAlertsForOrg: ["GET /orgs/{org}/dependabot/alerts"], - listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"], - listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], - listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], - listSelectedReposForOrgSecret: [ - "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories" - ], - removeSelectedRepoFromOrgSecret: [ - "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" - ], - repositoryAccessForOrg: ["GET /organizations/{org}/dependabot/repository-access"], - setRepositoryAccessDefaultLevel: [ - "PUT /organizations/{org}/dependabot/repository-access/default-level" - ], - setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"], - updateAlert: ["PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"], - updateRepositoryAccessForOrg: ["PATCH /organizations/{org}/dependabot/repository-access"] - }, - dependencyGraph: { - createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"], - diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"], - exportSbom: ["GET /repos/{owner}/{repo}/dependency-graph/sbom"] - }, - emojis: { get: ["GET /emojis"] }, - enterpriseTeamMemberships: { - add: ["PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"], - bulkAdd: ["POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add"], - bulkRemove: ["POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove"], - get: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"], - list: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships"], - remove: ["DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}"] - }, - enterpriseTeamOrganizations: { - add: ["PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"], - bulkAdd: ["POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add"], - bulkRemove: ["POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/remove"], - delete: ["DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"], - getAssignment: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}"], - getAssignments: ["GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations"] - }, - enterpriseTeams: { - create: ["POST /enterprises/{enterprise}/teams"], - delete: ["DELETE /enterprises/{enterprise}/teams/{team_slug}"], - get: ["GET /enterprises/{enterprise}/teams/{team_slug}"], - list: ["GET /enterprises/{enterprise}/teams"], - update: ["PATCH /enterprises/{enterprise}/teams/{team_slug}"] - }, - gists: { - checkIsStarred: ["GET /gists/{gist_id}/star"], - create: ["POST /gists"], - createComment: ["POST /gists/{gist_id}/comments"], - delete: ["DELETE /gists/{gist_id}"], - deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], - fork: ["POST /gists/{gist_id}/forks"], - get: ["GET /gists/{gist_id}"], - getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], - getRevision: ["GET /gists/{gist_id}/{sha}"], - list: ["GET /gists"], - listComments: ["GET /gists/{gist_id}/comments"], - listCommits: ["GET /gists/{gist_id}/commits"], - listForUser: ["GET /users/{username}/gists"], - listForks: ["GET /gists/{gist_id}/forks"], - listPublic: ["GET /gists/public"], - listStarred: ["GET /gists/starred"], - star: ["PUT /gists/{gist_id}/star"], - unstar: ["DELETE /gists/{gist_id}/star"], - update: ["PATCH /gists/{gist_id}"], - updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] - }, - git: { - createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], - createCommit: ["POST /repos/{owner}/{repo}/git/commits"], - createRef: ["POST /repos/{owner}/{repo}/git/refs"], - createTag: ["POST /repos/{owner}/{repo}/git/tags"], - createTree: ["POST /repos/{owner}/{repo}/git/trees"], - deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], - getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], - getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], - getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], - getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], - getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], - listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], - updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] - }, - gitignore: { - getAllTemplates: ["GET /gitignore/templates"], - getTemplate: ["GET /gitignore/templates/{name}"] - }, - hostedCompute: { - createNetworkConfigurationForOrg: ["POST /orgs/{org}/settings/network-configurations"], - deleteNetworkConfigurationFromOrg: [ - "DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}" - ], - getNetworkConfigurationForOrg: [ - "GET /orgs/{org}/settings/network-configurations/{network_configuration_id}" - ], - getNetworkSettingsForOrg: ["GET /orgs/{org}/settings/network-settings/{network_settings_id}"], - listNetworkConfigurationsForOrg: ["GET /orgs/{org}/settings/network-configurations"], - updateNetworkConfigurationForOrg: [ - "PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}" - ] - }, - interactions: { - getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], - getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], - getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], - getRestrictionsForYourPublicRepos: [ - "GET /user/interaction-limits", - {}, - { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] } - ], - removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], - removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], - removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits"], - removeRestrictionsForYourPublicRepos: [ - "DELETE /user/interaction-limits", - {}, - { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] } - ], - setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], - setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], - setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], - setRestrictionsForYourPublicRepos: [ - "PUT /user/interaction-limits", - {}, - { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] } - ] - }, - issues: { - addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], - addBlockedByDependency: [ - "POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by" - ], - addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], - addSubIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"], - checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], - checkUserCanBeAssignedToIssue: [ - "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}" - ], - create: ["POST /repos/{owner}/{repo}/issues"], - createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], - createLabel: ["POST /repos/{owner}/{repo}/labels"], - createMilestone: ["POST /repos/{owner}/{repo}/milestones"], - deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], - deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], - deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], - get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], - getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], - getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], - getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], - getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], - getParent: ["GET /repos/{owner}/{repo}/issues/{issue_number}/parent"], - list: ["GET /issues"], - listAssignees: ["GET /repos/{owner}/{repo}/assignees"], - listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], - listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], - listDependenciesBlockedBy: [ - "GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by" - ], - listDependenciesBlocking: [ - "GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking" - ], - listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], - listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], - listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"], - listForAuthenticatedUser: ["GET /user/issues"], - listForOrg: ["GET /orgs/{org}/issues"], - listForRepo: ["GET /repos/{owner}/{repo}/issues"], - listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], - listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], - listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], - listMilestones: ["GET /repos/{owner}/{repo}/milestones"], - listSubIssues: ["GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"], - lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], - removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], - removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], - removeDependencyBlockedBy: [ - "DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}" - ], - removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], - removeSubIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue"], - reprioritizeSubIssue: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority"], - setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], - unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], - update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], - updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], - updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], - updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] - }, - licenses: { - get: ["GET /licenses/{license}"], - getAllCommonlyUsed: ["GET /licenses"], - getForRepo: ["GET /repos/{owner}/{repo}/license"] - }, - markdown: { - render: ["POST /markdown"], - renderRaw: ["POST /markdown/raw", { headers: { "content-type": "text/plain; charset=utf-8" } }] - }, - meta: { - get: ["GET /meta"], - getAllVersions: ["GET /versions"], - getOctocat: ["GET /octocat"], - getZen: ["GET /zen"], - root: ["GET /"] - }, - migrations: { - deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive"], - deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"], - downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"], - getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"], - getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], - getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], - listForAuthenticatedUser: ["GET /user/migrations"], - listForOrg: ["GET /orgs/{org}/migrations"], - listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"], - listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], - listReposForUser: [ - "GET /user/migrations/{migration_id}/repositories", - {}, - { renamed: ["migrations", "listReposForAuthenticatedUser"] } - ], - startForAuthenticatedUser: ["POST /user/migrations"], - startForOrg: ["POST /orgs/{org}/migrations"], - unlockRepoForAuthenticatedUser: [ - "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock" - ], - unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"] - }, - oidc: { - getOidcCustomSubTemplateForOrg: ["GET /orgs/{org}/actions/oidc/customization/sub"], - updateOidcCustomSubTemplateForOrg: ["PUT /orgs/{org}/actions/oidc/customization/sub"] - }, - orgs: { - addSecurityManagerTeam: [ - "PUT /orgs/{org}/security-managers/teams/{team_slug}", - {}, - { - deprecated: - "octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team" - } - ], - assignTeamToOrgRole: ["PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"], - assignUserToOrgRole: ["PUT /orgs/{org}/organization-roles/users/{username}/{role_id}"], - blockUser: ["PUT /orgs/{org}/blocks/{username}"], - cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], - checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], - checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], - checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], - convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], - createArtifactStorageRecord: ["POST /orgs/{org}/artifacts/metadata/storage-record"], - createInvitation: ["POST /orgs/{org}/invitations"], - createIssueType: ["POST /orgs/{org}/issue-types"], - createWebhook: ["POST /orgs/{org}/hooks"], - customPropertiesForOrgsCreateOrUpdateOrganizationValues: [ - "PATCH /organizations/{org}/org-properties/values" - ], - customPropertiesForOrgsGetOrganizationValues: [ - "GET /organizations/{org}/org-properties/values" - ], - customPropertiesForReposCreateOrUpdateOrganizationDefinition: [ - "PUT /orgs/{org}/properties/schema/{custom_property_name}" - ], - customPropertiesForReposCreateOrUpdateOrganizationDefinitions: [ - "PATCH /orgs/{org}/properties/schema" - ], - customPropertiesForReposCreateOrUpdateOrganizationValues: [ - "PATCH /orgs/{org}/properties/values" - ], - customPropertiesForReposDeleteOrganizationDefinition: [ - "DELETE /orgs/{org}/properties/schema/{custom_property_name}" - ], - customPropertiesForReposGetOrganizationDefinition: [ - "GET /orgs/{org}/properties/schema/{custom_property_name}" - ], - customPropertiesForReposGetOrganizationDefinitions: ["GET /orgs/{org}/properties/schema"], - customPropertiesForReposGetOrganizationValues: ["GET /orgs/{org}/properties/values"], - delete: ["DELETE /orgs/{org}"], - deleteAttestationsBulk: ["POST /orgs/{org}/attestations/delete-request"], - deleteAttestationsById: ["DELETE /orgs/{org}/attestations/{attestation_id}"], - deleteAttestationsBySubjectDigest: ["DELETE /orgs/{org}/attestations/digest/{subject_digest}"], - deleteIssueType: ["DELETE /orgs/{org}/issue-types/{issue_type_id}"], - deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], - disableSelectedRepositoryImmutableReleasesOrganization: [ - "DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}" - ], - enableSelectedRepositoryImmutableReleasesOrganization: [ - "PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}" - ], - get: ["GET /orgs/{org}"], - getImmutableReleasesSettings: ["GET /orgs/{org}/settings/immutable-releases"], - getImmutableReleasesSettingsRepositories: [ - "GET /orgs/{org}/settings/immutable-releases/repositories" - ], - getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], - getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], - getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], - getOrgRulesetHistory: ["GET /orgs/{org}/rulesets/{ruleset_id}/history"], - getOrgRulesetVersion: ["GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}"], - getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], - getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], - getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"], - list: ["GET /organizations"], - listAppInstallations: ["GET /orgs/{org}/installations"], - listArtifactStorageRecords: [ - "GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records" - ], - listAttestationRepositories: ["GET /orgs/{org}/attestations/repositories"], - listAttestations: ["GET /orgs/{org}/attestations/{subject_digest}"], - listAttestationsBulk: ["POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}"], - listBlockedUsers: ["GET /orgs/{org}/blocks"], - listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], - listForAuthenticatedUser: ["GET /user/orgs"], - listForUser: ["GET /users/{username}/orgs"], - listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], - listIssueTypes: ["GET /orgs/{org}/issue-types"], - listMembers: ["GET /orgs/{org}/members"], - listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], - listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], - listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"], - listOrgRoles: ["GET /orgs/{org}/organization-roles"], - listOrganizationFineGrainedPermissions: [ - "GET /orgs/{org}/organization-fine-grained-permissions" - ], - listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], - listPatGrantRepositories: ["GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"], - listPatGrantRequestRepositories: [ - "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories" - ], - listPatGrantRequests: ["GET /orgs/{org}/personal-access-token-requests"], - listPatGrants: ["GET /orgs/{org}/personal-access-tokens"], - listPendingInvitations: ["GET /orgs/{org}/invitations"], - listPublicMembers: ["GET /orgs/{org}/public_members"], - listSecurityManagerTeams: [ - "GET /orgs/{org}/security-managers", - {}, - { - deprecated: - "octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams" - } - ], - listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], - listWebhooks: ["GET /orgs/{org}/hooks"], - pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], - redeliverWebhookDelivery: [ - "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" - ], - removeMember: ["DELETE /orgs/{org}/members/{username}"], - removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], - removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], - removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], - removeSecurityManagerTeam: [ - "DELETE /orgs/{org}/security-managers/teams/{team_slug}", - {}, - { - deprecated: - "octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team" - } - ], - reviewPatGrantRequest: ["POST /orgs/{org}/personal-access-token-requests/{pat_request_id}"], - reviewPatGrantRequestsInBulk: ["POST /orgs/{org}/personal-access-token-requests"], - revokeAllOrgRolesTeam: ["DELETE /orgs/{org}/organization-roles/teams/{team_slug}"], - revokeAllOrgRolesUser: ["DELETE /orgs/{org}/organization-roles/users/{username}"], - revokeOrgRoleTeam: ["DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"], - revokeOrgRoleUser: ["DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}"], - setImmutableReleasesSettings: ["PUT /orgs/{org}/settings/immutable-releases"], - setImmutableReleasesSettingsRepositories: [ - "PUT /orgs/{org}/settings/immutable-releases/repositories" - ], - setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], - setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], - unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], - update: ["PATCH /orgs/{org}"], - updateIssueType: ["PUT /orgs/{org}/issue-types/{issue_type_id}"], - updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], - updatePatAccess: ["POST /orgs/{org}/personal-access-tokens/{pat_id}"], - updatePatAccesses: ["POST /orgs/{org}/personal-access-tokens"], - updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], - updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] - }, - packages: { - deletePackageForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}"], - deletePackageForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}"], - deletePackageForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}"], - deletePackageVersionForAuthenticatedUser: [ - "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - deletePackageVersionForOrg: [ - "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - deletePackageVersionForUser: [ - "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - getAllPackageVersionsForAPackageOwnedByAnOrg: [ - "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", - {}, - { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] } - ], - getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [ - "GET /user/packages/{package_type}/{package_name}/versions", - {}, - { - renamed: ["packages", "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"] - } - ], - getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [ - "GET /user/packages/{package_type}/{package_name}/versions" - ], - getAllPackageVersionsForPackageOwnedByOrg: [ - "GET /orgs/{org}/packages/{package_type}/{package_name}/versions" - ], - getAllPackageVersionsForPackageOwnedByUser: [ - "GET /users/{username}/packages/{package_type}/{package_name}/versions" - ], - getPackageForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}"], - getPackageForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}"], - getPackageForUser: ["GET /users/{username}/packages/{package_type}/{package_name}"], - getPackageVersionForAuthenticatedUser: [ - "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - getPackageVersionForOrganization: [ - "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - getPackageVersionForUser: [ - "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" - ], - listDockerMigrationConflictingPackagesForAuthenticatedUser: ["GET /user/docker/conflicts"], - listDockerMigrationConflictingPackagesForOrganization: ["GET /orgs/{org}/docker/conflicts"], - listDockerMigrationConflictingPackagesForUser: ["GET /users/{username}/docker/conflicts"], - listPackagesForAuthenticatedUser: ["GET /user/packages"], - listPackagesForOrganization: ["GET /orgs/{org}/packages"], - listPackagesForUser: ["GET /users/{username}/packages"], - restorePackageForAuthenticatedUser: [ - "POST /user/packages/{package_type}/{package_name}/restore{?token}" - ], - restorePackageForOrg: [ - "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}" - ], - restorePackageForUser: [ - "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}" - ], - restorePackageVersionForAuthenticatedUser: [ - "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" - ], - restorePackageVersionForOrg: [ - "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" - ], - restorePackageVersionForUser: [ - "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" - ] - }, - privateRegistries: { - createOrgPrivateRegistry: ["POST /orgs/{org}/private-registries"], - deleteOrgPrivateRegistry: ["DELETE /orgs/{org}/private-registries/{secret_name}"], - getOrgPrivateRegistry: ["GET /orgs/{org}/private-registries/{secret_name}"], - getOrgPublicKey: ["GET /orgs/{org}/private-registries/public-key"], - listOrgPrivateRegistries: ["GET /orgs/{org}/private-registries"], - updateOrgPrivateRegistry: ["PATCH /orgs/{org}/private-registries/{secret_name}"] - }, - projects: { - addItemForOrg: ["POST /orgs/{org}/projectsV2/{project_number}/items"], - addItemForUser: ["POST /users/{username}/projectsV2/{project_number}/items"], - deleteItemForOrg: ["DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}"], - deleteItemForUser: ["DELETE /users/{username}/projectsV2/{project_number}/items/{item_id}"], - getFieldForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}"], - getFieldForUser: ["GET /users/{username}/projectsV2/{project_number}/fields/{field_id}"], - getForOrg: ["GET /orgs/{org}/projectsV2/{project_number}"], - getForUser: ["GET /users/{username}/projectsV2/{project_number}"], - getOrgItem: ["GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}"], - getUserItem: ["GET /users/{username}/projectsV2/{project_number}/items/{item_id}"], - listFieldsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/fields"], - listFieldsForUser: ["GET /users/{username}/projectsV2/{project_number}/fields"], - listForOrg: ["GET /orgs/{org}/projectsV2"], - listForUser: ["GET /users/{username}/projectsV2"], - listItemsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/items"], - listItemsForUser: ["GET /users/{username}/projectsV2/{project_number}/items"], - updateItemForOrg: ["PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}"], - updateItemForUser: ["PATCH /users/{username}/projectsV2/{project_number}/items/{item_id}"] - }, - pulls: { - checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], - create: ["POST /repos/{owner}/{repo}/pulls"], - createReplyForReviewComment: [ - "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies" - ], - createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], - createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], - deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], - deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], - dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], - get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], - getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], - getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], - list: ["GET /repos/{owner}/{repo}/pulls"], - listCommentsForReview: [ - "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments" - ], - listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], - listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], - listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], - listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], - listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], - listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], - merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], - removeRequestedReviewers: [ - "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" - ], - requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], - submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], - update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], - updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"], - updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], - updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] - }, - rateLimit: { get: ["GET /rate_limit"] }, - reactions: { - createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"], - createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"], - createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], - createForPullRequestReviewComment: [ - "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" - ], - createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"], - createForTeamDiscussionCommentInOrg: [ - "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" - ], - createForTeamDiscussionInOrg: [ - "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" - ], - deleteForCommitComment: [ - "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}" - ], - deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"], - deleteForIssueComment: [ - "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}" - ], - deleteForPullRequestComment: [ - "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}" - ], - deleteForRelease: [ - "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}" - ], - deleteForTeamDiscussion: [ - "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}" - ], - deleteForTeamDiscussionComment: [ - "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}" - ], - listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"], - listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], - listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], - listForPullRequestReviewComment: [ - "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" - ], - listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"], - listForTeamDiscussionCommentInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" - ], - listForTeamDiscussionInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" - ] - }, - repos: { - acceptInvitation: [ - "PATCH /user/repository_invitations/{invitation_id}", - {}, - { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] } - ], - acceptInvitationForAuthenticatedUser: ["PATCH /user/repository_invitations/{invitation_id}"], - addAppAccessRestrictions: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", - {}, - { mapToData: "apps" } - ], - addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], - addStatusCheckContexts: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", - {}, - { mapToData: "contexts" } - ], - addTeamAccessRestrictions: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", - {}, - { mapToData: "teams" } - ], - addUserAccessRestrictions: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", - {}, - { mapToData: "users" } - ], - cancelPagesDeployment: [ - "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel" - ], - checkAutomatedSecurityFixes: ["GET /repos/{owner}/{repo}/automated-security-fixes"], - checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], - checkImmutableReleases: ["GET /repos/{owner}/{repo}/immutable-releases"], - checkPrivateVulnerabilityReporting: [ - "GET /repos/{owner}/{repo}/private-vulnerability-reporting" - ], - checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts"], - codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], - compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], - compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"], - createAttestation: ["POST /repos/{owner}/{repo}/attestations"], - createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], - createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], - createCommitSignatureProtection: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" - ], - createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], - createDeployKey: ["POST /repos/{owner}/{repo}/keys"], - createDeployment: ["POST /repos/{owner}/{repo}/deployments"], - createDeploymentBranchPolicy: [ - "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" - ], - createDeploymentProtectionRule: [ - "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" - ], - createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], - createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], - createForAuthenticatedUser: ["POST /user/repos"], - createFork: ["POST /repos/{owner}/{repo}/forks"], - createInOrg: ["POST /orgs/{org}/repos"], - createOrUpdateEnvironment: ["PUT /repos/{owner}/{repo}/environments/{environment_name}"], - createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], - createOrgRuleset: ["POST /orgs/{org}/rulesets"], - createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"], - createPagesSite: ["POST /repos/{owner}/{repo}/pages"], - createRelease: ["POST /repos/{owner}/{repo}/releases"], - createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], - createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"], - createWebhook: ["POST /repos/{owner}/{repo}/hooks"], - customPropertiesForReposCreateOrUpdateRepositoryValues: [ - "PATCH /repos/{owner}/{repo}/properties/values" - ], - customPropertiesForReposGetRepositoryValues: ["GET /repos/{owner}/{repo}/properties/values"], - declineInvitation: [ - "DELETE /user/repository_invitations/{invitation_id}", - {}, - { renamed: ["repos", "declineInvitationForAuthenticatedUser"] } - ], - declineInvitationForAuthenticatedUser: ["DELETE /user/repository_invitations/{invitation_id}"], - delete: ["DELETE /repos/{owner}/{repo}"], - deleteAccessRestrictions: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions" - ], - deleteAdminBranchProtection: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" - ], - deleteAnEnvironment: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}"], - deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], - deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], - deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], - deleteCommitSignatureProtection: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" - ], - deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], - deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], - deleteDeploymentBranchPolicy: [ - "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" - ], - deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], - deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], - deleteOrgRuleset: ["DELETE /orgs/{org}/rulesets/{ruleset_id}"], - deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], - deletePullRequestReviewProtection: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" - ], - deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], - deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], - deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"], - deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], - disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"], - disableDeploymentProtectionRule: [ - "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" - ], - disableImmutableReleases: ["DELETE /repos/{owner}/{repo}/immutable-releases"], - disablePrivateVulnerabilityReporting: [ - "DELETE /repos/{owner}/{repo}/private-vulnerability-reporting" - ], - disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"], - downloadArchive: [ - "GET /repos/{owner}/{repo}/zipball/{ref}", - {}, - { renamed: ["repos", "downloadZipballArchive"] } - ], - downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], - downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], - enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes"], - enableImmutableReleases: ["PUT /repos/{owner}/{repo}/immutable-releases"], - enablePrivateVulnerabilityReporting: [ - "PUT /repos/{owner}/{repo}/private-vulnerability-reporting" - ], - enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"], - generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"], - get: ["GET /repos/{owner}/{repo}"], - getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], - getAdminBranchProtection: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" - ], - getAllDeploymentProtectionRules: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" - ], - getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], - getAllStatusCheckContexts: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts" - ], - getAllTopics: ["GET /repos/{owner}/{repo}/topics"], - getAppsWithAccessToProtectedBranch: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps" - ], - getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], - getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], - getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], - getBranchRules: ["GET /repos/{owner}/{repo}/rules/branches/{branch}"], - getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], - getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], - getCollaboratorPermissionLevel: [ - "GET /repos/{owner}/{repo}/collaborators/{username}/permission" - ], - getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], - getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], - getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], - getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], - getCommitSignatureProtection: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" - ], - getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], - getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], - getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], - getCustomDeploymentProtectionRule: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" - ], - getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], - getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], - getDeploymentBranchPolicy: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" - ], - getDeploymentStatus: [ - "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}" - ], - getEnvironment: ["GET /repos/{owner}/{repo}/environments/{environment_name}"], - getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], - getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], - getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"], - getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"], - getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"], - getOrgRulesets: ["GET /orgs/{org}/rulesets"], - getPages: ["GET /repos/{owner}/{repo}/pages"], - getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], - getPagesDeployment: ["GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}"], - getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], - getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], - getPullRequestReviewProtection: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" - ], - getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], - getReadme: ["GET /repos/{owner}/{repo}/readme"], - getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], - getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], - getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], - getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], - getRepoRuleSuite: ["GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}"], - getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"], - getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"], - getRepoRulesetHistory: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history"], - getRepoRulesetVersion: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}"], - getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"], - getStatusChecksProtection: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" - ], - getTeamsWithAccessToProtectedBranch: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams" - ], - getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], - getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], - getUsersWithAccessToProtectedBranch: [ - "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users" - ], - getViews: ["GET /repos/{owner}/{repo}/traffic/views"], - getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], - getWebhookConfigForRepo: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"], - getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"], - listActivities: ["GET /repos/{owner}/{repo}/activity"], - listAttestations: ["GET /repos/{owner}/{repo}/attestations/{subject_digest}"], - listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], - listBranches: ["GET /repos/{owner}/{repo}/branches"], - listBranchesForHeadCommit: [ - "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head" - ], - listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], - listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], - listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], - listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], - listCommits: ["GET /repos/{owner}/{repo}/commits"], - listContributors: ["GET /repos/{owner}/{repo}/contributors"], - listCustomDeploymentRuleIntegrations: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps" - ], - listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], - listDeploymentBranchPolicies: [ - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" - ], - listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], - listDeployments: ["GET /repos/{owner}/{repo}/deployments"], - listForAuthenticatedUser: ["GET /user/repos"], - listForOrg: ["GET /orgs/{org}/repos"], - listForUser: ["GET /users/{username}/repos"], - listForks: ["GET /repos/{owner}/{repo}/forks"], - listInvitations: ["GET /repos/{owner}/{repo}/invitations"], - listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], - listLanguages: ["GET /repos/{owner}/{repo}/languages"], - listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], - listPublic: ["GET /repositories"], - listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"], - listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], - listReleases: ["GET /repos/{owner}/{repo}/releases"], - listTags: ["GET /repos/{owner}/{repo}/tags"], - listTeams: ["GET /repos/{owner}/{repo}/teams"], - listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"], - listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], - merge: ["POST /repos/{owner}/{repo}/merges"], - mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], - pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], - redeliverWebhookDelivery: [ - "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" - ], - removeAppAccessRestrictions: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", - {}, - { mapToData: "apps" } - ], - removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], - removeStatusCheckContexts: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", - {}, - { mapToData: "contexts" } - ], - removeStatusCheckProtection: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" - ], - removeTeamAccessRestrictions: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", - {}, - { mapToData: "teams" } - ], - removeUserAccessRestrictions: [ - "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", - {}, - { mapToData: "users" } - ], - renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], - replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], - requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], - setAdminBranchProtection: [ - "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" - ], - setAppAccessRestrictions: [ - "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", - {}, - { mapToData: "apps" } - ], - setStatusCheckContexts: [ - "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", - {}, - { mapToData: "contexts" } - ], - setTeamAccessRestrictions: [ - "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", - {}, - { mapToData: "teams" } - ], - setUserAccessRestrictions: [ - "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", - {}, - { mapToData: "users" } - ], - testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], - transfer: ["POST /repos/{owner}/{repo}/transfer"], - update: ["PATCH /repos/{owner}/{repo}"], - updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], - updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], - updateDeploymentBranchPolicy: [ - "PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" - ], - updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], - updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], - updateOrgRuleset: ["PUT /orgs/{org}/rulesets/{ruleset_id}"], - updatePullRequestReviewProtection: [ - "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" - ], - updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], - updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], - updateRepoRuleset: ["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"], - updateStatusCheckPotection: [ - "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", - {}, - { renamed: ["repos", "updateStatusCheckProtection"] } - ], - updateStatusCheckProtection: [ - "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" - ], - updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], - updateWebhookConfigForRepo: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"], - uploadReleaseAsset: [ - "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", - { baseUrl: "https://uploads.github.com" } - ] - }, - search: { - code: ["GET /search/code"], - commits: ["GET /search/commits"], - issuesAndPullRequests: ["GET /search/issues"], - labels: ["GET /search/labels"], - repos: ["GET /search/repositories"], - topics: ["GET /search/topics"], - users: ["GET /search/users"] - }, - secretScanning: { - createPushProtectionBypass: [ - "POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses" - ], - getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], - getScanHistory: ["GET /repos/{owner}/{repo}/secret-scanning/scan-history"], - listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], - listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], - listLocationsForAlert: [ - "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations" - ], - listOrgPatternConfigs: ["GET /orgs/{org}/secret-scanning/pattern-configurations"], - updateAlert: ["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], - updateOrgPatternConfigs: ["PATCH /orgs/{org}/secret-scanning/pattern-configurations"] - }, - securityAdvisories: { - createFork: ["POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks"], - createPrivateVulnerabilityReport: ["POST /repos/{owner}/{repo}/security-advisories/reports"], - createRepositoryAdvisory: ["POST /repos/{owner}/{repo}/security-advisories"], - createRepositoryAdvisoryCveRequest: [ - "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve" - ], - getGlobalAdvisory: ["GET /advisories/{ghsa_id}"], - getRepositoryAdvisory: ["GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}"], - listGlobalAdvisories: ["GET /advisories"], - listOrgRepositoryAdvisories: ["GET /orgs/{org}/security-advisories"], - listRepositoryAdvisories: ["GET /repos/{owner}/{repo}/security-advisories"], - updateRepositoryAdvisory: ["PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}"] - }, - teams: { - addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], - addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], - checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], - create: ["POST /orgs/{org}/teams"], - createDiscussionCommentInOrg: [ - "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" - ], - createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], - deleteDiscussionCommentInOrg: [ - "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" - ], - deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], - deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], - getByName: ["GET /orgs/{org}/teams/{team_slug}"], - getDiscussionCommentInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" - ], - getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], - getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], - list: ["GET /orgs/{org}/teams"], - listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], - listDiscussionCommentsInOrg: [ - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" - ], - listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], - listForAuthenticatedUser: ["GET /user/teams"], - listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], - listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], - listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], - removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], - removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], - updateDiscussionCommentInOrg: [ - "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" - ], - updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], - updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] - }, - users: { - addEmailForAuthenticated: [ - "POST /user/emails", - {}, - { renamed: ["users", "addEmailForAuthenticatedUser"] } - ], - addEmailForAuthenticatedUser: ["POST /user/emails"], - addSocialAccountForAuthenticatedUser: ["POST /user/social_accounts"], - block: ["PUT /user/blocks/{username}"], - checkBlocked: ["GET /user/blocks/{username}"], - checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], - checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], - createGpgKeyForAuthenticated: [ - "POST /user/gpg_keys", - {}, - { renamed: ["users", "createGpgKeyForAuthenticatedUser"] } - ], - createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], - createPublicSshKeyForAuthenticated: [ - "POST /user/keys", - {}, - { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] } - ], - createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], - createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"], - deleteAttestationsBulk: ["POST /users/{username}/attestations/delete-request"], - deleteAttestationsById: ["DELETE /users/{username}/attestations/{attestation_id}"], - deleteAttestationsBySubjectDigest: [ - "DELETE /users/{username}/attestations/digest/{subject_digest}" - ], - deleteEmailForAuthenticated: [ - "DELETE /user/emails", - {}, - { renamed: ["users", "deleteEmailForAuthenticatedUser"] } - ], - deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], - deleteGpgKeyForAuthenticated: [ - "DELETE /user/gpg_keys/{gpg_key_id}", - {}, - { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] } - ], - deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], - deletePublicSshKeyForAuthenticated: [ - "DELETE /user/keys/{key_id}", - {}, - { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] } - ], - deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], - deleteSocialAccountForAuthenticatedUser: ["DELETE /user/social_accounts"], - deleteSshSigningKeyForAuthenticatedUser: ["DELETE /user/ssh_signing_keys/{ssh_signing_key_id}"], - follow: ["PUT /user/following/{username}"], - getAuthenticated: ["GET /user"], - getById: ["GET /user/{account_id}"], - getByUsername: ["GET /users/{username}"], - getContextForUser: ["GET /users/{username}/hovercard"], - getGpgKeyForAuthenticated: [ - "GET /user/gpg_keys/{gpg_key_id}", - {}, - { renamed: ["users", "getGpgKeyForAuthenticatedUser"] } - ], - getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], - getPublicSshKeyForAuthenticated: [ - "GET /user/keys/{key_id}", - {}, - { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] } - ], - getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], - getSshSigningKeyForAuthenticatedUser: ["GET /user/ssh_signing_keys/{ssh_signing_key_id}"], - list: ["GET /users"], - listAttestations: ["GET /users/{username}/attestations/{subject_digest}"], - listAttestationsBulk: ["POST /users/{username}/attestations/bulk-list{?per_page,before,after}"], - listBlockedByAuthenticated: [ - "GET /user/blocks", - {}, - { renamed: ["users", "listBlockedByAuthenticatedUser"] } - ], - listBlockedByAuthenticatedUser: ["GET /user/blocks"], - listEmailsForAuthenticated: [ - "GET /user/emails", - {}, - { renamed: ["users", "listEmailsForAuthenticatedUser"] } - ], - listEmailsForAuthenticatedUser: ["GET /user/emails"], - listFollowedByAuthenticated: [ - "GET /user/following", - {}, - { renamed: ["users", "listFollowedByAuthenticatedUser"] } - ], - listFollowedByAuthenticatedUser: ["GET /user/following"], - listFollowersForAuthenticatedUser: ["GET /user/followers"], - listFollowersForUser: ["GET /users/{username}/followers"], - listFollowingForUser: ["GET /users/{username}/following"], - listGpgKeysForAuthenticated: [ - "GET /user/gpg_keys", - {}, - { renamed: ["users", "listGpgKeysForAuthenticatedUser"] } - ], - listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], - listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], - listPublicEmailsForAuthenticated: [ - "GET /user/public_emails", - {}, - { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] } - ], - listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], - listPublicKeysForUser: ["GET /users/{username}/keys"], - listPublicSshKeysForAuthenticated: [ - "GET /user/keys", - {}, - { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] } - ], - listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], - listSocialAccountsForAuthenticatedUser: ["GET /user/social_accounts"], - listSocialAccountsForUser: ["GET /users/{username}/social_accounts"], - listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"], - listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"], - setPrimaryEmailVisibilityForAuthenticated: [ - "PATCH /user/email/visibility", - {}, - { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] } - ], - setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"], - unblock: ["DELETE /user/blocks/{username}"], - unfollow: ["DELETE /user/following/{username}"], - updateAuthenticated: ["PATCH /user"] - } -}; -var endpoints_default = Endpoints; - -// ../node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/endpoints-to-methods.js -var endpointMethodsMap = /* @__PURE__ */ new Map(); -for (const [scope, endpoints] of Object.entries(endpoints_default)) { - for (const [methodName, endpoint2] of Object.entries(endpoints)) { - const [route, defaults, decorations] = endpoint2; - const [method, url] = route.split(/ /); - const endpointDefaults = Object.assign( - { - method, - url - }, - defaults - ); - if (!endpointMethodsMap.has(scope)) { - endpointMethodsMap.set(scope, /* @__PURE__ */ new Map()); - } - endpointMethodsMap.get(scope).set(methodName, { - scope, - methodName, - endpointDefaults, - decorations - }); - } -} -var handler = { - has({ scope }, methodName) { - return endpointMethodsMap.get(scope).has(methodName); - }, - getOwnPropertyDescriptor(target, methodName) { - return { - value: this.get(target, methodName), - // ensures method is in the cache - configurable: true, - writable: true, - enumerable: true - }; - }, - defineProperty(target, methodName, descriptor) { - Object.defineProperty(target.cache, methodName, descriptor); - return true; - }, - deleteProperty(target, methodName) { - delete target.cache[methodName]; - return true; - }, - ownKeys({ scope }) { - return [...endpointMethodsMap.get(scope).keys()]; - }, - set(target, methodName, value) { - return (target.cache[methodName] = value); - }, - get({ octokit, scope, cache: cache3 }, methodName) { - if (cache3[methodName]) { - return cache3[methodName]; - } - const method = endpointMethodsMap.get(scope).get(methodName); - if (!method) { - return void 0; - } - const { endpointDefaults, decorations } = method; - if (decorations) { - cache3[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); - } else { - cache3[methodName] = octokit.request.defaults(endpointDefaults); - } - return cache3[methodName]; - } -}; -function endpointsToMethods(octokit) { - const newMethods = {}; - for (const scope of endpointMethodsMap.keys()) { - newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler); - } - return newMethods; -} -function decorate(octokit, scope, methodName, defaults, decorations) { - const requestWithDefaults = octokit.request.defaults(defaults); - function withDecorations(...args) { - let options = requestWithDefaults.endpoint.merge(...args); - if (decorations.mapToData) { - options = Object.assign({}, options, { - data: options[decorations.mapToData], - [decorations.mapToData]: void 0 - }); - return requestWithDefaults(options); - } - if (decorations.renamed) { - const [newScope, newMethodName] = decorations.renamed; - octokit.log.warn( - `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()` - ); - } - if (decorations.deprecated) { - octokit.log.warn(decorations.deprecated); - } - if (decorations.renamedParameters) { - const options2 = requestWithDefaults.endpoint.merge(...args); - for (const [name, alias] of Object.entries(decorations.renamedParameters)) { - if (name in options2) { - octokit.log.warn( - `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead` - ); - if (!(alias in options2)) { - options2[alias] = options2[name]; - } - delete options2[name]; - } - } - return requestWithDefaults(options2); - } - return requestWithDefaults(...args); - } - return Object.assign(withDecorations, requestWithDefaults); -} - -// ../node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/index.js -function restEndpointMethods(octokit) { - const api = endpointsToMethods(octokit); - return { - rest: api - }; -} -restEndpointMethods.VERSION = VERSION7; -function legacyRestEndpointMethods(octokit) { - const api = endpointsToMethods(octokit); - return { - ...api, - rest: api - }; -} -legacyRestEndpointMethods.VERSION = VERSION7; - -// ../node_modules/@octokit/rest/dist-src/version.js -var VERSION8 = "22.0.1"; - -// ../node_modules/@octokit/rest/dist-src/index.js -var Octokit2 = Octokit.plugin(requestLog, legacyRestEndpointMethods, paginateRest).defaults({ - userAgent: `octokit-rest.js/${VERSION8}` -}); - -// ../src/services/github.ts -var execFileAsync2 = (0, import_node_util2.promisify)(import_node_child_process2.execFile); -function createGitHubClient(token) { - return new Octokit2({ auth: token }); -} -async function createPullRequest(params) { - const client = createGitHubClient(params.token); - const response = await client.rest.pulls.create({ - owner: params.owner, - repo: params.repo, - title: params.title, - body: params.body, - head: params.head, - base: params.base - }); - return response.data.html_url; -} - -// src/commands/analyze.ts -var cachedAnalysis; -function getCachedAnalysis() { - return cachedAnalysis; -} -function setCachedAnalysis(analysis) { - cachedAnalysis = analysis; - vscode.commands.executeCommand("setContext", "primer.hasAnalysis", !!analysis); -} -async function analyzeCommand() { - const workspacePath = getWorkspacePath(); - if (!workspacePath) return; - await vscode.window.withProgress( - { location: vscode.ProgressLocation.Notification, title: "Primer: Analyzing repository\u2026" }, - async () => { - try { - const analysis = await analyzeRepo(workspacePath); - setCachedAnalysis(analysis); - } catch (err) { - vscode.window.showErrorMessage( - `Primer: Analysis failed \u2014 ${err instanceof Error ? err.message : String(err)}` - ); - } - } - ); -} -function getWorkspacePath() { - const folder = vscode.workspace.workspaceFolders?.[0]; - if (!folder) { - vscode.window.showWarningMessage("Primer: No workspace folder open."); - return void 0; - } - return folder.uri.fsPath; -} - -// src/commands/generate.ts -var vscode2 = __toESM(require("vscode")); -var GENERATE_OPTIONS = [ - { label: "MCP Config", value: "mcp", description: ".vscode/mcp.json" }, - { label: "VS Code Settings", value: "vscode", description: ".vscode/settings.json" } -]; -async function generateCommand() { - const workspacePath = getWorkspacePath(); - if (!workspacePath) return; - const picked = await vscode2.window.showQuickPick( - GENERATE_OPTIONS.map((o) => ({ label: o.label, description: o.description, value: o.value })), - { placeHolder: "Select config type to generate" } - ); - if (!picked) return; - let analysis = getCachedAnalysis(); - const result = await vscode2.window.withProgress( - { - location: vscode2.ProgressLocation.Notification, - title: `Primer: Generating ${picked.label}\u2026` - }, - async () => { - try { - if (!analysis) { - analysis = await analyzeRepo(workspacePath); - setCachedAnalysis(analysis); - } - return await generateConfigs({ - repoPath: workspacePath, - analysis, - selections: [picked.value], - force: false - }); - } catch (err) { - vscode2.window.showErrorMessage( - `Primer: Config generation failed \u2014 ${err instanceof Error ? err.message : String(err)}` - ); - return void 0; - } - } - ); - if (!result) return; - const wrote = result.files.filter((f) => f.action === "wrote"); - const skipped = result.files.filter((f) => f.action === "skipped"); - if (wrote.length > 0) { - const openAction = "Open File"; - const msg = `Generated ${wrote.map((f) => f.path).join(", ")}${skipped.length ? ` (${skipped.length} skipped)` : ""}`; - const action = await vscode2.window.showInformationMessage(`Primer: ${msg}`, openAction); - if (action === openAction && wrote[0]) { - const doc = await vscode2.workspace.openTextDocument(wrote[0].path); - await vscode2.window.showTextDocument(doc); - } - } else if (skipped.length > 0) { - const overwrite = "Overwrite"; - const action = await vscode2.window.showWarningMessage( - "Primer: All config files already exist.", - overwrite - ); - if (action === overwrite) { - await vscode2.window.withProgress( - { - location: vscode2.ProgressLocation.Notification, - title: `Primer: Overwriting ${picked.label}\u2026` - }, - async () => { - const forceResult = await generateConfigs({ - repoPath: workspacePath, - analysis, - selections: [picked.value], - force: true - }); - const forceWrote = forceResult.files.filter((f) => f.action === "wrote"); - if (forceWrote.length > 0) { - const doc = await vscode2.workspace.openTextDocument(forceWrote[0].path); - await vscode2.window.showTextDocument(doc); - } - } - ); - } - } -} - -// src/commands/instructions.ts -var vscode3 = __toESM(require("vscode")); - -// src/progress.ts -var VscodeProgressReporter = class { - constructor(progress) { - this.progress = progress; - } - update(message) { - this.progress.report({ message }); - } - succeed(message) { - this.progress.report({ message: `$(check) ${message}` }); - } - fail(message) { - this.progress.report({ message: `$(error) ${message}` }); - } - done() {} -}; - -// src/commands/instructions.ts -async function instructionsCommand() { - const workspacePath = getWorkspacePath(); - if (!workspacePath) return; - const model = vscode3.workspace.getConfiguration("primer").get("model"); - let analysis = getCachedAnalysis(); - if (!analysis) { - await vscode3.window.withProgress( - { - location: vscode3.ProgressLocation.Notification, - title: "Primer: Analyzing repository\u2026" - }, - async () => { - analysis = await analyzeRepo(workspacePath); - setCachedAnalysis(analysis); - } - ); - } - if (!analysis) return; - let selectedAreas = void 0; - if (analysis.areas && analysis.areas.length > 0) { - const picked = await vscode3.window.showQuickPick( - analysis.areas.map((a) => ({ label: a.name, description: a.description, area: a })), - { placeHolder: "Select areas for instructions (or Escape for root only)", canPickMany: true } - ); - if (picked && picked.length > 0) { - selectedAreas = picked.map((p) => p.area); - } - } - await vscode3.window.withProgress( - { - location: vscode3.ProgressLocation.Notification, - title: "Primer: Generating Copilot instructions\u2026", - cancellable: false - }, - async (progress) => { - try { - const reporter = new VscodeProgressReporter(progress); - reporter.update("Generating root instructions\u2026"); - await generateCopilotInstructions({ - repoPath: workspacePath, - model, - onProgress: (msg) => reporter.update(msg) - }); - if (selectedAreas) { - for (const area of selectedAreas) { - reporter.update(`Generating instructions for ${area.name}\u2026`); - await generateAreaInstructions({ - repoPath: workspacePath, - area, - model, - onProgress: (msg) => reporter.update(msg) - }); - } - } - reporter.succeed("Instructions generated."); - } catch (err) { - vscode3.window.showErrorMessage( - `Primer: Instruction generation failed \u2014 ${err instanceof Error ? err.message : String(err)}` - ); - } - } - ); -} - -// src/commands/readiness.ts -var vscode7 = __toESM(require("vscode")); - -// src/webview.ts -var vscode4 = __toESM(require("vscode")); -var panels = /* @__PURE__ */ new Map(); -function createWebviewPanel(id, title, html) { - const existing = panels.get(id); - if (existing) { - existing.webview.html = html; - existing.reveal(); - return existing; - } - const panel = vscode4.window.createWebviewPanel(id, title, vscode4.ViewColumn.One, { - enableScripts: true, - localResourceRoots: [] - }); - panel.webview.html = html; - panel.onDidDispose(() => panels.delete(id)); - panels.set(id, panel); - return panel; -} - -// src/views/AnalysisTreeProvider.ts -var vscode5 = __toESM(require("vscode")); -var AnalysisTreeProvider = class { - _onDidChangeTreeData = new vscode5.EventEmitter(); - onDidChangeTreeData = this._onDidChangeTreeData.event; - refresh() { - this._onDidChangeTreeData.fire(void 0); - } - getTreeItem(element) { - return element; - } - getChildren(element) { - if (element) return element.children ?? []; - const analysis = getCachedAnalysis(); - if (!analysis) return []; - return this.getRootItems(analysis); - } - getRootItems(analysis) { - const items = []; - if (analysis.languages.length > 0) { - const langs = new AnalysisItem( - "Languages", - vscode5.TreeItemCollapsibleState.Expanded, - analysis.languages.map((l) => { - const item = new AnalysisItem(l, vscode5.TreeItemCollapsibleState.None); - item.contextValue = "language"; - return item; - }) - ); - langs.iconPath = new vscode5.ThemeIcon("code"); - langs.description = `${analysis.languages.length}`; - langs.contextValue = "category"; - items.push(langs); - } - if (analysis.frameworks.length > 0) { - const frameworks = new AnalysisItem( - "Frameworks", - vscode5.TreeItemCollapsibleState.Expanded, - analysis.frameworks.map((f) => { - const item = new AnalysisItem(f, vscode5.TreeItemCollapsibleState.None); - item.contextValue = "framework"; - return item; - }) - ); - frameworks.iconPath = new vscode5.ThemeIcon("extensions"); - frameworks.description = `${analysis.frameworks.length}`; - frameworks.contextValue = "category"; - items.push(frameworks); - } - if (analysis.isMonorepo && analysis.areas) { - const areas = new AnalysisItem( - "Monorepo", - vscode5.TreeItemCollapsibleState.Expanded, - analysis.areas.map((a) => { - const item = new AnalysisItem(a.name, vscode5.TreeItemCollapsibleState.None); - item.description = typeof a.applyTo === "string" ? a.applyTo : a.applyTo.join(", "); - item.iconPath = new vscode5.ThemeIcon("folder"); - item.contextValue = "area"; - const md = new vscode5.MarkdownString(); - md.appendMarkdown(`**${a.name}**`); - if (a.description) - md.appendMarkdown(` - -${a.description}`); - md.appendMarkdown(` - -Globs: \`${typeof a.applyTo === "string" ? a.applyTo : a.applyTo.join("`, `")}\``); - item.tooltip = md; - return item; - }) - ); - areas.iconPath = new vscode5.ThemeIcon("folder-library"); - areas.description = analysis.workspaceType ?? void 0; - areas.contextValue = "category"; - items.push(areas); - } - if (analysis.packageManager) { - const pm = new AnalysisItem("Package Manager", vscode5.TreeItemCollapsibleState.None); - pm.description = analysis.packageManager; - pm.iconPath = new vscode5.ThemeIcon("package"); - pm.contextValue = "info"; - items.push(pm); - } - return items; - } -}; -var AnalysisItem = class extends vscode5.TreeItem { - constructor(label, collapsibleState, children) { - super(label, collapsibleState); - this.children = children; - } -}; - -// src/views/ReadinessTreeProvider.ts -var vscode6 = __toESM(require("vscode")); -var ReadinessTreeProvider = class { - _onDidChangeTreeData = new vscode6.EventEmitter(); - onDidChangeTreeData = this._onDidChangeTreeData.event; - report; - setReport(report) { - this.report = report; - this._onDidChangeTreeData.fire(void 0); - } - getReport() { - return this.report; - } - refresh() { - this._onDidChangeTreeData.fire(void 0); - } - getTreeItem(element) { - return element; - } - getChildren(element) { - if (element) return element.children ?? []; - if (!this.report) return []; - return this.getRootItems(this.report); - } - getRootItems(report) { - const items = []; - const levelInfo = report.levels.find((l) => l.level === report.achievedLevel); - const level = new ReadinessItem( - levelInfo?.name ?? `Level ${report.achievedLevel}`, - vscode6.TreeItemCollapsibleState.None - ); - level.description = `Level ${report.achievedLevel}`; - level.iconPath = new vscode6.ThemeIcon( - report.achievedLevel >= 3 ? "pass" : "warning", - new vscode6.ThemeColor( - report.achievedLevel >= 3 ? "testing.iconPassed" : "problemsWarningIcon.foreground" - ) - ); - level.contextValue = "level"; - items.push(level); - for (const pillar of report.pillars) { - const criteria = report.criteria.filter((c) => c.pillar === pillar.id); - items.push(this.createPillarItem(pillar, criteria)); - } - return items; - } - createPillarItem(pillar, criteria) { - const pct = Math.round(pillar.passRate * 100); - const item = new ReadinessItem( - pillar.name, - criteria.length > 0 - ? vscode6.TreeItemCollapsibleState.Collapsed - : vscode6.TreeItemCollapsibleState.None, - criteria.map((c) => { - const ci = new ReadinessItem(c.title, vscode6.TreeItemCollapsibleState.None); - ci.iconPath = new vscode6.ThemeIcon( - c.status === "pass" ? "pass" : c.status === "fail" ? "error" : "circle-outline", - c.status === "pass" - ? new vscode6.ThemeColor("testing.iconPassed") - : c.status === "fail" - ? new vscode6.ThemeColor("testing.iconFailed") - : void 0 - ); - ci.description = c.reason; - ci.contextValue = `criterion.${c.status}`; - const md = new vscode6.MarkdownString(); - md.appendMarkdown(`**${c.title}** - -`); - if (c.reason) - md.appendMarkdown(`${c.reason} - -`); - if (c.evidence && c.evidence.length > 0) { - md.appendMarkdown("**Evidence:**\n"); - for (const e of c.evidence) { - md.appendMarkdown(`- ${e} -`); - } - } - ci.tooltip = md; - return ci; - }) - ); - item.iconPath = new vscode6.ThemeIcon( - pct === 100 ? "pass" : pct >= 50 ? "warning" : "error", - pct === 100 - ? new vscode6.ThemeColor("testing.iconPassed") - : pct >= 50 - ? new vscode6.ThemeColor("problemsWarningIcon.foreground") - : new vscode6.ThemeColor("testing.iconFailed") - ); - item.description = `${pillar.passed}/${pillar.total} (${pct}%)`; - item.contextValue = "pillar"; - return item; - } -}; -var ReadinessItem = class extends vscode6.TreeItem { - constructor(label, collapsibleState, children) { - super(label, collapsibleState); - this.children = children; - } -}; - -// src/views/providers.ts -var analysisTreeProvider = new AnalysisTreeProvider(); -var readinessTreeProvider = new ReadinessTreeProvider(); - -// src/commands/readiness.ts -async function readinessCommand() { - const workspacePath = getWorkspacePath(); - if (!workspacePath) return; - await vscode7.window.withProgress( - { - location: vscode7.ProgressLocation.Notification, - title: "Primer: Running readiness assessment\u2026", - cancellable: false - }, - async (progress) => { - try { - const reporter = new VscodeProgressReporter(progress); - let analysis = getCachedAnalysis(); - if (!analysis) { - reporter.update("Analyzing repository\u2026"); - analysis = await analyzeRepo(workspacePath); - setCachedAnalysis(analysis); - } - reporter.update("Evaluating readiness pillars\u2026"); - const report = await runReadinessReport({ repoPath: workspacePath }); - reporter.update("Generating report\u2026"); - const repoName = vscode7.workspace.workspaceFolders?.[0]?.name ?? "Repository"; - const html = generateVisualReport({ - reports: [{ repo: repoName, report }], - title: `${repoName} \u2014 AI Readiness` - }); - createWebviewPanel("primer.readinessReport", "AI Readiness Report", html); - readinessTreeProvider.setReport(report); - reporter.succeed(`Readiness: Level ${report.achievedLevel} achieved.`); - } catch (err) { - vscode7.window.showErrorMessage( - `Primer: Readiness assessment failed \u2014 ${err instanceof Error ? err.message : String(err)}` - ); - } - } - ); -} - -// src/commands/eval.ts -var vscode8 = __toESM(require("vscode")); -var import_node_path2 = __toESM(require("node:path")); -var import_node_fs = __toESM(require("node:fs")); -async function evalCommand() { - const workspacePath = getWorkspacePath(); - if (!workspacePath) return; - const configPath = import_node_path2.default.join(workspacePath, "primer.eval.json"); - if (!import_node_fs.default.existsSync(configPath)) { - const action = await vscode8.window.showWarningMessage( - "Primer: No primer.eval.json found. Create one?", - "Scaffold", - "Cancel" - ); - if (action === "Scaffold") { - await evalInitCommand(); - } - return; - } - const config = vscode8.workspace.getConfiguration("primer"); - const model = config.get("model") ?? "claude-sonnet-4.5"; - await vscode8.window.withProgress( - { - location: vscode8.ProgressLocation.Notification, - title: "Primer: Running eval\u2026", - cancellable: false - }, - async (progress) => { - try { - const reporter = new VscodeProgressReporter(progress); - reporter.update("Running evaluation\u2026"); - const result = await runEval({ - configPath, - repoPath: workspacePath, - model, - judgeModel: model, - onProgress: (msg) => reporter.update(msg) - }); - reporter.succeed(`Eval complete. ${result.summary}`); - if (result.viewerPath && import_node_fs.default.existsSync(result.viewerPath)) { - const html = import_node_fs.default.readFileSync(result.viewerPath, "utf-8"); - createWebviewPanel("primer.evalResults", "Eval Results", html); - } - } catch (err) { - vscode8.window.showErrorMessage( - `Primer: Eval failed \u2014 ${err instanceof Error ? err.message : String(err)}` - ); - } - } - ); -} -async function evalInitCommand() { - const workspacePath = getWorkspacePath(); - if (!workspacePath) return; - const config = vscode8.workspace.getConfiguration("primer"); - const model = config.get("model"); - await vscode8.window.withProgress( - { - location: vscode8.ProgressLocation.Notification, - title: "Primer: Scaffolding eval config\u2026", - cancellable: false - }, - async (progress) => { - try { - const reporter = new VscodeProgressReporter(progress); - let analysis = getCachedAnalysis(); - if (!analysis) { - reporter.update("Analyzing repository\u2026"); - analysis = await analyzeRepo(workspacePath); - setCachedAnalysis(analysis); - } - reporter.update("Generating eval cases\u2026"); - const evalConfig = await generateEvalScaffold({ - repoPath: workspacePath, - count: 5, - model, - areas: analysis.areas, - onProgress: (msg) => reporter.update(msg) - }); - const outputPath = import_node_path2.default.join(workspacePath, "primer.eval.json"); - await safeWriteFile(outputPath, JSON.stringify(evalConfig, null, 2) + "\n", false); - reporter.succeed("Eval config scaffolded."); - const doc = await vscode8.workspace.openTextDocument(outputPath); - await vscode8.window.showTextDocument(doc); - } catch (err) { - vscode8.window.showErrorMessage( - `Primer: Eval scaffold failed \u2014 ${err instanceof Error ? err.message : String(err)}` - ); - } - } - ); -} - -// src/commands/init.ts -var vscode9 = __toESM(require("vscode")); -var import_node_path3 = __toESM(require("node:path")); -async function initCommand() { - const workspacePath = getWorkspacePath(); - if (!workspacePath) return; - const config = vscode9.workspace.getConfiguration("primer"); - const model = config.get("model"); - await vscode9.window.withProgress( - { - location: vscode9.ProgressLocation.Notification, - title: "Primer: Initializing repository\u2026", - cancellable: false - }, - async (progress) => { - try { - const reporter = new VscodeProgressReporter(progress); - reporter.update("Analyzing repository\u2026"); - const analysis = await analyzeRepo(workspacePath); - setCachedAnalysis(analysis); - reporter.update("Generating Copilot instructions\u2026"); - await generateCopilotInstructions({ - repoPath: workspacePath, - model, - onProgress: (msg) => reporter.update(msg) - }); - reporter.update("Generating configs\u2026"); - const result = await generateConfigs({ - repoPath: workspacePath, - analysis, - selections: ["mcp", "vscode"], - force: false - }); - const wrote = result.files.filter((f) => f.action === "wrote"); - const skipped = result.files.filter((f) => f.action === "skipped"); - const parts = []; - if (wrote.length) parts.push(`${wrote.length} files generated`); - if (skipped.length) parts.push(`${skipped.length} skipped (already exist)`); - reporter.succeed("Repository initialized."); - const instructionsPath = import_node_path3.default.join( - workspacePath, - ".github", - "copilot-instructions.md" - ); - try { - const doc = await vscode9.workspace.openTextDocument(instructionsPath); - await vscode9.window.showTextDocument(doc); - } catch {} - vscode9.window.showInformationMessage(`Primer: ${parts.join(", ") || "Done."}`); - } catch (err) { - vscode9.window.showErrorMessage( - `Primer: Initialization failed \u2014 ${err instanceof Error ? err.message : String(err)}` - ); - } - } - ); -} - -// src/commands/pr.ts -var vscode11 = __toESM(require("vscode")); - -// src/auth.ts -var vscode10 = __toESM(require("vscode")); -async function getGitHubToken() { - const session = await vscode10.authentication.getSession("github", ["repo"], { - createIfNone: true - }); - return session.accessToken; -} - -// node_modules/simple-git/dist/esm/index.js -var import_node_buffer2 = require("node:buffer"); -var import_file_exists2 = __toESM(require_dist3(), 1); -var import_debug2 = __toESM(require_src3(), 1); -var import_child_process2 = require("child_process"); -var import_promise_deferred3 = __toESM(require_dist4(), 1); -var import_node_path4 = require("node:path"); -var import_promise_deferred4 = __toESM(require_dist4(), 1); -var import_node_events = require("node:events"); -var __defProp3 = Object.defineProperty; -var __getOwnPropDesc3 = Object.getOwnPropertyDescriptor; -var __getOwnPropNames3 = Object.getOwnPropertyNames; -var __hasOwnProp3 = Object.prototype.hasOwnProperty; -var __esm2 = (fn, res) => - function __init() { - return (fn && (res = (0, fn[__getOwnPropNames3(fn)[0]])((fn = 0))), res); - }; -var __commonJS3 = (cb, mod) => - function __require() { - return ( - mod || (0, cb[__getOwnPropNames3(cb)[0]])((mod = { exports: {} }).exports, mod), - mod.exports - ); - }; -var __export3 = (target, all) => { - for (var name in all) __defProp3(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps3 = (to, from, except, desc) => { - if ((from && typeof from === "object") || typeof from === "function") { - for (let key of __getOwnPropNames3(from)) - if (!__hasOwnProp3.call(to, key) && key !== except) - __defProp3(to, key, { - get: () => from[key], - enumerable: !(desc = __getOwnPropDesc3(from, key)) || desc.enumerable - }); - } - return to; -}; -var __toCommonJS3 = (mod) => __copyProps3(__defProp3({}, "__esModule", { value: true }), mod); -function pathspec2(...paths) { - const key = new String(paths); - cache2.set(key, paths); - return key; -} -function isPathSpec2(path11) { - return path11 instanceof String && cache2.has(path11); -} -function toPaths(pathSpec) { - return cache2.get(pathSpec) || []; -} -var cache2; -var init_pathspec2 = __esm2({ - "src/lib/args/pathspec.ts"() { - "use strict"; - cache2 = /* @__PURE__ */ new WeakMap(); - } -}); -var GitError2; -var init_git_error2 = __esm2({ - "src/lib/errors/git-error.ts"() { - "use strict"; - GitError2 = class extends Error { - constructor(task, message) { - super(message); - this.task = task; - Object.setPrototypeOf(this, new.target.prototype); - } - }; - } -}); -var GitResponseError2; -var init_git_response_error2 = __esm2({ - "src/lib/errors/git-response-error.ts"() { - "use strict"; - init_git_error2(); - GitResponseError2 = class extends GitError2 { - constructor(git, message) { - super(void 0, message || String(git)); - this.git = git; - } - }; - } -}); -var TaskConfigurationError2; -var init_task_configuration_error2 = __esm2({ - "src/lib/errors/task-configuration-error.ts"() { - "use strict"; - init_git_error2(); - TaskConfigurationError2 = class extends GitError2 { - constructor(message) { - super(void 0, message); - } - }; - } -}); -function asFunction2(source) { - if (typeof source !== "function") { - return NOOP2; - } - return source; -} -function isUserFunction2(source) { - return typeof source === "function" && source !== NOOP2; -} -function splitOn2(input, char) { - const index = input.indexOf(char); - if (index <= 0) { - return [input, ""]; - } - return [input.substr(0, index), input.substr(index + 1)]; -} -function first2(input, offset = 0) { - return isArrayLike2(input) && input.length > offset ? input[offset] : void 0; -} -function last2(input, offset = 0) { - if (isArrayLike2(input) && input.length > offset) { - return input[input.length - 1 - offset]; - } -} -function isArrayLike2(input) { - return filterHasLength2(input); -} -function toLinesWithContent2(input = "", trimmed22 = true, separator = "\n") { - return input.split(separator).reduce((output, line) => { - const lineContent = trimmed22 ? line.trim() : line; - if (lineContent) { - output.push(lineContent); - } - return output; - }, []); -} -function forEachLineWithContent2(input, callback) { - return toLinesWithContent2(input, true).map((line) => callback(line)); -} -function folderExists2(path11) { - return (0, import_file_exists2.exists)(path11, import_file_exists2.FOLDER); -} -function append2(target, item) { - if (Array.isArray(target)) { - if (!target.includes(item)) { - target.push(item); - } - } else { - target.add(item); - } - return item; -} -function including2(target, item) { - if (Array.isArray(target) && !target.includes(item)) { - target.push(item); - } - return target; -} -function remove2(target, item) { - if (Array.isArray(target)) { - const index = target.indexOf(item); - if (index >= 0) { - target.splice(index, 1); - } - } else { - target.delete(item); - } - return item; -} -function asArray2(source) { - return Array.isArray(source) ? source : [source]; -} -function asCamelCase2(str) { - return str.replace(/[\s-]+(.)/g, (_all, chr) => { - return chr.toUpperCase(); - }); -} -function asStringArray2(source) { - return asArray2(source).map((item) => { - return item instanceof String ? item : String(item); - }); -} -function asNumber2(source, onNaN = 0) { - if (source == null) { - return onNaN; - } - const num = parseInt(source, 10); - return Number.isNaN(num) ? onNaN : num; -} -function prefixedArray2(input, prefix) { - const output = []; - for (let i = 0, max = input.length; i < max; i++) { - output.push(prefix, input[i]); - } - return output; -} -function bufferToString2(input) { - return (Array.isArray(input) ? import_node_buffer2.Buffer.concat(input) : input).toString( - "utf-8" - ); -} -function pick2(source, properties) { - const out = {}; - properties.forEach((key) => { - if (source[key] !== void 0) { - out[key] = source[key]; - } - }); - return out; -} -function delay2(duration = 0) { - return new Promise((done) => setTimeout(done, duration)); -} -function orVoid2(input) { - if (input === false) { - return void 0; - } - return input; -} -var NULL2; -var NOOP2; -var objectToString2; -var init_util2 = __esm2({ - "src/lib/utils/util.ts"() { - "use strict"; - init_argument_filters2(); - NULL2 = "\0"; - NOOP2 = () => {}; - objectToString2 = Object.prototype.toString.call.bind(Object.prototype.toString); - } -}); -function filterType2(input, filter, def) { - if (filter(input)) { - return input; - } - return arguments.length > 2 ? def : void 0; -} -function filterPrimitives2(input, omit2) { - const type = isPathSpec2(input) ? "string" : typeof input; - return /number|string|boolean/.test(type) && (!omit2 || !omit2.includes(type)); -} -function filterPlainObject2(input) { - return !!input && objectToString2(input) === "[object Object]"; -} -function filterFunction2(input) { - return typeof input === "function"; -} -var filterArray2; -var filterNumber2; -var filterString2; -var filterStringOrStringArray2; -var filterHasLength2; -var init_argument_filters2 = __esm2({ - "src/lib/utils/argument-filters.ts"() { - "use strict"; - init_pathspec2(); - init_util2(); - filterArray2 = (input) => { - return Array.isArray(input); - }; - filterNumber2 = (input) => { - return typeof input === "number"; - }; - filterString2 = (input) => { - return typeof input === "string"; - }; - filterStringOrStringArray2 = (input) => { - return filterString2(input) || (Array.isArray(input) && input.every(filterString2)); - }; - filterHasLength2 = (input) => { - if (input == null || "number|boolean|function".includes(typeof input)) { - return false; - } - return typeof input.length === "number"; - }; - } -}); -var ExitCodes2; -var init_exit_codes2 = __esm2({ - "src/lib/utils/exit-codes.ts"() { - "use strict"; - ExitCodes2 = /* @__PURE__ */ ((ExitCodes22) => { - ExitCodes22[(ExitCodes22["SUCCESS"] = 0)] = "SUCCESS"; - ExitCodes22[(ExitCodes22["ERROR"] = 1)] = "ERROR"; - ExitCodes22[(ExitCodes22["NOT_FOUND"] = -2)] = "NOT_FOUND"; - ExitCodes22[(ExitCodes22["UNCLEAN"] = 128)] = "UNCLEAN"; - return ExitCodes22; - })(ExitCodes2 || {}); - } -}); -var GitOutputStreams2; -var init_git_output_streams2 = __esm2({ - "src/lib/utils/git-output-streams.ts"() { - "use strict"; - GitOutputStreams2 = class _GitOutputStreams { - constructor(stdOut, stdErr) { - this.stdOut = stdOut; - this.stdErr = stdErr; - } - asStrings() { - return new _GitOutputStreams(this.stdOut.toString("utf8"), this.stdErr.toString("utf8")); - } - }; - } -}); -function useMatchesDefault2() { - throw new Error(`LineParser:useMatches not implemented`); -} -var LineParser2; -var RemoteLineParser2; -var init_line_parser2 = __esm2({ - "src/lib/utils/line-parser.ts"() { - "use strict"; - LineParser2 = class { - constructor(regExp, useMatches) { - this.matches = []; - this.useMatches = useMatchesDefault2; - this.parse = (line, target) => { - this.resetMatches(); - if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) { - return false; - } - return this.useMatches(target, this.prepareMatches()) !== false; - }; - this._regExp = Array.isArray(regExp) ? regExp : [regExp]; - if (useMatches) { - this.useMatches = useMatches; - } - } - resetMatches() { - this.matches.length = 0; - } - prepareMatches() { - return this.matches; - } - addMatch(reg, index, line) { - const matched = line && reg.exec(line); - if (matched) { - this.pushMatch(index, matched); - } - return !!matched; - } - pushMatch(_index, matched) { - this.matches.push(...matched.slice(1)); - } - }; - RemoteLineParser2 = class extends LineParser2 { - addMatch(reg, index, line) { - return /^remote:\s/.test(String(line)) && super.addMatch(reg, index, line); - } - pushMatch(index, matched) { - if (index > 0 || matched.length > 1) { - super.pushMatch(index, matched); - } - } - }; - } -}); -function createInstanceConfig2(...options) { - const baseDir = process.cwd(); - const config = Object.assign( - { baseDir, ...defaultOptions2 }, - ...options.filter((o) => typeof o === "object" && o) - ); - config.baseDir = config.baseDir || baseDir; - config.trimmed = config.trimmed === true; - return config; -} -var defaultOptions2; -var init_simple_git_options2 = __esm2({ - "src/lib/utils/simple-git-options.ts"() { - "use strict"; - defaultOptions2 = { - binary: "git", - maxConcurrentProcesses: 5, - config: [], - trimmed: false - }; - } -}); -function appendTaskOptions2(options, commands3 = []) { - if (!filterPlainObject2(options)) { - return commands3; - } - return Object.keys(options).reduce((commands22, key) => { - const value = options[key]; - if (isPathSpec2(value)) { - commands22.push(value); - } else if (filterPrimitives2(value, ["boolean"])) { - commands22.push(key + "=" + value); - } else if (Array.isArray(value)) { - for (const v of value) { - if (!filterPrimitives2(v, ["string", "number"])) { - commands22.push(key + "=" + v); - } - } - } else { - commands22.push(key); - } - return commands22; - }, commands3); -} -function getTrailingOptions2(args, initialPrimitive = 0, objectOnly = false) { - const command = []; - for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) { - if ("string|number".includes(typeof args[i])) { - command.push(String(args[i])); - } - } - appendTaskOptions2(trailingOptionsArgument2(args), command); - if (!objectOnly) { - command.push(...trailingArrayArgument2(args)); - } - return command; -} -function trailingArrayArgument2(args) { - const hasTrailingCallback = typeof last2(args) === "function"; - return asStringArray2(filterType2(last2(args, hasTrailingCallback ? 1 : 0), filterArray2, [])); -} -function trailingOptionsArgument2(args) { - const hasTrailingCallback = filterFunction2(last2(args)); - return filterType2(last2(args, hasTrailingCallback ? 1 : 0), filterPlainObject2); -} -function trailingFunctionArgument2(args, includeNoop = true) { - const callback = asFunction2(last2(args)); - return includeNoop || isUserFunction2(callback) ? callback : void 0; -} -var init_task_options2 = __esm2({ - "src/lib/utils/task-options.ts"() { - "use strict"; - init_argument_filters2(); - init_util2(); - init_pathspec2(); - } -}); -function callTaskParser2(parser42, streams) { - return parser42(streams.stdOut, streams.stdErr); -} -function parseStringResponse2(result, parsers122, texts, trim = true) { - asArray2(texts).forEach((text) => { - for (let lines = toLinesWithContent2(text, trim), i = 0, max = lines.length; i < max; i++) { - const line = (offset = 0) => { - if (i + offset >= max) { - return; - } - return lines[i + offset]; - }; - parsers122.some(({ parse: parse2 }) => parse2(line, result)); - } - }); - return result; -} -var init_task_parser2 = __esm2({ - "src/lib/utils/task-parser.ts"() { - "use strict"; - init_util2(); - } -}); -var utils_exports2 = {}; -__export3(utils_exports2, { - ExitCodes: () => ExitCodes2, - GitOutputStreams: () => GitOutputStreams2, - LineParser: () => LineParser2, - NOOP: () => NOOP2, - NULL: () => NULL2, - RemoteLineParser: () => RemoteLineParser2, - append: () => append2, - appendTaskOptions: () => appendTaskOptions2, - asArray: () => asArray2, - asCamelCase: () => asCamelCase2, - asFunction: () => asFunction2, - asNumber: () => asNumber2, - asStringArray: () => asStringArray2, - bufferToString: () => bufferToString2, - callTaskParser: () => callTaskParser2, - createInstanceConfig: () => createInstanceConfig2, - delay: () => delay2, - filterArray: () => filterArray2, - filterFunction: () => filterFunction2, - filterHasLength: () => filterHasLength2, - filterNumber: () => filterNumber2, - filterPlainObject: () => filterPlainObject2, - filterPrimitives: () => filterPrimitives2, - filterString: () => filterString2, - filterStringOrStringArray: () => filterStringOrStringArray2, - filterType: () => filterType2, - first: () => first2, - folderExists: () => folderExists2, - forEachLineWithContent: () => forEachLineWithContent2, - getTrailingOptions: () => getTrailingOptions2, - including: () => including2, - isUserFunction: () => isUserFunction2, - last: () => last2, - objectToString: () => objectToString2, - orVoid: () => orVoid2, - parseStringResponse: () => parseStringResponse2, - pick: () => pick2, - prefixedArray: () => prefixedArray2, - remove: () => remove2, - splitOn: () => splitOn2, - toLinesWithContent: () => toLinesWithContent2, - trailingFunctionArgument: () => trailingFunctionArgument2, - trailingOptionsArgument: () => trailingOptionsArgument2 -}); -var init_utils2 = __esm2({ - "src/lib/utils/index.ts"() { - "use strict"; - init_argument_filters2(); - init_exit_codes2(); - init_git_output_streams2(); - init_line_parser2(); - init_simple_git_options2(); - init_task_options2(); - init_task_parser2(); - init_util2(); - } -}); -var check_is_repo_exports2 = {}; -__export3(check_is_repo_exports2, { - CheckRepoActions: () => CheckRepoActions2, - checkIsBareRepoTask: () => checkIsBareRepoTask2, - checkIsRepoRootTask: () => checkIsRepoRootTask2, - checkIsRepoTask: () => checkIsRepoTask2 -}); -function checkIsRepoTask2(action) { - switch (action) { - case "bare": - return checkIsBareRepoTask2(); - case "root": - return checkIsRepoRootTask2(); - } - const commands3 = ["rev-parse", "--is-inside-work-tree"]; - return { - commands: commands3, - format: "utf-8", - onError: onError2, - parser: parser4 - }; -} -function checkIsRepoRootTask2() { - const commands3 = ["rev-parse", "--git-dir"]; - return { - commands: commands3, - format: "utf-8", - onError: onError2, - parser(path11) { - return /^\.(git)?$/.test(path11.trim()); - } - }; -} -function checkIsBareRepoTask2() { - const commands3 = ["rev-parse", "--is-bare-repository"]; - return { - commands: commands3, - format: "utf-8", - onError: onError2, - parser: parser4 - }; -} -function isNotRepoMessage2(error) { - return /(Not a git repository|Kein Git-Repository)/i.test(String(error)); -} -var CheckRepoActions2; -var onError2; -var parser4; -var init_check_is_repo2 = __esm2({ - "src/lib/tasks/check-is-repo.ts"() { - "use strict"; - init_utils2(); - CheckRepoActions2 = /* @__PURE__ */ ((CheckRepoActions22) => { - CheckRepoActions22["BARE"] = "bare"; - CheckRepoActions22["IN_TREE"] = "tree"; - CheckRepoActions22["IS_REPO_ROOT"] = "root"; - return CheckRepoActions22; - })(CheckRepoActions2 || {}); - onError2 = ({ exitCode }, error, done, fail) => { - if (exitCode === 128 && isNotRepoMessage2(error)) { - return done(Buffer.from("false")); - } - fail(error); - }; - parser4 = (text) => { - return text.trim() === "true"; - }; - } -}); -function cleanSummaryParser2(dryRun, text) { - const summary = new CleanResponse2(dryRun); - const regexp = dryRun ? dryRunRemovalRegexp2 : removalRegexp2; - toLinesWithContent2(text).forEach((line) => { - const removed = line.replace(regexp, ""); - summary.paths.push(removed); - (isFolderRegexp2.test(removed) ? summary.folders : summary.files).push(removed); - }); - return summary; -} -var CleanResponse2; -var removalRegexp2; -var dryRunRemovalRegexp2; -var isFolderRegexp2; -var init_CleanSummary2 = __esm2({ - "src/lib/responses/CleanSummary.ts"() { - "use strict"; - init_utils2(); - CleanResponse2 = class { - constructor(dryRun) { - this.dryRun = dryRun; - this.paths = []; - this.files = []; - this.folders = []; - } - }; - removalRegexp2 = /^[a-z]+\s*/i; - dryRunRemovalRegexp2 = /^[a-z]+\s+[a-z]+\s*/i; - isFolderRegexp2 = /\/$/; - } -}); -var task_exports2 = {}; -__export3(task_exports2, { - EMPTY_COMMANDS: () => EMPTY_COMMANDS2, - adhocExecTask: () => adhocExecTask2, - configurationErrorTask: () => configurationErrorTask2, - isBufferTask: () => isBufferTask2, - isEmptyTask: () => isEmptyTask2, - straightThroughBufferTask: () => straightThroughBufferTask2, - straightThroughStringTask: () => straightThroughStringTask2 -}); -function adhocExecTask2(parser42) { - return { - commands: EMPTY_COMMANDS2, - format: "empty", - parser: parser42 - }; -} -function configurationErrorTask2(error) { - return { - commands: EMPTY_COMMANDS2, - format: "empty", - parser() { - throw typeof error === "string" ? new TaskConfigurationError2(error) : error; - } - }; -} -function straightThroughStringTask2(commands3, trimmed22 = false) { - return { - commands: commands3, - format: "utf-8", - parser(text) { - return trimmed22 ? String(text).trim() : text; - } - }; -} -function straightThroughBufferTask2(commands3) { - return { - commands: commands3, - format: "buffer", - parser(buffer) { - return buffer; - } - }; -} -function isBufferTask2(task) { - return task.format === "buffer"; -} -function isEmptyTask2(task) { - return task.format === "empty" || !task.commands.length; -} -var EMPTY_COMMANDS2; -var init_task2 = __esm2({ - "src/lib/tasks/task.ts"() { - "use strict"; - init_task_configuration_error2(); - EMPTY_COMMANDS2 = []; - } -}); -var clean_exports2 = {}; -__export3(clean_exports2, { - CONFIG_ERROR_INTERACTIVE_MODE: () => CONFIG_ERROR_INTERACTIVE_MODE2, - CONFIG_ERROR_MODE_REQUIRED: () => CONFIG_ERROR_MODE_REQUIRED2, - CONFIG_ERROR_UNKNOWN_OPTION: () => CONFIG_ERROR_UNKNOWN_OPTION2, - CleanOptions: () => CleanOptions2, - cleanTask: () => cleanTask2, - cleanWithOptionsTask: () => cleanWithOptionsTask2, - isCleanOptionsArray: () => isCleanOptionsArray2 -}); -function cleanWithOptionsTask2(mode, customArgs) { - const { cleanMode, options, valid } = getCleanOptions2(mode); - if (!cleanMode) { - return configurationErrorTask2(CONFIG_ERROR_MODE_REQUIRED2); - } - if (!valid.options) { - return configurationErrorTask2(CONFIG_ERROR_UNKNOWN_OPTION2 + JSON.stringify(mode)); - } - options.push(...customArgs); - if (options.some(isInteractiveMode2)) { - return configurationErrorTask2(CONFIG_ERROR_INTERACTIVE_MODE2); - } - return cleanTask2(cleanMode, options); -} -function cleanTask2(mode, customArgs) { - const commands3 = ["clean", `-${mode}`, ...customArgs]; - return { - commands: commands3, - format: "utf-8", - parser(text) { - return cleanSummaryParser2(mode === "n", text); - } - }; -} -function isCleanOptionsArray2(input) { - return Array.isArray(input) && input.every((test) => CleanOptionValues2.has(test)); -} -function getCleanOptions2(input) { - let cleanMode; - let options = []; - let valid = { cleanMode: false, options: true }; - input - .replace(/[^a-z]i/g, "") - .split("") - .forEach((char) => { - if (isCleanMode2(char)) { - cleanMode = char; - valid.cleanMode = true; - } else { - valid.options = valid.options && isKnownOption2((options[options.length] = `-${char}`)); - } - }); - return { - cleanMode, - options, - valid - }; -} -function isCleanMode2(cleanMode) { - return cleanMode === "f" || cleanMode === "n"; -} -function isKnownOption2(option) { - return /^-[a-z]$/i.test(option) && CleanOptionValues2.has(option.charAt(1)); -} -function isInteractiveMode2(option) { - if (/^-[^\-]/.test(option)) { - return option.indexOf("i") > 0; - } - return option === "--interactive"; -} -var CONFIG_ERROR_INTERACTIVE_MODE2; -var CONFIG_ERROR_MODE_REQUIRED2; -var CONFIG_ERROR_UNKNOWN_OPTION2; -var CleanOptions2; -var CleanOptionValues2; -var init_clean2 = __esm2({ - "src/lib/tasks/clean.ts"() { - "use strict"; - init_CleanSummary2(); - init_utils2(); - init_task2(); - CONFIG_ERROR_INTERACTIVE_MODE2 = "Git clean interactive mode is not supported"; - CONFIG_ERROR_MODE_REQUIRED2 = 'Git clean mode parameter ("n" or "f") is required'; - CONFIG_ERROR_UNKNOWN_OPTION2 = "Git clean unknown option found in: "; - CleanOptions2 = /* @__PURE__ */ ((CleanOptions22) => { - CleanOptions22["DRY_RUN"] = "n"; - CleanOptions22["FORCE"] = "f"; - CleanOptions22["IGNORED_INCLUDED"] = "x"; - CleanOptions22["IGNORED_ONLY"] = "X"; - CleanOptions22["EXCLUDING"] = "e"; - CleanOptions22["QUIET"] = "q"; - CleanOptions22["RECURSIVE"] = "d"; - return CleanOptions22; - })(CleanOptions2 || {}); - CleanOptionValues2 = /* @__PURE__ */ new Set([ - "i", - ...asStringArray2(Object.values(CleanOptions2)) - ]); - } -}); -function configListParser2(text) { - const config = new ConfigList2(); - for (const item of configParser2(text)) { - config.addValue(item.file, String(item.key), item.value); - } - return config; -} -function configGetParser2(text, key) { - let value = null; - const values = []; - const scopes = /* @__PURE__ */ new Map(); - for (const item of configParser2(text, key)) { - if (item.key !== key) { - continue; - } - values.push((value = item.value)); - if (!scopes.has(item.file)) { - scopes.set(item.file, []); - } - scopes.get(item.file).push(value); - } - return { - key, - paths: Array.from(scopes.keys()), - scopes, - value, - values - }; -} -function configFilePath2(filePath) { - return filePath.replace(/^(file):/, ""); -} -function* configParser2(text, requestedKey = null) { - const lines = text.split("\0"); - for (let i = 0, max = lines.length - 1; i < max; ) { - const file = configFilePath2(lines[i++]); - let value = lines[i++]; - let key = requestedKey; - if (value.includes("\n")) { - const line = splitOn2(value, "\n"); - key = line[0]; - value = line[1]; - } - yield { file, key, value }; - } -} -var ConfigList2; -var init_ConfigList2 = __esm2({ - "src/lib/responses/ConfigList.ts"() { - "use strict"; - init_utils2(); - ConfigList2 = class { - constructor() { - this.files = []; - this.values = /* @__PURE__ */ Object.create(null); - } - get all() { - if (!this._all) { - this._all = this.files.reduce((all, file) => { - return Object.assign(all, this.values[file]); - }, {}); - } - return this._all; - } - addFile(file) { - if (!(file in this.values)) { - const latest = last2(this.files); - this.values[file] = latest ? Object.create(this.values[latest]) : {}; - this.files.push(file); - } - return this.values[file]; - } - addValue(file, key, value) { - const values = this.addFile(file); - if (!Object.hasOwn(values, key)) { - values[key] = value; - } else if (Array.isArray(values[key])) { - values[key].push(value); - } else { - values[key] = [values[key], value]; - } - this._all = void 0; - } - }; - } -}); -function asConfigScope2(scope, fallback) { - if (typeof scope === "string" && Object.hasOwn(GitConfigScope2, scope)) { - return scope; - } - return fallback; -} -function addConfigTask2(key, value, append22, scope) { - const commands3 = ["config", `--${scope}`]; - if (append22) { - commands3.push("--add"); - } - commands3.push(key, value); - return { - commands: commands3, - format: "utf-8", - parser(text) { - return text; - } - }; -} -function getConfigTask2(key, scope) { - const commands3 = ["config", "--null", "--show-origin", "--get-all", key]; - if (scope) { - commands3.splice(1, 0, `--${scope}`); - } - return { - commands: commands3, - format: "utf-8", - parser(text) { - return configGetParser2(text, key); - } - }; -} -function listConfigTask2(scope) { - const commands3 = ["config", "--list", "--show-origin", "--null"]; - if (scope) { - commands3.push(`--${scope}`); - } - return { - commands: commands3, - format: "utf-8", - parser(text) { - return configListParser2(text); - } - }; -} -function config_default2() { - return { - addConfig(key, value, ...rest) { - return this._runTask( - addConfigTask2( - key, - value, - rest[0] === true, - asConfigScope2( - rest[1], - "local" - /* local */ - ) - ), - trailingFunctionArgument2(arguments) - ); - }, - getConfig(key, scope) { - return this._runTask( - getConfigTask2(key, asConfigScope2(scope, void 0)), - trailingFunctionArgument2(arguments) - ); - }, - listConfig(...rest) { - return this._runTask( - listConfigTask2(asConfigScope2(rest[0], void 0)), - trailingFunctionArgument2(arguments) - ); - } - }; -} -var GitConfigScope2; -var init_config2 = __esm2({ - "src/lib/tasks/config.ts"() { - "use strict"; - init_ConfigList2(); - init_utils2(); - GitConfigScope2 = /* @__PURE__ */ ((GitConfigScope22) => { - GitConfigScope22["system"] = "system"; - GitConfigScope22["global"] = "global"; - GitConfigScope22["local"] = "local"; - GitConfigScope22["worktree"] = "worktree"; - return GitConfigScope22; - })(GitConfigScope2 || {}); - } -}); -function isDiffNameStatus2(input) { - return diffNameStatus2.has(input); -} -var DiffNameStatus2; -var diffNameStatus2; -var init_diff_name_status2 = __esm2({ - "src/lib/tasks/diff-name-status.ts"() { - "use strict"; - DiffNameStatus2 = /* @__PURE__ */ ((DiffNameStatus22) => { - DiffNameStatus22["ADDED"] = "A"; - DiffNameStatus22["COPIED"] = "C"; - DiffNameStatus22["DELETED"] = "D"; - DiffNameStatus22["MODIFIED"] = "M"; - DiffNameStatus22["RENAMED"] = "R"; - DiffNameStatus22["CHANGED"] = "T"; - DiffNameStatus22["UNMERGED"] = "U"; - DiffNameStatus22["UNKNOWN"] = "X"; - DiffNameStatus22["BROKEN"] = "B"; - return DiffNameStatus22; - })(DiffNameStatus2 || {}); - diffNameStatus2 = new Set(Object.values(DiffNameStatus2)); - } -}); -function grepQueryBuilder2(...params) { - return new GrepQuery2().param(...params); -} -function parseGrep2(grep) { - const paths = /* @__PURE__ */ new Set(); - const results = {}; - forEachLineWithContent2(grep, (input) => { - const [path11, line, preview] = input.split(NULL2); - paths.add(path11); - (results[path11] = results[path11] || []).push({ - line: asNumber2(line), - path: path11, - preview - }); - }); - return { - paths, - results - }; -} -function grep_default2() { - return { - grep(searchTerm) { - const then = trailingFunctionArgument2(arguments); - const options = getTrailingOptions2(arguments); - for (const option of disallowedOptions2) { - if (options.includes(option)) { - return this._runTask( - configurationErrorTask2(`git.grep: use of "${option}" is not supported.`), - then - ); - } - } - if (typeof searchTerm === "string") { - searchTerm = grepQueryBuilder2().param(searchTerm); - } - const commands3 = ["grep", "--null", "-n", "--full-name", ...options, ...searchTerm]; - return this._runTask( - { - commands: commands3, - format: "utf-8", - parser(stdOut) { - return parseGrep2(stdOut); - } - }, - then - ); - } - }; -} -var disallowedOptions2; -var Query2; -var _a2; -var GrepQuery2; -var init_grep2 = __esm2({ - "src/lib/tasks/grep.ts"() { - "use strict"; - init_utils2(); - init_task2(); - disallowedOptions2 = ["-h"]; - Query2 = Symbol("grepQuery"); - GrepQuery2 = class { - constructor() { - this[_a2] = []; - } - *[((_a2 = Query2), Symbol.iterator)]() { - for (const query of this[Query2]) { - yield query; - } - } - and(...and) { - and.length && this[Query2].push("--and", "(", ...prefixedArray2(and, "-e"), ")"); - return this; - } - param(...param) { - this[Query2].push(...prefixedArray2(param, "-e")); - return this; - } - }; - } -}); -var reset_exports2 = {}; -__export3(reset_exports2, { - ResetMode: () => ResetMode2, - getResetMode: () => getResetMode2, - resetTask: () => resetTask2 -}); -function resetTask2(mode, customArgs) { - const commands3 = ["reset"]; - if (isValidResetMode2(mode)) { - commands3.push(`--${mode}`); - } - commands3.push(...customArgs); - return straightThroughStringTask2(commands3); -} -function getResetMode2(mode) { - if (isValidResetMode2(mode)) { - return mode; - } - switch (typeof mode) { - case "string": - case "undefined": - return "soft"; - } - return; -} -function isValidResetMode2(mode) { - return typeof mode === "string" && validResetModes2.includes(mode); -} -var ResetMode2; -var validResetModes2; -var init_reset2 = __esm2({ - "src/lib/tasks/reset.ts"() { - "use strict"; - init_utils2(); - init_task2(); - ResetMode2 = /* @__PURE__ */ ((ResetMode22) => { - ResetMode22["MIXED"] = "mixed"; - ResetMode22["SOFT"] = "soft"; - ResetMode22["HARD"] = "hard"; - ResetMode22["MERGE"] = "merge"; - ResetMode22["KEEP"] = "keep"; - return ResetMode22; - })(ResetMode2 || {}); - validResetModes2 = asStringArray2(Object.values(ResetMode2)); - } -}); -function createLog2() { - return (0, import_debug2.default)("simple-git"); -} -function prefixedLogger2(to, prefix, forward) { - if (!prefix || !String(prefix).replace(/\s*/, "")) { - return !forward - ? to - : (message, ...args) => { - to(message, ...args); - forward(message, ...args); - }; - } - return (message, ...args) => { - to(`%s ${message}`, prefix, ...args); - if (forward) { - forward(message, ...args); - } - }; -} -function childLoggerName2(name, childDebugger, { namespace: parentNamespace }) { - if (typeof name === "string") { - return name; - } - const childNamespace = (childDebugger && childDebugger.namespace) || ""; - if (childNamespace.startsWith(parentNamespace)) { - return childNamespace.substr(parentNamespace.length + 1); - } - return childNamespace || parentNamespace; -} -function createLogger3(label, verbose, initialStep, infoDebugger = createLog2()) { - const labelPrefix = (label && `[${label}]`) || ""; - const spawned = []; - const debugDebugger = typeof verbose === "string" ? infoDebugger.extend(verbose) : verbose; - const key = childLoggerName2(filterType2(verbose, filterString2), debugDebugger, infoDebugger); - return step(initialStep); - function sibling(name, initial) { - return append2( - spawned, - createLogger3(label, key.replace(/^[^:]+/, name), initial, infoDebugger) - ); - } - function step(phase) { - const stepPrefix = (phase && `[${phase}]`) || ""; - const debug22 = (debugDebugger && prefixedLogger2(debugDebugger, stepPrefix)) || NOOP2; - const info = prefixedLogger2(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug22); - return Object.assign(debugDebugger ? debug22 : info, { - label, - sibling, - info, - step - }); - } -} -var init_git_logger2 = __esm2({ - "src/lib/git-logger.ts"() { - "use strict"; - init_utils2(); - import_debug2.default.formatters.L = (value) => - String(filterHasLength2(value) ? value.length : "-"); - import_debug2.default.formatters.B = (value) => { - if (Buffer.isBuffer(value)) { - return value.toString("utf8"); - } - return objectToString2(value); - }; - } -}); -var TasksPendingQueue2; -var init_tasks_pending_queue2 = __esm2({ - "src/lib/runners/tasks-pending-queue.ts"() { - "use strict"; - init_git_error2(); - init_git_logger2(); - TasksPendingQueue2 = class _TasksPendingQueue { - constructor(logLabel = "GitExecutor") { - this.logLabel = logLabel; - this._queue = /* @__PURE__ */ new Map(); - } - withProgress(task) { - return this._queue.get(task); - } - createProgress(task) { - const name = _TasksPendingQueue.getName(task.commands[0]); - const logger = createLogger3(this.logLabel, name); - return { - task, - logger, - name - }; - } - push(task) { - const progress = this.createProgress(task); - progress.logger("Adding task to the queue, commands = %o", task.commands); - this._queue.set(task, progress); - return progress; - } - fatal(err) { - for (const [task, { logger }] of Array.from(this._queue.entries())) { - if (task === err.task) { - logger.info(`Failed %o`, err); - logger( - `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted` - ); - } else { - logger.info( - `A fatal exception occurred in a previous task, the queue has been purged: %o`, - err.message - ); - } - this.complete(task); - } - if (this._queue.size !== 0) { - throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`); - } - } - complete(task) { - const progress = this.withProgress(task); - if (progress) { - this._queue.delete(task); - } - } - attempt(task) { - const progress = this.withProgress(task); - if (!progress) { - throw new GitError2(void 0, "TasksPendingQueue: attempt called for an unknown task"); - } - progress.logger("Starting task"); - return progress; - } - static getName(name = "empty") { - return `task:${name}:${++_TasksPendingQueue.counter}`; - } - static { - this.counter = 0; - } - }; - } -}); -function pluginContext2(task, commands3) { - return { - method: first2(task.commands) || "", - commands: commands3 - }; -} -function onErrorReceived2(target, logger) { - return (err) => { - logger(`[ERROR] child process exception %o`, err); - target.push(Buffer.from(String(err.stack), "ascii")); - }; -} -function onDataReceived2(target, name, logger, output) { - return (buffer) => { - logger(`%s received %L bytes`, name, buffer); - output(`%B`, buffer); - target.push(buffer); - }; -} -var GitExecutorChain2; -var init_git_executor_chain2 = __esm2({ - "src/lib/runners/git-executor-chain.ts"() { - "use strict"; - init_git_error2(); - init_task2(); - init_utils2(); - init_tasks_pending_queue2(); - GitExecutorChain2 = class { - constructor(_executor, _scheduler, _plugins) { - this._executor = _executor; - this._scheduler = _scheduler; - this._plugins = _plugins; - this._chain = Promise.resolve(); - this._queue = new TasksPendingQueue2(); - } - get cwd() { - return this._cwd || this._executor.cwd; - } - set cwd(cwd) { - this._cwd = cwd; - } - get env() { - return this._executor.env; - } - get outputHandler() { - return this._executor.outputHandler; - } - chain() { - return this; - } - push(task) { - this._queue.push(task); - return (this._chain = this._chain.then(() => this.attemptTask(task))); - } - async attemptTask(task) { - const onScheduleComplete = await this._scheduler.next(); - const onQueueComplete = () => this._queue.complete(task); - try { - const { logger } = this._queue.attempt(task); - return await (isEmptyTask2(task) - ? this.attemptEmptyTask(task, logger) - : this.attemptRemoteTask(task, logger)); - } catch (e) { - throw this.onFatalException(task, e); - } finally { - onQueueComplete(); - onScheduleComplete(); - } - } - onFatalException(task, e) { - const gitError = - e instanceof GitError2 ? Object.assign(e, { task }) : new GitError2(task, e && String(e)); - this._chain = Promise.resolve(); - this._queue.fatal(gitError); - return gitError; - } - async attemptRemoteTask(task, logger) { - const binary = this._plugins.exec("spawn.binary", "", pluginContext2(task, task.commands)); - const args = this._plugins.exec( - "spawn.args", - [...task.commands], - pluginContext2(task, task.commands) - ); - const raw = await this.gitResponse( - task, - binary, - args, - this.outputHandler, - logger.step("SPAWN") - ); - const outputStreams = await this.handleTaskData(task, args, raw, logger.step("HANDLE")); - logger(`passing response to task's parser as a %s`, task.format); - if (isBufferTask2(task)) { - return callTaskParser2(task.parser, outputStreams); - } - return callTaskParser2(task.parser, outputStreams.asStrings()); - } - async attemptEmptyTask(task, logger) { - logger(`empty task bypassing child process to call to task's parser`); - return task.parser(this); - } - handleTaskData(task, args, result, logger) { - const { exitCode, rejection, stdOut, stdErr } = result; - return new Promise((done, fail) => { - logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); - const { error } = this._plugins.exec( - "task.error", - { error: rejection }, - { - ...pluginContext2(task, args), - ...result - } - ); - if (error && task.onError) { - logger.info(`exitCode=%s handling with custom error handler`); - return task.onError( - result, - error, - (newStdOut) => { - logger.info(`custom error handler treated as success`); - logger(`custom error returned a %s`, objectToString2(newStdOut)); - done( - new GitOutputStreams2( - Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, - Buffer.concat(stdErr) - ) - ); - }, - fail - ); - } - if (error) { - logger.info( - `handling as error: exitCode=%s stdErr=%s rejection=%o`, - exitCode, - stdErr.length, - rejection - ); - return fail(error); - } - logger.info(`retrieving task output complete`); - done(new GitOutputStreams2(Buffer.concat(stdOut), Buffer.concat(stdErr))); - }); - } - async gitResponse(task, command, args, outputHandler, logger) { - const outputLogger = logger.sibling("output"); - const spawnOptions = this._plugins.exec( - "spawn.options", - { - cwd: this.cwd, - env: this.env, - windowsHide: true - }, - pluginContext2(task, task.commands) - ); - return new Promise((done) => { - const stdOut = []; - const stdErr = []; - logger.info(`%s %o`, command, args); - logger("%O", spawnOptions); - let rejection = this._beforeSpawn(task, args); - if (rejection) { - return done({ - stdOut, - stdErr, - exitCode: 9901, - rejection - }); - } - this._plugins.exec("spawn.before", void 0, { - ...pluginContext2(task, args), - kill(reason) { - rejection = reason || rejection; - } - }); - const spawned = (0, import_child_process2.spawn)(command, args, spawnOptions); - spawned.stdout.on( - "data", - onDataReceived2(stdOut, "stdOut", logger, outputLogger.step("stdOut")) - ); - spawned.stderr.on( - "data", - onDataReceived2(stdErr, "stdErr", logger, outputLogger.step("stdErr")) - ); - spawned.on("error", onErrorReceived2(stdErr, logger)); - if (outputHandler) { - logger(`Passing child process stdOut/stdErr to custom outputHandler`); - outputHandler(command, spawned.stdout, spawned.stderr, [...args]); - } - this._plugins.exec("spawn.after", void 0, { - ...pluginContext2(task, args), - spawned, - close(exitCode, reason) { - done({ - stdOut, - stdErr, - exitCode, - rejection: rejection || reason - }); - }, - kill(reason) { - if (spawned.killed) { - return; - } - rejection = reason; - spawned.kill("SIGINT"); - } - }); - }); - } - _beforeSpawn(task, args) { - let rejection; - this._plugins.exec("spawn.before", void 0, { - ...pluginContext2(task, args), - kill(reason) { - rejection = reason || rejection; - } - }); - return rejection; - } - }; - } -}); -var git_executor_exports2 = {}; -__export3(git_executor_exports2, { - GitExecutor: () => GitExecutor2 -}); -var GitExecutor2; -var init_git_executor2 = __esm2({ - "src/lib/runners/git-executor.ts"() { - "use strict"; - init_git_executor_chain2(); - GitExecutor2 = class { - constructor(cwd, _scheduler, _plugins) { - this.cwd = cwd; - this._scheduler = _scheduler; - this._plugins = _plugins; - this._chain = new GitExecutorChain2(this, this._scheduler, this._plugins); - } - chain() { - return new GitExecutorChain2(this, this._scheduler, this._plugins); - } - push(task) { - return this._chain.push(task); - } - }; - } -}); -function taskCallback2(task, response, callback = NOOP2) { - const onSuccess = (data) => { - callback(null, data); - }; - const onError22 = (err) => { - if (err?.task === task) { - callback(err instanceof GitResponseError2 ? addDeprecationNoticeToError2(err) : err, void 0); - } - }; - response.then(onSuccess, onError22); -} -function addDeprecationNoticeToError2(err) { - let log = (name) => { - console.warn( - `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3` - ); - log = NOOP2; - }; - return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); - function descriptorReducer(all, name) { - if (name in err) { - return all; - } - all[name] = { - enumerable: false, - configurable: false, - get() { - log(name); - return err.git[name]; - } - }; - return all; - } -} -var init_task_callback2 = __esm2({ - "src/lib/task-callback.ts"() { - "use strict"; - init_git_response_error2(); - init_utils2(); - } -}); -function changeWorkingDirectoryTask2(directory, root) { - return adhocExecTask2((instance) => { - if (!folderExists2(directory)) { - throw new Error(`Git.cwd: cannot change to non-directory "${directory}"`); - } - return ((root || instance).cwd = directory); - }); -} -var init_change_working_directory2 = __esm2({ - "src/lib/tasks/change-working-directory.ts"() { - "use strict"; - init_utils2(); - init_task2(); - } -}); -function checkoutTask2(args) { - const commands3 = ["checkout", ...args]; - if (commands3[1] === "-b" && commands3.includes("-B")) { - commands3[1] = remove2(commands3, "-B"); - } - return straightThroughStringTask2(commands3); -} -function checkout_default2() { - return { - checkout() { - return this._runTask( - checkoutTask2(getTrailingOptions2(arguments, 1)), - trailingFunctionArgument2(arguments) - ); - }, - checkoutBranch(branchName, startPoint) { - return this._runTask( - checkoutTask2(["-b", branchName, startPoint, ...getTrailingOptions2(arguments)]), - trailingFunctionArgument2(arguments) - ); - }, - checkoutLocalBranch(branchName) { - return this._runTask( - checkoutTask2(["-b", branchName, ...getTrailingOptions2(arguments)]), - trailingFunctionArgument2(arguments) - ); - } - }; -} -var init_checkout2 = __esm2({ - "src/lib/tasks/checkout.ts"() { - "use strict"; - init_utils2(); - init_task2(); - } -}); -function countObjectsResponse2() { - return { - count: 0, - garbage: 0, - inPack: 0, - packs: 0, - prunePackable: 0, - size: 0, - sizeGarbage: 0, - sizePack: 0 - }; -} -function count_objects_default2() { - return { - countObjects() { - return this._runTask({ - commands: ["count-objects", "--verbose"], - format: "utf-8", - parser(stdOut) { - return parseStringResponse2(countObjectsResponse2(), [parser22], stdOut); - } - }); - } - }; -} -var parser22; -var init_count_objects2 = __esm2({ - "src/lib/tasks/count-objects.ts"() { - "use strict"; - init_utils2(); - parser22 = new LineParser2(/([a-z-]+): (\d+)$/, (result, [key, value]) => { - const property = asCamelCase2(key); - if (Object.hasOwn(result, property)) { - result[property] = asNumber2(value); - } - }); - } -}); -function parseCommitResult2(stdOut) { - const result = { - author: null, - branch: "", - commit: "", - root: false, - summary: { - changes: 0, - insertions: 0, - deletions: 0 - } - }; - return parseStringResponse2(result, parsers12, stdOut); -} -var parsers12; -var init_parse_commit2 = __esm2({ - "src/lib/parsers/parse-commit.ts"() { - "use strict"; - init_utils2(); - parsers12 = [ - new LineParser2(/^\[([^\s]+)( \([^)]+\))? ([^\]]+)/, (result, [branch, root, commit]) => { - result.branch = branch; - result.commit = commit; - result.root = !!root; - }), - new LineParser2(/\s*Author:\s(.+)/i, (result, [author]) => { - const parts = author.split("<"); - const email = parts.pop(); - if (!email || !email.includes("@")) { - return; - } - result.author = { - email: email.substr(0, email.length - 1), - name: parts.join("<").trim() - }; - }), - new LineParser2( - /(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, - (result, [changes, insertions, deletions]) => { - result.summary.changes = parseInt(changes, 10) || 0; - result.summary.insertions = parseInt(insertions, 10) || 0; - result.summary.deletions = parseInt(deletions, 10) || 0; - } - ), - new LineParser2( - /^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, - (result, [changes, lines, direction]) => { - result.summary.changes = parseInt(changes, 10) || 0; - const count = parseInt(lines, 10) || 0; - if (direction === "-") { - result.summary.deletions = count; - } else if (direction === "+") { - result.summary.insertions = count; - } - } - ) - ]; - } -}); -function commitTask2(message, files, customArgs) { - const commands3 = [ - "-c", - "core.abbrev=40", - "commit", - ...prefixedArray2(message, "-m"), - ...files, - ...customArgs - ]; - return { - commands: commands3, - format: "utf-8", - parser: parseCommitResult2 - }; -} -function commit_default2() { - return { - commit(message, ...rest) { - const next = trailingFunctionArgument2(arguments); - const task = - rejectDeprecatedSignatures(message) || - commitTask2( - asArray2(message), - asArray2(filterType2(rest[0], filterStringOrStringArray2, [])), - [ - ...asStringArray2(filterType2(rest[1], filterArray2, [])), - ...getTrailingOptions2(arguments, 0, true) - ] - ); - return this._runTask(task, next); - } - }; - function rejectDeprecatedSignatures(message) { - return ( - !filterStringOrStringArray2(message) && - configurationErrorTask2( - `git.commit: requires the commit message to be supplied as a string/string[]` - ) - ); - } -} -var init_commit2 = __esm2({ - "src/lib/tasks/commit.ts"() { - "use strict"; - init_parse_commit2(); - init_utils2(); - init_task2(); - } -}); -function first_commit_default2() { - return { - firstCommit() { - return this._runTask( - straightThroughStringTask2(["rev-list", "--max-parents=0", "HEAD"], true), - trailingFunctionArgument2(arguments) - ); - } - }; -} -var init_first_commit2 = __esm2({ - "src/lib/tasks/first-commit.ts"() { - "use strict"; - init_utils2(); - init_task2(); - } -}); -function hashObjectTask2(filePath, write) { - const commands3 = ["hash-object", filePath]; - if (write) { - commands3.push("-w"); - } - return straightThroughStringTask2(commands3, true); -} -var init_hash_object2 = __esm2({ - "src/lib/tasks/hash-object.ts"() { - "use strict"; - init_task2(); - } -}); -function parseInit2(bare, path11, text) { - const response = String(text).trim(); - let result; - if ((result = initResponseRegex2.exec(response))) { - return new InitSummary2(bare, path11, false, result[1]); - } - if ((result = reInitResponseRegex2.exec(response))) { - return new InitSummary2(bare, path11, true, result[1]); - } - let gitDir = ""; - const tokens = response.split(" "); - while (tokens.length) { - const token = tokens.shift(); - if (token === "in") { - gitDir = tokens.join(" "); - break; - } - } - return new InitSummary2(bare, path11, /^re/i.test(response), gitDir); -} -var InitSummary2; -var initResponseRegex2; -var reInitResponseRegex2; -var init_InitSummary2 = __esm2({ - "src/lib/responses/InitSummary.ts"() { - "use strict"; - InitSummary2 = class { - constructor(bare, path11, existing, gitDir) { - this.bare = bare; - this.path = path11; - this.existing = existing; - this.gitDir = gitDir; - } - }; - initResponseRegex2 = /^Init.+ repository in (.+)$/; - reInitResponseRegex2 = /^Rein.+ in (.+)$/; - } -}); -function hasBareCommand2(command) { - return command.includes(bareCommand2); -} -function initTask2(bare = false, path11, customArgs) { - const commands3 = ["init", ...customArgs]; - if (bare && !hasBareCommand2(commands3)) { - commands3.splice(1, 0, bareCommand2); - } - return { - commands: commands3, - format: "utf-8", - parser(text) { - return parseInit2(commands3.includes("--bare"), path11, text); - } - }; -} -var bareCommand2; -var init_init2 = __esm2({ - "src/lib/tasks/init.ts"() { - "use strict"; - init_InitSummary2(); - bareCommand2 = "--bare"; - } -}); -function logFormatFromCommand2(customArgs) { - for (let i = 0; i < customArgs.length; i++) { - const format = logFormatRegex2.exec(customArgs[i]); - if (format) { - return `--${format[1]}`; - } - } - return ""; -} -function isLogFormat2(customArg) { - return logFormatRegex2.test(customArg); -} -var logFormatRegex2; -var init_log_format2 = __esm2({ - "src/lib/args/log-format.ts"() { - "use strict"; - logFormatRegex2 = /^--(stat|numstat|name-only|name-status)(=|$)/; - } -}); -var DiffSummary2; -var init_DiffSummary2 = __esm2({ - "src/lib/responses/DiffSummary.ts"() { - "use strict"; - DiffSummary2 = class { - constructor() { - this.changed = 0; - this.deletions = 0; - this.insertions = 0; - this.files = []; - } - }; - } -}); -function getDiffParser2(format = "") { - const parser42 = diffSummaryParsers2[format]; - return (stdOut) => parseStringResponse2(new DiffSummary2(), parser42, stdOut, false); -} -var statParser2; -var numStatParser2; -var nameOnlyParser2; -var nameStatusParser2; -var diffSummaryParsers2; -var init_parse_diff_summary2 = __esm2({ - "src/lib/parsers/parse-diff-summary.ts"() { - "use strict"; - init_log_format2(); - init_DiffSummary2(); - init_diff_name_status2(); - init_utils2(); - statParser2 = [ - new LineParser2( - /^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, - (result, [file, changes, alterations = ""]) => { - result.files.push({ - file: file.trim(), - changes: asNumber2(changes), - insertions: alterations.replace(/[^+]/g, "").length, - deletions: alterations.replace(/[^-]/g, "").length, - binary: false - }); - } - ), - new LineParser2( - /^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, - (result, [file, before, after]) => { - result.files.push({ - file: file.trim(), - before: asNumber2(before), - after: asNumber2(after), - binary: true - }); - } - ), - new LineParser2( - /(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, - (result, [changed, summary]) => { - const inserted = /(\d+) i/.exec(summary); - const deleted = /(\d+) d/.exec(summary); - result.changed = asNumber2(changed); - result.insertions = asNumber2(inserted?.[1]); - result.deletions = asNumber2(deleted?.[1]); - } - ) - ]; - numStatParser2 = [ - new LineParser2(/(\d+)\t(\d+)\t(.+)$/, (result, [changesInsert, changesDelete, file]) => { - const insertions = asNumber2(changesInsert); - const deletions = asNumber2(changesDelete); - result.changed++; - result.insertions += insertions; - result.deletions += deletions; - result.files.push({ - file, - changes: insertions + deletions, - insertions, - deletions, - binary: false - }); - }), - new LineParser2(/-\t-\t(.+)$/, (result, [file]) => { - result.changed++; - result.files.push({ - file, - after: 0, - before: 0, - binary: true - }); - }) - ]; - nameOnlyParser2 = [ - new LineParser2(/(.+)$/, (result, [file]) => { - result.changed++; - result.files.push({ - file, - changes: 0, - insertions: 0, - deletions: 0, - binary: false - }); - }) - ]; - nameStatusParser2 = [ - new LineParser2( - /([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, - (result, [status, similarity, from, _to, to]) => { - result.changed++; - result.files.push({ - file: to ?? from, - changes: 0, - insertions: 0, - deletions: 0, - binary: false, - status: orVoid2(isDiffNameStatus2(status) && status), - from: orVoid2(!!to && from !== to && from), - similarity: asNumber2(similarity) - }); - } - ) - ]; - diffSummaryParsers2 = { - [""]: - /* NONE */ - statParser2, - ["--stat"]: - /* STAT */ - statParser2, - ["--numstat"]: - /* NUM_STAT */ - numStatParser2, - ["--name-status"]: - /* NAME_STATUS */ - nameStatusParser2, - ["--name-only"]: - /* NAME_ONLY */ - nameOnlyParser2 - }; - } -}); -function lineBuilder2(tokens, fields) { - return fields.reduce( - (line, field, index) => { - line[field] = tokens[index] || ""; - return line; - }, - /* @__PURE__ */ Object.create({ diff: null }) - ); -} -function createListLogSummaryParser2( - splitter = SPLITTER2, - fields = defaultFieldNames2, - logFormat = "" -) { - const parseDiffResult = getDiffParser2(logFormat); - return function (stdOut) { - const all = toLinesWithContent2(stdOut.trim(), false, START_BOUNDARY2).map(function (item) { - const lineDetail = item.split(COMMIT_BOUNDARY2); - const listLogLine = lineBuilder2(lineDetail[0].split(splitter), fields); - if (lineDetail.length > 1 && !!lineDetail[1].trim()) { - listLogLine.diff = parseDiffResult(lineDetail[1]); - } - return listLogLine; - }); - return { - all, - latest: (all.length && all[0]) || null, - total: all.length - }; - }; -} -var START_BOUNDARY2; -var COMMIT_BOUNDARY2; -var SPLITTER2; -var defaultFieldNames2; -var init_parse_list_log_summary2 = __esm2({ - "src/lib/parsers/parse-list-log-summary.ts"() { - "use strict"; - init_utils2(); - init_parse_diff_summary2(); - init_log_format2(); - START_BOUNDARY2 = "\xF2\xF2\xF2\xF2\xF2\xF2 "; - COMMIT_BOUNDARY2 = " \xF2\xF2"; - SPLITTER2 = " \xF2 "; - defaultFieldNames2 = ["hash", "date", "message", "refs", "author_name", "author_email"]; - } -}); -var diff_exports2 = {}; -__export3(diff_exports2, { - diffSummaryTask: () => diffSummaryTask2, - validateLogFormatConfig: () => validateLogFormatConfig2 -}); -function diffSummaryTask2(customArgs) { - let logFormat = logFormatFromCommand2(customArgs); - const commands3 = ["diff"]; - if (logFormat === "") { - logFormat = "--stat"; - commands3.push("--stat=4096"); - } - commands3.push(...customArgs); - return ( - validateLogFormatConfig2(commands3) || { - commands: commands3, - format: "utf-8", - parser: getDiffParser2(logFormat) - } - ); -} -function validateLogFormatConfig2(customArgs) { - const flags = customArgs.filter(isLogFormat2); - if (flags.length > 1) { - return configurationErrorTask2( - `Summary flags are mutually exclusive - pick one of ${flags.join(",")}` - ); - } - if (flags.length && customArgs.includes("-z")) { - return configurationErrorTask2( - `Summary flag ${flags} parsing is not compatible with null termination option '-z'` - ); - } -} -var init_diff2 = __esm2({ - "src/lib/tasks/diff.ts"() { - "use strict"; - init_log_format2(); - init_parse_diff_summary2(); - init_task2(); - } -}); -function prettyFormat2(format, splitter) { - const fields = []; - const formatStr = []; - Object.keys(format).forEach((field) => { - fields.push(field); - formatStr.push(String(format[field])); - }); - return [fields, formatStr.join(splitter)]; -} -function userOptions2(input) { - return Object.keys(input).reduce((out, key) => { - if (!(key in excludeOptions2)) { - out[key] = input[key]; - } - return out; - }, {}); -} -function parseLogOptions2(opt = {}, customArgs = []) { - const splitter = filterType2(opt.splitter, filterString2, SPLITTER2); - const format = filterPlainObject2(opt.format) - ? opt.format - : { - hash: "%H", - date: opt.strictDate === false ? "%ai" : "%aI", - message: "%s", - refs: "%D", - body: opt.multiLine ? "%B" : "%b", - author_name: opt.mailMap !== false ? "%aN" : "%an", - author_email: opt.mailMap !== false ? "%aE" : "%ae" - }; - const [fields, formatStr] = prettyFormat2(format, splitter); - const suffix = []; - const command = [ - `--pretty=format:${START_BOUNDARY2}${formatStr}${COMMIT_BOUNDARY2}`, - ...customArgs - ]; - const maxCount = opt.n || opt["max-count"] || opt.maxCount; - if (maxCount) { - command.push(`--max-count=${maxCount}`); - } - if (opt.from || opt.to) { - const rangeOperator = opt.symmetric !== false ? "..." : ".."; - suffix.push(`${opt.from || ""}${rangeOperator}${opt.to || ""}`); - } - if (filterString2(opt.file)) { - command.push("--follow", pathspec2(opt.file)); - } - appendTaskOptions2(userOptions2(opt), command); - return { - fields, - splitter, - commands: [...command, ...suffix] - }; -} -function logTask2(splitter, fields, customArgs) { - const parser42 = createListLogSummaryParser2(splitter, fields, logFormatFromCommand2(customArgs)); - return { - commands: ["log", ...customArgs], - format: "utf-8", - parser: parser42 - }; -} -function log_default2() { - return { - log(...rest) { - const next = trailingFunctionArgument2(arguments); - const options = parseLogOptions2( - trailingOptionsArgument2(arguments), - asStringArray2(filterType2(arguments[0], filterArray2, [])) - ); - const task = - rejectDeprecatedSignatures(...rest) || - validateLogFormatConfig2(options.commands) || - createLogTask(options); - return this._runTask(task, next); - } - }; - function createLogTask(options) { - return logTask2(options.splitter, options.fields, options.commands); - } - function rejectDeprecatedSignatures(from, to) { - return ( - filterString2(from) && - filterString2(to) && - configurationErrorTask2( - `git.log(string, string) should be replaced with git.log({ from: string, to: string })` - ) - ); - } -} -var excludeOptions2; -var init_log2 = __esm2({ - "src/lib/tasks/log.ts"() { - "use strict"; - init_log_format2(); - init_pathspec2(); - init_parse_list_log_summary2(); - init_utils2(); - init_task2(); - init_diff2(); - excludeOptions2 = /* @__PURE__ */ ((excludeOptions22) => { - excludeOptions22[(excludeOptions22["--pretty"] = 0)] = "--pretty"; - excludeOptions22[(excludeOptions22["max-count"] = 1)] = "max-count"; - excludeOptions22[(excludeOptions22["maxCount"] = 2)] = "maxCount"; - excludeOptions22[(excludeOptions22["n"] = 3)] = "n"; - excludeOptions22[(excludeOptions22["file"] = 4)] = "file"; - excludeOptions22[(excludeOptions22["format"] = 5)] = "format"; - excludeOptions22[(excludeOptions22["from"] = 6)] = "from"; - excludeOptions22[(excludeOptions22["to"] = 7)] = "to"; - excludeOptions22[(excludeOptions22["splitter"] = 8)] = "splitter"; - excludeOptions22[(excludeOptions22["symmetric"] = 9)] = "symmetric"; - excludeOptions22[(excludeOptions22["mailMap"] = 10)] = "mailMap"; - excludeOptions22[(excludeOptions22["multiLine"] = 11)] = "multiLine"; - excludeOptions22[(excludeOptions22["strictDate"] = 12)] = "strictDate"; - return excludeOptions22; - })(excludeOptions2 || {}); - } -}); -var MergeSummaryConflict2; -var MergeSummaryDetail2; -var init_MergeSummary2 = __esm2({ - "src/lib/responses/MergeSummary.ts"() { - "use strict"; - MergeSummaryConflict2 = class { - constructor(reason, file = null, meta) { - this.reason = reason; - this.file = file; - this.meta = meta; - } - toString() { - return `${this.file}:${this.reason}`; - } - }; - MergeSummaryDetail2 = class { - constructor() { - this.conflicts = []; - this.merges = []; - this.result = "success"; - } - get failed() { - return this.conflicts.length > 0; - } - get reason() { - return this.result; - } - toString() { - if (this.conflicts.length) { - return `CONFLICTS: ${this.conflicts.join(", ")}`; - } - return "OK"; - } - }; - } -}); -var PullSummary2; -var PullFailedSummary2; -var init_PullSummary2 = __esm2({ - "src/lib/responses/PullSummary.ts"() { - "use strict"; - PullSummary2 = class { - constructor() { - this.remoteMessages = { - all: [] - }; - this.created = []; - this.deleted = []; - this.files = []; - this.deletions = {}; - this.insertions = {}; - this.summary = { - changes: 0, - deletions: 0, - insertions: 0 - }; - } - }; - PullFailedSummary2 = class { - constructor() { - this.remote = ""; - this.hash = { - local: "", - remote: "" - }; - this.branch = { - local: "", - remote: "" - }; - this.message = ""; - } - toString() { - return this.message; - } - }; - } -}); -function objectEnumerationResult2(remoteMessages) { - return (remoteMessages.objects = remoteMessages.objects || { - compressing: 0, - counting: 0, - enumerating: 0, - packReused: 0, - reused: { count: 0, delta: 0 }, - total: { count: 0, delta: 0 } - }); -} -function asObjectCount2(source) { - const count = /^\s*(\d+)/.exec(source); - const delta = /delta (\d+)/i.exec(source); - return { - count: asNumber2((count && count[1]) || "0"), - delta: asNumber2((delta && delta[1]) || "0") - }; -} -var remoteMessagesObjectParsers2; -var init_parse_remote_objects2 = __esm2({ - "src/lib/parsers/parse-remote-objects.ts"() { - "use strict"; - init_utils2(); - remoteMessagesObjectParsers2 = [ - new RemoteLineParser2( - /^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, - (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult2(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber2(count) }); - } - ), - new RemoteLineParser2( - /^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, - (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult2(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber2(count) }); - } - ), - new RemoteLineParser2( - /total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, - (result, [total, reused, packReused]) => { - const objects = objectEnumerationResult2(result.remoteMessages); - objects.total = asObjectCount2(total); - objects.reused = asObjectCount2(reused); - objects.packReused = asNumber2(packReused); - } - ) - ]; - } -}); -function parseRemoteMessages2(_stdOut, stdErr) { - return parseStringResponse2({ remoteMessages: new RemoteMessageSummary2() }, parsers22, stdErr); -} -var parsers22; -var RemoteMessageSummary2; -var init_parse_remote_messages2 = __esm2({ - "src/lib/parsers/parse-remote-messages.ts"() { - "use strict"; - init_utils2(); - init_parse_remote_objects2(); - parsers22 = [ - new RemoteLineParser2(/^remote:\s*(.+)$/, (result, [text]) => { - result.remoteMessages.all.push(text.trim()); - return false; - }), - ...remoteMessagesObjectParsers2, - new RemoteLineParser2( - [/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], - (result, [pullRequestUrl]) => { - result.remoteMessages.pullRequestUrl = pullRequestUrl; - } - ), - new RemoteLineParser2( - [/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], - (result, [count, summary, url]) => { - result.remoteMessages.vulnerabilities = { - count: asNumber2(count), - summary, - url - }; - } - ) - ]; - RemoteMessageSummary2 = class { - constructor() { - this.all = []; - } - }; - } -}); -function parsePullErrorResult2(stdOut, stdErr) { - const pullError = parseStringResponse2(new PullFailedSummary2(), errorParsers2, [stdOut, stdErr]); - return pullError.message && pullError; -} -var FILE_UPDATE_REGEX2; -var SUMMARY_REGEX2; -var ACTION_REGEX2; -var parsers32; -var errorParsers2; -var parsePullDetail2; -var parsePullResult2; -var init_parse_pull2 = __esm2({ - "src/lib/parsers/parse-pull.ts"() { - "use strict"; - init_PullSummary2(); - init_utils2(); - init_parse_remote_messages2(); - FILE_UPDATE_REGEX2 = /^\s*(.+?)\s+\|\s+\d+\s*(\+*)(-*)/; - SUMMARY_REGEX2 = /(\d+)\D+((\d+)\D+\(\+\))?(\D+(\d+)\D+\(-\))?/; - ACTION_REGEX2 = /^(create|delete) mode \d+ (.+)/; - parsers32 = [ - new LineParser2(FILE_UPDATE_REGEX2, (result, [file, insertions, deletions]) => { - result.files.push(file); - if (insertions) { - result.insertions[file] = insertions.length; - } - if (deletions) { - result.deletions[file] = deletions.length; - } - }), - new LineParser2(SUMMARY_REGEX2, (result, [changes, , insertions, , deletions]) => { - if (insertions !== void 0 || deletions !== void 0) { - result.summary.changes = +changes || 0; - result.summary.insertions = +insertions || 0; - result.summary.deletions = +deletions || 0; - return true; - } - return false; - }), - new LineParser2(ACTION_REGEX2, (result, [action, file]) => { - append2(result.files, file); - append2(action === "create" ? result.created : result.deleted, file); - }) - ]; - errorParsers2 = [ - new LineParser2(/^from\s(.+)$/i, (result, [remote]) => void (result.remote = remote)), - new LineParser2(/^fatal:\s(.+)$/, (result, [message]) => void (result.message = message)), - new LineParser2( - /([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, - (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { - result.branch.local = branchLocal; - result.hash.local = hashLocal; - result.branch.remote = branchRemote; - result.hash.remote = hashRemote; - } - ) - ]; - parsePullDetail2 = (stdOut, stdErr) => { - return parseStringResponse2(new PullSummary2(), parsers32, [stdOut, stdErr]); - }; - parsePullResult2 = (stdOut, stdErr) => { - return Object.assign( - new PullSummary2(), - parsePullDetail2(stdOut, stdErr), - parseRemoteMessages2(stdOut, stdErr) - ); - }; - } -}); -var parsers42; -var parseMergeResult2; -var parseMergeDetail2; -var init_parse_merge2 = __esm2({ - "src/lib/parsers/parse-merge.ts"() { - "use strict"; - init_MergeSummary2(); - init_utils2(); - init_parse_pull2(); - parsers42 = [ - new LineParser2(/^Auto-merging\s+(.+)$/, (summary, [autoMerge]) => { - summary.merges.push(autoMerge); - }), - new LineParser2( - /^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, - (summary, [reason, file]) => { - summary.conflicts.push(new MergeSummaryConflict2(reason, file)); - } - ), - new LineParser2( - /^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, - (summary, [reason, file, deleteRef]) => { - summary.conflicts.push(new MergeSummaryConflict2(reason, file, { deleteRef })); - } - ), - new LineParser2(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { - summary.conflicts.push(new MergeSummaryConflict2(reason, null)); - }), - new LineParser2(/^Automatic merge failed;\s+(.+)$/, (summary, [result]) => { - summary.result = result; - }) - ]; - parseMergeResult2 = (stdOut, stdErr) => { - return Object.assign(parseMergeDetail2(stdOut, stdErr), parsePullResult2(stdOut, stdErr)); - }; - parseMergeDetail2 = (stdOut) => { - return parseStringResponse2(new MergeSummaryDetail2(), parsers42, stdOut); - }; - } -}); -function mergeTask2(customArgs) { - if (!customArgs.length) { - return configurationErrorTask2("Git.merge requires at least one option"); - } - return { - commands: ["merge", ...customArgs], - format: "utf-8", - parser(stdOut, stdErr) { - const merge2 = parseMergeResult2(stdOut, stdErr); - if (merge2.failed) { - throw new GitResponseError2(merge2); - } - return merge2; - } - }; -} -var init_merge2 = __esm2({ - "src/lib/tasks/merge.ts"() { - "use strict"; - init_git_response_error2(); - init_parse_merge2(); - init_task2(); - } -}); -function pushResultPushedItem2(local, remote, status) { - const deleted = status.includes("deleted"); - const tag = status.includes("tag") || /^refs\/tags/.test(local); - const alreadyUpdated = !status.includes("new"); - return { - deleted, - tag, - branch: !tag, - new: !alreadyUpdated, - alreadyUpdated, - local, - remote - }; -} -var parsers52; -var parsePushResult2; -var parsePushDetail2; -var init_parse_push2 = __esm2({ - "src/lib/parsers/parse-push.ts"() { - "use strict"; - init_utils2(); - init_parse_remote_messages2(); - parsers52 = [ - new LineParser2(/^Pushing to (.+)$/, (result, [repo]) => { - result.repo = repo; - }), - new LineParser2(/^updating local tracking ref '(.+)'/, (result, [local]) => { - result.ref = { - ...(result.ref || {}), - local - }; - }), - new LineParser2(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { - result.pushed.push(pushResultPushedItem2(local, remote, type)); - }), - new LineParser2( - /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, - (result, [local, remote, remoteName]) => { - result.branch = { - ...(result.branch || {}), - local, - remote, - remoteName - }; - } - ), - new LineParser2( - /^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, - (result, [local, remote, from, to]) => { - result.update = { - head: { - local, - remote - }, - hash: { - from, - to - } - }; - } - ) - ]; - parsePushResult2 = (stdOut, stdErr) => { - const pushDetail = parsePushDetail2(stdOut, stdErr); - const responseDetail = parseRemoteMessages2(stdOut, stdErr); - return { - ...pushDetail, - ...responseDetail - }; - }; - parsePushDetail2 = (stdOut, stdErr) => { - return parseStringResponse2({ pushed: [] }, parsers52, [stdOut, stdErr]); - }; - } -}); -var push_exports2 = {}; -__export3(push_exports2, { - pushTagsTask: () => pushTagsTask2, - pushTask: () => pushTask2 -}); -function pushTagsTask2(ref = {}, customArgs) { - append2(customArgs, "--tags"); - return pushTask2(ref, customArgs); -} -function pushTask2(ref = {}, customArgs) { - const commands3 = ["push", ...customArgs]; - if (ref.branch) { - commands3.splice(1, 0, ref.branch); - } - if (ref.remote) { - commands3.splice(1, 0, ref.remote); - } - remove2(commands3, "-v"); - append2(commands3, "--verbose"); - append2(commands3, "--porcelain"); - return { - commands: commands3, - format: "utf-8", - parser: parsePushResult2 - }; -} -var init_push2 = __esm2({ - "src/lib/tasks/push.ts"() { - "use strict"; - init_parse_push2(); - init_utils2(); - } -}); -function show_default2() { - return { - showBuffer() { - const commands3 = ["show", ...getTrailingOptions2(arguments, 1)]; - if (!commands3.includes("--binary")) { - commands3.splice(1, 0, "--binary"); - } - return this._runTask( - straightThroughBufferTask2(commands3), - trailingFunctionArgument2(arguments) - ); - }, - show() { - const commands3 = ["show", ...getTrailingOptions2(arguments, 1)]; - return this._runTask( - straightThroughStringTask2(commands3), - trailingFunctionArgument2(arguments) - ); - } - }; -} -var init_show2 = __esm2({ - "src/lib/tasks/show.ts"() { - "use strict"; - init_utils2(); - init_task2(); - } -}); -var fromPathRegex2; -var FileStatusSummary2; -var init_FileStatusSummary2 = __esm2({ - "src/lib/responses/FileStatusSummary.ts"() { - "use strict"; - fromPathRegex2 = /^(.+)\0(.+)$/; - FileStatusSummary2 = class { - constructor(path11, index, working_dir) { - this.path = path11; - this.index = index; - this.working_dir = working_dir; - if (index === "R" || working_dir === "R") { - const detail = fromPathRegex2.exec(path11) || [null, path11, path11]; - this.from = detail[2] || ""; - this.path = detail[1] || ""; - } - } - }; - } -}); -function renamedFile2(line) { - const [to, from] = line.split(NULL2); - return { - from: from || to, - to - }; -} -function parser32(indexX, indexY, handler2) { - return [`${indexX}${indexY}`, handler2]; -} -function conflicts2(indexX, ...indexY) { - return indexY.map((y) => parser32(indexX, y, (result, file) => result.conflicted.push(file))); -} -function splitLine2(result, lineStr) { - const trimmed22 = lineStr.trim(); - switch (" ") { - case trimmed22.charAt(2): - return data(trimmed22.charAt(0), trimmed22.charAt(1), trimmed22.slice(3)); - case trimmed22.charAt(1): - return data(" ", trimmed22.charAt(0), trimmed22.slice(2)); - default: - return; - } - function data(index, workingDir, path11) { - const raw = `${index}${workingDir}`; - const handler2 = parsers62.get(raw); - if (handler2) { - handler2(result, path11); - } - if (raw !== "##" && raw !== "!!") { - result.files.push(new FileStatusSummary2(path11, index, workingDir)); - } - } -} -var StatusSummary2; -var parsers62; -var parseStatusSummary2; -var init_StatusSummary2 = __esm2({ - "src/lib/responses/StatusSummary.ts"() { - "use strict"; - init_utils2(); - init_FileStatusSummary2(); - StatusSummary2 = class { - constructor() { - this.not_added = []; - this.conflicted = []; - this.created = []; - this.deleted = []; - this.ignored = void 0; - this.modified = []; - this.renamed = []; - this.files = []; - this.staged = []; - this.ahead = 0; - this.behind = 0; - this.current = null; - this.tracking = null; - this.detached = false; - this.isClean = () => { - return !this.files.length; - }; - } - }; - parsers62 = new Map([ - parser32(" ", "A", (result, file) => result.created.push(file)), - parser32(" ", "D", (result, file) => result.deleted.push(file)), - parser32(" ", "M", (result, file) => result.modified.push(file)), - parser32("A", " ", (result, file) => { - result.created.push(file); - result.staged.push(file); - }), - parser32("A", "M", (result, file) => { - result.created.push(file); - result.staged.push(file); - result.modified.push(file); - }), - parser32("D", " ", (result, file) => { - result.deleted.push(file); - result.staged.push(file); - }), - parser32("M", " ", (result, file) => { - result.modified.push(file); - result.staged.push(file); - }), - parser32("M", "M", (result, file) => { - result.modified.push(file); - result.staged.push(file); - }), - parser32("R", " ", (result, file) => { - result.renamed.push(renamedFile2(file)); - }), - parser32("R", "M", (result, file) => { - const renamed = renamedFile2(file); - result.renamed.push(renamed); - result.modified.push(renamed.to); - }), - parser32("!", "!", (_result, _file) => { - (_result.ignored = _result.ignored || []).push(_file); - }), - parser32("?", "?", (result, file) => result.not_added.push(file)), - ...conflicts2( - "A", - "A", - "U" - /* UNMERGED */ - ), - ...conflicts2( - "D", - "D", - "U" - /* UNMERGED */ - ), - ...conflicts2( - "U", - "A", - "D", - "U" - /* UNMERGED */ - ), - [ - "##", - (result, line) => { - const aheadReg = /ahead (\d+)/; - const behindReg = /behind (\d+)/; - const currentReg = /^(.+?(?=(?:\.{3}|\s|$)))/; - const trackingReg = /\.{3}(\S*)/; - const onEmptyBranchReg = /\son\s(\S+?)(?=\.{3}|$)/; - let regexResult = aheadReg.exec(line); - result.ahead = (regexResult && +regexResult[1]) || 0; - regexResult = behindReg.exec(line); - result.behind = (regexResult && +regexResult[1]) || 0; - regexResult = currentReg.exec(line); - result.current = filterType2(regexResult?.[1], filterString2, null); - regexResult = trackingReg.exec(line); - result.tracking = filterType2(regexResult?.[1], filterString2, null); - regexResult = onEmptyBranchReg.exec(line); - if (regexResult) { - result.current = filterType2(regexResult?.[1], filterString2, result.current); - } - result.detached = /\(no branch\)/.test(line); - } - ] - ]); - parseStatusSummary2 = function (text) { - const lines = text.split(NULL2); - const status = new StatusSummary2(); - for (let i = 0, l = lines.length; i < l; ) { - let line = lines[i++].trim(); - if (!line) { - continue; - } - if (line.charAt(0) === "R") { - line += NULL2 + (lines[i++] || ""); - } - splitLine2(status, line); - } - return status; - }; - } -}); -function statusTask2(customArgs) { - const commands3 = [ - "status", - "--porcelain", - "-b", - "-u", - "--null", - ...customArgs.filter((arg) => !ignoredOptions2.includes(arg)) - ]; - return { - format: "utf-8", - commands: commands3, - parser(text) { - return parseStatusSummary2(text); - } - }; -} -var ignoredOptions2; -var init_status2 = __esm2({ - "src/lib/tasks/status.ts"() { - "use strict"; - init_StatusSummary2(); - ignoredOptions2 = ["--null", "-z"]; - } -}); -function versionResponse2(major = 0, minor = 0, patch = 0, agent = "", installed = true) { - return Object.defineProperty( - { - major, - minor, - patch, - agent, - installed - }, - "toString", - { - value() { - return `${this.major}.${this.minor}.${this.patch}`; - }, - configurable: false, - enumerable: false - } - ); -} -function notInstalledResponse2() { - return versionResponse2(0, 0, 0, "", false); -} -function version_default2() { - return { - version() { - return this._runTask({ - commands: ["--version"], - format: "utf-8", - parser: versionParser2, - onError(result, error, done, fail) { - if (result.exitCode === -2) { - return done(Buffer.from(NOT_INSTALLED2)); - } - fail(error); - } - }); - } - }; -} -function versionParser2(stdOut) { - if (stdOut === NOT_INSTALLED2) { - return notInstalledResponse2(); - } - return parseStringResponse2(versionResponse2(0, 0, 0, stdOut), parsers72, stdOut); -} -var NOT_INSTALLED2; -var parsers72; -var init_version2 = __esm2({ - "src/lib/tasks/version.ts"() { - "use strict"; - init_utils2(); - NOT_INSTALLED2 = "installed=false"; - parsers72 = [ - new LineParser2( - /version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, - (result, [major, minor, patch, agent = ""]) => { - Object.assign( - result, - versionResponse2(asNumber2(major), asNumber2(minor), asNumber2(patch), agent) - ); - } - ), - new LineParser2( - /version (\d+)\.(\d+)\.(\D+)(.+)?$/, - (result, [major, minor, patch, agent = ""]) => { - Object.assign(result, versionResponse2(asNumber2(major), asNumber2(minor), patch, agent)); - } - ) - ]; - } -}); -var simple_git_api_exports2 = {}; -__export3(simple_git_api_exports2, { - SimpleGitApi: () => SimpleGitApi2 -}); -var SimpleGitApi2; -var init_simple_git_api2 = __esm2({ - "src/lib/simple-git-api.ts"() { - "use strict"; - init_task_callback2(); - init_change_working_directory2(); - init_checkout2(); - init_count_objects2(); - init_commit2(); - init_config2(); - init_first_commit2(); - init_grep2(); - init_hash_object2(); - init_init2(); - init_log2(); - init_merge2(); - init_push2(); - init_show2(); - init_status2(); - init_task2(); - init_version2(); - init_utils2(); - SimpleGitApi2 = class { - constructor(_executor) { - this._executor = _executor; - } - _runTask(task, then) { - const chain = this._executor.chain(); - const promise = chain.push(task); - if (then) { - taskCallback2(task, promise, then); - } - return Object.create(this, { - then: { value: promise.then.bind(promise) }, - catch: { value: promise.catch.bind(promise) }, - _executor: { value: chain } - }); - } - add(files) { - return this._runTask( - straightThroughStringTask2(["add", ...asArray2(files)]), - trailingFunctionArgument2(arguments) - ); - } - cwd(directory) { - const next = trailingFunctionArgument2(arguments); - if (typeof directory === "string") { - return this._runTask(changeWorkingDirectoryTask2(directory, this._executor), next); - } - if (typeof directory?.path === "string") { - return this._runTask( - changeWorkingDirectoryTask2( - directory.path, - (directory.root && this._executor) || void 0 - ), - next - ); - } - return this._runTask( - configurationErrorTask2("Git.cwd: workingDirectory must be supplied as a string"), - next - ); - } - hashObject(path11, write) { - return this._runTask( - hashObjectTask2(path11, write === true), - trailingFunctionArgument2(arguments) - ); - } - init(bare) { - return this._runTask( - initTask2(bare === true, this._executor.cwd, getTrailingOptions2(arguments)), - trailingFunctionArgument2(arguments) - ); - } - merge() { - return this._runTask( - mergeTask2(getTrailingOptions2(arguments)), - trailingFunctionArgument2(arguments) - ); - } - mergeFromTo(remote, branch) { - if (!(filterString2(remote) && filterString2(branch))) { - return this._runTask( - configurationErrorTask2( - `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings` - ) - ); - } - return this._runTask( - mergeTask2([remote, branch, ...getTrailingOptions2(arguments)]), - trailingFunctionArgument2(arguments, false) - ); - } - outputHandler(handler2) { - this._executor.outputHandler = handler2; - return this; - } - push() { - const task = pushTask2( - { - remote: filterType2(arguments[0], filterString2), - branch: filterType2(arguments[1], filterString2) - }, - getTrailingOptions2(arguments) - ); - return this._runTask(task, trailingFunctionArgument2(arguments)); - } - stash() { - return this._runTask( - straightThroughStringTask2(["stash", ...getTrailingOptions2(arguments)]), - trailingFunctionArgument2(arguments) - ); - } - status() { - return this._runTask( - statusTask2(getTrailingOptions2(arguments)), - trailingFunctionArgument2(arguments) - ); - } - }; - Object.assign( - SimpleGitApi2.prototype, - checkout_default2(), - commit_default2(), - config_default2(), - count_objects_default2(), - first_commit_default2(), - grep_default2(), - log_default2(), - show_default2(), - version_default2() - ); - } -}); -var scheduler_exports2 = {}; -__export3(scheduler_exports2, { - Scheduler: () => Scheduler2 -}); -var createScheduledTask2; -var Scheduler2; -var init_scheduler2 = __esm2({ - "src/lib/runners/scheduler.ts"() { - "use strict"; - init_utils2(); - init_git_logger2(); - createScheduledTask2 = /* @__PURE__ */ (() => { - let id = 0; - return () => { - id++; - const { promise, done } = (0, import_promise_deferred3.createDeferred)(); - return { - promise, - done, - id - }; - }; - })(); - Scheduler2 = class { - constructor(concurrency = 2) { - this.concurrency = concurrency; - this.logger = createLogger3("", "scheduler"); - this.pending = []; - this.running = []; - this.logger(`Constructed, concurrency=%s`, concurrency); - } - schedule() { - if (!this.pending.length || this.running.length >= this.concurrency) { - this.logger( - `Schedule attempt ignored, pending=%s running=%s concurrency=%s`, - this.pending.length, - this.running.length, - this.concurrency - ); - return; - } - const task = append2(this.running, this.pending.shift()); - this.logger(`Attempting id=%s`, task.id); - task.done(() => { - this.logger(`Completing id=`, task.id); - remove2(this.running, task); - this.schedule(); - }); - } - next() { - const { promise, id } = append2(this.pending, createScheduledTask2()); - this.logger(`Scheduling id=%s`, id); - this.schedule(); - return promise; - } - }; - } -}); -var apply_patch_exports2 = {}; -__export3(apply_patch_exports2, { - applyPatchTask: () => applyPatchTask2 -}); -function applyPatchTask2(patches, customArgs) { - return straightThroughStringTask2(["apply", ...customArgs, ...patches]); -} -var init_apply_patch2 = __esm2({ - "src/lib/tasks/apply-patch.ts"() { - "use strict"; - init_task2(); - } -}); -function branchDeletionSuccess2(branch, hash) { - return { - branch, - hash, - success: true - }; -} -function branchDeletionFailure2(branch) { - return { - branch, - hash: null, - success: false - }; -} -var BranchDeletionBatch2; -var init_BranchDeleteSummary2 = __esm2({ - "src/lib/responses/BranchDeleteSummary.ts"() { - "use strict"; - BranchDeletionBatch2 = class { - constructor() { - this.all = []; - this.branches = {}; - this.errors = []; - } - get success() { - return !this.errors.length; - } - }; - } -}); -function hasBranchDeletionError2(data, processExitCode) { - return processExitCode === 1 && deleteErrorRegex2.test(data); -} -var deleteSuccessRegex2; -var deleteErrorRegex2; -var parsers82; -var parseBranchDeletions2; -var init_parse_branch_delete2 = __esm2({ - "src/lib/parsers/parse-branch-delete.ts"() { - "use strict"; - init_BranchDeleteSummary2(); - init_utils2(); - deleteSuccessRegex2 = /(\S+)\s+\(\S+\s([^)]+)\)/; - deleteErrorRegex2 = /^error[^']+'([^']+)'/m; - parsers82 = [ - new LineParser2(deleteSuccessRegex2, (result, [branch, hash]) => { - const deletion = branchDeletionSuccess2(branch, hash); - result.all.push(deletion); - result.branches[branch] = deletion; - }), - new LineParser2(deleteErrorRegex2, (result, [branch]) => { - const deletion = branchDeletionFailure2(branch); - result.errors.push(deletion); - result.all.push(deletion); - result.branches[branch] = deletion; - }) - ]; - parseBranchDeletions2 = (stdOut, stdErr) => { - return parseStringResponse2(new BranchDeletionBatch2(), parsers82, [stdOut, stdErr]); - }; - } -}); -var BranchSummaryResult2; -var init_BranchSummary2 = __esm2({ - "src/lib/responses/BranchSummary.ts"() { - "use strict"; - BranchSummaryResult2 = class { - constructor() { - this.all = []; - this.branches = {}; - this.current = ""; - this.detached = false; - } - push(status, detached, name, commit, label) { - if (status === "*") { - this.detached = detached; - this.current = name; - } - this.all.push(name); - this.branches[name] = { - current: status === "*", - linkedWorkTree: status === "+", - name, - commit, - label - }; - } - }; - } -}); -function branchStatus2(input) { - return input ? input.charAt(0) : ""; -} -function parseBranchSummary2(stdOut, currentOnly = false) { - return parseStringResponse2( - new BranchSummaryResult2(), - currentOnly ? [currentBranchParser2] : parsers92, - stdOut - ); -} -var parsers92; -var currentBranchParser2; -var init_parse_branch2 = __esm2({ - "src/lib/parsers/parse-branch.ts"() { - "use strict"; - init_BranchSummary2(); - init_utils2(); - parsers92 = [ - new LineParser2( - /^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, - (result, [current, name, commit, label]) => { - result.push(branchStatus2(current), true, name, commit, label); - } - ), - new LineParser2( - /^([*+]\s)?(\S+)\s+([a-z0-9]+)\s?(.*)$/s, - (result, [current, name, commit, label]) => { - result.push(branchStatus2(current), false, name, commit, label); - } - ) - ]; - currentBranchParser2 = new LineParser2(/^(\S+)$/s, (result, [name]) => { - result.push("*", false, name, "", ""); - }); - } -}); -var branch_exports2 = {}; -__export3(branch_exports2, { - branchLocalTask: () => branchLocalTask2, - branchTask: () => branchTask2, - containsDeleteBranchCommand: () => containsDeleteBranchCommand2, - deleteBranchTask: () => deleteBranchTask2, - deleteBranchesTask: () => deleteBranchesTask2 -}); -function containsDeleteBranchCommand2(commands3) { - const deleteCommands = ["-d", "-D", "--delete"]; - return commands3.some((command) => deleteCommands.includes(command)); -} -function branchTask2(customArgs) { - const isDelete = containsDeleteBranchCommand2(customArgs); - const isCurrentOnly = customArgs.includes("--show-current"); - const commands3 = ["branch", ...customArgs]; - if (commands3.length === 1) { - commands3.push("-a"); - } - if (!commands3.includes("-v")) { - commands3.splice(1, 0, "-v"); - } - return { - format: "utf-8", - commands: commands3, - parser(stdOut, stdErr) { - if (isDelete) { - return parseBranchDeletions2(stdOut, stdErr).all[0]; - } - return parseBranchSummary2(stdOut, isCurrentOnly); - } - }; -} -function branchLocalTask2() { - return { - format: "utf-8", - commands: ["branch", "-v"], - parser(stdOut) { - return parseBranchSummary2(stdOut); - } - }; -} -function deleteBranchesTask2(branches, forceDelete = false) { - return { - format: "utf-8", - commands: ["branch", "-v", forceDelete ? "-D" : "-d", ...branches], - parser(stdOut, stdErr) { - return parseBranchDeletions2(stdOut, stdErr); - }, - onError({ exitCode, stdOut }, error, done, fail) { - if (!hasBranchDeletionError2(String(error), exitCode)) { - return fail(error); - } - done(stdOut); - } - }; -} -function deleteBranchTask2(branch, forceDelete = false) { - const task = { - format: "utf-8", - commands: ["branch", "-v", forceDelete ? "-D" : "-d", branch], - parser(stdOut, stdErr) { - return parseBranchDeletions2(stdOut, stdErr).branches[branch]; - }, - onError({ exitCode, stdErr, stdOut }, error, _, fail) { - if (!hasBranchDeletionError2(String(error), exitCode)) { - return fail(error); - } - throw new GitResponseError2( - task.parser(bufferToString2(stdOut), bufferToString2(stdErr)), - String(error) - ); - } - }; - return task; -} -var init_branch2 = __esm2({ - "src/lib/tasks/branch.ts"() { - "use strict"; - init_git_response_error2(); - init_parse_branch_delete2(); - init_parse_branch2(); - init_utils2(); - } -}); -function toPath2(input) { - const path11 = input.trim().replace(/^["']|["']$/g, ""); - return path11 && (0, import_node_path4.normalize)(path11); -} -var parseCheckIgnore2; -var init_CheckIgnore2 = __esm2({ - "src/lib/responses/CheckIgnore.ts"() { - "use strict"; - parseCheckIgnore2 = (text) => { - return text.split(/\n/g).map(toPath2).filter(Boolean); - }; - } -}); -var check_ignore_exports2 = {}; -__export3(check_ignore_exports2, { - checkIgnoreTask: () => checkIgnoreTask2 -}); -function checkIgnoreTask2(paths) { - return { - commands: ["check-ignore", ...paths], - format: "utf-8", - parser: parseCheckIgnore2 - }; -} -var init_check_ignore2 = __esm2({ - "src/lib/tasks/check-ignore.ts"() { - "use strict"; - init_CheckIgnore2(); - } -}); -var clone_exports2 = {}; -__export3(clone_exports2, { - cloneMirrorTask: () => cloneMirrorTask2, - cloneTask: () => cloneTask2 -}); -function disallowedCommand3(command) { - return /^--upload-pack(=|$)/.test(command); -} -function cloneTask2(repo, directory, customArgs) { - const commands3 = ["clone", ...customArgs]; - filterString2(repo) && commands3.push(repo); - filterString2(directory) && commands3.push(directory); - const banned = commands3.find(disallowedCommand3); - if (banned) { - return configurationErrorTask2(`git.fetch: potential exploit argument blocked.`); - } - return straightThroughStringTask2(commands3); -} -function cloneMirrorTask2(repo, directory, customArgs) { - append2(customArgs, "--mirror"); - return cloneTask2(repo, directory, customArgs); -} -var init_clone2 = __esm2({ - "src/lib/tasks/clone.ts"() { - "use strict"; - init_task2(); - init_utils2(); - } -}); -function parseFetchResult2(stdOut, stdErr) { - const result = { - raw: stdOut, - remote: null, - branches: [], - tags: [], - updated: [], - deleted: [] - }; - return parseStringResponse2(result, parsers102, [stdOut, stdErr]); -} -var parsers102; -var init_parse_fetch2 = __esm2({ - "src/lib/parsers/parse-fetch.ts"() { - "use strict"; - init_utils2(); - parsers102 = [ - new LineParser2(/From (.+)$/, (result, [remote]) => { - result.remote = remote; - }), - new LineParser2(/\* \[new branch]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { - result.branches.push({ - name, - tracking - }); - }), - new LineParser2(/\* \[new tag]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { - result.tags.push({ - name, - tracking - }); - }), - new LineParser2(/- \[deleted]\s+\S+\s*-> (.+)$/, (result, [tracking]) => { - result.deleted.push({ - tracking - }); - }), - new LineParser2( - /\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, - (result, [from, to, name, tracking]) => { - result.updated.push({ - name, - tracking, - to, - from - }); - } - ) - ]; - } -}); -var fetch_exports2 = {}; -__export3(fetch_exports2, { - fetchTask: () => fetchTask2 -}); -function disallowedCommand22(command) { - return /^--upload-pack(=|$)/.test(command); -} -function fetchTask2(remote, branch, customArgs) { - const commands3 = ["fetch", ...customArgs]; - if (remote && branch) { - commands3.push(remote, branch); - } - const banned = commands3.find(disallowedCommand22); - if (banned) { - return configurationErrorTask2(`git.fetch: potential exploit argument blocked.`); - } - return { - commands: commands3, - format: "utf-8", - parser: parseFetchResult2 - }; -} -var init_fetch2 = __esm2({ - "src/lib/tasks/fetch.ts"() { - "use strict"; - init_parse_fetch2(); - init_task2(); - } -}); -function parseMoveResult2(stdOut) { - return parseStringResponse2({ moves: [] }, parsers112, stdOut); -} -var parsers112; -var init_parse_move2 = __esm2({ - "src/lib/parsers/parse-move.ts"() { - "use strict"; - init_utils2(); - parsers112 = [ - new LineParser2(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { - result.moves.push({ from, to }); - }) - ]; - } -}); -var move_exports2 = {}; -__export3(move_exports2, { - moveTask: () => moveTask2 -}); -function moveTask2(from, to) { - return { - commands: ["mv", "-v", ...asArray2(from), to], - format: "utf-8", - parser: parseMoveResult2 - }; -} -var init_move2 = __esm2({ - "src/lib/tasks/move.ts"() { - "use strict"; - init_parse_move2(); - init_utils2(); - } -}); -var pull_exports2 = {}; -__export3(pull_exports2, { - pullTask: () => pullTask2 -}); -function pullTask2(remote, branch, customArgs) { - const commands3 = ["pull", ...customArgs]; - if (remote && branch) { - commands3.splice(1, 0, remote, branch); - } - return { - commands: commands3, - format: "utf-8", - parser(stdOut, stdErr) { - return parsePullResult2(stdOut, stdErr); - }, - onError(result, _error, _done, fail) { - const pullError = parsePullErrorResult2( - bufferToString2(result.stdOut), - bufferToString2(result.stdErr) - ); - if (pullError) { - return fail(new GitResponseError2(pullError)); - } - fail(_error); - } - }; -} -var init_pull2 = __esm2({ - "src/lib/tasks/pull.ts"() { - "use strict"; - init_git_response_error2(); - init_parse_pull2(); - init_utils2(); - } -}); -function parseGetRemotes2(text) { - const remotes = {}; - forEach2(text, ([name]) => (remotes[name] = { name })); - return Object.values(remotes); -} -function parseGetRemotesVerbose2(text) { - const remotes = {}; - forEach2(text, ([name, url, purpose]) => { - if (!Object.hasOwn(remotes, name)) { - remotes[name] = { - name, - refs: { fetch: "", push: "" } - }; - } - if (purpose && url) { - remotes[name].refs[purpose.replace(/[^a-z]/g, "")] = url; - } - }); - return Object.values(remotes); -} -function forEach2(text, handler2) { - forEachLineWithContent2(text, (line) => handler2(line.split(/\s+/))); -} -var init_GetRemoteSummary2 = __esm2({ - "src/lib/responses/GetRemoteSummary.ts"() { - "use strict"; - init_utils2(); - } -}); -var remote_exports2 = {}; -__export3(remote_exports2, { - addRemoteTask: () => addRemoteTask2, - getRemotesTask: () => getRemotesTask2, - listRemotesTask: () => listRemotesTask2, - remoteTask: () => remoteTask2, - removeRemoteTask: () => removeRemoteTask2 -}); -function addRemoteTask2(remoteName, remoteRepo, customArgs) { - return straightThroughStringTask2(["remote", "add", ...customArgs, remoteName, remoteRepo]); -} -function getRemotesTask2(verbose) { - const commands3 = ["remote"]; - if (verbose) { - commands3.push("-v"); - } - return { - commands: commands3, - format: "utf-8", - parser: verbose ? parseGetRemotesVerbose2 : parseGetRemotes2 - }; -} -function listRemotesTask2(customArgs) { - const commands3 = [...customArgs]; - if (commands3[0] !== "ls-remote") { - commands3.unshift("ls-remote"); - } - return straightThroughStringTask2(commands3); -} -function remoteTask2(customArgs) { - const commands3 = [...customArgs]; - if (commands3[0] !== "remote") { - commands3.unshift("remote"); - } - return straightThroughStringTask2(commands3); -} -function removeRemoteTask2(remoteName) { - return straightThroughStringTask2(["remote", "remove", remoteName]); -} -var init_remote2 = __esm2({ - "src/lib/tasks/remote.ts"() { - "use strict"; - init_GetRemoteSummary2(); - init_task2(); - } -}); -var stash_list_exports2 = {}; -__export3(stash_list_exports2, { - stashListTask: () => stashListTask2 -}); -function stashListTask2(opt = {}, customArgs) { - const options = parseLogOptions2(opt); - const commands3 = ["stash", "list", ...options.commands, ...customArgs]; - const parser42 = createListLogSummaryParser2( - options.splitter, - options.fields, - logFormatFromCommand2(commands3) - ); - return ( - validateLogFormatConfig2(commands3) || { - commands: commands3, - format: "utf-8", - parser: parser42 - } - ); -} -var init_stash_list2 = __esm2({ - "src/lib/tasks/stash-list.ts"() { - "use strict"; - init_log_format2(); - init_parse_list_log_summary2(); - init_diff2(); - init_log2(); - } -}); -var sub_module_exports2 = {}; -__export3(sub_module_exports2, { - addSubModuleTask: () => addSubModuleTask2, - initSubModuleTask: () => initSubModuleTask2, - subModuleTask: () => subModuleTask2, - updateSubModuleTask: () => updateSubModuleTask2 -}); -function addSubModuleTask2(repo, path11) { - return subModuleTask2(["add", repo, path11]); -} -function initSubModuleTask2(customArgs) { - return subModuleTask2(["init", ...customArgs]); -} -function subModuleTask2(customArgs) { - const commands3 = [...customArgs]; - if (commands3[0] !== "submodule") { - commands3.unshift("submodule"); - } - return straightThroughStringTask2(commands3); -} -function updateSubModuleTask2(customArgs) { - return subModuleTask2(["update", ...customArgs]); -} -var init_sub_module2 = __esm2({ - "src/lib/tasks/sub-module.ts"() { - "use strict"; - init_task2(); - } -}); -function singleSorted2(a, b) { - const aIsNum = Number.isNaN(a); - const bIsNum = Number.isNaN(b); - if (aIsNum !== bIsNum) { - return aIsNum ? 1 : -1; - } - return aIsNum ? sorted2(a, b) : 0; -} -function sorted2(a, b) { - return a === b ? 0 : a > b ? 1 : -1; -} -function trimmed2(input) { - return input.trim(); -} -function toNumber2(input) { - if (typeof input === "string") { - return parseInt(input.replace(/^\D+/g, ""), 10) || 0; - } - return 0; -} -var TagList2; -var parseTagList2; -var init_TagList2 = __esm2({ - "src/lib/responses/TagList.ts"() { - "use strict"; - TagList2 = class { - constructor(all, latest) { - this.all = all; - this.latest = latest; - } - }; - parseTagList2 = function (data, customSort = false) { - const tags = data.split("\n").map(trimmed2).filter(Boolean); - if (!customSort) { - tags.sort(function (tagA, tagB) { - const partsA = tagA.split("."); - const partsB = tagB.split("."); - if (partsA.length === 1 || partsB.length === 1) { - return singleSorted2(toNumber2(partsA[0]), toNumber2(partsB[0])); - } - for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) { - const diff = sorted2(toNumber2(partsA[i]), toNumber2(partsB[i])); - if (diff) { - return diff; - } - } - return 0; - }); - } - const latest = customSort - ? tags[0] - : [...tags].reverse().find((tag) => tag.indexOf(".") >= 0); - return new TagList2(tags, latest); - }; - } -}); -var tag_exports2 = {}; -__export3(tag_exports2, { - addAnnotatedTagTask: () => addAnnotatedTagTask2, - addTagTask: () => addTagTask2, - tagListTask: () => tagListTask2 -}); -function tagListTask2(customArgs = []) { - const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option)); - return { - format: "utf-8", - commands: ["tag", "-l", ...customArgs], - parser(text) { - return parseTagList2(text, hasCustomSort); - } - }; -} -function addTagTask2(name) { - return { - format: "utf-8", - commands: ["tag", name], - parser() { - return { name }; - } - }; -} -function addAnnotatedTagTask2(name, tagMessage) { - return { - format: "utf-8", - commands: ["tag", "-a", "-m", tagMessage, name], - parser() { - return { name }; - } - }; -} -var init_tag2 = __esm2({ - "src/lib/tasks/tag.ts"() { - "use strict"; - init_TagList2(); - } -}); -var require_git2 = __commonJS3({ - "src/git.js"(exports2, module2) { - "use strict"; - var { GitExecutor: GitExecutor22 } = - (init_git_executor2(), __toCommonJS3(git_executor_exports2)); - var { SimpleGitApi: SimpleGitApi22 } = - (init_simple_git_api2(), __toCommonJS3(simple_git_api_exports2)); - var { Scheduler: Scheduler22 } = (init_scheduler2(), __toCommonJS3(scheduler_exports2)); - var { configurationErrorTask: configurationErrorTask22 } = - (init_task2(), __toCommonJS3(task_exports2)); - var { - asArray: asArray22, - filterArray: filterArray22, - filterPrimitives: filterPrimitives22, - filterString: filterString22, - filterStringOrStringArray: filterStringOrStringArray22, - filterType: filterType22, - getTrailingOptions: getTrailingOptions22, - trailingFunctionArgument: trailingFunctionArgument22, - trailingOptionsArgument: trailingOptionsArgument22 - } = (init_utils2(), __toCommonJS3(utils_exports2)); - var { applyPatchTask: applyPatchTask22 } = - (init_apply_patch2(), __toCommonJS3(apply_patch_exports2)); - var { - branchTask: branchTask22, - branchLocalTask: branchLocalTask22, - deleteBranchesTask: deleteBranchesTask22, - deleteBranchTask: deleteBranchTask22 - } = (init_branch2(), __toCommonJS3(branch_exports2)); - var { checkIgnoreTask: checkIgnoreTask22 } = - (init_check_ignore2(), __toCommonJS3(check_ignore_exports2)); - var { checkIsRepoTask: checkIsRepoTask22 } = - (init_check_is_repo2(), __toCommonJS3(check_is_repo_exports2)); - var { cloneTask: cloneTask22, cloneMirrorTask: cloneMirrorTask22 } = - (init_clone2(), __toCommonJS3(clone_exports2)); - var { - cleanWithOptionsTask: cleanWithOptionsTask22, - isCleanOptionsArray: isCleanOptionsArray22 - } = (init_clean2(), __toCommonJS3(clean_exports2)); - var { diffSummaryTask: diffSummaryTask22 } = (init_diff2(), __toCommonJS3(diff_exports2)); - var { fetchTask: fetchTask22 } = (init_fetch2(), __toCommonJS3(fetch_exports2)); - var { moveTask: moveTask22 } = (init_move2(), __toCommonJS3(move_exports2)); - var { pullTask: pullTask22 } = (init_pull2(), __toCommonJS3(pull_exports2)); - var { pushTagsTask: pushTagsTask22 } = (init_push2(), __toCommonJS3(push_exports2)); - var { - addRemoteTask: addRemoteTask22, - getRemotesTask: getRemotesTask22, - listRemotesTask: listRemotesTask22, - remoteTask: remoteTask22, - removeRemoteTask: removeRemoteTask22 - } = (init_remote2(), __toCommonJS3(remote_exports2)); - var { getResetMode: getResetMode22, resetTask: resetTask22 } = - (init_reset2(), __toCommonJS3(reset_exports2)); - var { stashListTask: stashListTask22 } = - (init_stash_list2(), __toCommonJS3(stash_list_exports2)); - var { - addSubModuleTask: addSubModuleTask22, - initSubModuleTask: initSubModuleTask22, - subModuleTask: subModuleTask22, - updateSubModuleTask: updateSubModuleTask22 - } = (init_sub_module2(), __toCommonJS3(sub_module_exports2)); - var { - addAnnotatedTagTask: addAnnotatedTagTask22, - addTagTask: addTagTask22, - tagListTask: tagListTask22 - } = (init_tag2(), __toCommonJS3(tag_exports2)); - var { - straightThroughBufferTask: straightThroughBufferTask22, - straightThroughStringTask: straightThroughStringTask22 - } = (init_task2(), __toCommonJS3(task_exports2)); - function Git22(options, plugins) { - this._plugins = plugins; - this._executor = new GitExecutor22( - options.baseDir, - new Scheduler22(options.maxConcurrentProcesses), - plugins - ); - this._trimmed = options.trimmed; - } - (Git22.prototype = Object.create(SimpleGitApi22.prototype)).constructor = Git22; - Git22.prototype.customBinary = function (command) { - this._plugins.reconfigure("binary", command); - return this; - }; - Git22.prototype.env = function (name, value) { - if (arguments.length === 1 && typeof name === "object") { - this._executor.env = name; - } else { - (this._executor.env = this._executor.env || {})[name] = value; - } - return this; - }; - Git22.prototype.stashList = function (options) { - return this._runTask( - stashListTask22( - trailingOptionsArgument22(arguments) || {}, - (filterArray22(options) && options) || [] - ), - trailingFunctionArgument22(arguments) - ); - }; - function createCloneTask(api, task, repoPath, localPath) { - if (typeof repoPath !== "string") { - return configurationErrorTask22(`git.${api}() requires a string 'repoPath'`); - } - return task( - repoPath, - filterType22(localPath, filterString22), - getTrailingOptions22(arguments) - ); - } - Git22.prototype.clone = function () { - return this._runTask( - createCloneTask("clone", cloneTask22, ...arguments), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.mirror = function () { - return this._runTask( - createCloneTask("mirror", cloneMirrorTask22, ...arguments), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.mv = function (from, to) { - return this._runTask(moveTask22(from, to), trailingFunctionArgument22(arguments)); - }; - Git22.prototype.checkoutLatestTag = function (then) { - var git = this; - return this.pull(function () { - git.tags(function (err, tags) { - git.checkout(tags.latest, then); - }); - }); - }; - Git22.prototype.pull = function (remote, branch, options, then) { - return this._runTask( - pullTask22( - filterType22(remote, filterString22), - filterType22(branch, filterString22), - getTrailingOptions22(arguments) - ), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.fetch = function (remote, branch) { - return this._runTask( - fetchTask22( - filterType22(remote, filterString22), - filterType22(branch, filterString22), - getTrailingOptions22(arguments) - ), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.silent = function (silence) { - console.warn( - "simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3" - ); - return this; - }; - Git22.prototype.tags = function (options, then) { - return this._runTask( - tagListTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.rebase = function () { - return this._runTask( - straightThroughStringTask22(["rebase", ...getTrailingOptions22(arguments)]), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.reset = function (mode) { - return this._runTask( - resetTask22(getResetMode22(mode), getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.revert = function (commit) { - const next = trailingFunctionArgument22(arguments); - if (typeof commit !== "string") { - return this._runTask(configurationErrorTask22("Commit must be a string"), next); - } - return this._runTask( - straightThroughStringTask22([ - "revert", - ...getTrailingOptions22(arguments, 0, true), - commit - ]), - next - ); - }; - Git22.prototype.addTag = function (name) { - const task = - typeof name === "string" - ? addTagTask22(name) - : configurationErrorTask22("Git.addTag requires a tag name"); - return this._runTask(task, trailingFunctionArgument22(arguments)); - }; - Git22.prototype.addAnnotatedTag = function (tagName, tagMessage) { - return this._runTask( - addAnnotatedTagTask22(tagName, tagMessage), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.deleteLocalBranch = function (branchName, forceDelete, then) { - return this._runTask( - deleteBranchTask22(branchName, typeof forceDelete === "boolean" ? forceDelete : false), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) { - return this._runTask( - deleteBranchesTask22(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.branch = function (options, then) { - return this._runTask( - branchTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.branchLocal = function (then) { - return this._runTask(branchLocalTask22(), trailingFunctionArgument22(arguments)); - }; - Git22.prototype.raw = function (commands3) { - const createRestCommands = !Array.isArray(commands3); - const command = [].slice.call(createRestCommands ? arguments : commands3, 0); - for (let i = 0; i < command.length && createRestCommands; i++) { - if (!filterPrimitives22(command[i])) { - command.splice(i, command.length - i); - break; - } - } - command.push(...getTrailingOptions22(arguments, 0, true)); - var next = trailingFunctionArgument22(arguments); - if (!command.length) { - return this._runTask( - configurationErrorTask22("Raw: must supply one or more command to execute"), - next - ); - } - return this._runTask(straightThroughStringTask22(command, this._trimmed), next); - }; - Git22.prototype.submoduleAdd = function (repo, path11, then) { - return this._runTask(addSubModuleTask22(repo, path11), trailingFunctionArgument22(arguments)); - }; - Git22.prototype.submoduleUpdate = function (args, then) { - return this._runTask( - updateSubModuleTask22(getTrailingOptions22(arguments, true)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.submoduleInit = function (args, then) { - return this._runTask( - initSubModuleTask22(getTrailingOptions22(arguments, true)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.subModule = function (options, then) { - return this._runTask( - subModuleTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.listRemote = function () { - return this._runTask( - listRemotesTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.addRemote = function (remoteName, remoteRepo, then) { - return this._runTask( - addRemoteTask22(remoteName, remoteRepo, getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.removeRemote = function (remoteName, then) { - return this._runTask(removeRemoteTask22(remoteName), trailingFunctionArgument22(arguments)); - }; - Git22.prototype.getRemotes = function (verbose, then) { - return this._runTask( - getRemotesTask22(verbose === true), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.remote = function (options, then) { - return this._runTask( - remoteTask22(getTrailingOptions22(arguments)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.tag = function (options, then) { - const command = getTrailingOptions22(arguments); - if (command[0] !== "tag") { - command.unshift("tag"); - } - return this._runTask( - straightThroughStringTask22(command), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.updateServerInfo = function (then) { - return this._runTask( - straightThroughStringTask22(["update-server-info"]), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.pushTags = function (remote, then) { - const task = pushTagsTask22( - { remote: filterType22(remote, filterString22) }, - getTrailingOptions22(arguments) - ); - return this._runTask(task, trailingFunctionArgument22(arguments)); - }; - Git22.prototype.rm = function (files) { - return this._runTask( - straightThroughStringTask22(["rm", "-f", ...asArray22(files)]), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.rmKeepLocal = function (files) { - return this._runTask( - straightThroughStringTask22(["rm", "--cached", ...asArray22(files)]), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.catFile = function (options, then) { - return this._catFile("utf-8", arguments); - }; - Git22.prototype.binaryCatFile = function () { - return this._catFile("buffer", arguments); - }; - Git22.prototype._catFile = function (format, args) { - var handler2 = trailingFunctionArgument22(args); - var command = ["cat-file"]; - var options = args[0]; - if (typeof options === "string") { - return this._runTask( - configurationErrorTask22("Git.catFile: options must be supplied as an array of strings"), - handler2 - ); - } - if (Array.isArray(options)) { - command.push.apply(command, options); - } - const task = - format === "buffer" - ? straightThroughBufferTask22(command) - : straightThroughStringTask22(command); - return this._runTask(task, handler2); - }; - Git22.prototype.diff = function (options, then) { - const task = filterString22(options) - ? configurationErrorTask22( - "git.diff: supplying options as a single string is no longer supported, switch to an array of strings" - ) - : straightThroughStringTask22(["diff", ...getTrailingOptions22(arguments)]); - return this._runTask(task, trailingFunctionArgument22(arguments)); - }; - Git22.prototype.diffSummary = function () { - return this._runTask( - diffSummaryTask22(getTrailingOptions22(arguments, 1)), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.applyPatch = function (patches) { - const task = !filterStringOrStringArray22(patches) - ? configurationErrorTask22( - `git.applyPatch requires one or more string patches as the first argument` - ) - : applyPatchTask22(asArray22(patches), getTrailingOptions22([].slice.call(arguments, 1))); - return this._runTask(task, trailingFunctionArgument22(arguments)); - }; - Git22.prototype.revparse = function () { - const commands3 = ["rev-parse", ...getTrailingOptions22(arguments, true)]; - return this._runTask( - straightThroughStringTask22(commands3, true), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.clean = function (mode, options, then) { - const usingCleanOptionsArray = isCleanOptionsArray22(mode); - const cleanMode = - (usingCleanOptionsArray && mode.join("")) || filterType22(mode, filterString22) || ""; - const customArgs = getTrailingOptions22( - [].slice.call(arguments, usingCleanOptionsArray ? 1 : 0) - ); - return this._runTask( - cleanWithOptionsTask22(cleanMode, customArgs), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.exec = function (then) { - const task = { - commands: [], - format: "utf-8", - parser() { - if (typeof then === "function") { - then(); - } - } - }; - return this._runTask(task); - }; - Git22.prototype.clearQueue = function () { - return this; - }; - Git22.prototype.checkIgnore = function (pathnames, then) { - return this._runTask( - checkIgnoreTask22(asArray22(filterType22(pathnames, filterStringOrStringArray22, []))), - trailingFunctionArgument22(arguments) - ); - }; - Git22.prototype.checkIsRepo = function (checkType, then) { - return this._runTask( - checkIsRepoTask22(filterType22(checkType, filterString22)), - trailingFunctionArgument22(arguments) - ); - }; - module2.exports = Git22; - } -}); -init_pathspec2(); -init_git_error2(); -var GitConstructError = class extends GitError2 { - constructor(config, message) { - super(void 0, message); - this.config = config; - } -}; -init_git_error2(); -init_git_error2(); -var GitPluginError = class extends GitError2 { - constructor(task, plugin, message) { - super(task, message); - this.task = task; - this.plugin = plugin; - Object.setPrototypeOf(this, new.target.prototype); - } -}; -init_git_response_error2(); -init_task_configuration_error2(); -init_check_is_repo2(); -init_clean2(); -init_config2(); -init_diff_name_status2(); -init_grep2(); -init_reset2(); -function abortPlugin(signal) { - if (!signal) { - return; - } - const onSpawnAfter = { - type: "spawn.after", - action(_data, context) { - function kill() { - context.kill(new GitPluginError(void 0, "abort", "Abort signal received")); - } - signal.addEventListener("abort", kill); - context.spawned.on("close", () => signal.removeEventListener("abort", kill)); - } - }; - const onSpawnBefore = { - type: "spawn.before", - action(_data, context) { - if (signal.aborted) { - context.kill(new GitPluginError(void 0, "abort", "Abort already signaled")); - } - } - }; - return [onSpawnBefore, onSpawnAfter]; -} -function isConfigSwitch(arg) { - return typeof arg === "string" && arg.trim().toLowerCase() === "-c"; -} -function preventProtocolOverride(arg, next) { - if (!isConfigSwitch(arg)) { - return; - } - if (!/^\s*protocol(.[a-z]+)?.allow/.test(next)) { - return; - } - throw new GitPluginError( - void 0, - "unsafe", - "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol" - ); -} -function preventUploadPack(arg, method) { - if (/^\s*--(upload|receive)-pack/.test(arg)) { - throw new GitPluginError( - void 0, - "unsafe", - `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack` - ); - } - if (method === "clone" && /^\s*-u\b/.test(arg)) { - throw new GitPluginError( - void 0, - "unsafe", - `Use of clone with option -u is not permitted without enabling allowUnsafePack` - ); - } - if (method === "push" && /^\s*--exec\b/.test(arg)) { - throw new GitPluginError( - void 0, - "unsafe", - `Use of push with option --exec is not permitted without enabling allowUnsafePack` - ); - } -} -function blockUnsafeOperationsPlugin({ - allowUnsafeProtocolOverride = false, - allowUnsafePack = false -} = {}) { - return { - type: "spawn.args", - action(args, context) { - args.forEach((current, index) => { - const next = index < args.length ? args[index + 1] : ""; - allowUnsafeProtocolOverride || preventProtocolOverride(current, next); - allowUnsafePack || preventUploadPack(current, context.method); - }); - return args; - } - }; -} -init_utils2(); -function commandConfigPrefixingPlugin(configuration) { - const prefix = prefixedArray2(configuration, "-c"); - return { - type: "spawn.args", - action(data) { - return [...prefix, ...data]; - } - }; -} -init_utils2(); -var never2 = (0, import_promise_deferred4.deferred)().promise; -function completionDetectionPlugin({ onClose = true, onExit = 50 } = {}) { - function createEvents() { - let exitCode = -1; - const events = { - close: (0, import_promise_deferred4.deferred)(), - closeTimeout: (0, import_promise_deferred4.deferred)(), - exit: (0, import_promise_deferred4.deferred)(), - exitTimeout: (0, import_promise_deferred4.deferred)() - }; - const result = Promise.race([ - onClose === false ? never2 : events.closeTimeout.promise, - onExit === false ? never2 : events.exitTimeout.promise - ]); - configureTimeout(onClose, events.close, events.closeTimeout); - configureTimeout(onExit, events.exit, events.exitTimeout); - return { - close(code) { - exitCode = code; - events.close.done(); - }, - exit(code) { - exitCode = code; - events.exit.done(); - }, - get exitCode() { - return exitCode; - }, - result - }; - } - function configureTimeout(flag, event, timeout) { - if (flag === false) { - return; - } - (flag === true ? event.promise : event.promise.then(() => delay2(flag))).then(timeout.done); - } - return { - type: "spawn.after", - async action(_data, { spawned, close }) { - const events = createEvents(); - let deferClose = true; - let quickClose = () => void (deferClose = false); - spawned.stdout?.on("data", quickClose); - spawned.stderr?.on("data", quickClose); - spawned.on("error", quickClose); - spawned.on("close", (code) => events.close(code)); - spawned.on("exit", (code) => events.exit(code)); - try { - await events.result; - if (deferClose) { - await delay2(50); - } - close(events.exitCode); - } catch (err) { - close(events.exitCode, err); - } - } - }; -} -init_utils2(); -var WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`; -var WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`; -function isBadArgument(arg) { - return !arg || !/^([a-z]:)?([a-z0-9/.\\_~-]+)$/i.test(arg); -} -function toBinaryConfig(input, allowUnsafe) { - if (input.length < 1 || input.length > 2) { - throw new GitPluginError(void 0, "binary", WRONG_NUMBER_ERR); - } - const isBad = input.some(isBadArgument); - if (isBad) { - if (allowUnsafe) { - console.warn(WRONG_CHARS_ERR); - } else { - throw new GitPluginError(void 0, "binary", WRONG_CHARS_ERR); - } - } - const [binary, prefix] = input; - return { - binary, - prefix - }; -} -function customBinaryPlugin(plugins, input = ["git"], allowUnsafe = false) { - let config = toBinaryConfig(asArray2(input), allowUnsafe); - plugins.on("binary", (input2) => { - config = toBinaryConfig(asArray2(input2), allowUnsafe); - }); - plugins.append("spawn.binary", () => { - return config.binary; - }); - plugins.append("spawn.args", (data) => { - return config.prefix ? [config.prefix, ...data] : data; - }); -} -init_git_error2(); -function isTaskError(result) { - return !!(result.exitCode && result.stdErr.length); -} -function getErrorMessage(result) { - return Buffer.concat([...result.stdOut, ...result.stdErr]); -} -function errorDetectionHandler( - overwrite = false, - isError = isTaskError, - errorMessage = getErrorMessage -) { - return (error, result) => { - if ((!overwrite && error) || !isError(result)) { - return error; - } - return errorMessage(result); - }; -} -function errorDetectionPlugin(config) { - return { - type: "task.error", - action(data, context) { - const error = config(data.error, { - stdErr: context.stdErr, - stdOut: context.stdOut, - exitCode: context.exitCode - }); - if (Buffer.isBuffer(error)) { - return { error: new GitError2(void 0, error.toString("utf-8")) }; - } - return { - error - }; - } - }; -} -init_utils2(); -var PluginStore = class { - constructor() { - this.plugins = /* @__PURE__ */ new Set(); - this.events = new import_node_events.EventEmitter(); - } - on(type, listener) { - this.events.on(type, listener); - } - reconfigure(type, data) { - this.events.emit(type, data); - } - append(type, action) { - const plugin = append2(this.plugins, { type, action }); - return () => this.plugins.delete(plugin); - } - add(plugin) { - const plugins = []; - asArray2(plugin).forEach((plugin2) => plugin2 && this.plugins.add(append2(plugins, plugin2))); - return () => { - plugins.forEach((plugin2) => this.plugins.delete(plugin2)); - }; - } - exec(type, data, context) { - let output = data; - const contextual = Object.freeze(Object.create(context)); - for (const plugin of this.plugins) { - if (plugin.type === type) { - output = plugin.action(output, contextual); - } - } - return output; - } -}; -init_utils2(); -function progressMonitorPlugin(progress) { - const progressCommand = "--progress"; - const progressMethods = ["checkout", "clone", "fetch", "pull", "push"]; - const onProgress = { - type: "spawn.after", - action(_data, context) { - if (!context.commands.includes(progressCommand)) { - return; - } - context.spawned.stderr?.on("data", (chunk) => { - const message = /^([\s\S]+?):\s*(\d+)% \((\d+)\/(\d+)\)/.exec(chunk.toString("utf8")); - if (!message) { - return; - } - progress({ - method: context.method, - stage: progressEventStage(message[1]), - progress: asNumber2(message[2]), - processed: asNumber2(message[3]), - total: asNumber2(message[4]) - }); - }); - } - }; - const onArgs = { - type: "spawn.args", - action(args, context) { - if (!progressMethods.includes(context.method)) { - return args; - } - return including2(args, progressCommand); - } - }; - return [onArgs, onProgress]; -} -function progressEventStage(input) { - return String(input.toLowerCase().split(" ", 1)) || "unknown"; -} -init_utils2(); -function spawnOptionsPlugin(spawnOptions) { - const options = pick2(spawnOptions, ["uid", "gid"]); - return { - type: "spawn.options", - action(data) { - return { ...options, ...data }; - } - }; -} -function timeoutPlugin({ block, stdErr = true, stdOut = true }) { - if (block > 0) { - return { - type: "spawn.after", - action(_data, context) { - let timeout; - function wait() { - timeout && clearTimeout(timeout); - timeout = setTimeout(kill, block); - } - function stop() { - context.spawned.stdout?.off("data", wait); - context.spawned.stderr?.off("data", wait); - context.spawned.off("exit", stop); - context.spawned.off("close", stop); - timeout && clearTimeout(timeout); - } - function kill() { - stop(); - context.kill(new GitPluginError(void 0, "timeout", `block timeout reached`)); - } - stdOut && context.spawned.stdout?.on("data", wait); - stdErr && context.spawned.stderr?.on("data", wait); - context.spawned.on("exit", stop); - context.spawned.on("close", stop); - wait(); - } - }; - } -} -init_pathspec2(); -function suffixPathsPlugin() { - return { - type: "spawn.args", - action(data) { - const prefix = []; - let suffix; - function append22(args) { - (suffix = suffix || []).push(...args); - } - for (let i = 0; i < data.length; i++) { - const param = data[i]; - if (isPathSpec2(param)) { - append22(toPaths(param)); - continue; - } - if (param === "--") { - append22( - data.slice(i + 1).flatMap((item) => (isPathSpec2(item) && toPaths(item)) || item) - ); - break; - } - prefix.push(param); - } - return !suffix ? prefix : [...prefix, "--", ...suffix.map(String)]; - } - }; -} -init_utils2(); -var Git2 = require_git2(); -function gitInstanceFactory(baseDir, options) { - const plugins = new PluginStore(); - const config = createInstanceConfig2( - (baseDir && (typeof baseDir === "string" ? { baseDir } : baseDir)) || {}, - options - ); - if (!folderExists2(config.baseDir)) { - throw new GitConstructError(config, `Cannot use simple-git on a directory that does not exist`); - } - if (Array.isArray(config.config)) { - plugins.add(commandConfigPrefixingPlugin(config.config)); - } - plugins.add(blockUnsafeOperationsPlugin(config.unsafe)); - plugins.add(suffixPathsPlugin()); - plugins.add(completionDetectionPlugin(config.completion)); - config.abort && plugins.add(abortPlugin(config.abort)); - config.progress && plugins.add(progressMonitorPlugin(config.progress)); - config.timeout && plugins.add(timeoutPlugin(config.timeout)); - config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions)); - plugins.add(errorDetectionPlugin(errorDetectionHandler(true))); - config.errors && plugins.add(errorDetectionPlugin(config.errors)); - customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary); - return new Git2(config, plugins); -} -init_git_response_error2(); -var esm_default2 = gitInstanceFactory; - -// src/commands/pr.ts -async function prCommand() { - const workspacePath = getWorkspacePath(); - if (!workspacePath) return; - const git = esm_default2(workspacePath); - const remotes = await git.getRemotes(true); - const origin = remotes.find((r) => r.name === "origin"); - if (!origin?.refs.push) { - vscode11.window.showErrorMessage("Primer: No origin remote found."); - return; - } - const match = origin.refs.push.match(/github\.com[:/]([^/]+)\/([^/.]+)/); - if (!match) { - vscode11.window.showErrorMessage( - "Primer: Could not parse GitHub owner/repo from origin remote." - ); - return; - } - const [, owner, repo] = match; - const branch = (await git.branch()).current; - const defaultBranch = await git - .raw(["symbolic-ref", "refs/remotes/origin/HEAD", "--short"]) - .catch(() => "origin/main"); - const base = defaultBranch.replace("origin/", "").trim(); - if (branch === base) { - vscode11.window.showErrorMessage( - "Primer: Cannot create PR from the default branch. Check out a feature branch first." - ); - return; - } - const title = await vscode11.window.showInputBox({ - prompt: "Pull request title", - value: `Add Primer AI configs for ${repo}` - }); - if (!title) return; - await vscode11.window.withProgress( - { - location: vscode11.ProgressLocation.Notification, - title: "Primer: Creating pull request\u2026" - }, - async () => { - try { - const token = await getGitHubToken(); - const status = await git.status(); - if (status.files.length > 0) { - const primerFiles = status.files - .map((f) => f.path) - .filter( - (p) => - p.startsWith(".github/") || - p.startsWith(".vscode/") || - p.endsWith(".instructions.md") || - p === "primer.eval.json" - ); - if (primerFiles.length === 0) { - vscode11.window.showWarningMessage("Primer: No Primer-generated files to commit."); - return; - } - await git.add(primerFiles); - await git.commit(title); - await git.push("origin", branch); - } - const prUrl = await createPullRequest({ - token, - owner, - repo, - title, - body: "Generated by Primer VS Code extension.", - head: branch, - base - }); - const openAction = "Open in Browser"; - const action = await vscode11.window.showInformationMessage( - `Primer: Pull request created.`, - openAction - ); - if (action === openAction && prUrl.startsWith("https://")) { - vscode11.env.openExternal(vscode11.Uri.parse(prUrl)); - } - } catch (err) { - vscode11.window.showErrorMessage( - `Primer: PR creation failed \u2014 ${err instanceof Error ? err.message : String(err)}` - ); - } - } - ); -} - -// src/extension.ts -function activate(context) { - const statusBar = vscode12.window.createStatusBarItem(vscode12.StatusBarAlignment.Left, 0); - statusBar.text = "$(beaker) Primer"; - statusBar.tooltip = "Primer \u2014 click to analyze repository"; - statusBar.command = "primer.analyze"; - statusBar.show(); - context.subscriptions.push(statusBar); - const analysisView = vscode12.window.createTreeView("primer.analysis", { - treeDataProvider: analysisTreeProvider - }); - const readinessView = vscode12.window.createTreeView("primer.readiness", { - treeDataProvider: readinessTreeProvider - }); - context.subscriptions.push(analysisView, readinessView); - function updateAnalysisView() { - const analysis = getCachedAnalysis(); - if (analysis) { - const parts = [...analysis.languages.slice(0, 3), ...analysis.frameworks.slice(0, 2)]; - analysisView.description = parts.join(", ") || void 0; - } else { - analysisView.description = void 0; - } - } - function updateReadinessView() { - const report = readinessTreeProvider.getReport(); - if (report) { - readinessView.description = `Level ${report.achievedLevel}`; - } else { - readinessView.description = void 0; - } - } - function updateStatusBar() { - const analysis = getCachedAnalysis(); - if (analysis) { - const parts = analysis.languages.slice(0, 2); - statusBar.text = `$(beaker) ${parts.join(", ") || "Primer"}`; - statusBar.tooltip = `Primer \u2014 ${analysis.languages.join(", ")}${analysis.isMonorepo ? " | monorepo" : ""}`; - } else { - statusBar.text = "$(beaker) Primer"; - statusBar.tooltip = "Primer \u2014 click to analyze repository"; - } - } - context.subscriptions.push( - vscode12.commands.registerCommand("primer.analyze", async () => { - await analyzeCommand(); - analysisTreeProvider.refresh(); - updateAnalysisView(); - updateStatusBar(); - vscode12.commands.executeCommand("primer.analysis.focus"); - }), - vscode12.commands.registerCommand("primer.generate", generateCommand), - vscode12.commands.registerCommand("primer.instructions", instructionsCommand), - vscode12.commands.registerCommand("primer.readiness", async () => { - await readinessCommand(); - updateReadinessView(); - updateStatusBar(); - }), - vscode12.commands.registerCommand("primer.eval", evalCommand), - vscode12.commands.registerCommand("primer.evalInit", evalInitCommand), - vscode12.commands.registerCommand("primer.init", async () => { - await initCommand(); - analysisTreeProvider.refresh(); - updateAnalysisView(); - updateStatusBar(); - vscode12.commands.executeCommand("primer.analysis.focus"); - }), - vscode12.commands.registerCommand("primer.pr", prCommand) - ); - const config = vscode12.workspace.getConfiguration("primer"); - if (config.get("autoAnalyze") && vscode12.workspace.workspaceFolders?.length) { - analyzeCommand() - .then(() => { - analysisTreeProvider.refresh(); - updateAnalysisView(); - updateStatusBar(); - }) - .catch(() => {}); - } -} -function deactivate() {} -// Annotate the CommonJS export names for ESM import in node: -0 && - (module.exports = { - activate, - deactivate - }); -/*! Bundled license information: - -is-extglob/index.js: - (*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - *) - -is-glob/index.js: - (*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - *) - -is-number/index.js: - (*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - *) - -to-regex-range/index.js: - (*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - *) - -fill-range/index.js: - (*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - *) - -queue-microtask/index.js: - (*! queue-microtask. MIT License. Feross Aboukhadijeh *) - -run-parallel/index.js: - (*! run-parallel. MIT License. Feross Aboukhadijeh *) - -@octokit/request-error/dist-src/index.js: - (* v8 ignore else -- @preserve -- Bug with vitest coverage where it sees an else branch that doesn't exist *) - -@octokit/request/dist-bundle/index.js: - (* v8 ignore next -- @preserve *) - (* v8 ignore else -- @preserve *) -*/ -//# sourceMappingURL=extension.js.map diff --git a/vscode-extension/out/extension.js.map b/vscode-extension/out/extension.js.map deleted file mode 100644 index d73ba72..0000000 --- a/vscode-extension/out/extension.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../node_modules/fast-glob/out/utils/array.js", "../../node_modules/fast-glob/out/utils/errno.js", "../../node_modules/fast-glob/out/utils/fs.js", "../../node_modules/fast-glob/out/utils/path.js", "../../node_modules/is-extglob/index.js", "../../node_modules/is-glob/index.js", "../../node_modules/fast-glob/node_modules/glob-parent/index.js", "../../node_modules/braces/lib/utils.js", "../../node_modules/braces/lib/stringify.js", "../../node_modules/is-number/index.js", "../../node_modules/to-regex-range/index.js", "../../node_modules/fill-range/index.js", "../../node_modules/braces/lib/compile.js", "../../node_modules/braces/lib/expand.js", "../../node_modules/braces/lib/constants.js", "../../node_modules/braces/lib/parse.js", "../../node_modules/braces/index.js", "../../node_modules/picomatch/lib/constants.js", "../../node_modules/picomatch/lib/utils.js", "../../node_modules/picomatch/lib/scan.js", "../../node_modules/picomatch/lib/parse.js", "../../node_modules/picomatch/lib/picomatch.js", "../../node_modules/picomatch/index.js", "../../node_modules/micromatch/index.js", "../../node_modules/fast-glob/out/utils/pattern.js", "../../node_modules/merge2/index.js", "../../node_modules/fast-glob/out/utils/stream.js", "../../node_modules/fast-glob/out/utils/string.js", "../../node_modules/fast-glob/out/utils/index.js", "../../node_modules/fast-glob/out/managers/tasks.js", "../../node_modules/@nodelib/fs.stat/out/providers/async.js", "../../node_modules/@nodelib/fs.stat/out/providers/sync.js", "../../node_modules/@nodelib/fs.stat/out/adapters/fs.js", "../../node_modules/@nodelib/fs.stat/out/settings.js", "../../node_modules/@nodelib/fs.stat/out/index.js", "../../node_modules/queue-microtask/index.js", "../../node_modules/run-parallel/index.js", "../../node_modules/@nodelib/fs.scandir/out/constants.js", "../../node_modules/@nodelib/fs.scandir/out/utils/fs.js", "../../node_modules/@nodelib/fs.scandir/out/utils/index.js", "../../node_modules/@nodelib/fs.scandir/out/providers/common.js", "../../node_modules/@nodelib/fs.scandir/out/providers/async.js", "../../node_modules/@nodelib/fs.scandir/out/providers/sync.js", "../../node_modules/@nodelib/fs.scandir/out/adapters/fs.js", "../../node_modules/@nodelib/fs.scandir/out/settings.js", "../../node_modules/@nodelib/fs.scandir/out/index.js", "../../node_modules/reusify/reusify.js", "../../node_modules/fastq/queue.js", "../../node_modules/@nodelib/fs.walk/out/readers/common.js", "../../node_modules/@nodelib/fs.walk/out/readers/reader.js", "../../node_modules/@nodelib/fs.walk/out/readers/async.js", "../../node_modules/@nodelib/fs.walk/out/providers/async.js", "../../node_modules/@nodelib/fs.walk/out/providers/stream.js", "../../node_modules/@nodelib/fs.walk/out/readers/sync.js", "../../node_modules/@nodelib/fs.walk/out/providers/sync.js", "../../node_modules/@nodelib/fs.walk/out/settings.js", "../../node_modules/@nodelib/fs.walk/out/index.js", "../../node_modules/fast-glob/out/readers/reader.js", "../../node_modules/fast-glob/out/readers/stream.js", "../../node_modules/fast-glob/out/readers/async.js", "../../node_modules/fast-glob/out/providers/matchers/matcher.js", "../../node_modules/fast-glob/out/providers/matchers/partial.js", "../../node_modules/fast-glob/out/providers/filters/deep.js", "../../node_modules/fast-glob/out/providers/filters/entry.js", "../../node_modules/fast-glob/out/providers/filters/error.js", "../../node_modules/fast-glob/out/providers/transformers/entry.js", "../../node_modules/fast-glob/out/providers/provider.js", "../../node_modules/fast-glob/out/providers/async.js", "../../node_modules/fast-glob/out/providers/stream.js", "../../node_modules/fast-glob/out/readers/sync.js", "../../node_modules/fast-glob/out/providers/sync.js", "../../node_modules/fast-glob/out/settings.js", "../../node_modules/fast-glob/out/index.js", "../../node_modules/ms/index.js", "../../node_modules/debug/src/common.js", "../../node_modules/debug/src/browser.js", "../../node_modules/has-flag/index.js", "../../node_modules/supports-color/index.js", "../../node_modules/debug/src/node.js", "../../node_modules/debug/src/index.js", "../../node_modules/@kwsites/file-exists/src/index.ts", "../../node_modules/@kwsites/file-exists/index.ts", "../../node_modules/@kwsites/promise-deferred/src/index.ts", "../../node_modules/fast-content-type-parse/index.js", "../node_modules/ms/index.js", "../node_modules/debug/src/common.js", "../node_modules/debug/src/browser.js", "../node_modules/debug/src/node.js", "../node_modules/debug/src/index.js", "../node_modules/@kwsites/file-exists/src/index.ts", "../node_modules/@kwsites/file-exists/index.ts", "../node_modules/@kwsites/promise-deferred/src/index.ts", "../src/extension.ts", "../src/commands/analyze.ts", "../../src/services/analyzer.ts", "../../src/utils/fs.ts", "../../src/services/git.ts", "../../node_modules/simple-git/src/lib/args/pathspec.ts", "../../node_modules/simple-git/src/lib/errors/git-error.ts", "../../node_modules/simple-git/src/lib/errors/git-response-error.ts", "../../node_modules/simple-git/src/lib/errors/task-configuration-error.ts", "../../node_modules/simple-git/src/lib/utils/util.ts", "../../node_modules/simple-git/src/lib/utils/argument-filters.ts", "../../node_modules/simple-git/src/lib/utils/exit-codes.ts", "../../node_modules/simple-git/src/lib/utils/git-output-streams.ts", "../../node_modules/simple-git/src/lib/utils/line-parser.ts", "../../node_modules/simple-git/src/lib/utils/simple-git-options.ts", "../../node_modules/simple-git/src/lib/utils/task-options.ts", "../../node_modules/simple-git/src/lib/utils/task-parser.ts", "../../node_modules/simple-git/src/lib/utils/index.ts", "../../node_modules/simple-git/src/lib/tasks/check-is-repo.ts", "../../node_modules/simple-git/src/lib/responses/CleanSummary.ts", "../../node_modules/simple-git/src/lib/tasks/task.ts", "../../node_modules/simple-git/src/lib/tasks/clean.ts", "../../node_modules/simple-git/src/lib/responses/ConfigList.ts", "../../node_modules/simple-git/src/lib/tasks/config.ts", "../../node_modules/simple-git/src/lib/tasks/diff-name-status.ts", "../../node_modules/simple-git/src/lib/tasks/grep.ts", "../../node_modules/simple-git/src/lib/tasks/reset.ts", "../../node_modules/simple-git/src/lib/git-logger.ts", "../../node_modules/simple-git/src/lib/runners/tasks-pending-queue.ts", "../../node_modules/simple-git/src/lib/runners/git-executor-chain.ts", "../../node_modules/simple-git/src/lib/runners/git-executor.ts", "../../node_modules/simple-git/src/lib/task-callback.ts", "../../node_modules/simple-git/src/lib/tasks/change-working-directory.ts", "../../node_modules/simple-git/src/lib/tasks/checkout.ts", "../../node_modules/simple-git/src/lib/tasks/count-objects.ts", "../../node_modules/simple-git/src/lib/parsers/parse-commit.ts", "../../node_modules/simple-git/src/lib/tasks/commit.ts", "../../node_modules/simple-git/src/lib/tasks/first-commit.ts", "../../node_modules/simple-git/src/lib/tasks/hash-object.ts", "../../node_modules/simple-git/src/lib/responses/InitSummary.ts", "../../node_modules/simple-git/src/lib/tasks/init.ts", "../../node_modules/simple-git/src/lib/args/log-format.ts", "../../node_modules/simple-git/src/lib/responses/DiffSummary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-diff-summary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-list-log-summary.ts", "../../node_modules/simple-git/src/lib/tasks/diff.ts", "../../node_modules/simple-git/src/lib/tasks/log.ts", "../../node_modules/simple-git/src/lib/responses/MergeSummary.ts", "../../node_modules/simple-git/src/lib/responses/PullSummary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-remote-objects.ts", "../../node_modules/simple-git/src/lib/parsers/parse-remote-messages.ts", "../../node_modules/simple-git/src/lib/parsers/parse-pull.ts", "../../node_modules/simple-git/src/lib/parsers/parse-merge.ts", "../../node_modules/simple-git/src/lib/tasks/merge.ts", "../../node_modules/simple-git/src/lib/parsers/parse-push.ts", "../../node_modules/simple-git/src/lib/tasks/push.ts", "../../node_modules/simple-git/src/lib/tasks/show.ts", "../../node_modules/simple-git/src/lib/responses/FileStatusSummary.ts", "../../node_modules/simple-git/src/lib/responses/StatusSummary.ts", "../../node_modules/simple-git/src/lib/tasks/status.ts", "../../node_modules/simple-git/src/lib/tasks/version.ts", "../../node_modules/simple-git/src/lib/simple-git-api.ts", "../../node_modules/simple-git/src/lib/runners/scheduler.ts", "../../node_modules/simple-git/src/lib/tasks/apply-patch.ts", "../../node_modules/simple-git/src/lib/responses/BranchDeleteSummary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-branch-delete.ts", "../../node_modules/simple-git/src/lib/responses/BranchSummary.ts", "../../node_modules/simple-git/src/lib/parsers/parse-branch.ts", "../../node_modules/simple-git/src/lib/tasks/branch.ts", "../../node_modules/simple-git/src/lib/responses/CheckIgnore.ts", "../../node_modules/simple-git/src/lib/tasks/check-ignore.ts", "../../node_modules/simple-git/src/lib/tasks/clone.ts", "../../node_modules/simple-git/src/lib/parsers/parse-fetch.ts", "../../node_modules/simple-git/src/lib/tasks/fetch.ts", "../../node_modules/simple-git/src/lib/parsers/parse-move.ts", "../../node_modules/simple-git/src/lib/tasks/move.ts", "../../node_modules/simple-git/src/lib/tasks/pull.ts", "../../node_modules/simple-git/src/lib/responses/GetRemoteSummary.ts", "../../node_modules/simple-git/src/lib/tasks/remote.ts", "../../node_modules/simple-git/src/lib/tasks/stash-list.ts", "../../node_modules/simple-git/src/lib/tasks/sub-module.ts", "../../node_modules/simple-git/src/lib/responses/TagList.ts", "../../node_modules/simple-git/src/lib/tasks/tag.ts", "../../node_modules/simple-git/src/git.js", "../../node_modules/simple-git/src/lib/api.ts", "../../node_modules/simple-git/src/lib/errors/git-construct-error.ts", "../../node_modules/simple-git/src/lib/errors/git-plugin-error.ts", "../../node_modules/simple-git/src/lib/plugins/abort-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/completion-detection.plugin.ts", "../../node_modules/simple-git/src/lib/plugins/custom-binary.plugin.ts", "../../node_modules/simple-git/src/lib/plugins/error-detection.plugin.ts", "../../node_modules/simple-git/src/lib/plugins/plugin-store.ts", "../../node_modules/simple-git/src/lib/plugins/progress-monitor-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/spawn-options-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/timout-plugin.ts", "../../node_modules/simple-git/src/lib/plugins/suffix-paths.plugin.ts", "../../node_modules/simple-git/src/lib/git-factory.ts", "../../node_modules/simple-git/src/lib/runners/promise-wrapped.ts", "../../node_modules/simple-git/src/esm.mjs", "../../src/services/generator.ts", "../../src/config.ts", "../../src/services/copilot.ts", "../../src/services/instructions.ts", "../../src/services/evaluator.ts", "../../src/services/evalScaffold.ts", "../../src/services/readiness.ts", "../../src/services/policy.ts", "../../src/services/visualReport.ts", "../../src/services/github.ts", "../../node_modules/universal-user-agent/index.js", "../../node_modules/before-after-hook/lib/register.js", "../../node_modules/before-after-hook/lib/add.js", "../../node_modules/before-after-hook/lib/remove.js", "../../node_modules/before-after-hook/index.js", "../../node_modules/@octokit/endpoint/dist-bundle/index.js", "../../node_modules/@octokit/request/dist-bundle/index.js", "../../node_modules/@octokit/request-error/dist-src/index.js", "../../node_modules/@octokit/graphql/dist-bundle/index.js", "../../node_modules/@octokit/auth-token/dist-bundle/index.js", "../../node_modules/@octokit/core/dist-src/version.js", "../../node_modules/@octokit/core/dist-src/index.js", "../../node_modules/@octokit/plugin-request-log/dist-src/version.js", "../../node_modules/@octokit/plugin-request-log/dist-src/index.js", "../../node_modules/@octokit/plugin-paginate-rest/dist-bundle/index.js", "../../node_modules/@octokit/src/version.ts", "../../node_modules/@octokit/src/generated/endpoints.ts", "../../node_modules/@octokit/src/endpoints-to-methods.ts", "../../node_modules/@octokit/src/index.ts", "../../node_modules/@octokit/rest/dist-src/version.js", "../../node_modules/@octokit/rest/dist-src/index.js", "../src/commands/generate.ts", "../src/commands/instructions.ts", "../src/progress.ts", "../src/commands/readiness.ts", "../src/webview.ts", "../src/views/AnalysisTreeProvider.ts", "../src/views/ReadinessTreeProvider.ts", "../src/views/providers.ts", "../src/commands/eval.ts", "../src/commands/init.ts", "../src/commands/pr.ts", "../src/auth.ts", "../node_modules/simple-git/src/lib/args/pathspec.ts", "../node_modules/simple-git/src/lib/errors/git-error.ts", "../node_modules/simple-git/src/lib/errors/git-response-error.ts", "../node_modules/simple-git/src/lib/errors/task-configuration-error.ts", "../node_modules/simple-git/src/lib/utils/util.ts", "../node_modules/simple-git/src/lib/utils/argument-filters.ts", "../node_modules/simple-git/src/lib/utils/exit-codes.ts", "../node_modules/simple-git/src/lib/utils/git-output-streams.ts", "../node_modules/simple-git/src/lib/utils/line-parser.ts", "../node_modules/simple-git/src/lib/utils/simple-git-options.ts", "../node_modules/simple-git/src/lib/utils/task-options.ts", "../node_modules/simple-git/src/lib/utils/task-parser.ts", "../node_modules/simple-git/src/lib/utils/index.ts", "../node_modules/simple-git/src/lib/tasks/check-is-repo.ts", "../node_modules/simple-git/src/lib/responses/CleanSummary.ts", "../node_modules/simple-git/src/lib/tasks/task.ts", "../node_modules/simple-git/src/lib/tasks/clean.ts", "../node_modules/simple-git/src/lib/responses/ConfigList.ts", "../node_modules/simple-git/src/lib/tasks/config.ts", "../node_modules/simple-git/src/lib/tasks/diff-name-status.ts", "../node_modules/simple-git/src/lib/tasks/grep.ts", "../node_modules/simple-git/src/lib/tasks/reset.ts", "../node_modules/simple-git/src/lib/git-logger.ts", "../node_modules/simple-git/src/lib/runners/tasks-pending-queue.ts", "../node_modules/simple-git/src/lib/runners/git-executor-chain.ts", "../node_modules/simple-git/src/lib/runners/git-executor.ts", "../node_modules/simple-git/src/lib/task-callback.ts", "../node_modules/simple-git/src/lib/tasks/change-working-directory.ts", "../node_modules/simple-git/src/lib/tasks/checkout.ts", "../node_modules/simple-git/src/lib/tasks/count-objects.ts", "../node_modules/simple-git/src/lib/parsers/parse-commit.ts", "../node_modules/simple-git/src/lib/tasks/commit.ts", "../node_modules/simple-git/src/lib/tasks/first-commit.ts", "../node_modules/simple-git/src/lib/tasks/hash-object.ts", "../node_modules/simple-git/src/lib/responses/InitSummary.ts", "../node_modules/simple-git/src/lib/tasks/init.ts", "../node_modules/simple-git/src/lib/args/log-format.ts", "../node_modules/simple-git/src/lib/responses/DiffSummary.ts", "../node_modules/simple-git/src/lib/parsers/parse-diff-summary.ts", "../node_modules/simple-git/src/lib/parsers/parse-list-log-summary.ts", "../node_modules/simple-git/src/lib/tasks/diff.ts", "../node_modules/simple-git/src/lib/tasks/log.ts", "../node_modules/simple-git/src/lib/responses/MergeSummary.ts", "../node_modules/simple-git/src/lib/responses/PullSummary.ts", "../node_modules/simple-git/src/lib/parsers/parse-remote-objects.ts", "../node_modules/simple-git/src/lib/parsers/parse-remote-messages.ts", "../node_modules/simple-git/src/lib/parsers/parse-pull.ts", "../node_modules/simple-git/src/lib/parsers/parse-merge.ts", "../node_modules/simple-git/src/lib/tasks/merge.ts", "../node_modules/simple-git/src/lib/parsers/parse-push.ts", "../node_modules/simple-git/src/lib/tasks/push.ts", "../node_modules/simple-git/src/lib/tasks/show.ts", "../node_modules/simple-git/src/lib/responses/FileStatusSummary.ts", "../node_modules/simple-git/src/lib/responses/StatusSummary.ts", "../node_modules/simple-git/src/lib/tasks/status.ts", "../node_modules/simple-git/src/lib/tasks/version.ts", "../node_modules/simple-git/src/lib/simple-git-api.ts", "../node_modules/simple-git/src/lib/runners/scheduler.ts", "../node_modules/simple-git/src/lib/tasks/apply-patch.ts", "../node_modules/simple-git/src/lib/responses/BranchDeleteSummary.ts", "../node_modules/simple-git/src/lib/parsers/parse-branch-delete.ts", "../node_modules/simple-git/src/lib/responses/BranchSummary.ts", "../node_modules/simple-git/src/lib/parsers/parse-branch.ts", "../node_modules/simple-git/src/lib/tasks/branch.ts", "../node_modules/simple-git/src/lib/responses/CheckIgnore.ts", "../node_modules/simple-git/src/lib/tasks/check-ignore.ts", "../node_modules/simple-git/src/lib/tasks/clone.ts", "../node_modules/simple-git/src/lib/parsers/parse-fetch.ts", "../node_modules/simple-git/src/lib/tasks/fetch.ts", "../node_modules/simple-git/src/lib/parsers/parse-move.ts", "../node_modules/simple-git/src/lib/tasks/move.ts", "../node_modules/simple-git/src/lib/tasks/pull.ts", "../node_modules/simple-git/src/lib/responses/GetRemoteSummary.ts", "../node_modules/simple-git/src/lib/tasks/remote.ts", "../node_modules/simple-git/src/lib/tasks/stash-list.ts", "../node_modules/simple-git/src/lib/tasks/sub-module.ts", "../node_modules/simple-git/src/lib/responses/TagList.ts", "../node_modules/simple-git/src/lib/tasks/tag.ts", "../node_modules/simple-git/src/git.js", "../node_modules/simple-git/src/lib/api.ts", "../node_modules/simple-git/src/lib/errors/git-construct-error.ts", "../node_modules/simple-git/src/lib/errors/git-plugin-error.ts", "../node_modules/simple-git/src/lib/plugins/abort-plugin.ts", "../node_modules/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts", "../node_modules/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts", "../node_modules/simple-git/src/lib/plugins/completion-detection.plugin.ts", "../node_modules/simple-git/src/lib/plugins/custom-binary.plugin.ts", "../node_modules/simple-git/src/lib/plugins/error-detection.plugin.ts", "../node_modules/simple-git/src/lib/plugins/plugin-store.ts", "../node_modules/simple-git/src/lib/plugins/progress-monitor-plugin.ts", "../node_modules/simple-git/src/lib/plugins/spawn-options-plugin.ts", "../node_modules/simple-git/src/lib/plugins/timout-plugin.ts", "../node_modules/simple-git/src/lib/plugins/suffix-paths.plugin.ts", "../node_modules/simple-git/src/lib/git-factory.ts", "../node_modules/simple-git/src/lib/runners/promise-wrapped.ts", "../node_modules/simple-git/src/esm.mjs"], - "sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.splitWhen = exports.flatten = void 0;\nfunction flatten(items) {\n return items.reduce((collection, item) => [].concat(collection, item), []);\n}\nexports.flatten = flatten;\nfunction splitWhen(items, predicate) {\n const result = [[]];\n let groupIndex = 0;\n for (const item of items) {\n if (predicate(item)) {\n groupIndex++;\n result[groupIndex] = [];\n }\n else {\n result[groupIndex].push(item);\n }\n }\n return result;\n}\nexports.splitWhen = splitWhen;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isEnoentCodeError = void 0;\nfunction isEnoentCodeError(error) {\n return error.code === 'ENOENT';\n}\nexports.isEnoentCodeError = isEnoentCodeError;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createDirentFromStats = void 0;\nclass DirentFromStats {\n constructor(name, stats) {\n this.name = name;\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\n this.isDirectory = stats.isDirectory.bind(stats);\n this.isFIFO = stats.isFIFO.bind(stats);\n this.isFile = stats.isFile.bind(stats);\n this.isSocket = stats.isSocket.bind(stats);\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\n }\n}\nfunction createDirentFromStats(name, stats) {\n return new DirentFromStats(name, stats);\n}\nexports.createDirentFromStats = createDirentFromStats;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertPosixPathToPattern = exports.convertWindowsPathToPattern = exports.convertPathToPattern = exports.escapePosixPath = exports.escapeWindowsPath = exports.escape = exports.removeLeadingDotSegment = exports.makeAbsolute = exports.unixify = void 0;\nconst os = require(\"os\");\nconst path = require(\"path\");\nconst IS_WINDOWS_PLATFORM = os.platform() === 'win32';\nconst LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\\\\n/**\n * All non-escaped special characters.\n * Posix: ()*?[]{|}, !+@ before (, ! at the beginning, \\\\ before non-special characters.\n * Windows: (){}[], !+@ before (, ! at the beginning.\n */\nconst POSIX_UNESCAPED_GLOB_SYMBOLS_RE = /(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\()|\\\\(?![!()*+?@[\\]{|}]))/g;\nconst WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE = /(\\\\?)([()[\\]{}]|^!|[!+@](?=\\())/g;\n/**\n * The device path (\\\\.\\ or \\\\?\\).\n * https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats#dos-device-paths\n */\nconst DOS_DEVICE_PATH_RE = /^\\\\\\\\([.?])/;\n/**\n * All backslashes except those escaping special characters.\n * Windows: !()+@{}\n * https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions\n */\nconst WINDOWS_BACKSLASHES_RE = /\\\\(?![!()+@[\\]{}])/g;\n/**\n * Designed to work only with simple paths: `dir\\\\file`.\n */\nfunction unixify(filepath) {\n return filepath.replace(/\\\\/g, '/');\n}\nexports.unixify = unixify;\nfunction makeAbsolute(cwd, filepath) {\n return path.resolve(cwd, filepath);\n}\nexports.makeAbsolute = makeAbsolute;\nfunction removeLeadingDotSegment(entry) {\n // We do not use `startsWith` because this is 10x slower than current implementation for some cases.\n // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\n if (entry.charAt(0) === '.') {\n const secondCharactery = entry.charAt(1);\n if (secondCharactery === '/' || secondCharactery === '\\\\') {\n return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT);\n }\n }\n return entry;\n}\nexports.removeLeadingDotSegment = removeLeadingDotSegment;\nexports.escape = IS_WINDOWS_PLATFORM ? escapeWindowsPath : escapePosixPath;\nfunction escapeWindowsPath(pattern) {\n return pattern.replace(WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE, '\\\\$2');\n}\nexports.escapeWindowsPath = escapeWindowsPath;\nfunction escapePosixPath(pattern) {\n return pattern.replace(POSIX_UNESCAPED_GLOB_SYMBOLS_RE, '\\\\$2');\n}\nexports.escapePosixPath = escapePosixPath;\nexports.convertPathToPattern = IS_WINDOWS_PLATFORM ? convertWindowsPathToPattern : convertPosixPathToPattern;\nfunction convertWindowsPathToPattern(filepath) {\n return escapeWindowsPath(filepath)\n .replace(DOS_DEVICE_PATH_RE, '//$1')\n .replace(WINDOWS_BACKSLASHES_RE, '/');\n}\nexports.convertWindowsPathToPattern = convertWindowsPathToPattern;\nfunction convertPosixPathToPattern(filepath) {\n return escapePosixPath(filepath);\n}\nexports.convertPosixPathToPattern = convertPosixPathToPattern;\n", "/*!\n * is-extglob \n *\n * Copyright (c) 2014-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nmodule.exports = function isExtglob(str) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n var match;\n while ((match = /(\\\\).|([@?!+*]\\(.*\\))/g.exec(str))) {\n if (match[2]) return true;\n str = str.slice(match.index + match[0].length);\n }\n\n return false;\n};\n", "/*!\n * is-glob \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nvar isExtglob = require('is-extglob');\nvar chars = { '{': '}', '(': ')', '[': ']'};\nvar strictCheck = function(str) {\n if (str[0] === '!') {\n return true;\n }\n var index = 0;\n var pipeIndex = -2;\n var closeSquareIndex = -2;\n var closeCurlyIndex = -2;\n var closeParenIndex = -2;\n var backSlashIndex = -2;\n while (index < str.length) {\n if (str[index] === '*') {\n return true;\n }\n\n if (str[index + 1] === '?' && /[\\].+)]/.test(str[index])) {\n return true;\n }\n\n if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') {\n if (closeSquareIndex < index) {\n closeSquareIndex = str.indexOf(']', index);\n }\n if (closeSquareIndex > index) {\n if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {\n return true;\n }\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {\n return true;\n }\n }\n }\n\n if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') {\n closeCurlyIndex = str.indexOf('}', index);\n if (closeCurlyIndex > index) {\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) {\n return true;\n }\n }\n }\n\n if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') {\n closeParenIndex = str.indexOf(')', index);\n if (closeParenIndex > index) {\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {\n return true;\n }\n }\n }\n\n if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') {\n if (pipeIndex < index) {\n pipeIndex = str.indexOf('|', index);\n }\n if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') {\n closeParenIndex = str.indexOf(')', pipeIndex);\n if (closeParenIndex > pipeIndex) {\n backSlashIndex = str.indexOf('\\\\', pipeIndex);\n if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {\n return true;\n }\n }\n }\n }\n\n if (str[index] === '\\\\') {\n var open = str[index + 1];\n index += 2;\n var close = chars[open];\n\n if (close) {\n var n = str.indexOf(close, index);\n if (n !== -1) {\n index = n + 1;\n }\n }\n\n if (str[index] === '!') {\n return true;\n }\n } else {\n index++;\n }\n }\n return false;\n};\n\nvar relaxedCheck = function(str) {\n if (str[0] === '!') {\n return true;\n }\n var index = 0;\n while (index < str.length) {\n if (/[*?{}()[\\]]/.test(str[index])) {\n return true;\n }\n\n if (str[index] === '\\\\') {\n var open = str[index + 1];\n index += 2;\n var close = chars[open];\n\n if (close) {\n var n = str.indexOf(close, index);\n if (n !== -1) {\n index = n + 1;\n }\n }\n\n if (str[index] === '!') {\n return true;\n }\n } else {\n index++;\n }\n }\n return false;\n};\n\nmodule.exports = function isGlob(str, options) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n if (isExtglob(str)) {\n return true;\n }\n\n var check = strictCheck;\n\n // optionally relax check\n if (options && options.strict === false) {\n check = relaxedCheck;\n }\n\n return check(str);\n};\n", "'use strict';\n\nvar isGlob = require('is-glob');\nvar pathPosixDirname = require('path').posix.dirname;\nvar isWin32 = require('os').platform() === 'win32';\n\nvar slash = '/';\nvar backslash = /\\\\/g;\nvar enclosure = /[\\{\\[].*[\\}\\]]$/;\nvar globby = /(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/;\nvar escaped = /\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;\n\n/**\n * @param {string} str\n * @param {Object} opts\n * @param {boolean} [opts.flipBackslashes=true]\n * @returns {string}\n */\nmodule.exports = function globParent(str, opts) {\n var options = Object.assign({ flipBackslashes: true }, opts);\n\n // flip windows path separators\n if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {\n str = str.replace(backslash, slash);\n }\n\n // special case for strings ending in enclosure containing path separator\n if (enclosure.test(str)) {\n str += slash;\n }\n\n // preserves full path in case of trailing path separator\n str += 'a';\n\n // remove path parts that are globby\n do {\n str = pathPosixDirname(str);\n } while (isGlob(str) || globby.test(str));\n\n // remove escape chars and return result\n return str.replace(escaped, '$1');\n};\n", "'use strict';\n\nexports.isInteger = num => {\n if (typeof num === 'number') {\n return Number.isInteger(num);\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isInteger(Number(num));\n }\n return false;\n};\n\n/**\n * Find a node of the given type\n */\n\nexports.find = (node, type) => node.nodes.find(node => node.type === type);\n\n/**\n * Find a node of the given type\n */\n\nexports.exceedsLimit = (min, max, step = 1, limit) => {\n if (limit === false) return false;\n if (!exports.isInteger(min) || !exports.isInteger(max)) return false;\n return ((Number(max) - Number(min)) / Number(step)) >= limit;\n};\n\n/**\n * Escape the given node with '\\\\' before node.value\n */\n\nexports.escapeNode = (block, n = 0, type) => {\n const node = block.nodes[n];\n if (!node) return;\n\n if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {\n if (node.escaped !== true) {\n node.value = '\\\\' + node.value;\n node.escaped = true;\n }\n }\n};\n\n/**\n * Returns true if the given brace node should be enclosed in literal braces\n */\n\nexports.encloseBrace = node => {\n if (node.type !== 'brace') return false;\n if ((node.commas >> 0 + node.ranges >> 0) === 0) {\n node.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a brace node is invalid.\n */\n\nexports.isInvalidBrace = block => {\n if (block.type !== 'brace') return false;\n if (block.invalid === true || block.dollar) return true;\n if ((block.commas >> 0 + block.ranges >> 0) === 0) {\n block.invalid = true;\n return true;\n }\n if (block.open !== true || block.close !== true) {\n block.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a node is an open or close node\n */\n\nexports.isOpenOrClose = node => {\n if (node.type === 'open' || node.type === 'close') {\n return true;\n }\n return node.open === true || node.close === true;\n};\n\n/**\n * Reduce an array of text nodes.\n */\n\nexports.reduce = nodes => nodes.reduce((acc, node) => {\n if (node.type === 'text') acc.push(node.value);\n if (node.type === 'range') node.type = 'text';\n return acc;\n}, []);\n\n/**\n * Flatten an array\n */\n\nexports.flatten = (...args) => {\n const result = [];\n\n const flat = arr => {\n for (let i = 0; i < arr.length; i++) {\n const ele = arr[i];\n\n if (Array.isArray(ele)) {\n flat(ele);\n continue;\n }\n\n if (ele !== undefined) {\n result.push(ele);\n }\n }\n return result;\n };\n\n flat(args);\n return result;\n};\n", "'use strict';\n\nconst utils = require('./utils');\n\nmodule.exports = (ast, options = {}) => {\n const stringify = (node, parent = {}) => {\n const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n let output = '';\n\n if (node.value) {\n if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) {\n return '\\\\' + node.value;\n }\n return node.value;\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += stringify(child);\n }\n }\n return output;\n };\n\n return stringify(ast);\n};\n\n", "/*!\n * is-number \n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function(num) {\n if (typeof num === 'number') {\n return num - num === 0;\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);\n }\n return false;\n};\n", "/*!\n * to-regex-range \n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst isNumber = require('is-number');\n\nconst toRegexRange = (min, max, options) => {\n if (isNumber(min) === false) {\n throw new TypeError('toRegexRange: expected the first argument to be a number');\n }\n\n if (max === void 0 || min === max) {\n return String(min);\n }\n\n if (isNumber(max) === false) {\n throw new TypeError('toRegexRange: expected the second argument to be a number.');\n }\n\n let opts = { relaxZeros: true, ...options };\n if (typeof opts.strictZeros === 'boolean') {\n opts.relaxZeros = opts.strictZeros === false;\n }\n\n let relax = String(opts.relaxZeros);\n let shorthand = String(opts.shorthand);\n let capture = String(opts.capture);\n let wrap = String(opts.wrap);\n let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;\n\n if (toRegexRange.cache.hasOwnProperty(cacheKey)) {\n return toRegexRange.cache[cacheKey].result;\n }\n\n let a = Math.min(min, max);\n let b = Math.max(min, max);\n\n if (Math.abs(a - b) === 1) {\n let result = min + '|' + max;\n if (opts.capture) {\n return `(${result})`;\n }\n if (opts.wrap === false) {\n return result;\n }\n return `(?:${result})`;\n }\n\n let isPadded = hasPadding(min) || hasPadding(max);\n let state = { min, max, a, b };\n let positives = [];\n let negatives = [];\n\n if (isPadded) {\n state.isPadded = isPadded;\n state.maxLen = String(state.max).length;\n }\n\n if (a < 0) {\n let newMin = b < 0 ? Math.abs(b) : 1;\n negatives = splitToPatterns(newMin, Math.abs(a), state, opts);\n a = state.a = 0;\n }\n\n if (b >= 0) {\n positives = splitToPatterns(a, b, state, opts);\n }\n\n state.negatives = negatives;\n state.positives = positives;\n state.result = collatePatterns(negatives, positives, opts);\n\n if (opts.capture === true) {\n state.result = `(${state.result})`;\n } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {\n state.result = `(?:${state.result})`;\n }\n\n toRegexRange.cache[cacheKey] = state;\n return state.result;\n};\n\nfunction collatePatterns(neg, pos, options) {\n let onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];\n let onlyPositive = filterPatterns(pos, neg, '', false, options) || [];\n let intersected = filterPatterns(neg, pos, '-?', true, options) || [];\n let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);\n return subpatterns.join('|');\n}\n\nfunction splitToRanges(min, max) {\n let nines = 1;\n let zeros = 1;\n\n let stop = countNines(min, nines);\n let stops = new Set([max]);\n\n while (min <= stop && stop <= max) {\n stops.add(stop);\n nines += 1;\n stop = countNines(min, nines);\n }\n\n stop = countZeros(max + 1, zeros) - 1;\n\n while (min < stop && stop <= max) {\n stops.add(stop);\n zeros += 1;\n stop = countZeros(max + 1, zeros) - 1;\n }\n\n stops = [...stops];\n stops.sort(compare);\n return stops;\n}\n\n/**\n * Convert a range to a regex pattern\n * @param {Number} `start`\n * @param {Number} `stop`\n * @return {String}\n */\n\nfunction rangeToPattern(start, stop, options) {\n if (start === stop) {\n return { pattern: start, count: [], digits: 0 };\n }\n\n let zipped = zip(start, stop);\n let digits = zipped.length;\n let pattern = '';\n let count = 0;\n\n for (let i = 0; i < digits; i++) {\n let [startDigit, stopDigit] = zipped[i];\n\n if (startDigit === stopDigit) {\n pattern += startDigit;\n\n } else if (startDigit !== '0' || stopDigit !== '9') {\n pattern += toCharacterClass(startDigit, stopDigit, options);\n\n } else {\n count++;\n }\n }\n\n if (count) {\n pattern += options.shorthand === true ? '\\\\d' : '[0-9]';\n }\n\n return { pattern, count: [count], digits };\n}\n\nfunction splitToPatterns(min, max, tok, options) {\n let ranges = splitToRanges(min, max);\n let tokens = [];\n let start = min;\n let prev;\n\n for (let i = 0; i < ranges.length; i++) {\n let max = ranges[i];\n let obj = rangeToPattern(String(start), String(max), options);\n let zeros = '';\n\n if (!tok.isPadded && prev && prev.pattern === obj.pattern) {\n if (prev.count.length > 1) {\n prev.count.pop();\n }\n\n prev.count.push(obj.count[0]);\n prev.string = prev.pattern + toQuantifier(prev.count);\n start = max + 1;\n continue;\n }\n\n if (tok.isPadded) {\n zeros = padZeros(max, tok, options);\n }\n\n obj.string = zeros + obj.pattern + toQuantifier(obj.count);\n tokens.push(obj);\n start = max + 1;\n prev = obj;\n }\n\n return tokens;\n}\n\nfunction filterPatterns(arr, comparison, prefix, intersection, options) {\n let result = [];\n\n for (let ele of arr) {\n let { string } = ele;\n\n // only push if _both_ are negative...\n if (!intersection && !contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n\n // or _both_ are positive\n if (intersection && contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n }\n return result;\n}\n\n/**\n * Zip strings\n */\n\nfunction zip(a, b) {\n let arr = [];\n for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);\n return arr;\n}\n\nfunction compare(a, b) {\n return a > b ? 1 : b > a ? -1 : 0;\n}\n\nfunction contains(arr, key, val) {\n return arr.some(ele => ele[key] === val);\n}\n\nfunction countNines(min, len) {\n return Number(String(min).slice(0, -len) + '9'.repeat(len));\n}\n\nfunction countZeros(integer, zeros) {\n return integer - (integer % Math.pow(10, zeros));\n}\n\nfunction toQuantifier(digits) {\n let [start = 0, stop = ''] = digits;\n if (stop || start > 1) {\n return `{${start + (stop ? ',' + stop : '')}}`;\n }\n return '';\n}\n\nfunction toCharacterClass(a, b, options) {\n return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;\n}\n\nfunction hasPadding(str) {\n return /^-?(0+)\\d/.test(str);\n}\n\nfunction padZeros(value, tok, options) {\n if (!tok.isPadded) {\n return value;\n }\n\n let diff = Math.abs(tok.maxLen - String(value).length);\n let relax = options.relaxZeros !== false;\n\n switch (diff) {\n case 0:\n return '';\n case 1:\n return relax ? '0?' : '0';\n case 2:\n return relax ? '0{0,2}' : '00';\n default: {\n return relax ? `0{0,${diff}}` : `0{${diff}}`;\n }\n }\n}\n\n/**\n * Cache\n */\n\ntoRegexRange.cache = {};\ntoRegexRange.clearCache = () => (toRegexRange.cache = {});\n\n/**\n * Expose `toRegexRange`\n */\n\nmodule.exports = toRegexRange;\n", "/*!\n * fill-range \n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst util = require('util');\nconst toRegexRange = require('to-regex-range');\n\nconst isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\n\nconst transform = toNumber => {\n return value => toNumber === true ? Number(value) : String(value);\n};\n\nconst isValidValue = value => {\n return typeof value === 'number' || (typeof value === 'string' && value !== '');\n};\n\nconst isNumber = num => Number.isInteger(+num);\n\nconst zeros = input => {\n let value = `${input}`;\n let index = -1;\n if (value[0] === '-') value = value.slice(1);\n if (value === '0') return false;\n while (value[++index] === '0');\n return index > 0;\n};\n\nconst stringify = (start, end, options) => {\n if (typeof start === 'string' || typeof end === 'string') {\n return true;\n }\n return options.stringify === true;\n};\n\nconst pad = (input, maxLength, toNumber) => {\n if (maxLength > 0) {\n let dash = input[0] === '-' ? '-' : '';\n if (dash) input = input.slice(1);\n input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));\n }\n if (toNumber === false) {\n return String(input);\n }\n return input;\n};\n\nconst toMaxLen = (input, maxLength) => {\n let negative = input[0] === '-' ? '-' : '';\n if (negative) {\n input = input.slice(1);\n maxLength--;\n }\n while (input.length < maxLength) input = '0' + input;\n return negative ? ('-' + input) : input;\n};\n\nconst toSequence = (parts, options, maxLen) => {\n parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n\n let prefix = options.capture ? '' : '?:';\n let positives = '';\n let negatives = '';\n let result;\n\n if (parts.positives.length) {\n positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|');\n }\n\n if (parts.negatives.length) {\n negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`;\n }\n\n if (positives && negatives) {\n result = `${positives}|${negatives}`;\n } else {\n result = positives || negatives;\n }\n\n if (options.wrap) {\n return `(${prefix}${result})`;\n }\n\n return result;\n};\n\nconst toRange = (a, b, isNumbers, options) => {\n if (isNumbers) {\n return toRegexRange(a, b, { wrap: false, ...options });\n }\n\n let start = String.fromCharCode(a);\n if (a === b) return start;\n\n let stop = String.fromCharCode(b);\n return `[${start}-${stop}]`;\n};\n\nconst toRegex = (start, end, options) => {\n if (Array.isArray(start)) {\n let wrap = options.wrap === true;\n let prefix = options.capture ? '' : '?:';\n return wrap ? `(${prefix}${start.join('|')})` : start.join('|');\n }\n return toRegexRange(start, end, options);\n};\n\nconst rangeError = (...args) => {\n return new RangeError('Invalid range arguments: ' + util.inspect(...args));\n};\n\nconst invalidRange = (start, end, options) => {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n};\n\nconst invalidStep = (step, options) => {\n if (options.strictRanges === true) {\n throw new TypeError(`Expected step \"${step}\" to be a number`);\n }\n return [];\n};\n\nconst fillNumbers = (start, end, step = 1, options = {}) => {\n let a = Number(start);\n let b = Number(end);\n\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n }\n\n // fix negative zero\n if (a === 0) a = 0;\n if (b === 0) b = 0;\n\n let descending = a > b;\n let startString = String(start);\n let endString = String(end);\n let stepString = String(step);\n step = Math.max(Math.abs(step), 1);\n\n let padded = zeros(startString) || zeros(endString) || zeros(stepString);\n let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;\n let toNumber = padded === false && stringify(start, end, options) === false;\n let format = options.transform || transform(toNumber);\n\n if (options.toRegex && step === 1) {\n return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);\n }\n\n let parts = { negatives: [], positives: [] };\n let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n if (options.toRegex === true && step > 1) {\n push(a);\n } else {\n range.push(pad(format(a, index), maxLen, toNumber));\n }\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return step > 1\n ? toSequence(parts, options, maxLen)\n : toRegex(range, null, { wrap: false, ...options });\n }\n\n return range;\n};\n\nconst fillLetters = (start, end, step = 1, options = {}) => {\n if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {\n return invalidRange(start, end, options);\n }\n\n let format = options.transform || (val => String.fromCharCode(val));\n let a = `${start}`.charCodeAt(0);\n let b = `${end}`.charCodeAt(0);\n\n let descending = a > b;\n let min = Math.min(a, b);\n let max = Math.max(a, b);\n\n if (options.toRegex && step === 1) {\n return toRange(min, max, false, options);\n }\n\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n range.push(format(a, index));\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return toRegex(range, null, { wrap: false, options });\n }\n\n return range;\n};\n\nconst fill = (start, end, step, options = {}) => {\n if (end == null && isValidValue(start)) {\n return [start];\n }\n\n if (!isValidValue(start) || !isValidValue(end)) {\n return invalidRange(start, end, options);\n }\n\n if (typeof step === 'function') {\n return fill(start, end, 1, { transform: step });\n }\n\n if (isObject(step)) {\n return fill(start, end, 0, step);\n }\n\n let opts = { ...options };\n if (opts.capture === true) opts.wrap = true;\n step = step || opts.step || 1;\n\n if (!isNumber(step)) {\n if (step != null && !isObject(step)) return invalidStep(step, opts);\n return fill(start, end, 1, step);\n }\n\n if (isNumber(start) && isNumber(end)) {\n return fillNumbers(start, end, step, opts);\n }\n\n return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);\n};\n\nmodule.exports = fill;\n", "'use strict';\n\nconst fill = require('fill-range');\nconst utils = require('./utils');\n\nconst compile = (ast, options = {}) => {\n const walk = (node, parent = {}) => {\n const invalidBlock = utils.isInvalidBrace(parent);\n const invalidNode = node.invalid === true && options.escapeInvalid === true;\n const invalid = invalidBlock === true || invalidNode === true;\n const prefix = options.escapeInvalid === true ? '\\\\' : '';\n let output = '';\n\n if (node.isOpen === true) {\n return prefix + node.value;\n }\n\n if (node.isClose === true) {\n console.log('node.isClose', prefix, node.value);\n return prefix + node.value;\n }\n\n if (node.type === 'open') {\n return invalid ? prefix + node.value : '(';\n }\n\n if (node.type === 'close') {\n return invalid ? prefix + node.value : ')';\n }\n\n if (node.type === 'comma') {\n return node.prev.type === 'comma' ? '' : invalid ? node.value : '|';\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true });\n\n if (range.length !== 0) {\n return args.length > 1 && range.length > 1 ? `(${range})` : range;\n }\n }\n\n if (node.nodes) {\n for (const child of node.nodes) {\n output += walk(child, node);\n }\n }\n\n return output;\n };\n\n return walk(ast);\n};\n\nmodule.exports = compile;\n", "'use strict';\n\nconst fill = require('fill-range');\nconst stringify = require('./stringify');\nconst utils = require('./utils');\n\nconst append = (queue = '', stash = '', enclose = false) => {\n const result = [];\n\n queue = [].concat(queue);\n stash = [].concat(stash);\n\n if (!stash.length) return queue;\n if (!queue.length) {\n return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;\n }\n\n for (const item of queue) {\n if (Array.isArray(item)) {\n for (const value of item) {\n result.push(append(value, stash, enclose));\n }\n } else {\n for (let ele of stash) {\n if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;\n result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele);\n }\n }\n }\n return utils.flatten(result);\n};\n\nconst expand = (ast, options = {}) => {\n const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit;\n\n const walk = (node, parent = {}) => {\n node.queue = [];\n\n let p = parent;\n let q = parent.queue;\n\n while (p.type !== 'brace' && p.type !== 'root' && p.parent) {\n p = p.parent;\n q = p.queue;\n }\n\n if (node.invalid || node.dollar) {\n q.push(append(q.pop(), stringify(node, options)));\n return;\n }\n\n if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {\n q.push(append(q.pop(), ['{}']));\n return;\n }\n\n if (node.nodes && node.ranges > 0) {\n const args = utils.reduce(node.nodes);\n\n if (utils.exceedsLimit(...args, options.step, rangeLimit)) {\n throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');\n }\n\n let range = fill(...args, options);\n if (range.length === 0) {\n range = stringify(node, options);\n }\n\n q.push(append(q.pop(), range));\n node.nodes = [];\n return;\n }\n\n const enclose = utils.encloseBrace(node);\n let queue = node.queue;\n let block = node;\n\n while (block.type !== 'brace' && block.type !== 'root' && block.parent) {\n block = block.parent;\n queue = block.queue;\n }\n\n for (let i = 0; i < node.nodes.length; i++) {\n const child = node.nodes[i];\n\n if (child.type === 'comma' && node.type === 'brace') {\n if (i === 1) queue.push('');\n queue.push('');\n continue;\n }\n\n if (child.type === 'close') {\n q.push(append(q.pop(), queue, enclose));\n continue;\n }\n\n if (child.value && child.type !== 'open') {\n queue.push(append(queue.pop(), child.value));\n continue;\n }\n\n if (child.nodes) {\n walk(child, node);\n }\n }\n\n return queue;\n };\n\n return utils.flatten(walk(ast));\n};\n\nmodule.exports = expand;\n", "'use strict';\n\nmodule.exports = {\n MAX_LENGTH: 10000,\n\n // Digits\n CHAR_0: '0', /* 0 */\n CHAR_9: '9', /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 'A', /* A */\n CHAR_LOWERCASE_A: 'a', /* a */\n CHAR_UPPERCASE_Z: 'Z', /* Z */\n CHAR_LOWERCASE_Z: 'z', /* z */\n\n CHAR_LEFT_PARENTHESES: '(', /* ( */\n CHAR_RIGHT_PARENTHESES: ')', /* ) */\n\n CHAR_ASTERISK: '*', /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: '&', /* & */\n CHAR_AT: '@', /* @ */\n CHAR_BACKSLASH: '\\\\', /* \\ */\n CHAR_BACKTICK: '`', /* ` */\n CHAR_CARRIAGE_RETURN: '\\r', /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */\n CHAR_COLON: ':', /* : */\n CHAR_COMMA: ',', /* , */\n CHAR_DOLLAR: '$', /* . */\n CHAR_DOT: '.', /* . */\n CHAR_DOUBLE_QUOTE: '\"', /* \" */\n CHAR_EQUAL: '=', /* = */\n CHAR_EXCLAMATION_MARK: '!', /* ! */\n CHAR_FORM_FEED: '\\f', /* \\f */\n CHAR_FORWARD_SLASH: '/', /* / */\n CHAR_HASH: '#', /* # */\n CHAR_HYPHEN_MINUS: '-', /* - */\n CHAR_LEFT_ANGLE_BRACKET: '<', /* < */\n CHAR_LEFT_CURLY_BRACE: '{', /* { */\n CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */\n CHAR_LINE_FEED: '\\n', /* \\n */\n CHAR_NO_BREAK_SPACE: '\\u00A0', /* \\u00A0 */\n CHAR_PERCENT: '%', /* % */\n CHAR_PLUS: '+', /* + */\n CHAR_QUESTION_MARK: '?', /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */\n CHAR_RIGHT_CURLY_BRACE: '}', /* } */\n CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */\n CHAR_SEMICOLON: ';', /* ; */\n CHAR_SINGLE_QUOTE: '\\'', /* ' */\n CHAR_SPACE: ' ', /* */\n CHAR_TAB: '\\t', /* \\t */\n CHAR_UNDERSCORE: '_', /* _ */\n CHAR_VERTICAL_LINE: '|', /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\\uFEFF' /* \\uFEFF */\n};\n", "'use strict';\n\nconst stringify = require('./stringify');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n CHAR_BACKSLASH, /* \\ */\n CHAR_BACKTICK, /* ` */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_RIGHT_SQUARE_BRACKET, /* ] */\n CHAR_DOUBLE_QUOTE, /* \" */\n CHAR_SINGLE_QUOTE, /* ' */\n CHAR_NO_BREAK_SPACE,\n CHAR_ZERO_WIDTH_NOBREAK_SPACE\n} = require('./constants');\n\n/**\n * parse\n */\n\nconst parse = (input, options = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n const opts = options || {};\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n if (input.length > max) {\n throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);\n }\n\n const ast = { type: 'root', input, nodes: [] };\n const stack = [ast];\n let block = ast;\n let prev = ast;\n let brackets = 0;\n const length = input.length;\n let index = 0;\n let depth = 0;\n let value;\n\n /**\n * Helpers\n */\n\n const advance = () => input[index++];\n const push = node => {\n if (node.type === 'text' && prev.type === 'dot') {\n prev.type = 'text';\n }\n\n if (prev && prev.type === 'text' && node.type === 'text') {\n prev.value += node.value;\n return;\n }\n\n block.nodes.push(node);\n node.parent = block;\n node.prev = prev;\n prev = node;\n return node;\n };\n\n push({ type: 'bos' });\n\n while (index < length) {\n block = stack[stack.length - 1];\n value = advance();\n\n /**\n * Invalid chars\n */\n\n if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {\n continue;\n }\n\n /**\n * Escaped chars\n */\n\n if (value === CHAR_BACKSLASH) {\n push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });\n continue;\n }\n\n /**\n * Right square bracket (literal): ']'\n */\n\n if (value === CHAR_RIGHT_SQUARE_BRACKET) {\n push({ type: 'text', value: '\\\\' + value });\n continue;\n }\n\n /**\n * Left square bracket: '['\n */\n\n if (value === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n\n let next;\n\n while (index < length && (next = advance())) {\n value += next;\n\n if (next === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n continue;\n }\n\n if (next === CHAR_BACKSLASH) {\n value += advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n brackets--;\n\n if (brackets === 0) {\n break;\n }\n }\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === CHAR_LEFT_PARENTHESES) {\n block = push({ type: 'paren', nodes: [] });\n stack.push(block);\n push({ type: 'text', value });\n continue;\n }\n\n if (value === CHAR_RIGHT_PARENTHESES) {\n if (block.type !== 'paren') {\n push({ type: 'text', value });\n continue;\n }\n block = stack.pop();\n push({ type: 'text', value });\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Quotes: '|\"|`\n */\n\n if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {\n const open = value;\n let next;\n\n if (options.keepQuotes !== true) {\n value = '';\n }\n\n while (index < length && (next = advance())) {\n if (next === CHAR_BACKSLASH) {\n value += next + advance();\n continue;\n }\n\n if (next === open) {\n if (options.keepQuotes === true) value += next;\n break;\n }\n\n value += next;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Left curly brace: '{'\n */\n\n if (value === CHAR_LEFT_CURLY_BRACE) {\n depth++;\n\n const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;\n const brace = {\n type: 'brace',\n open: true,\n close: false,\n dollar,\n depth,\n commas: 0,\n ranges: 0,\n nodes: []\n };\n\n block = push(brace);\n stack.push(block);\n push({ type: 'open', value });\n continue;\n }\n\n /**\n * Right curly brace: '}'\n */\n\n if (value === CHAR_RIGHT_CURLY_BRACE) {\n if (block.type !== 'brace') {\n push({ type: 'text', value });\n continue;\n }\n\n const type = 'close';\n block = stack.pop();\n block.close = true;\n\n push({ type, value });\n depth--;\n\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Comma: ','\n */\n\n if (value === CHAR_COMMA && depth > 0) {\n if (block.ranges > 0) {\n block.ranges = 0;\n const open = block.nodes.shift();\n block.nodes = [open, { type: 'text', value: stringify(block) }];\n }\n\n push({ type: 'comma', value });\n block.commas++;\n continue;\n }\n\n /**\n * Dot: '.'\n */\n\n if (value === CHAR_DOT && depth > 0 && block.commas === 0) {\n const siblings = block.nodes;\n\n if (depth === 0 || siblings.length === 0) {\n push({ type: 'text', value });\n continue;\n }\n\n if (prev.type === 'dot') {\n block.range = [];\n prev.value += value;\n prev.type = 'range';\n\n if (block.nodes.length !== 3 && block.nodes.length !== 5) {\n block.invalid = true;\n block.ranges = 0;\n prev.type = 'text';\n continue;\n }\n\n block.ranges++;\n block.args = [];\n continue;\n }\n\n if (prev.type === 'range') {\n siblings.pop();\n\n const before = siblings[siblings.length - 1];\n before.value += prev.value + value;\n prev = before;\n block.ranges--;\n continue;\n }\n\n push({ type: 'dot', value });\n continue;\n }\n\n /**\n * Text\n */\n\n push({ type: 'text', value });\n }\n\n // Mark imbalanced braces and brackets as invalid\n do {\n block = stack.pop();\n\n if (block.type !== 'root') {\n block.nodes.forEach(node => {\n if (!node.nodes) {\n if (node.type === 'open') node.isOpen = true;\n if (node.type === 'close') node.isClose = true;\n if (!node.nodes) node.type = 'text';\n node.invalid = true;\n }\n });\n\n // get the location of the block on parent.nodes (block's siblings)\n const parent = stack[stack.length - 1];\n const index = parent.nodes.indexOf(block);\n // replace the (invalid) block with it's nodes\n parent.nodes.splice(index, 1, ...block.nodes);\n }\n } while (stack.length > 0);\n\n push({ type: 'eos' });\n return ast;\n};\n\nmodule.exports = parse;\n", "'use strict';\n\nconst stringify = require('./lib/stringify');\nconst compile = require('./lib/compile');\nconst expand = require('./lib/expand');\nconst parse = require('./lib/parse');\n\n/**\n * Expand the given pattern or create a regex-compatible string.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']\n * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nconst braces = (input, options = {}) => {\n let output = [];\n\n if (Array.isArray(input)) {\n for (const pattern of input) {\n const result = braces.create(pattern, options);\n if (Array.isArray(result)) {\n output.push(...result);\n } else {\n output.push(result);\n }\n }\n } else {\n output = [].concat(braces.create(input, options));\n }\n\n if (options && options.expand === true && options.nodupes === true) {\n output = [...new Set(output)];\n }\n return output;\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * // braces.parse(pattern, [, options]);\n * const ast = braces.parse('a/{b,c}/d');\n * console.log(ast);\n * ```\n * @param {String} pattern Brace pattern to parse\n * @param {Object} options\n * @return {Object} Returns an AST\n * @api public\n */\n\nbraces.parse = (input, options = {}) => parse(input, options);\n\n/**\n * Creates a braces string from an AST, or an AST node.\n *\n * ```js\n * const braces = require('braces');\n * let ast = braces.parse('foo/{a,b}/bar');\n * console.log(stringify(ast.nodes[2])); //=> '{a,b}'\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.stringify = (input, options = {}) => {\n if (typeof input === 'string') {\n return stringify(braces.parse(input, options), options);\n }\n return stringify(input, options);\n};\n\n/**\n * Compiles a brace pattern into a regex-compatible, optimized string.\n * This method is called by the main [braces](#braces) function by default.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.compile('a/{b,c}/d'));\n * //=> ['a/(b|c)/d']\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.compile = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n return compile(input, options);\n};\n\n/**\n * Expands a brace pattern into an array. This method is called by the\n * main [braces](#braces) function when `options.expand` is true. Before\n * using this method it's recommended that you read the [performance notes](#performance))\n * and advantages of using [.compile](#compile) instead.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.expand('a/{b,c}/d'));\n * //=> ['a/b/d', 'a/c/d'];\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.expand = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n\n let result = expand(input, options);\n\n // filter out empty strings if specified\n if (options.noempty === true) {\n result = result.filter(Boolean);\n }\n\n // filter out duplicates if specified\n if (options.nodupes === true) {\n result = [...new Set(result)];\n }\n\n return result;\n};\n\n/**\n * Processes a brace pattern and returns either an expanded array\n * (if `options.expand` is true), a highly optimized regex-compatible string.\n * This method is called by the main [braces](#braces) function.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))\n * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.create = (input, options = {}) => {\n if (input === '' || input.length < 3) {\n return [input];\n }\n\n return options.expand !== true\n ? braces.compile(input, options)\n : braces.expand(input, options);\n};\n\n/**\n * Expose \"braces\"\n */\n\nmodule.exports = braces;\n", "'use strict';\n\nconst path = require('path');\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n SEP: path.sep,\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n", "'use strict';\n\nconst path = require('path');\nconst win32 = process.platform === 'win32';\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.supportsLookbehinds = () => {\n const segs = process.version.slice(1).split('.').map(Number);\n if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {\n return true;\n }\n return false;\n};\n\nexports.isWindows = options => {\n if (options && typeof options.windows === 'boolean') {\n return options.windows;\n }\n return win32 === true || path.sep === '\\\\';\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n", "'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n", "'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(win32);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = opts => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index] || '';\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren') {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.value += tok.value;\n prev.output = (prev.output || '') + tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n let rest;\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n // In this case, we need to parse the string and use it in the output of the original pattern.\n // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n //\n // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n output = token.close = `)${expression})${extglobStar})`;\n }\n\n if (token.prev.type === 'bos') {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance();\n } else {\n value += advance();\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if (next === '<' && !utils.supportsLookbehinds()) {\n throw new Error('Node.js v10 or higher is required for regex lookbehinds');\n }\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(win32);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = opts => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n", "'use strict';\n\nconst path = require('path');\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = utils.isWindows(options);\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(path.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return state.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${state.output})${append}`;\n if (state && state.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = state;\n }\n\n return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n let parsed = { negated: false, fastpaths: true };\n\n if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n parsed.output = parse.fastpaths(input, options);\n }\n\n if (!parsed.output) {\n parsed = parse(input, options);\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n", "'use strict';\n\nmodule.exports = require('./lib/picomatch');\n", "'use strict';\n\nconst util = require('util');\nconst braces = require('braces');\nconst picomatch = require('picomatch');\nconst utils = require('picomatch/lib/utils');\n\nconst isEmptyString = v => v === '' || v === './';\nconst hasBraces = v => {\n const index = v.indexOf('{');\n return index > -1 && v.indexOf('}', index) > -1;\n};\n\n/**\n * Returns an array of strings that match one or more glob patterns.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm(list, patterns[, options]);\n *\n * console.log(mm(['a.js', 'a.txt'], ['*.js']));\n * //=> [ 'a.js' ]\n * ```\n * @param {String|Array} `list` List of strings to match.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options)\n * @return {Array} Returns an array of matches\n * @summary false\n * @api public\n */\n\nconst micromatch = (list, patterns, options) => {\n patterns = [].concat(patterns);\n list = [].concat(list);\n\n let omit = new Set();\n let keep = new Set();\n let items = new Set();\n let negatives = 0;\n\n let onResult = state => {\n items.add(state.output);\n if (options && options.onResult) {\n options.onResult(state);\n }\n };\n\n for (let i = 0; i < patterns.length; i++) {\n let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true);\n let negated = isMatch.state.negated || isMatch.state.negatedExtglob;\n if (negated) negatives++;\n\n for (let item of list) {\n let matched = isMatch(item, true);\n\n let match = negated ? !matched.isMatch : matched.isMatch;\n if (!match) continue;\n\n if (negated) {\n omit.add(matched.output);\n } else {\n omit.delete(matched.output);\n keep.add(matched.output);\n }\n }\n }\n\n let result = negatives === patterns.length ? [...items] : [...keep];\n let matches = result.filter(item => !omit.has(item));\n\n if (options && matches.length === 0) {\n if (options.failglob === true) {\n throw new Error(`No matches found for \"${patterns.join(', ')}\"`);\n }\n\n if (options.nonull === true || options.nullglob === true) {\n return options.unescape ? patterns.map(p => p.replace(/\\\\/g, '')) : patterns;\n }\n }\n\n return matches;\n};\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.match = micromatch;\n\n/**\n * Returns a matcher function from the given glob `pattern` and `options`.\n * The returned function takes a string to match as its only argument and returns\n * true if the string is a match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matcher(pattern[, options]);\n *\n * const isMatch = mm.matcher('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @param {String} `pattern` Glob pattern\n * @param {Object} `options`\n * @return {Function} Returns a matcher function.\n * @api public\n */\n\nmicromatch.matcher = (pattern, options) => picomatch(pattern, options);\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.isMatch(string, patterns[, options]);\n *\n * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(mm.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `[options]` See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.any = micromatch.isMatch;\n\n/**\n * Returns a list of strings that _**do not match any**_ of the given `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.not(list, patterns[, options]);\n *\n * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));\n * //=> ['b.b', 'c.c']\n * ```\n * @param {Array} `list` Array of strings to match.\n * @param {String|Array} `patterns` One or more glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of strings that **do not match** the given patterns.\n * @api public\n */\n\nmicromatch.not = (list, patterns, options = {}) => {\n patterns = [].concat(patterns).map(String);\n let result = new Set();\n let items = [];\n\n let onResult = state => {\n if (options.onResult) options.onResult(state);\n items.push(state.output);\n };\n\n let matches = new Set(micromatch(list, patterns, { ...options, onResult }));\n\n for (let item of items) {\n if (!matches.has(item)) {\n result.add(item);\n }\n }\n return [...result];\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar\n * to [.isMatch](#isMatch) but the pattern can match any part of the string.\n *\n * ```js\n * var mm = require('micromatch');\n * // mm.contains(string, pattern[, options]);\n *\n * console.log(mm.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(mm.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String|Array} `patterns` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any of the patterns matches any part of `str`.\n * @api public\n */\n\nmicromatch.contains = (str, pattern, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n if (Array.isArray(pattern)) {\n return pattern.some(p => micromatch.contains(str, p, options));\n }\n\n if (typeof pattern === 'string') {\n if (isEmptyString(str) || isEmptyString(pattern)) {\n return false;\n }\n\n if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) {\n return true;\n }\n }\n\n return micromatch.isMatch(str, pattern, { ...options, contains: true });\n};\n\n/**\n * Filter the keys of the given object with the given `glob` pattern\n * and `options`. Does not attempt to match nested keys. If you need this feature,\n * use [glob-object][] instead.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matchKeys(object, patterns[, options]);\n *\n * const obj = { aa: 'a', ab: 'b', ac: 'c' };\n * console.log(mm.matchKeys(obj, '*b'));\n * //=> { ab: 'b' }\n * ```\n * @param {Object} `object` The object with keys to filter.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Object} Returns an object with only keys that match the given patterns.\n * @api public\n */\n\nmicromatch.matchKeys = (obj, patterns, options) => {\n if (!utils.isObject(obj)) {\n throw new TypeError('Expected the first argument to be an object');\n }\n let keys = micromatch(Object.keys(obj), patterns, options);\n let res = {};\n for (let key of keys) res[key] = obj[key];\n return res;\n};\n\n/**\n * Returns true if some of the strings in the given `list` match any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.some(list, patterns[, options]);\n *\n * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // true\n * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any `patterns` matches any of the strings in `list`\n * @api public\n */\n\nmicromatch.some = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (items.some(item => isMatch(item))) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if every string in the given `list` matches\n * any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.every(list, patterns[, options]);\n *\n * console.log(mm.every('foo.js', ['foo.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // false\n * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if all `patterns` matches all of the strings in `list`\n * @api public\n */\n\nmicromatch.every = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (!items.every(item => isMatch(item))) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns true if **all** of the given `patterns` match\n * the specified string.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.all(string, patterns[, options]);\n *\n * console.log(mm.all('foo.js', ['foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', '!foo.js']));\n * // false\n *\n * console.log(mm.all('foo.js', ['*.js', 'foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));\n * // true\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.all = (str, patterns, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n return [].concat(patterns).every(p => picomatch(p, options)(str));\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.capture(pattern, string[, options]);\n *\n * console.log(mm.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(mm.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `glob` Glob pattern to use for matching.\n * @param {String} `input` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array|null} Returns an array of captures if the input matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nmicromatch.capture = (glob, input, options) => {\n let posix = utils.isWindows(options);\n let regex = picomatch.makeRe(String(glob), { ...options, capture: true });\n let match = regex.exec(posix ? utils.toPosixSlashes(input) : input);\n\n if (match) {\n return match.slice(1).map(v => v === void 0 ? '' : v);\n }\n};\n\n/**\n * Create a regular expression from the given glob `pattern`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.makeRe(pattern[, options]);\n *\n * console.log(mm.makeRe('*.js'));\n * //=> /^(?:(\\.[\\\\\\/])?(?!\\.)(?=.)[^\\/]*?\\.js)$/\n * ```\n * @param {String} `pattern` A glob pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\nmicromatch.makeRe = (...args) => picomatch.makeRe(...args);\n\n/**\n * Scan a glob pattern to separate the pattern into segments. Used\n * by the [split](#split) method.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.scan(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\nmicromatch.scan = (...args) => picomatch.scan(...args);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.parse(pattern[, options]);\n * ```\n * @param {String} `glob`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as regex source string.\n * @api public\n */\n\nmicromatch.parse = (patterns, options) => {\n let res = [];\n for (let pattern of [].concat(patterns || [])) {\n for (let str of braces(String(pattern), options)) {\n res.push(picomatch.parse(str, options));\n }\n }\n return res;\n};\n\n/**\n * Process the given brace `pattern`.\n *\n * ```js\n * const { braces } = require('micromatch');\n * console.log(braces('foo/{a,b,c}/bar'));\n * //=> [ 'foo/(a|b|c)/bar' ]\n *\n * console.log(braces('foo/{a,b,c}/bar', { expand: true }));\n * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]\n * ```\n * @param {String} `pattern` String with brace pattern to process.\n * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.\n * @return {Array}\n * @api public\n */\n\nmicromatch.braces = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n if ((options && options.nobrace === true) || !hasBraces(pattern)) {\n return [pattern];\n }\n return braces(pattern, options);\n};\n\n/**\n * Expand braces\n */\n\nmicromatch.braceExpand = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n return micromatch.braces(pattern, { ...options, expand: true });\n};\n\n/**\n * Expose micromatch\n */\n\n// exposed for tests\nmicromatch.hasBraces = hasBraces;\nmodule.exports = micromatch;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isAbsolute = exports.partitionAbsoluteAndRelative = exports.removeDuplicateSlashes = exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;\nconst path = require(\"path\");\nconst globParent = require(\"glob-parent\");\nconst micromatch = require(\"micromatch\");\nconst GLOBSTAR = '**';\nconst ESCAPE_SYMBOL = '\\\\';\nconst COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;\nconst REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\\[[^[]*]/;\nconst REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\\([^(]*\\|[^|]*\\)/;\nconst GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\\([^(]*\\)/;\nconst BRACE_EXPANSION_SEPARATORS_RE = /,|\\.\\./;\n/**\n * Matches a sequence of two or more consecutive slashes, excluding the first two slashes at the beginning of the string.\n * The latter is due to the presence of the device path at the beginning of the UNC path.\n */\nconst DOUBLE_SLASH_RE = /(?!^)\\/{2,}/g;\nfunction isStaticPattern(pattern, options = {}) {\n return !isDynamicPattern(pattern, options);\n}\nexports.isStaticPattern = isStaticPattern;\nfunction isDynamicPattern(pattern, options = {}) {\n /**\n * A special case with an empty string is necessary for matching patterns that start with a forward slash.\n * An empty string cannot be a dynamic pattern.\n * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'.\n */\n if (pattern === '') {\n return false;\n }\n /**\n * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check\n * filepath directly (without read directory).\n */\n if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) {\n return true;\n }\n if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) {\n return true;\n }\n if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) {\n return true;\n }\n if (options.braceExpansion !== false && hasBraceExpansion(pattern)) {\n return true;\n }\n return false;\n}\nexports.isDynamicPattern = isDynamicPattern;\nfunction hasBraceExpansion(pattern) {\n const openingBraceIndex = pattern.indexOf('{');\n if (openingBraceIndex === -1) {\n return false;\n }\n const closingBraceIndex = pattern.indexOf('}', openingBraceIndex + 1);\n if (closingBraceIndex === -1) {\n return false;\n }\n const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex);\n return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent);\n}\nfunction convertToPositivePattern(pattern) {\n return isNegativePattern(pattern) ? pattern.slice(1) : pattern;\n}\nexports.convertToPositivePattern = convertToPositivePattern;\nfunction convertToNegativePattern(pattern) {\n return '!' + pattern;\n}\nexports.convertToNegativePattern = convertToNegativePattern;\nfunction isNegativePattern(pattern) {\n return pattern.startsWith('!') && pattern[1] !== '(';\n}\nexports.isNegativePattern = isNegativePattern;\nfunction isPositivePattern(pattern) {\n return !isNegativePattern(pattern);\n}\nexports.isPositivePattern = isPositivePattern;\nfunction getNegativePatterns(patterns) {\n return patterns.filter(isNegativePattern);\n}\nexports.getNegativePatterns = getNegativePatterns;\nfunction getPositivePatterns(patterns) {\n return patterns.filter(isPositivePattern);\n}\nexports.getPositivePatterns = getPositivePatterns;\n/**\n * Returns patterns that can be applied inside the current directory.\n *\n * @example\n * // ['./*', '*', 'a/*']\n * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])\n */\nfunction getPatternsInsideCurrentDirectory(patterns) {\n return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern));\n}\nexports.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory;\n/**\n * Returns patterns to be expanded relative to (outside) the current directory.\n *\n * @example\n * // ['../*', './../*']\n * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])\n */\nfunction getPatternsOutsideCurrentDirectory(patterns) {\n return patterns.filter(isPatternRelatedToParentDirectory);\n}\nexports.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory;\nfunction isPatternRelatedToParentDirectory(pattern) {\n return pattern.startsWith('..') || pattern.startsWith('./..');\n}\nexports.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory;\nfunction getBaseDirectory(pattern) {\n return globParent(pattern, { flipBackslashes: false });\n}\nexports.getBaseDirectory = getBaseDirectory;\nfunction hasGlobStar(pattern) {\n return pattern.includes(GLOBSTAR);\n}\nexports.hasGlobStar = hasGlobStar;\nfunction endsWithSlashGlobStar(pattern) {\n return pattern.endsWith('/' + GLOBSTAR);\n}\nexports.endsWithSlashGlobStar = endsWithSlashGlobStar;\nfunction isAffectDepthOfReadingPattern(pattern) {\n const basename = path.basename(pattern);\n return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);\n}\nexports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;\nfunction expandPatternsWithBraceExpansion(patterns) {\n return patterns.reduce((collection, pattern) => {\n return collection.concat(expandBraceExpansion(pattern));\n }, []);\n}\nexports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion;\nfunction expandBraceExpansion(pattern) {\n const patterns = micromatch.braces(pattern, { expand: true, nodupes: true, keepEscaping: true });\n /**\n * Sort the patterns by length so that the same depth patterns are processed side by side.\n * `a/{b,}/{c,}/*` \u2013 `['a///*', 'a/b//*', 'a//c/*', 'a/b/c/*']`\n */\n patterns.sort((a, b) => a.length - b.length);\n /**\n * Micromatch can return an empty string in the case of patterns like `{a,}`.\n */\n return patterns.filter((pattern) => pattern !== '');\n}\nexports.expandBraceExpansion = expandBraceExpansion;\nfunction getPatternParts(pattern, options) {\n let { parts } = micromatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true }));\n /**\n * The scan method returns an empty array in some cases.\n * See micromatch/picomatch#58 for more details.\n */\n if (parts.length === 0) {\n parts = [pattern];\n }\n /**\n * The scan method does not return an empty part for the pattern with a forward slash.\n * This is another part of micromatch/picomatch#58.\n */\n if (parts[0].startsWith('/')) {\n parts[0] = parts[0].slice(1);\n parts.unshift('');\n }\n return parts;\n}\nexports.getPatternParts = getPatternParts;\nfunction makeRe(pattern, options) {\n return micromatch.makeRe(pattern, options);\n}\nexports.makeRe = makeRe;\nfunction convertPatternsToRe(patterns, options) {\n return patterns.map((pattern) => makeRe(pattern, options));\n}\nexports.convertPatternsToRe = convertPatternsToRe;\nfunction matchAny(entry, patternsRe) {\n return patternsRe.some((patternRe) => patternRe.test(entry));\n}\nexports.matchAny = matchAny;\n/**\n * This package only works with forward slashes as a path separator.\n * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes.\n */\nfunction removeDuplicateSlashes(pattern) {\n return pattern.replace(DOUBLE_SLASH_RE, '/');\n}\nexports.removeDuplicateSlashes = removeDuplicateSlashes;\nfunction partitionAbsoluteAndRelative(patterns) {\n const absolute = [];\n const relative = [];\n for (const pattern of patterns) {\n if (isAbsolute(pattern)) {\n absolute.push(pattern);\n }\n else {\n relative.push(pattern);\n }\n }\n return [absolute, relative];\n}\nexports.partitionAbsoluteAndRelative = partitionAbsoluteAndRelative;\nfunction isAbsolute(pattern) {\n return path.isAbsolute(pattern);\n}\nexports.isAbsolute = isAbsolute;\n", "'use strict'\n/*\n * merge2\n * https://github.com/teambition/merge2\n *\n * Copyright (c) 2014-2020 Teambition\n * Licensed under the MIT license.\n */\nconst Stream = require('stream')\nconst PassThrough = Stream.PassThrough\nconst slice = Array.prototype.slice\n\nmodule.exports = merge2\n\nfunction merge2 () {\n const streamsQueue = []\n const args = slice.call(arguments)\n let merging = false\n let options = args[args.length - 1]\n\n if (options && !Array.isArray(options) && options.pipe == null) {\n args.pop()\n } else {\n options = {}\n }\n\n const doEnd = options.end !== false\n const doPipeError = options.pipeError === true\n if (options.objectMode == null) {\n options.objectMode = true\n }\n if (options.highWaterMark == null) {\n options.highWaterMark = 64 * 1024\n }\n const mergedStream = PassThrough(options)\n\n function addStream () {\n for (let i = 0, len = arguments.length; i < len; i++) {\n streamsQueue.push(pauseStreams(arguments[i], options))\n }\n mergeStream()\n return this\n }\n\n function mergeStream () {\n if (merging) {\n return\n }\n merging = true\n\n let streams = streamsQueue.shift()\n if (!streams) {\n process.nextTick(endStream)\n return\n }\n if (!Array.isArray(streams)) {\n streams = [streams]\n }\n\n let pipesCount = streams.length + 1\n\n function next () {\n if (--pipesCount > 0) {\n return\n }\n merging = false\n mergeStream()\n }\n\n function pipe (stream) {\n function onend () {\n stream.removeListener('merge2UnpipeEnd', onend)\n stream.removeListener('end', onend)\n if (doPipeError) {\n stream.removeListener('error', onerror)\n }\n next()\n }\n function onerror (err) {\n mergedStream.emit('error', err)\n }\n // skip ended stream\n if (stream._readableState.endEmitted) {\n return next()\n }\n\n stream.on('merge2UnpipeEnd', onend)\n stream.on('end', onend)\n\n if (doPipeError) {\n stream.on('error', onerror)\n }\n\n stream.pipe(mergedStream, { end: false })\n // compatible for old stream\n stream.resume()\n }\n\n for (let i = 0; i < streams.length; i++) {\n pipe(streams[i])\n }\n\n next()\n }\n\n function endStream () {\n merging = false\n // emit 'queueDrain' when all streams merged.\n mergedStream.emit('queueDrain')\n if (doEnd) {\n mergedStream.end()\n }\n }\n\n mergedStream.setMaxListeners(0)\n mergedStream.add = addStream\n mergedStream.on('unpipe', function (stream) {\n stream.emit('merge2UnpipeEnd')\n })\n\n if (args.length) {\n addStream.apply(null, args)\n }\n return mergedStream\n}\n\n// check and pause streams for pipe.\nfunction pauseStreams (streams, options) {\n if (!Array.isArray(streams)) {\n // Backwards-compat with old-style streams\n if (!streams._readableState && streams.pipe) {\n streams = streams.pipe(PassThrough(options))\n }\n if (!streams._readableState || !streams.pause || !streams.pipe) {\n throw new Error('Only readable stream can be merged.')\n }\n streams.pause()\n } else {\n for (let i = 0, len = streams.length; i < len; i++) {\n streams[i] = pauseStreams(streams[i], options)\n }\n }\n return streams\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.merge = void 0;\nconst merge2 = require(\"merge2\");\nfunction merge(streams) {\n const mergedStream = merge2(streams);\n streams.forEach((stream) => {\n stream.once('error', (error) => mergedStream.emit('error', error));\n });\n mergedStream.once('close', () => propagateCloseEventToSources(streams));\n mergedStream.once('end', () => propagateCloseEventToSources(streams));\n return mergedStream;\n}\nexports.merge = merge;\nfunction propagateCloseEventToSources(streams) {\n streams.forEach((stream) => stream.emit('close'));\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isEmpty = exports.isString = void 0;\nfunction isString(input) {\n return typeof input === 'string';\n}\nexports.isString = isString;\nfunction isEmpty(input) {\n return input === '';\n}\nexports.isEmpty = isEmpty;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0;\nconst array = require(\"./array\");\nexports.array = array;\nconst errno = require(\"./errno\");\nexports.errno = errno;\nconst fs = require(\"./fs\");\nexports.fs = fs;\nconst path = require(\"./path\");\nexports.path = path;\nconst pattern = require(\"./pattern\");\nexports.pattern = pattern;\nconst stream = require(\"./stream\");\nexports.stream = stream;\nconst string = require(\"./string\");\nexports.string = string;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0;\nconst utils = require(\"../utils\");\nfunction generate(input, settings) {\n const patterns = processPatterns(input, settings);\n const ignore = processPatterns(settings.ignore, settings);\n const positivePatterns = getPositivePatterns(patterns);\n const negativePatterns = getNegativePatternsAsPositive(patterns, ignore);\n const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings));\n const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings));\n const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false);\n const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true);\n return staticTasks.concat(dynamicTasks);\n}\nexports.generate = generate;\nfunction processPatterns(input, settings) {\n let patterns = input;\n /**\n * The original pattern like `{,*,**,a/*}` can lead to problems checking the depth when matching entry\n * and some problems with the micromatch package (see fast-glob issues: #365, #394).\n *\n * To solve this problem, we expand all patterns containing brace expansion. This can lead to a slight slowdown\n * in matching in the case of a large set of patterns after expansion.\n */\n if (settings.braceExpansion) {\n patterns = utils.pattern.expandPatternsWithBraceExpansion(patterns);\n }\n /**\n * If the `baseNameMatch` option is enabled, we must add globstar to patterns, so that they can be used\n * at any nesting level.\n *\n * We do this here, because otherwise we have to complicate the filtering logic. For example, we need to change\n * the pattern in the filter before creating a regular expression. There is no need to change the patterns\n * in the application. Only on the input.\n */\n if (settings.baseNameMatch) {\n patterns = patterns.map((pattern) => pattern.includes('/') ? pattern : `**/${pattern}`);\n }\n /**\n * This method also removes duplicate slashes that may have been in the pattern or formed as a result of expansion.\n */\n return patterns.map((pattern) => utils.pattern.removeDuplicateSlashes(pattern));\n}\n/**\n * Returns tasks grouped by basic pattern directories.\n *\n * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately.\n * This is necessary because directory traversal starts at the base directory and goes deeper.\n */\nfunction convertPatternsToTasks(positive, negative, dynamic) {\n const tasks = [];\n const patternsOutsideCurrentDirectory = utils.pattern.getPatternsOutsideCurrentDirectory(positive);\n const patternsInsideCurrentDirectory = utils.pattern.getPatternsInsideCurrentDirectory(positive);\n const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory);\n const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory);\n tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic));\n /*\n * For the sake of reducing future accesses to the file system, we merge all tasks within the current directory\n * into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest.\n */\n if ('.' in insideCurrentDirectoryGroup) {\n tasks.push(convertPatternGroupToTask('.', patternsInsideCurrentDirectory, negative, dynamic));\n }\n else {\n tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic));\n }\n return tasks;\n}\nexports.convertPatternsToTasks = convertPatternsToTasks;\nfunction getPositivePatterns(patterns) {\n return utils.pattern.getPositivePatterns(patterns);\n}\nexports.getPositivePatterns = getPositivePatterns;\nfunction getNegativePatternsAsPositive(patterns, ignore) {\n const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore);\n const positive = negative.map(utils.pattern.convertToPositivePattern);\n return positive;\n}\nexports.getNegativePatternsAsPositive = getNegativePatternsAsPositive;\nfunction groupPatternsByBaseDirectory(patterns) {\n const group = {};\n return patterns.reduce((collection, pattern) => {\n const base = utils.pattern.getBaseDirectory(pattern);\n if (base in collection) {\n collection[base].push(pattern);\n }\n else {\n collection[base] = [pattern];\n }\n return collection;\n }, group);\n}\nexports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;\nfunction convertPatternGroupsToTasks(positive, negative, dynamic) {\n return Object.keys(positive).map((base) => {\n return convertPatternGroupToTask(base, positive[base], negative, dynamic);\n });\n}\nexports.convertPatternGroupsToTasks = convertPatternGroupsToTasks;\nfunction convertPatternGroupToTask(base, positive, negative, dynamic) {\n return {\n dynamic,\n positive,\n negative,\n base,\n patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern))\n };\n}\nexports.convertPatternGroupToTask = convertPatternGroupToTask;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.read = void 0;\nfunction read(path, settings, callback) {\n settings.fs.lstat(path, (lstatError, lstat) => {\n if (lstatError !== null) {\n callFailureCallback(callback, lstatError);\n return;\n }\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\n callSuccessCallback(callback, lstat);\n return;\n }\n settings.fs.stat(path, (statError, stat) => {\n if (statError !== null) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n callFailureCallback(callback, statError);\n return;\n }\n callSuccessCallback(callback, lstat);\n return;\n }\n if (settings.markSymbolicLink) {\n stat.isSymbolicLink = () => true;\n }\n callSuccessCallback(callback, stat);\n });\n });\n}\nexports.read = read;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, result) {\n callback(null, result);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.read = void 0;\nfunction read(path, settings) {\n const lstat = settings.fs.lstatSync(path);\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\n return lstat;\n }\n try {\n const stat = settings.fs.statSync(path);\n if (settings.markSymbolicLink) {\n stat.isSymbolicLink = () => true;\n }\n return stat;\n }\n catch (error) {\n if (!settings.throwErrorOnBrokenSymbolicLink) {\n return lstat;\n }\n throw error;\n }\n}\nexports.read = read;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nexports.FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n stat: fs.stat,\n lstatSync: fs.lstatSync,\n statSync: fs.statSync\n};\nfunction createFileSystemAdapter(fsMethods) {\n if (fsMethods === undefined) {\n return exports.FILE_SYSTEM_ADAPTER;\n }\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\n}\nexports.createFileSystemAdapter = createFileSystemAdapter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs = require(\"./adapters/fs\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true);\n this.fs = fs.createFileSystemAdapter(this._options.fs);\n this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.statSync = exports.stat = exports.Settings = void 0;\nconst async = require(\"./providers/async\");\nconst sync = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction stat(path, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n async.read(path, getSettings(), optionsOrSettingsOrCallback);\n return;\n }\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\n}\nexports.stat = stat;\nfunction statSync(path, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n return sync.read(path, settings);\n}\nexports.statSync = statSync;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "/*! queue-microtask. MIT License. Feross Aboukhadijeh */\nlet promise\n\nmodule.exports = typeof queueMicrotask === 'function'\n ? queueMicrotask.bind(typeof window !== 'undefined' ? window : global)\n // reuse resolved promise, and allocate it lazily\n : cb => (promise || (promise = Promise.resolve()))\n .then(cb)\n .catch(err => setTimeout(() => { throw err }, 0))\n", "/*! run-parallel. MIT License. Feross Aboukhadijeh */\nmodule.exports = runParallel\n\nconst queueMicrotask = require('queue-microtask')\n\nfunction runParallel (tasks, cb) {\n let results, pending, keys\n let isSync = true\n\n if (Array.isArray(tasks)) {\n results = []\n pending = tasks.length\n } else {\n keys = Object.keys(tasks)\n results = {}\n pending = keys.length\n }\n\n function done (err) {\n function end () {\n if (cb) cb(err, results)\n cb = null\n }\n if (isSync) queueMicrotask(end)\n else end()\n }\n\n function each (i, err, result) {\n results[i] = result\n if (--pending === 0 || err) {\n done(err)\n }\n }\n\n if (!pending) {\n // empty\n done(null)\n } else if (keys) {\n // object\n keys.forEach(function (key) {\n tasks[key](function (err, result) { each(key, err, result) })\n })\n } else {\n // array\n tasks.forEach(function (task, i) {\n task(function (err, result) { each(i, err, result) })\n })\n }\n\n isSync = false\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0;\nconst NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.');\nif (NODE_PROCESS_VERSION_PARTS[0] === undefined || NODE_PROCESS_VERSION_PARTS[1] === undefined) {\n throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);\n}\nconst MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10);\nconst MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10);\nconst SUPPORTED_MAJOR_VERSION = 10;\nconst SUPPORTED_MINOR_VERSION = 10;\nconst IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION;\nconst IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION;\n/**\n * IS `true` for Node.js 10.10 and greater.\n */\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createDirentFromStats = void 0;\nclass DirentFromStats {\n constructor(name, stats) {\n this.name = name;\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\n this.isDirectory = stats.isDirectory.bind(stats);\n this.isFIFO = stats.isFIFO.bind(stats);\n this.isFile = stats.isFile.bind(stats);\n this.isSocket = stats.isSocket.bind(stats);\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\n }\n}\nfunction createDirentFromStats(name, stats) {\n return new DirentFromStats(name, stats);\n}\nexports.createDirentFromStats = createDirentFromStats;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fs = void 0;\nconst fs = require(\"./fs\");\nexports.fs = fs;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.joinPathSegments = void 0;\nfunction joinPathSegments(a, b, separator) {\n /**\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\n */\n if (a.endsWith(separator)) {\n return a + b;\n }\n return a + separator + b;\n}\nexports.joinPathSegments = joinPathSegments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst rpl = require(\"run-parallel\");\nconst constants_1 = require(\"../constants\");\nconst utils = require(\"../utils\");\nconst common = require(\"./common\");\nfunction read(directory, settings, callback) {\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\n readdirWithFileTypes(directory, settings, callback);\n return;\n }\n readdir(directory, settings, callback);\n}\nexports.read = read;\nfunction readdirWithFileTypes(directory, settings, callback) {\n settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => {\n if (readdirError !== null) {\n callFailureCallback(callback, readdirError);\n return;\n }\n const entries = dirents.map((dirent) => ({\n dirent,\n name: dirent.name,\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\n }));\n if (!settings.followSymbolicLinks) {\n callSuccessCallback(callback, entries);\n return;\n }\n const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings));\n rpl(tasks, (rplError, rplEntries) => {\n if (rplError !== null) {\n callFailureCallback(callback, rplError);\n return;\n }\n callSuccessCallback(callback, rplEntries);\n });\n });\n}\nexports.readdirWithFileTypes = readdirWithFileTypes;\nfunction makeRplTaskEntry(entry, settings) {\n return (done) => {\n if (!entry.dirent.isSymbolicLink()) {\n done(null, entry);\n return;\n }\n settings.fs.stat(entry.path, (statError, stats) => {\n if (statError !== null) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n done(statError);\n return;\n }\n done(null, entry);\n return;\n }\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\n done(null, entry);\n });\n };\n}\nfunction readdir(directory, settings, callback) {\n settings.fs.readdir(directory, (readdirError, names) => {\n if (readdirError !== null) {\n callFailureCallback(callback, readdirError);\n return;\n }\n const tasks = names.map((name) => {\n const path = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);\n return (done) => {\n fsStat.stat(path, settings.fsStatSettings, (error, stats) => {\n if (error !== null) {\n done(error);\n return;\n }\n const entry = {\n name,\n path,\n dirent: utils.fs.createDirentFromStats(name, stats)\n };\n if (settings.stats) {\n entry.stats = stats;\n }\n done(null, entry);\n });\n };\n });\n rpl(tasks, (rplError, entries) => {\n if (rplError !== null) {\n callFailureCallback(callback, rplError);\n return;\n }\n callSuccessCallback(callback, entries);\n });\n });\n}\nexports.readdir = readdir;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, result) {\n callback(null, result);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst constants_1 = require(\"../constants\");\nconst utils = require(\"../utils\");\nconst common = require(\"./common\");\nfunction read(directory, settings) {\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\n return readdirWithFileTypes(directory, settings);\n }\n return readdir(directory, settings);\n}\nexports.read = read;\nfunction readdirWithFileTypes(directory, settings) {\n const dirents = settings.fs.readdirSync(directory, { withFileTypes: true });\n return dirents.map((dirent) => {\n const entry = {\n dirent,\n name: dirent.name,\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\n };\n if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) {\n try {\n const stats = settings.fs.statSync(entry.path);\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\n }\n catch (error) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n throw error;\n }\n }\n }\n return entry;\n });\n}\nexports.readdirWithFileTypes = readdirWithFileTypes;\nfunction readdir(directory, settings) {\n const names = settings.fs.readdirSync(directory);\n return names.map((name) => {\n const entryPath = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);\n const stats = fsStat.statSync(entryPath, settings.fsStatSettings);\n const entry = {\n name,\n path: entryPath,\n dirent: utils.fs.createDirentFromStats(name, stats)\n };\n if (settings.stats) {\n entry.stats = stats;\n }\n return entry;\n });\n}\nexports.readdir = readdir;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nexports.FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n stat: fs.stat,\n lstatSync: fs.lstatSync,\n statSync: fs.statSync,\n readdir: fs.readdir,\n readdirSync: fs.readdirSync\n};\nfunction createFileSystemAdapter(fsMethods) {\n if (fsMethods === undefined) {\n return exports.FILE_SYSTEM_ADAPTER;\n }\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\n}\nexports.createFileSystemAdapter = createFileSystemAdapter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fs = require(\"./adapters/fs\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false);\n this.fs = fs.createFileSystemAdapter(this._options.fs);\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\n this.stats = this._getValue(this._options.stats, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\n this.fsStatSettings = new fsStat.Settings({\n followSymbolicLink: this.followSymbolicLinks,\n fs: this.fs,\n throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink\n });\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Settings = exports.scandirSync = exports.scandir = void 0;\nconst async = require(\"./providers/async\");\nconst sync = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction scandir(path, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n async.read(path, getSettings(), optionsOrSettingsOrCallback);\n return;\n }\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\n}\nexports.scandir = scandir;\nfunction scandirSync(path, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n return sync.read(path, settings);\n}\nexports.scandirSync = scandirSync;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "'use strict'\n\nfunction reusify (Constructor) {\n var head = new Constructor()\n var tail = head\n\n function get () {\n var current = head\n\n if (current.next) {\n head = current.next\n } else {\n head = new Constructor()\n tail = head\n }\n\n current.next = null\n\n return current\n }\n\n function release (obj) {\n tail.next = obj\n tail = obj\n }\n\n return {\n get: get,\n release: release\n }\n}\n\nmodule.exports = reusify\n", "'use strict'\n\n/* eslint-disable no-var */\n\nvar reusify = require('reusify')\n\nfunction fastqueue (context, worker, _concurrency) {\n if (typeof context === 'function') {\n _concurrency = worker\n worker = context\n context = null\n }\n\n if (!(_concurrency >= 1)) {\n throw new Error('fastqueue concurrency must be equal to or greater than 1')\n }\n\n var cache = reusify(Task)\n var queueHead = null\n var queueTail = null\n var _running = 0\n var errorHandler = null\n\n var self = {\n push: push,\n drain: noop,\n saturated: noop,\n pause: pause,\n paused: false,\n\n get concurrency () {\n return _concurrency\n },\n set concurrency (value) {\n if (!(value >= 1)) {\n throw new Error('fastqueue concurrency must be equal to or greater than 1')\n }\n _concurrency = value\n\n if (self.paused) return\n for (; queueHead && _running < _concurrency;) {\n _running++\n release()\n }\n },\n\n running: running,\n resume: resume,\n idle: idle,\n length: length,\n getQueue: getQueue,\n unshift: unshift,\n empty: noop,\n kill: kill,\n killAndDrain: killAndDrain,\n error: error,\n abort: abort\n }\n\n return self\n\n function running () {\n return _running\n }\n\n function pause () {\n self.paused = true\n }\n\n function length () {\n var current = queueHead\n var counter = 0\n\n while (current) {\n current = current.next\n counter++\n }\n\n return counter\n }\n\n function getQueue () {\n var current = queueHead\n var tasks = []\n\n while (current) {\n tasks.push(current.value)\n current = current.next\n }\n\n return tasks\n }\n\n function resume () {\n if (!self.paused) return\n self.paused = false\n if (queueHead === null) {\n _running++\n release()\n return\n }\n for (; queueHead && _running < _concurrency;) {\n _running++\n release()\n }\n }\n\n function idle () {\n return _running === 0 && self.length() === 0\n }\n\n function push (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n current.errorHandler = errorHandler\n\n if (_running >= _concurrency || self.paused) {\n if (queueTail) {\n queueTail.next = current\n queueTail = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function unshift (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n current.errorHandler = errorHandler\n\n if (_running >= _concurrency || self.paused) {\n if (queueHead) {\n current.next = queueHead\n queueHead = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function release (holder) {\n if (holder) {\n cache.release(holder)\n }\n var next = queueHead\n if (next && _running <= _concurrency) {\n if (!self.paused) {\n if (queueTail === queueHead) {\n queueTail = null\n }\n queueHead = next.next\n next.next = null\n worker.call(context, next.value, next.worked)\n if (queueTail === null) {\n self.empty()\n }\n } else {\n _running--\n }\n } else if (--_running === 0) {\n self.drain()\n }\n }\n\n function kill () {\n queueHead = null\n queueTail = null\n self.drain = noop\n }\n\n function killAndDrain () {\n queueHead = null\n queueTail = null\n self.drain()\n self.drain = noop\n }\n\n function abort () {\n var current = queueHead\n queueHead = null\n queueTail = null\n\n while (current) {\n var next = current.next\n var callback = current.callback\n var errorHandler = current.errorHandler\n var val = current.value\n var context = current.context\n\n // Reset the task state\n current.value = null\n current.callback = noop\n current.errorHandler = null\n\n // Call error handler if present\n if (errorHandler) {\n errorHandler(new Error('abort'), val)\n }\n\n // Call callback with error\n callback.call(context, new Error('abort'))\n\n // Release the task back to the pool\n current.release(current)\n\n current = next\n }\n\n self.drain = noop\n }\n\n function error (handler) {\n errorHandler = handler\n }\n}\n\nfunction noop () {}\n\nfunction Task () {\n this.value = null\n this.callback = noop\n this.next = null\n this.release = noop\n this.context = null\n this.errorHandler = null\n\n var self = this\n\n this.worked = function worked (err, result) {\n var callback = self.callback\n var errorHandler = self.errorHandler\n var val = self.value\n self.value = null\n self.callback = noop\n if (self.errorHandler) {\n errorHandler(err, val)\n }\n callback.call(self.context, err, result)\n self.release(self)\n }\n}\n\nfunction queueAsPromised (context, worker, _concurrency) {\n if (typeof context === 'function') {\n _concurrency = worker\n worker = context\n context = null\n }\n\n function asyncWrapper (arg, cb) {\n worker.call(this, arg)\n .then(function (res) {\n cb(null, res)\n }, cb)\n }\n\n var queue = fastqueue(context, asyncWrapper, _concurrency)\n\n var pushCb = queue.push\n var unshiftCb = queue.unshift\n\n queue.push = push\n queue.unshift = unshift\n queue.drained = drained\n\n return queue\n\n function push (value) {\n var p = new Promise(function (resolve, reject) {\n pushCb(value, function (err, result) {\n if (err) {\n reject(err)\n return\n }\n resolve(result)\n })\n })\n\n // Let's fork the promise chain to\n // make the error bubble up to the user but\n // not lead to a unhandledRejection\n p.catch(noop)\n\n return p\n }\n\n function unshift (value) {\n var p = new Promise(function (resolve, reject) {\n unshiftCb(value, function (err, result) {\n if (err) {\n reject(err)\n return\n }\n resolve(result)\n })\n })\n\n // Let's fork the promise chain to\n // make the error bubble up to the user but\n // not lead to a unhandledRejection\n p.catch(noop)\n\n return p\n }\n\n function drained () {\n var p = new Promise(function (resolve) {\n process.nextTick(function () {\n if (queue.idle()) {\n resolve()\n } else {\n var previousDrain = queue.drain\n queue.drain = function () {\n if (typeof previousDrain === 'function') previousDrain()\n resolve()\n queue.drain = previousDrain\n }\n }\n })\n })\n\n return p\n }\n}\n\nmodule.exports = fastqueue\nmodule.exports.promise = queueAsPromised\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.joinPathSegments = exports.replacePathSegmentSeparator = exports.isAppliedFilter = exports.isFatalError = void 0;\nfunction isFatalError(settings, error) {\n if (settings.errorFilter === null) {\n return true;\n }\n return !settings.errorFilter(error);\n}\nexports.isFatalError = isFatalError;\nfunction isAppliedFilter(filter, value) {\n return filter === null || filter(value);\n}\nexports.isAppliedFilter = isAppliedFilter;\nfunction replacePathSegmentSeparator(filepath, separator) {\n return filepath.split(/[/\\\\]/).join(separator);\n}\nexports.replacePathSegmentSeparator = replacePathSegmentSeparator;\nfunction joinPathSegments(a, b, separator) {\n if (a === '') {\n return b;\n }\n /**\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\n */\n if (a.endsWith(separator)) {\n return a + b;\n }\n return a + separator + b;\n}\nexports.joinPathSegments = joinPathSegments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst common = require(\"./common\");\nclass Reader {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator);\n }\n}\nexports.default = Reader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nconst fastq = require(\"fastq\");\nconst common = require(\"./common\");\nconst reader_1 = require(\"./reader\");\nclass AsyncReader extends reader_1.default {\n constructor(_root, _settings) {\n super(_root, _settings);\n this._settings = _settings;\n this._scandir = fsScandir.scandir;\n this._emitter = new events_1.EventEmitter();\n this._queue = fastq(this._worker.bind(this), this._settings.concurrency);\n this._isFatalError = false;\n this._isDestroyed = false;\n this._queue.drain = () => {\n if (!this._isFatalError) {\n this._emitter.emit('end');\n }\n };\n }\n read() {\n this._isFatalError = false;\n this._isDestroyed = false;\n setImmediate(() => {\n this._pushToQueue(this._root, this._settings.basePath);\n });\n return this._emitter;\n }\n get isDestroyed() {\n return this._isDestroyed;\n }\n destroy() {\n if (this._isDestroyed) {\n throw new Error('The reader is already destroyed');\n }\n this._isDestroyed = true;\n this._queue.killAndDrain();\n }\n onEntry(callback) {\n this._emitter.on('entry', callback);\n }\n onError(callback) {\n this._emitter.once('error', callback);\n }\n onEnd(callback) {\n this._emitter.once('end', callback);\n }\n _pushToQueue(directory, base) {\n const queueItem = { directory, base };\n this._queue.push(queueItem, (error) => {\n if (error !== null) {\n this._handleError(error);\n }\n });\n }\n _worker(item, done) {\n this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => {\n if (error !== null) {\n done(error, undefined);\n return;\n }\n for (const entry of entries) {\n this._handleEntry(entry, item.base);\n }\n done(null, undefined);\n });\n }\n _handleError(error) {\n if (this._isDestroyed || !common.isFatalError(this._settings, error)) {\n return;\n }\n this._isFatalError = true;\n this._isDestroyed = true;\n this._emitter.emit('error', error);\n }\n _handleEntry(entry, base) {\n if (this._isDestroyed || this._isFatalError) {\n return;\n }\n const fullpath = entry.path;\n if (base !== undefined) {\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\n }\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\n this._emitEntry(entry);\n }\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\n this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);\n }\n }\n _emitEntry(entry) {\n this._emitter.emit('entry', entry);\n }\n}\nexports.default = AsyncReader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst async_1 = require(\"../readers/async\");\nclass AsyncProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new async_1.default(this._root, this._settings);\n this._storage = [];\n }\n read(callback) {\n this._reader.onError((error) => {\n callFailureCallback(callback, error);\n });\n this._reader.onEntry((entry) => {\n this._storage.push(entry);\n });\n this._reader.onEnd(() => {\n callSuccessCallback(callback, this._storage);\n });\n this._reader.read();\n }\n}\nexports.default = AsyncProvider;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, entries) {\n callback(null, entries);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst async_1 = require(\"../readers/async\");\nclass StreamProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new async_1.default(this._root, this._settings);\n this._stream = new stream_1.Readable({\n objectMode: true,\n read: () => { },\n destroy: () => {\n if (!this._reader.isDestroyed) {\n this._reader.destroy();\n }\n }\n });\n }\n read() {\n this._reader.onError((error) => {\n this._stream.emit('error', error);\n });\n this._reader.onEntry((entry) => {\n this._stream.push(entry);\n });\n this._reader.onEnd(() => {\n this._stream.push(null);\n });\n this._reader.read();\n return this._stream;\n }\n}\nexports.default = StreamProvider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nconst common = require(\"./common\");\nconst reader_1 = require(\"./reader\");\nclass SyncReader extends reader_1.default {\n constructor() {\n super(...arguments);\n this._scandir = fsScandir.scandirSync;\n this._storage = [];\n this._queue = new Set();\n }\n read() {\n this._pushToQueue(this._root, this._settings.basePath);\n this._handleQueue();\n return this._storage;\n }\n _pushToQueue(directory, base) {\n this._queue.add({ directory, base });\n }\n _handleQueue() {\n for (const item of this._queue.values()) {\n this._handleDirectory(item.directory, item.base);\n }\n }\n _handleDirectory(directory, base) {\n try {\n const entries = this._scandir(directory, this._settings.fsScandirSettings);\n for (const entry of entries) {\n this._handleEntry(entry, base);\n }\n }\n catch (error) {\n this._handleError(error);\n }\n }\n _handleError(error) {\n if (!common.isFatalError(this._settings, error)) {\n return;\n }\n throw error;\n }\n _handleEntry(entry, base) {\n const fullpath = entry.path;\n if (base !== undefined) {\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\n }\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\n this._pushToStorage(entry);\n }\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\n this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);\n }\n }\n _pushToStorage(entry) {\n this._storage.push(entry);\n }\n}\nexports.default = SyncReader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst sync_1 = require(\"../readers/sync\");\nclass SyncProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new sync_1.default(this._root, this._settings);\n }\n read() {\n return this._reader.read();\n }\n}\nexports.default = SyncProvider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.basePath = this._getValue(this._options.basePath, undefined);\n this.concurrency = this._getValue(this._options.concurrency, Number.POSITIVE_INFINITY);\n this.deepFilter = this._getValue(this._options.deepFilter, null);\n this.entryFilter = this._getValue(this._options.entryFilter, null);\n this.errorFilter = this._getValue(this._options.errorFilter, null);\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\n this.fsScandirSettings = new fsScandir.Settings({\n followSymbolicLinks: this._options.followSymbolicLinks,\n fs: this._options.fs,\n pathSegmentSeparator: this._options.pathSegmentSeparator,\n stats: this._options.stats,\n throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink\n });\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Settings = exports.walkStream = exports.walkSync = exports.walk = void 0;\nconst async_1 = require(\"./providers/async\");\nconst stream_1 = require(\"./providers/stream\");\nconst sync_1 = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction walk(directory, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback);\n return;\n }\n new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback);\n}\nexports.walk = walk;\nfunction walkSync(directory, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n const provider = new sync_1.default(directory, settings);\n return provider.read();\n}\nexports.walkSync = walkSync;\nfunction walkStream(directory, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n const provider = new stream_1.default(directory, settings);\n return provider.read();\n}\nexports.walkStream = walkStream;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst utils = require(\"../utils\");\nclass Reader {\n constructor(_settings) {\n this._settings = _settings;\n this._fsStatSettings = new fsStat.Settings({\n followSymbolicLink: this._settings.followSymbolicLinks,\n fs: this._settings.fs,\n throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks\n });\n }\n _getFullEntryPath(filepath) {\n return path.resolve(this._settings.cwd, filepath);\n }\n _makeEntry(stats, pattern) {\n const entry = {\n name: pattern,\n path: pattern,\n dirent: utils.fs.createDirentFromStats(pattern, stats)\n };\n if (this._settings.stats) {\n entry.stats = stats;\n }\n return entry;\n }\n _isFatalError(error) {\n return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors;\n }\n}\nexports.default = Reader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fsWalk = require(\"@nodelib/fs.walk\");\nconst reader_1 = require(\"./reader\");\nclass ReaderStream extends reader_1.default {\n constructor() {\n super(...arguments);\n this._walkStream = fsWalk.walkStream;\n this._stat = fsStat.stat;\n }\n dynamic(root, options) {\n return this._walkStream(root, options);\n }\n static(patterns, options) {\n const filepaths = patterns.map(this._getFullEntryPath, this);\n const stream = new stream_1.PassThrough({ objectMode: true });\n stream._write = (index, _enc, done) => {\n return this._getEntry(filepaths[index], patterns[index], options)\n .then((entry) => {\n if (entry !== null && options.entryFilter(entry)) {\n stream.push(entry);\n }\n if (index === filepaths.length - 1) {\n stream.end();\n }\n done();\n })\n .catch(done);\n };\n for (let i = 0; i < filepaths.length; i++) {\n stream.write(i);\n }\n return stream;\n }\n _getEntry(filepath, pattern, options) {\n return this._getStat(filepath)\n .then((stats) => this._makeEntry(stats, pattern))\n .catch((error) => {\n if (options.errorFilter(error)) {\n return null;\n }\n throw error;\n });\n }\n _getStat(filepath) {\n return new Promise((resolve, reject) => {\n this._stat(filepath, this._fsStatSettings, (error, stats) => {\n return error === null ? resolve(stats) : reject(error);\n });\n });\n }\n}\nexports.default = ReaderStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsWalk = require(\"@nodelib/fs.walk\");\nconst reader_1 = require(\"./reader\");\nconst stream_1 = require(\"./stream\");\nclass ReaderAsync extends reader_1.default {\n constructor() {\n super(...arguments);\n this._walkAsync = fsWalk.walk;\n this._readerStream = new stream_1.default(this._settings);\n }\n dynamic(root, options) {\n return new Promise((resolve, reject) => {\n this._walkAsync(root, options, (error, entries) => {\n if (error === null) {\n resolve(entries);\n }\n else {\n reject(error);\n }\n });\n });\n }\n async static(patterns, options) {\n const entries = [];\n const stream = this._readerStream.static(patterns, options);\n // After #235, replace it with an asynchronous iterator.\n return new Promise((resolve, reject) => {\n stream.once('error', reject);\n stream.on('data', (entry) => entries.push(entry));\n stream.once('end', () => resolve(entries));\n });\n }\n}\nexports.default = ReaderAsync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass Matcher {\n constructor(_patterns, _settings, _micromatchOptions) {\n this._patterns = _patterns;\n this._settings = _settings;\n this._micromatchOptions = _micromatchOptions;\n this._storage = [];\n this._fillStorage();\n }\n _fillStorage() {\n for (const pattern of this._patterns) {\n const segments = this._getPatternSegments(pattern);\n const sections = this._splitSegmentsIntoSections(segments);\n this._storage.push({\n complete: sections.length <= 1,\n pattern,\n segments,\n sections\n });\n }\n }\n _getPatternSegments(pattern) {\n const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions);\n return parts.map((part) => {\n const dynamic = utils.pattern.isDynamicPattern(part, this._settings);\n if (!dynamic) {\n return {\n dynamic: false,\n pattern: part\n };\n }\n return {\n dynamic: true,\n pattern: part,\n patternRe: utils.pattern.makeRe(part, this._micromatchOptions)\n };\n });\n }\n _splitSegmentsIntoSections(segments) {\n return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern));\n }\n}\nexports.default = Matcher;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst matcher_1 = require(\"./matcher\");\nclass PartialMatcher extends matcher_1.default {\n match(filepath) {\n const parts = filepath.split('/');\n const levels = parts.length;\n const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels);\n for (const pattern of patterns) {\n const section = pattern.sections[0];\n /**\n * In this case, the pattern has a globstar and we must read all directories unconditionally,\n * but only if the level has reached the end of the first group.\n *\n * fixtures/{a,b}/**\n * ^ true/false ^ always true\n */\n if (!pattern.complete && levels > section.length) {\n return true;\n }\n const match = parts.every((part, index) => {\n const segment = pattern.segments[index];\n if (segment.dynamic && segment.patternRe.test(part)) {\n return true;\n }\n if (!segment.dynamic && segment.pattern === part) {\n return true;\n }\n return false;\n });\n if (match) {\n return true;\n }\n }\n return false;\n }\n}\nexports.default = PartialMatcher;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nconst partial_1 = require(\"../matchers/partial\");\nclass DeepFilter {\n constructor(_settings, _micromatchOptions) {\n this._settings = _settings;\n this._micromatchOptions = _micromatchOptions;\n }\n getFilter(basePath, positive, negative) {\n const matcher = this._getMatcher(positive);\n const negativeRe = this._getNegativePatternsRe(negative);\n return (entry) => this._filter(basePath, entry, matcher, negativeRe);\n }\n _getMatcher(patterns) {\n return new partial_1.default(patterns, this._settings, this._micromatchOptions);\n }\n _getNegativePatternsRe(patterns) {\n const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern);\n return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions);\n }\n _filter(basePath, entry, matcher, negativeRe) {\n if (this._isSkippedByDeep(basePath, entry.path)) {\n return false;\n }\n if (this._isSkippedSymbolicLink(entry)) {\n return false;\n }\n const filepath = utils.path.removeLeadingDotSegment(entry.path);\n if (this._isSkippedByPositivePatterns(filepath, matcher)) {\n return false;\n }\n return this._isSkippedByNegativePatterns(filepath, negativeRe);\n }\n _isSkippedByDeep(basePath, entryPath) {\n /**\n * Avoid unnecessary depth calculations when it doesn't matter.\n */\n if (this._settings.deep === Infinity) {\n return false;\n }\n return this._getEntryLevel(basePath, entryPath) >= this._settings.deep;\n }\n _getEntryLevel(basePath, entryPath) {\n const entryPathDepth = entryPath.split('/').length;\n if (basePath === '') {\n return entryPathDepth;\n }\n const basePathDepth = basePath.split('/').length;\n return entryPathDepth - basePathDepth;\n }\n _isSkippedSymbolicLink(entry) {\n return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink();\n }\n _isSkippedByPositivePatterns(entryPath, matcher) {\n return !this._settings.baseNameMatch && !matcher.match(entryPath);\n }\n _isSkippedByNegativePatterns(entryPath, patternsRe) {\n return !utils.pattern.matchAny(entryPath, patternsRe);\n }\n}\nexports.default = DeepFilter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass EntryFilter {\n constructor(_settings, _micromatchOptions) {\n this._settings = _settings;\n this._micromatchOptions = _micromatchOptions;\n this.index = new Map();\n }\n getFilter(positive, negative) {\n const [absoluteNegative, relativeNegative] = utils.pattern.partitionAbsoluteAndRelative(negative);\n const patterns = {\n positive: {\n all: utils.pattern.convertPatternsToRe(positive, this._micromatchOptions)\n },\n negative: {\n absolute: utils.pattern.convertPatternsToRe(absoluteNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true })),\n relative: utils.pattern.convertPatternsToRe(relativeNegative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true }))\n }\n };\n return (entry) => this._filter(entry, patterns);\n }\n _filter(entry, patterns) {\n const filepath = utils.path.removeLeadingDotSegment(entry.path);\n if (this._settings.unique && this._isDuplicateEntry(filepath)) {\n return false;\n }\n if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) {\n return false;\n }\n const isMatched = this._isMatchToPatternsSet(filepath, patterns, entry.dirent.isDirectory());\n if (this._settings.unique && isMatched) {\n this._createIndexRecord(filepath);\n }\n return isMatched;\n }\n _isDuplicateEntry(filepath) {\n return this.index.has(filepath);\n }\n _createIndexRecord(filepath) {\n this.index.set(filepath, undefined);\n }\n _onlyFileFilter(entry) {\n return this._settings.onlyFiles && !entry.dirent.isFile();\n }\n _onlyDirectoryFilter(entry) {\n return this._settings.onlyDirectories && !entry.dirent.isDirectory();\n }\n _isMatchToPatternsSet(filepath, patterns, isDirectory) {\n const isMatched = this._isMatchToPatterns(filepath, patterns.positive.all, isDirectory);\n if (!isMatched) {\n return false;\n }\n const isMatchedByRelativeNegative = this._isMatchToPatterns(filepath, patterns.negative.relative, isDirectory);\n if (isMatchedByRelativeNegative) {\n return false;\n }\n const isMatchedByAbsoluteNegative = this._isMatchToAbsoluteNegative(filepath, patterns.negative.absolute, isDirectory);\n if (isMatchedByAbsoluteNegative) {\n return false;\n }\n return true;\n }\n _isMatchToAbsoluteNegative(filepath, patternsRe, isDirectory) {\n if (patternsRe.length === 0) {\n return false;\n }\n const fullpath = utils.path.makeAbsolute(this._settings.cwd, filepath);\n return this._isMatchToPatterns(fullpath, patternsRe, isDirectory);\n }\n _isMatchToPatterns(filepath, patternsRe, isDirectory) {\n if (patternsRe.length === 0) {\n return false;\n }\n // Trying to match files and directories by patterns.\n const isMatched = utils.pattern.matchAny(filepath, patternsRe);\n // A pattern with a trailling slash can be used for directory matching.\n // To apply such pattern, we need to add a tralling slash to the path.\n if (!isMatched && isDirectory) {\n return utils.pattern.matchAny(filepath + '/', patternsRe);\n }\n return isMatched;\n }\n}\nexports.default = EntryFilter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass ErrorFilter {\n constructor(_settings) {\n this._settings = _settings;\n }\n getFilter() {\n return (error) => this._isNonFatalError(error);\n }\n _isNonFatalError(error) {\n return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors;\n }\n}\nexports.default = ErrorFilter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils = require(\"../../utils\");\nclass EntryTransformer {\n constructor(_settings) {\n this._settings = _settings;\n }\n getTransformer() {\n return (entry) => this._transform(entry);\n }\n _transform(entry) {\n let filepath = entry.path;\n if (this._settings.absolute) {\n filepath = utils.path.makeAbsolute(this._settings.cwd, filepath);\n filepath = utils.path.unixify(filepath);\n }\n if (this._settings.markDirectories && entry.dirent.isDirectory()) {\n filepath += '/';\n }\n if (!this._settings.objectMode) {\n return filepath;\n }\n return Object.assign(Object.assign({}, entry), { path: filepath });\n }\n}\nexports.default = EntryTransformer;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst deep_1 = require(\"./filters/deep\");\nconst entry_1 = require(\"./filters/entry\");\nconst error_1 = require(\"./filters/error\");\nconst entry_2 = require(\"./transformers/entry\");\nclass Provider {\n constructor(_settings) {\n this._settings = _settings;\n this.errorFilter = new error_1.default(this._settings);\n this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions());\n this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions());\n this.entryTransformer = new entry_2.default(this._settings);\n }\n _getRootDirectory(task) {\n return path.resolve(this._settings.cwd, task.base);\n }\n _getReaderOptions(task) {\n const basePath = task.base === '.' ? '' : task.base;\n return {\n basePath,\n pathSegmentSeparator: '/',\n concurrency: this._settings.concurrency,\n deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative),\n entryFilter: this.entryFilter.getFilter(task.positive, task.negative),\n errorFilter: this.errorFilter.getFilter(),\n followSymbolicLinks: this._settings.followSymbolicLinks,\n fs: this._settings.fs,\n stats: this._settings.stats,\n throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink,\n transform: this.entryTransformer.getTransformer()\n };\n }\n _getMicromatchOptions() {\n return {\n dot: this._settings.dot,\n matchBase: this._settings.baseNameMatch,\n nobrace: !this._settings.braceExpansion,\n nocase: !this._settings.caseSensitiveMatch,\n noext: !this._settings.extglob,\n noglobstar: !this._settings.globstar,\n posix: true,\n strictSlashes: false\n };\n }\n}\nexports.default = Provider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst async_1 = require(\"../readers/async\");\nconst provider_1 = require(\"./provider\");\nclass ProviderAsync extends provider_1.default {\n constructor() {\n super(...arguments);\n this._reader = new async_1.default(this._settings);\n }\n async read(task) {\n const root = this._getRootDirectory(task);\n const options = this._getReaderOptions(task);\n const entries = await this.api(root, task, options);\n return entries.map((entry) => options.transform(entry));\n }\n api(root, task, options) {\n if (task.dynamic) {\n return this._reader.dynamic(root, options);\n }\n return this._reader.static(task.patterns, options);\n }\n}\nexports.default = ProviderAsync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst stream_2 = require(\"../readers/stream\");\nconst provider_1 = require(\"./provider\");\nclass ProviderStream extends provider_1.default {\n constructor() {\n super(...arguments);\n this._reader = new stream_2.default(this._settings);\n }\n read(task) {\n const root = this._getRootDirectory(task);\n const options = this._getReaderOptions(task);\n const source = this.api(root, task, options);\n const destination = new stream_1.Readable({ objectMode: true, read: () => { } });\n source\n .once('error', (error) => destination.emit('error', error))\n .on('data', (entry) => destination.emit('data', options.transform(entry)))\n .once('end', () => destination.emit('end'));\n destination\n .once('close', () => source.destroy());\n return destination;\n }\n api(root, task, options) {\n if (task.dynamic) {\n return this._reader.dynamic(root, options);\n }\n return this._reader.static(task.patterns, options);\n }\n}\nexports.default = ProviderStream;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fsWalk = require(\"@nodelib/fs.walk\");\nconst reader_1 = require(\"./reader\");\nclass ReaderSync extends reader_1.default {\n constructor() {\n super(...arguments);\n this._walkSync = fsWalk.walkSync;\n this._statSync = fsStat.statSync;\n }\n dynamic(root, options) {\n return this._walkSync(root, options);\n }\n static(patterns, options) {\n const entries = [];\n for (const pattern of patterns) {\n const filepath = this._getFullEntryPath(pattern);\n const entry = this._getEntry(filepath, pattern, options);\n if (entry === null || !options.entryFilter(entry)) {\n continue;\n }\n entries.push(entry);\n }\n return entries;\n }\n _getEntry(filepath, pattern, options) {\n try {\n const stats = this._getStat(filepath);\n return this._makeEntry(stats, pattern);\n }\n catch (error) {\n if (options.errorFilter(error)) {\n return null;\n }\n throw error;\n }\n }\n _getStat(filepath) {\n return this._statSync(filepath, this._fsStatSettings);\n }\n}\nexports.default = ReaderSync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst sync_1 = require(\"../readers/sync\");\nconst provider_1 = require(\"./provider\");\nclass ProviderSync extends provider_1.default {\n constructor() {\n super(...arguments);\n this._reader = new sync_1.default(this._settings);\n }\n read(task) {\n const root = this._getRootDirectory(task);\n const options = this._getReaderOptions(task);\n const entries = this.api(root, task, options);\n return entries.map(options.transform);\n }\n api(root, task, options) {\n if (task.dynamic) {\n return this._reader.dynamic(root, options);\n }\n return this._reader.static(task.patterns, options);\n }\n}\nexports.default = ProviderSync;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nconst os = require(\"os\");\n/**\n * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero.\n * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107\n */\nconst CPU_COUNT = Math.max(os.cpus().length, 1);\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n lstatSync: fs.lstatSync,\n stat: fs.stat,\n statSync: fs.statSync,\n readdir: fs.readdir,\n readdirSync: fs.readdirSync\n};\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.absolute = this._getValue(this._options.absolute, false);\n this.baseNameMatch = this._getValue(this._options.baseNameMatch, false);\n this.braceExpansion = this._getValue(this._options.braceExpansion, true);\n this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true);\n this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT);\n this.cwd = this._getValue(this._options.cwd, process.cwd());\n this.deep = this._getValue(this._options.deep, Infinity);\n this.dot = this._getValue(this._options.dot, false);\n this.extglob = this._getValue(this._options.extglob, true);\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true);\n this.fs = this._getFileSystemMethods(this._options.fs);\n this.globstar = this._getValue(this._options.globstar, true);\n this.ignore = this._getValue(this._options.ignore, []);\n this.markDirectories = this._getValue(this._options.markDirectories, false);\n this.objectMode = this._getValue(this._options.objectMode, false);\n this.onlyDirectories = this._getValue(this._options.onlyDirectories, false);\n this.onlyFiles = this._getValue(this._options.onlyFiles, true);\n this.stats = this._getValue(this._options.stats, false);\n this.suppressErrors = this._getValue(this._options.suppressErrors, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false);\n this.unique = this._getValue(this._options.unique, true);\n if (this.onlyDirectories) {\n this.onlyFiles = false;\n }\n if (this.stats) {\n this.objectMode = true;\n }\n // Remove the cast to the array in the next major (#404).\n this.ignore = [].concat(this.ignore);\n }\n _getValue(option, value) {\n return option === undefined ? value : option;\n }\n _getFileSystemMethods(methods = {}) {\n return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods);\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nconst taskManager = require(\"./managers/tasks\");\nconst async_1 = require(\"./providers/async\");\nconst stream_1 = require(\"./providers/stream\");\nconst sync_1 = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nconst utils = require(\"./utils\");\nasync function FastGlob(source, options) {\n assertPatternsInput(source);\n const works = getWorks(source, async_1.default, options);\n const result = await Promise.all(works);\n return utils.array.flatten(result);\n}\n// https://github.com/typescript-eslint/typescript-eslint/issues/60\n// eslint-disable-next-line no-redeclare\n(function (FastGlob) {\n FastGlob.glob = FastGlob;\n FastGlob.globSync = sync;\n FastGlob.globStream = stream;\n FastGlob.async = FastGlob;\n function sync(source, options) {\n assertPatternsInput(source);\n const works = getWorks(source, sync_1.default, options);\n return utils.array.flatten(works);\n }\n FastGlob.sync = sync;\n function stream(source, options) {\n assertPatternsInput(source);\n const works = getWorks(source, stream_1.default, options);\n /**\n * The stream returned by the provider cannot work with an asynchronous iterator.\n * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams.\n * This affects performance (+25%). I don't see best solution right now.\n */\n return utils.stream.merge(works);\n }\n FastGlob.stream = stream;\n function generateTasks(source, options) {\n assertPatternsInput(source);\n const patterns = [].concat(source);\n const settings = new settings_1.default(options);\n return taskManager.generate(patterns, settings);\n }\n FastGlob.generateTasks = generateTasks;\n function isDynamicPattern(source, options) {\n assertPatternsInput(source);\n const settings = new settings_1.default(options);\n return utils.pattern.isDynamicPattern(source, settings);\n }\n FastGlob.isDynamicPattern = isDynamicPattern;\n function escapePath(source) {\n assertPatternsInput(source);\n return utils.path.escape(source);\n }\n FastGlob.escapePath = escapePath;\n function convertPathToPattern(source) {\n assertPatternsInput(source);\n return utils.path.convertPathToPattern(source);\n }\n FastGlob.convertPathToPattern = convertPathToPattern;\n let posix;\n (function (posix) {\n function escapePath(source) {\n assertPatternsInput(source);\n return utils.path.escapePosixPath(source);\n }\n posix.escapePath = escapePath;\n function convertPathToPattern(source) {\n assertPatternsInput(source);\n return utils.path.convertPosixPathToPattern(source);\n }\n posix.convertPathToPattern = convertPathToPattern;\n })(posix = FastGlob.posix || (FastGlob.posix = {}));\n let win32;\n (function (win32) {\n function escapePath(source) {\n assertPatternsInput(source);\n return utils.path.escapeWindowsPath(source);\n }\n win32.escapePath = escapePath;\n function convertPathToPattern(source) {\n assertPatternsInput(source);\n return utils.path.convertWindowsPathToPattern(source);\n }\n win32.convertPathToPattern = convertPathToPattern;\n })(win32 = FastGlob.win32 || (FastGlob.win32 = {}));\n})(FastGlob || (FastGlob = {}));\nfunction getWorks(source, _Provider, options) {\n const patterns = [].concat(source);\n const settings = new settings_1.default(options);\n const tasks = taskManager.generate(patterns, settings);\n const provider = new _Provider(settings);\n return tasks.map(provider.read, provider);\n}\nfunction assertPatternsInput(input) {\n const source = [].concat(input);\n const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item));\n if (!isValidSource) {\n throw new TypeError('Patterns must be a string (non empty) or an array of strings');\n }\n}\nmodule.exports = FastGlob;\n", "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n", "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n", "/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n", "'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n", "'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n", "/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n", "/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n", null, null, null, "'use strict'\n\nconst NullObject = function NullObject () { }\nNullObject.prototype = Object.create(null)\n\n/**\n * RegExp to match *( \";\" parameter ) in RFC 7231 sec 3.1.1.1\n *\n * parameter = token \"=\" ( token / quoted-string )\n * token = 1*tchar\n * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" / \"*\"\n * / \"+\" / \"-\" / \".\" / \"^\" / \"_\" / \"`\" / \"|\" / \"~\"\n * / DIGIT / ALPHA\n * ; any VCHAR, except delimiters\n * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE\n * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text\n * obs-text = %x80-FF\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n */\nconst paramRE = /; *([!#$%&'*+.^\\w`|~-]+)=(\"(?:[\\v\\u0020\\u0021\\u0023-\\u005b\\u005d-\\u007e\\u0080-\\u00ff]|\\\\[\\v\\u0020-\\u00ff])*\"|[!#$%&'*+.^\\w`|~-]+) */gu\n\n/**\n * RegExp to match quoted-pair in RFC 7230 sec 3.2.6\n *\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n * obs-text = %x80-FF\n */\nconst quotedPairRE = /\\\\([\\v\\u0020-\\u00ff])/gu\n\n/**\n * RegExp to match type in RFC 7231 sec 3.1.1.1\n *\n * media-type = type \"/\" subtype\n * type = token\n * subtype = token\n */\nconst mediaTypeRE = /^[!#$%&'*+.^\\w|~-]+\\/[!#$%&'*+.^\\w|~-]+$/u\n\n// default ContentType to prevent repeated object creation\nconst defaultContentType = { type: '', parameters: new NullObject() }\nObject.freeze(defaultContentType.parameters)\nObject.freeze(defaultContentType)\n\n/**\n * Parse media type to object.\n *\n * @param {string|object} header\n * @return {Object}\n * @public\n */\n\nfunction parse (header) {\n if (typeof header !== 'string') {\n throw new TypeError('argument header is required and must be a string')\n }\n\n let index = header.indexOf(';')\n const type = index !== -1\n ? header.slice(0, index).trim()\n : header.trim()\n\n if (mediaTypeRE.test(type) === false) {\n throw new TypeError('invalid media type')\n }\n\n const result = {\n type: type.toLowerCase(),\n parameters: new NullObject()\n }\n\n // parse parameters\n if (index === -1) {\n return result\n }\n\n let key\n let match\n let value\n\n paramRE.lastIndex = index\n\n while ((match = paramRE.exec(header))) {\n if (match.index !== index) {\n throw new TypeError('invalid parameter format')\n }\n\n index += match[0].length\n key = match[1].toLowerCase()\n value = match[2]\n\n if (value[0] === '\"') {\n // remove quotes and escapes\n value = value\n .slice(1, value.length - 1)\n\n quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'))\n }\n\n result.parameters[key] = value\n }\n\n if (index !== header.length) {\n throw new TypeError('invalid parameter format')\n }\n\n return result\n}\n\nfunction safeParse (header) {\n if (typeof header !== 'string') {\n return defaultContentType\n }\n\n let index = header.indexOf(';')\n const type = index !== -1\n ? header.slice(0, index).trim()\n : header.trim()\n\n if (mediaTypeRE.test(type) === false) {\n return defaultContentType\n }\n\n const result = {\n type: type.toLowerCase(),\n parameters: new NullObject()\n }\n\n // parse parameters\n if (index === -1) {\n return result\n }\n\n let key\n let match\n let value\n\n paramRE.lastIndex = index\n\n while ((match = paramRE.exec(header))) {\n if (match.index !== index) {\n return defaultContentType\n }\n\n index += match[0].length\n key = match[1].toLowerCase()\n value = match[2]\n\n if (value[0] === '\"') {\n // remove quotes and escapes\n value = value\n .slice(1, value.length - 1)\n\n quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'))\n }\n\n result.parameters[key] = value\n }\n\n if (index !== header.length) {\n return defaultContentType\n }\n\n return result\n}\n\nmodule.exports.default = { parse, safeParse }\nmodule.exports.parse = parse\nmodule.exports.safeParse = safeParse\nmodule.exports.defaultContentType = defaultContentType\n", "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n", "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n", "/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n", "/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n", "/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n", null, null, null, "import * as vscode from \"vscode\";\nimport { analyzeCommand, getCachedAnalysis } from \"./commands/analyze.js\";\nimport { generateCommand } from \"./commands/generate.js\";\nimport { instructionsCommand } from \"./commands/instructions.js\";\nimport { readinessCommand } from \"./commands/readiness.js\";\nimport { evalCommand, evalInitCommand } from \"./commands/eval.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { prCommand } from \"./commands/pr.js\";\nimport { analysisTreeProvider, readinessTreeProvider } from \"./views/providers.js\";\n\nexport function activate(context: vscode.ExtensionContext): void {\n // Status bar\n const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0);\n statusBar.text = \"$(beaker) Primer\";\n statusBar.tooltip = \"Primer \u2014 click to analyze repository\";\n statusBar.command = \"primer.analyze\";\n statusBar.show();\n context.subscriptions.push(statusBar);\n\n // Tree views (createTreeView for description/badge support)\n const analysisView = vscode.window.createTreeView(\"primer.analysis\", {\n treeDataProvider: analysisTreeProvider,\n });\n const readinessView = vscode.window.createTreeView(\"primer.readiness\", {\n treeDataProvider: readinessTreeProvider,\n });\n context.subscriptions.push(analysisView, readinessView);\n\n function updateAnalysisView(): void {\n const analysis = getCachedAnalysis();\n if (analysis) {\n const parts = [...analysis.languages.slice(0, 3), ...analysis.frameworks.slice(0, 2)];\n analysisView.description = parts.join(\", \") || undefined;\n } else {\n analysisView.description = undefined;\n }\n }\n\n function updateReadinessView(): void {\n const report = readinessTreeProvider.getReport();\n if (report) {\n readinessView.description = `Level ${report.achievedLevel}`;\n } else {\n readinessView.description = undefined;\n }\n }\n\n function updateStatusBar(): void {\n const analysis = getCachedAnalysis();\n if (analysis) {\n const parts = analysis.languages.slice(0, 2);\n statusBar.text = `$(beaker) ${parts.join(\", \") || \"Primer\"}`;\n statusBar.tooltip = `Primer \u2014 ${analysis.languages.join(\", \")}${analysis.isMonorepo ? \" | monorepo\" : \"\"}`;\n } else {\n statusBar.text = \"$(beaker) Primer\";\n statusBar.tooltip = \"Primer \u2014 click to analyze repository\";\n }\n }\n\n // Commands\n context.subscriptions.push(\n vscode.commands.registerCommand(\"primer.analyze\", async () => {\n await analyzeCommand();\n analysisTreeProvider.refresh();\n updateAnalysisView();\n updateStatusBar();\n vscode.commands.executeCommand(\"primer.analysis.focus\");\n }),\n vscode.commands.registerCommand(\"primer.generate\", generateCommand),\n vscode.commands.registerCommand(\"primer.instructions\", instructionsCommand),\n vscode.commands.registerCommand(\"primer.readiness\", async () => {\n await readinessCommand();\n updateReadinessView();\n updateStatusBar();\n }),\n vscode.commands.registerCommand(\"primer.eval\", evalCommand),\n vscode.commands.registerCommand(\"primer.evalInit\", evalInitCommand),\n vscode.commands.registerCommand(\"primer.init\", async () => {\n await initCommand();\n analysisTreeProvider.refresh();\n updateAnalysisView();\n updateStatusBar();\n vscode.commands.executeCommand(\"primer.analysis.focus\");\n }),\n vscode.commands.registerCommand(\"primer.pr\", prCommand),\n );\n\n // Auto-analyze on activation if configured\n const config = vscode.workspace.getConfiguration(\"primer\");\n if (config.get(\"autoAnalyze\") && vscode.workspace.workspaceFolders?.length) {\n analyzeCommand()\n .then(() => {\n analysisTreeProvider.refresh();\n updateAnalysisView();\n updateStatusBar();\n })\n .catch(() => {});\n }\n}\n\nexport function deactivate(): void {}\n", "import * as vscode from \"vscode\";\nimport { analyzeRepo } from \"../services.js\";\nimport type { RepoAnalysis } from \"../types.js\";\n\nlet cachedAnalysis: RepoAnalysis | undefined;\n\nexport function getCachedAnalysis(): RepoAnalysis | undefined {\n return cachedAnalysis;\n}\n\nexport function setCachedAnalysis(analysis: RepoAnalysis | undefined): void {\n cachedAnalysis = analysis;\n vscode.commands.executeCommand(\"setContext\", \"primer.hasAnalysis\", !!analysis);\n}\n\nexport async function analyzeCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: \"Primer: Analyzing repository\u2026\" },\n async () => {\n try {\n const analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Analysis failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n\nexport function getWorkspacePath(): string | undefined {\n const folder = vscode.workspace.workspaceFolders?.[0];\n if (!folder) {\n vscode.window.showWarningMessage(\"Primer: No workspace folder open.\");\n return undefined;\n }\n return folder.uri.fsPath;\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport fg from \"fast-glob\";\n\nimport { fileExists, safeReadDir, readJson } from \"../utils/fs\";\n\nimport { isGitRepo } from \"./git\";\n\nexport type RepoApp = {\n name: string;\n path: string;\n ecosystem?: \"node\" | \"rust\" | \"go\" | \"dotnet\" | \"java\" | \"python\" | \"ruby\" | \"php\";\n manifestPath?: string;\n packageJsonPath: string;\n scripts: Record;\n hasTsConfig: boolean;\n};\n\nexport type Area = {\n name: string;\n description?: string;\n applyTo: string | string[];\n path?: string;\n ecosystem?: RepoApp[\"ecosystem\"];\n source: \"auto\" | \"config\";\n scripts?: Record;\n hasTsConfig?: boolean;\n};\n\nexport type RepoAnalysis = {\n path: string;\n isGitRepo: boolean;\n languages: string[];\n frameworks: string[];\n packageManager?: string;\n isMonorepo?: boolean;\n workspaceType?: \"npm\" | \"pnpm\" | \"yarn\" | \"cargo\" | \"go\" | \"dotnet\" | \"gradle\" | \"maven\";\n workspacePatterns?: string[];\n apps?: RepoApp[];\n areas?: Area[];\n};\n\nconst PACKAGE_MANAGERS: Array<{ file: string; name: string }> = [\n { file: \"pnpm-lock.yaml\", name: \"pnpm\" },\n { file: \"yarn.lock\", name: \"yarn\" },\n { file: \"package-lock.json\", name: \"npm\" },\n { file: \"bun.lockb\", name: \"bun\" }\n];\n\nexport async function analyzeRepo(repoPath: string): Promise {\n const files = await safeReadDir(repoPath);\n const analysis: RepoAnalysis = {\n path: repoPath,\n isGitRepo: await isGitRepo(repoPath),\n languages: [],\n frameworks: []\n };\n\n const hasPackageJson = files.includes(\"package.json\");\n const hasTsConfig = files.includes(\"tsconfig.json\");\n const hasPyProject = files.includes(\"pyproject.toml\");\n const hasRequirements = files.includes(\"requirements.txt\");\n const hasGoMod = files.includes(\"go.mod\");\n const hasCargo = files.includes(\"Cargo.toml\");\n const hasCsproj = files.some((f) => f.endsWith(\".csproj\") || f.endsWith(\".sln\"));\n const hasPomXml = files.includes(\"pom.xml\");\n const hasBuildGradle = files.includes(\"build.gradle\") || files.includes(\"build.gradle.kts\");\n const hasGemfile = files.includes(\"Gemfile\");\n const hasComposerJson = files.includes(\"composer.json\");\n\n if (hasPackageJson) analysis.languages.push(\"JavaScript\");\n if (hasTsConfig) analysis.languages.push(\"TypeScript\");\n if (hasPyProject || hasRequirements) analysis.languages.push(\"Python\");\n if (hasGoMod) analysis.languages.push(\"Go\");\n if (hasCargo) analysis.languages.push(\"Rust\");\n if (hasCsproj) analysis.languages.push(\"C#\");\n if (hasPomXml || hasBuildGradle) analysis.languages.push(\"Java\");\n if (hasGemfile) analysis.languages.push(\"Ruby\");\n if (hasComposerJson) analysis.languages.push(\"PHP\");\n\n analysis.packageManager = await detectPackageManager(repoPath, files);\n\n let rootPackageJson: Record | undefined;\n\n if (hasPackageJson) {\n rootPackageJson = await readJson(path.join(repoPath, \"package.json\"));\n const deps = Object.keys({\n ...(rootPackageJson?.dependencies ?? {}),\n ...(rootPackageJson?.devDependencies ?? {})\n });\n analysis.frameworks.push(...detectFrameworks(deps, files));\n }\n\n const workspace = await detectWorkspace(repoPath, files, rootPackageJson);\n if (workspace) {\n analysis.workspaceType = workspace.type;\n analysis.workspacePatterns = workspace.patterns;\n }\n\n let apps = await resolveWorkspaceApps(repoPath, workspace?.patterns ?? [], rootPackageJson);\n\n // If JS workspace didn't find multiple apps, try non-JS monorepo detection\n if (apps.length <= 1) {\n const nonJs = await detectNonJsMonorepo(repoPath, files);\n if (nonJs.apps.length > 1) {\n apps = nonJs.apps;\n if (nonJs.type) analysis.workspaceType = nonJs.type;\n if (nonJs.patterns) analysis.workspacePatterns = nonJs.patterns;\n }\n }\n\n analysis.apps = apps;\n analysis.isMonorepo = apps.length > 1;\n\n analysis.languages = unique(analysis.languages);\n analysis.frameworks = unique(analysis.frameworks);\n\n // Detect areas from apps and folder heuristics\n analysis.areas = await detectAreas(repoPath, analysis);\n\n return analysis;\n}\n\nasync function detectPackageManager(\n _repoPath: string,\n files: string[]\n): Promise {\n for (const manager of PACKAGE_MANAGERS) {\n if (files.includes(manager.file)) return manager.name;\n }\n\n if (files.includes(\"package.json\")) return \"npm\";\n if (files.includes(\"pyproject.toml\")) return \"pip\";\n if (files.includes(\"pom.xml\")) return \"maven\";\n if (files.includes(\"build.gradle\") || files.includes(\"build.gradle.kts\")) return \"gradle\";\n if (files.includes(\"Gemfile\")) return \"bundler\";\n if (files.includes(\"composer.json\")) return \"composer\";\n return undefined;\n}\n\nfunction detectFrameworks(deps: string[], files: string[]): string[] {\n const frameworks: string[] = [];\n const hasFile = (file: string): boolean => files.includes(file);\n\n if (deps.includes(\"next\") || hasFile(\"next.config.js\") || hasFile(\"next.config.mjs\"))\n frameworks.push(\"Next.js\");\n if (deps.includes(\"react\") || deps.includes(\"react-dom\")) frameworks.push(\"React\");\n if (deps.includes(\"vue\") || hasFile(\"vue.config.js\")) frameworks.push(\"Vue\");\n if (deps.includes(\"@angular/core\") || hasFile(\"angular.json\")) frameworks.push(\"Angular\");\n if (deps.includes(\"svelte\") || hasFile(\"svelte.config.js\")) frameworks.push(\"Svelte\");\n if (deps.includes(\"express\")) frameworks.push(\"Express\");\n if (deps.includes(\"@nestjs/core\")) frameworks.push(\"NestJS\");\n if (deps.includes(\"fastify\")) frameworks.push(\"Fastify\");\n\n return frameworks;\n}\n\nasync function safeReadFile(filePath: string): Promise {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\ntype WorkspaceConfig = {\n type: \"npm\" | \"pnpm\" | \"yarn\";\n patterns: string[];\n};\n\nasync function detectWorkspace(\n repoPath: string,\n files: string[],\n packageJson?: Record\n): Promise {\n if (files.includes(\"pnpm-workspace.yaml\")) {\n const patterns = await readPnpmWorkspace(path.join(repoPath, \"pnpm-workspace.yaml\"));\n if (patterns.length) return { type: \"pnpm\", patterns };\n }\n\n const workspaces = packageJson?.workspaces;\n if (Array.isArray(workspaces)) {\n return { type: files.includes(\"yarn.lock\") ? \"yarn\" : \"npm\", patterns: workspaces.map(String) };\n }\n\n if (workspaces && typeof workspaces === \"object\") {\n const packages = (workspaces as { packages?: unknown }).packages;\n if (Array.isArray(packages)) {\n return { type: files.includes(\"yarn.lock\") ? \"yarn\" : \"npm\", patterns: packages.map(String) };\n }\n }\n\n return undefined;\n}\n\nasync function readPnpmWorkspace(filePath: string): Promise {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const lines = raw.split(/\\r?\\n/u);\n const patterns: string[] = [];\n let inPackages = false;\n for (const line of lines) {\n // Skip comment-only lines\n if (/^\\s*#/u.test(line)) continue;\n if (!inPackages && /^\\s*packages\\s*:/u.test(line)) {\n // Handle inline array: packages: [\"apps/*\", \"libs/*\"]\n const inline = line.match(/packages\\s*:\\s*\\[([^\\]]+)\\]/u);\n if (inline) {\n const items = inline[1].split(\",\").map((s) => s.trim().replace(/^['\"]|['\"]$/gu, \"\"));\n return items.filter(Boolean);\n }\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = line.match(/^\\s*-\\s*(.+)$/u);\n if (match?.[1]) {\n // Strip trailing comments and quotes\n const value = match[1]\n .split(\"#\")[0]\n .trim()\n .replace(/^['\"]|['\"]$/gu, \"\");\n if (value) patterns.push(value);\n continue;\n }\n // Non-indented, non-empty line means a new top-level key\n if (/^\\S/u.test(line) && line.trim()) break;\n }\n }\n return patterns;\n } catch {\n return [];\n }\n}\n\nasync function resolveWorkspaceApps(\n repoPath: string,\n patterns: string[],\n rootPackageJson?: Record\n): Promise {\n const workspacePatterns = patterns\n .map((pattern) => pattern.replace(/\\\\/gu, \"/\"))\n .map((pattern) =>\n pattern.endsWith(\"package.json\") ? pattern : path.posix.join(pattern, \"package.json\")\n );\n\n const packageJsonPaths = workspacePatterns.length\n ? (\n await fg(workspacePatterns, { cwd: repoPath, absolute: true, onlyFiles: true, dot: false })\n ).map((p) => path.normalize(p))\n : [];\n\n if (!packageJsonPaths.length && rootPackageJson) {\n const rootPath = path.join(repoPath, \"package.json\");\n return [await buildRepoApp(repoPath, rootPath, rootPackageJson)];\n }\n\n const apps = await Promise.all(\n packageJsonPaths.map(async (pkgPath) => {\n const pkg = await readJson(pkgPath);\n return buildRepoApp(path.dirname(pkgPath), pkgPath, pkg);\n })\n );\n\n return apps.filter(Boolean) as RepoApp[];\n}\n\nasync function buildRepoApp(\n appPath: string,\n packageJsonPath: string,\n packageJson?: Record\n): Promise {\n const scripts = (packageJson?.scripts ?? {}) as Record;\n const name = typeof packageJson?.name === \"string\" ? packageJson.name : path.basename(appPath);\n const hasTsConfig = await fileExists(path.join(appPath, \"tsconfig.json\"));\n\n return {\n name,\n path: appPath,\n ecosystem: \"node\",\n manifestPath: packageJsonPath,\n packageJsonPath,\n scripts,\n hasTsConfig\n };\n}\n\nfunction buildNonJsApp(\n name: string,\n appPath: string,\n ecosystem: NonNullable,\n manifestPath: string\n): RepoApp {\n return {\n name,\n path: appPath,\n ecosystem,\n manifestPath,\n packageJsonPath: \"\",\n scripts: {},\n hasTsConfig: false\n };\n}\n\n// \u2500\u2500\u2500 Non-JS monorepo detection \u2500\u2500\u2500\n\ntype NonJsMonorepoResult = {\n type?: \"cargo\" | \"go\" | \"dotnet\" | \"gradle\" | \"maven\";\n patterns?: string[];\n apps: RepoApp[];\n};\n\nasync function detectNonJsMonorepo(\n repoPath: string,\n files: string[]\n): Promise {\n const cargoApps = await detectCargoWorkspace(repoPath);\n if (cargoApps.length > 1) return { type: \"cargo\", apps: cargoApps };\n\n const goApps = await detectGoWorkspace(repoPath);\n if (goApps.length > 1) return { type: \"go\", apps: goApps };\n\n const dotnetApps = await detectDotnetSolution(repoPath, files);\n if (dotnetApps.length > 1) return { type: \"dotnet\", apps: dotnetApps };\n\n const gradleApps = await detectGradleMultiProject(repoPath, files);\n if (gradleApps.length > 1) return { type: \"gradle\", apps: gradleApps };\n\n const mavenApps = await detectMavenMultiModule(repoPath);\n if (mavenApps.length > 1) return { type: \"maven\", apps: mavenApps };\n\n return { apps: [] };\n}\n\nasync function detectCargoWorkspace(repoPath: string): Promise {\n const content = await safeReadFile(path.join(repoPath, \"Cargo.toml\"));\n if (!content) return [];\n\n // Extract [workspace] section up to the next section header\n const workspaceSection = content.match(/\\[workspace\\]([\\s\\S]*?)(?:\\n\\[|$)/u);\n if (!workspaceSection) return [];\n\n const membersMatch = workspaceSection[1].match(/members\\s*=\\s*\\[([\\s\\S]*?)\\]/u);\n if (!membersMatch) return [];\n\n const patterns = [...membersMatch[1].matchAll(/\"([^\"]+)\"/gu)].map((m) => m[1]);\n if (!patterns.length) return [];\n\n const tomlPaths = (\n await fg(\n patterns.map((p) => path.posix.join(p, \"Cargo.toml\")),\n { cwd: repoPath, absolute: true, onlyFiles: true }\n )\n ).map((p) => path.normalize(p));\n\n return Promise.all(\n tomlPaths.map(async (tomlPath) => {\n const dir = path.dirname(tomlPath);\n const toml = await safeReadFile(tomlPath);\n const nameMatch = toml?.match(/^\\s*name\\s*=\\s*\"([^\"]+)\"/mu);\n return buildNonJsApp(nameMatch?.[1] ?? path.basename(dir), dir, \"rust\", tomlPath);\n })\n );\n}\n\nasync function detectGoWorkspace(repoPath: string): Promise {\n const content = await safeReadFile(path.join(repoPath, \"go.work\"));\n if (!content) return [];\n\n const modules: string[] = [];\n\n // Block form: use ( ./cmd/server \\n ./pkg/lib )\n const blockMatch = content.match(/use\\s*\\(([\\s\\S]*?)\\)/u);\n if (blockMatch) {\n for (const line of blockMatch[1].split(/\\r?\\n/u)) {\n const trimmed = line.replace(/\\/\\/.*$/u, \"\").trim();\n if (trimmed) modules.push(trimmed);\n }\n }\n\n // Single-line form: use ./cmd/server\n for (const match of content.matchAll(/^use\\s+(\\S+)\\s*$/gmu)) {\n modules.push(match[1]);\n }\n\n const apps: RepoApp[] = [];\n for (const mod of modules) {\n const modPath = path.resolve(repoPath, mod);\n const goModPath = path.join(modPath, \"go.mod\");\n if (!(await fileExists(goModPath))) continue;\n\n const goMod = await safeReadFile(goModPath);\n const nameMatch = goMod?.match(/^module\\s+(\\S+)/mu);\n const shortName = nameMatch?.[1]?.split(\"/\").pop() ?? path.basename(modPath);\n apps.push(buildNonJsApp(shortName, modPath, \"go\", goModPath));\n }\n\n return apps;\n}\n\nasync function detectDotnetSolution(repoPath: string, files: string[]): Promise {\n const slnFile = files.find((f) => f.endsWith(\".sln\"));\n if (!slnFile) return [];\n\n const content = await safeReadFile(path.join(repoPath, slnFile));\n if (!content) return [];\n\n // Match: Project(\"{guid}\") = \"Name\", \"path\\to\\Project.csproj\", \"{guid}\"\n const projectRegex = /Project\\(\"[^\"]*\"\\)\\s*=\\s*\"([^\"]+)\",\\s*\"([^\"]+\\.(?:cs|fs|vb)proj)\"/giu;\n const apps: RepoApp[] = [];\n\n for (const match of content.matchAll(projectRegex)) {\n const name = match[1];\n const projRelPath = match[2].replace(/\\\\/gu, \"/\");\n const projPath = path.resolve(repoPath, projRelPath);\n const appDir = path.dirname(projPath);\n\n if (await fileExists(projPath)) {\n apps.push(buildNonJsApp(name, appDir, \"dotnet\", projPath));\n }\n }\n\n return apps;\n}\n\nasync function detectGradleMultiProject(repoPath: string, files: string[]): Promise {\n const settingsFile = files.includes(\"settings.gradle.kts\")\n ? \"settings.gradle.kts\"\n : files.includes(\"settings.gradle\")\n ? \"settings.gradle\"\n : null;\n if (!settingsFile) return [];\n\n const content = await safeReadFile(path.join(repoPath, settingsFile));\n if (!content) return [];\n\n // Extract all Gradle project references (':app', ':lib:core') from the file\n const projectNames: string[] = [];\n for (const match of content.matchAll(/['\"](:(?:[\\w.-]+:)*[\\w.-]+)['\"]/gu)) {\n projectNames.push(match[1].replace(/^:/u, \"\").replace(/:/gu, \"/\"));\n }\n\n const uniqueProjects = [...new Set(projectNames)];\n const apps: RepoApp[] = [];\n\n for (const project of uniqueProjects) {\n const projectDir = path.resolve(repoPath, project);\n const ktsPath = path.join(projectDir, \"build.gradle.kts\");\n const groovyPath = path.join(projectDir, \"build.gradle\");\n\n const buildFile = (await fileExists(ktsPath))\n ? ktsPath\n : (await fileExists(groovyPath))\n ? groovyPath\n : null;\n\n if (buildFile) {\n apps.push(buildNonJsApp(path.basename(project), projectDir, \"java\", buildFile));\n }\n }\n\n return apps;\n}\n\nasync function detectMavenMultiModule(repoPath: string): Promise {\n const content = await safeReadFile(path.join(repoPath, \"pom.xml\"));\n if (!content) return [];\n\n const apps: RepoApp[] = [];\n for (const match of content.matchAll(/([^<]+)<\\/module>/gu)) {\n const modName = match[1].trim();\n const modDir = path.resolve(repoPath, modName);\n const pomPath = path.join(modDir, \"pom.xml\");\n\n if (await fileExists(pomPath)) {\n apps.push(buildNonJsApp(path.basename(modName), modDir, \"java\", pomPath));\n }\n }\n\n return apps;\n}\n\nfunction unique(items: T[]): T[] {\n return Array.from(new Set(items));\n}\n\n// \u2500\u2500\u2500 Area detection \u2500\u2500\u2500\n\nconst AREA_HEURISTIC_DIRS = [\n \"frontend\",\n \"backend\",\n \"api\",\n \"web\",\n \"mobile\",\n \"app\",\n \"server\",\n \"client\",\n \"infra\",\n \"infrastructure\",\n \"shared\",\n \"common\",\n \"lib\",\n \"libs\",\n \"packages\",\n \"services\",\n \"docs\",\n \"scripts\",\n \"tools\",\n \"cli\",\n \"sdk\",\n \"core\",\n \"admin\",\n \"portal\",\n \"dashboard\",\n \"worker\",\n \"functions\"\n];\n\nconst MANIFEST_FILES = [\n \"package.json\",\n \"pyproject.toml\",\n \"requirements.txt\",\n \"go.mod\",\n \"Cargo.toml\",\n \"pom.xml\",\n \"build.gradle\",\n \"build.gradle.kts\",\n \"Gemfile\",\n \"composer.json\",\n \"setup.py\",\n \"setup.cfg\"\n];\n\nfunction areasFromApps(repoPath: string, apps: RepoApp[]): Area[] {\n return apps.map((app) => {\n const rel = path.relative(repoPath, app.path).replace(/\\\\/gu, \"/\");\n return {\n name: app.name,\n applyTo: `${rel}/**`,\n path: app.path,\n ecosystem: app.ecosystem,\n source: \"auto\" as const,\n scripts: Object.keys(app.scripts).length > 0 ? app.scripts : undefined,\n hasTsConfig: app.hasTsConfig || undefined\n };\n });\n}\n\nasync function areasFromHeuristics(repoPath: string): Promise {\n const entries = await safeReadDir(repoPath);\n const areas: Area[] = [];\n\n for (const entry of entries) {\n const lower = entry.toLowerCase();\n if (!AREA_HEURISTIC_DIRS.includes(lower)) continue;\n\n const fullPath = path.join(repoPath, entry);\n try {\n const stat = await fs.stat(fullPath);\n if (!stat.isDirectory()) continue;\n } catch {\n continue;\n }\n\n // Check if the directory has meaningful content (manifest or code files)\n const children = await safeReadDir(fullPath);\n const hasManifest = children.some((c) => MANIFEST_FILES.includes(c));\n const hasCode = children.some(\n (c) =>\n c.endsWith(\".ts\") ||\n c.endsWith(\".js\") ||\n c.endsWith(\".py\") ||\n c.endsWith(\".go\") ||\n c.endsWith(\".rs\") ||\n c.endsWith(\".java\") ||\n c.endsWith(\".cs\") ||\n c.endsWith(\".rb\") ||\n c.endsWith(\".php\")\n );\n const hasSrcDir = children.includes(\"src\");\n\n if (!hasManifest && !hasCode && !hasSrcDir) continue;\n\n // Read scripts from manifest if present\n let scripts: Record | undefined;\n let hasTsConfig: boolean | undefined;\n if (children.includes(\"package.json\")) {\n const pkg = await readJson(path.join(fullPath, \"package.json\"));\n const pkgScripts = (pkg?.scripts ?? {}) as Record;\n if (Object.keys(pkgScripts).length > 0) scripts = pkgScripts;\n }\n if (children.includes(\"tsconfig.json\")) {\n hasTsConfig = true;\n }\n\n areas.push({\n name: entry,\n applyTo: `${entry}/**`,\n path: fullPath,\n source: \"auto\",\n scripts,\n hasTsConfig\n });\n }\n\n return areas;\n}\n\nasync function detectAreas(repoPath: string, analysis: RepoAnalysis): Promise {\n let autoAreas: Area[];\n\n if (analysis.isMonorepo && analysis.apps && analysis.apps.length > 1) {\n const appAreas = areasFromApps(repoPath, analysis.apps);\n // Also run heuristics to catch non-app directories (docs, infra, etc.)\n const heuristicAreas = await areasFromHeuristics(repoPath);\n // Merge: app areas take precedence by name\n const byName = new Map(heuristicAreas.map((a) => [a.name.toLowerCase(), a]));\n for (const a of appAreas) {\n byName.set(a.name.toLowerCase(), a);\n }\n autoAreas = Array.from(byName.values());\n } else {\n autoAreas = await areasFromHeuristics(repoPath);\n }\n\n // Merge with config areas\n const config = await loadPrimerConfig(repoPath);\n if (!config?.areas?.length) return autoAreas;\n\n const resolvedRoot = path.resolve(repoPath);\n const configAreas: Area[] = [];\n for (const ca of config.areas) {\n // Derive path: extract leading directory from first applyTo pattern, ignoring glob-only patterns\n const patterns = Array.isArray(ca.applyTo) ? ca.applyTo : [ca.applyTo];\n const firstSegment = patterns[0].split(\"/\")[0];\n const basePath =\n firstSegment.includes(\"*\") || firstSegment.includes(\"?\")\n ? repoPath\n : path.join(repoPath, firstSegment);\n\n // Prevent path traversal \u2014 config areas must stay inside the repo\n const resolved = path.resolve(basePath);\n if (resolved !== resolvedRoot && !resolved.startsWith(resolvedRoot + path.sep)) continue;\n\n // Enrich config areas with scripts/hasTsConfig\n let scripts: Record | undefined;\n let hasTsConfig: boolean | undefined;\n try {\n const children = await safeReadDir(basePath);\n if (children.includes(\"package.json\")) {\n const pkg = await readJson(path.join(basePath, \"package.json\"));\n const pkgScripts = (pkg?.scripts ?? {}) as Record;\n if (Object.keys(pkgScripts).length > 0) scripts = pkgScripts;\n }\n if (children.includes(\"tsconfig.json\")) hasTsConfig = true;\n } catch {\n // Directory may not exist yet for config areas\n }\n\n configAreas.push({\n name: ca.name,\n description: ca.description,\n applyTo: ca.applyTo,\n path: basePath,\n source: \"config\" as const,\n scripts,\n hasTsConfig\n });\n }\n\n // Config areas override auto-detected by name (case-insensitive)\n const autoByName = new Map(autoAreas.map((a) => [a.name.toLowerCase(), a]));\n for (const ca of configAreas) {\n autoByName.set(ca.name.toLowerCase(), ca);\n }\n\n return Array.from(autoByName.values());\n}\n\n// \u2500\u2500\u2500 Primer config \u2500\u2500\u2500\n\nexport type PrimerConfigArea = {\n name: string;\n applyTo: string | string[];\n description?: string;\n};\n\nexport type PrimerConfig = {\n areas?: PrimerConfigArea[];\n policies?: string[];\n};\n\nexport async function loadPrimerConfig(repoPath: string): Promise {\n // Try repo root first, then .github/\n const candidates = [\n path.join(repoPath, \"primer.config.json\"),\n path.join(repoPath, \".github\", \"primer.config.json\")\n ];\n\n for (const candidate of candidates) {\n const json = await readJson(candidate);\n if (!json) continue;\n\n // Validate shape\n if (json.areas !== undefined && !Array.isArray(json.areas)) {\n return undefined;\n }\n const areas: PrimerConfigArea[] = [];\n if (Array.isArray(json.areas)) {\n for (const entry of json.areas) {\n if (\n typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as Record).name === \"string\" &&\n (entry as Record).applyTo !== undefined\n ) {\n const e = entry as Record;\n if (!(e.name as string).trim()) continue;\n const rawApplyTo = e.applyTo;\n // Validate applyTo is a string or array of strings\n let applyTo: string | string[];\n if (typeof rawApplyTo === \"string\") {\n applyTo = rawApplyTo;\n } else if (Array.isArray(rawApplyTo) && rawApplyTo.every((v) => typeof v === \"string\")) {\n applyTo = rawApplyTo as string[];\n } else {\n continue;\n }\n if (\n (typeof applyTo === \"string\" && !applyTo.trim()) ||\n (Array.isArray(applyTo) && applyTo.length === 0)\n )\n continue;\n // Reject patterns with path traversal segments\n const allPatterns = Array.isArray(applyTo) ? applyTo : [applyTo];\n if (allPatterns.some((p) => p.split(\"/\").includes(\"..\"))) continue;\n areas.push({\n name: e.name as string,\n applyTo,\n description: typeof e.description === \"string\" ? e.description : undefined\n });\n }\n }\n }\n\n // Parse policies array\n let policies: string[] | undefined;\n if (Array.isArray(json.policies)) {\n policies = json.policies.filter((p): p is string => typeof p === \"string\" && p.trim() !== \"\");\n }\n\n return { areas, policies: policies?.length ? policies : undefined };\n }\n\n return undefined;\n}\n\nexport function sanitizeAreaName(name: string): string {\n const sanitized = name\n .toLowerCase()\n .replace(/[^a-z0-9-]/gu, \"-\")\n .replace(/-+/gu, \"-\")\n .replace(/^-|-$/gu, \"\");\n return sanitized || \"unnamed\";\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nexport async function ensureDir(dirPath: string): Promise {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport type WriteResult = { wrote: boolean; reason?: \"symlink\" | \"exists\" };\n\nexport async function safeWriteFile(\n filePath: string,\n content: string,\n force: boolean\n): Promise {\n const resolved = path.resolve(filePath);\n\n // Reject symlinks to prevent writing through them to unintended locations\n try {\n const stat = await fs.lstat(resolved);\n if (stat.isSymbolicLink()) {\n return { wrote: false, reason: \"symlink\" };\n }\n if (!force) {\n return { wrote: false, reason: \"exists\" };\n }\n } catch {\n // File does not exist \u2014 safe to create\n }\n\n await fs.writeFile(resolved, content, \"utf8\");\n return { wrote: true };\n}\n\n/**\n * Validate that a constructed path stays within the expected root directory.\n * Prevents path traversal via malicious repo names or owner slugs.\n */\nexport function validateCachePath(cacheRoot: string, ...segments: string[]): string {\n const resolvedRoot = path.resolve(cacheRoot);\n const resolved = path.resolve(cacheRoot, ...segments);\n if (!resolved.startsWith(resolvedRoot + path.sep) && resolved !== resolvedRoot) {\n throw new Error(`Invalid path: escapes cache directory (${resolved})`);\n }\n return resolved;\n}\n\nexport async function fileExists(filePath: string): Promise {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function safeReadDir(dirPath: string): Promise {\n try {\n return await fs.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nexport async function readJson(filePath: string): Promise | undefined> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as Record;\n } catch {\n return undefined;\n }\n}\n\nexport function buildTimestampedName(baseName: string, extension = \".json\"): string {\n const stamp = new Date().toISOString().replace(/[:.]/gu, \"-\");\n return `${baseName}-${stamp}${extension}`;\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport type { SimpleGitProgressEvent } from \"simple-git\";\nimport simpleGit from \"simple-git\";\n\nexport async function isGitRepo(repoPath: string): Promise {\n try {\n await fs.access(path.join(repoPath, \".git\"));\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getRepoRoot(repoPath: string): Promise {\n const git = simpleGit(repoPath);\n const root = await git.revparse([\"--show-toplevel\"]);\n return root.trim();\n}\n\nexport type CloneOptions = {\n shallow?: boolean;\n timeoutMs?: number;\n onProgress?: (stage: string, progress: number) => void;\n};\n\nexport async function cloneRepo(\n repoUrl: string,\n destination: string,\n options: CloneOptions = {}\n): Promise {\n const { shallow = true, timeoutMs = 60000, onProgress } = options;\n\n const git = simpleGit({\n progress: onProgress\n ? ({ stage, progress }: SimpleGitProgressEvent) => {\n onProgress(stage, progress);\n }\n : undefined,\n timeout: {\n block: timeoutMs\n }\n });\n\n const cloneArgs: string[] = [];\n if (shallow) {\n cloneArgs.push(\"--depth\", \"1\");\n }\n\n await git.clone(repoUrl, destination, cloneArgs);\n}\n\n/**\n * Replace the remote origin URL, typically to strip embedded credentials\n * after cloning with an authenticated URL.\n */\nexport async function setRemoteUrl(repoPath: string, url: string): Promise {\n const git = simpleGit(repoPath);\n await git.remote([\"set-url\", \"origin\", url]);\n}\n\nexport async function checkoutBranch(repoPath: string, branch: string): Promise {\n const git = simpleGit(repoPath);\n const branches = await git.branchLocal();\n if (!branches.all.includes(branch)) {\n await git.checkoutLocalBranch(branch);\n return;\n }\n await git.checkout(branch);\n}\n\nexport async function commitAll(repoPath: string, message: string): Promise {\n const git = simpleGit(repoPath);\n await git.add([\"-A\"]);\n const status = await git.status();\n if (status.files.length === 0) return;\n await git.commit(message);\n}\n\nexport type AuthProvider = \"github\" | \"azure\";\n\n/** Normalize a git URL by removing trailing slashes and any existing auth */\nfunction normalizeGitUrl(url: string): string {\n let normalized = url.trim();\n // Remove trailing slashes\n while (normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n // Remove any existing x-access-token auth\n normalized = normalized.replace(/https:\\/\\/x-access-token:[^@]+@/, \"https://\");\n // Remove any existing PAT auth\n normalized = normalized.replace(/https:\\/\\/pat:[^@]+@/, \"https://\");\n return normalized;\n}\n\nexport function buildAuthedUrl(url: string, token: string, provider: AuthProvider): string {\n const normalizedUrl = normalizeGitUrl(url);\n if (!normalizedUrl.startsWith(\"https://\")) return normalizedUrl;\n if (provider === \"azure\") {\n return normalizedUrl.replace(\"https://\", `https://pat:${token}@`);\n }\n return normalizedUrl.replace(\"https://\", `https://x-access-token:${token}@`);\n}\n\nexport async function pushBranch(\n repoPath: string,\n branch: string,\n token?: string,\n provider: AuthProvider = \"github\"\n): Promise {\n const git = simpleGit(repoPath);\n\n if (token) {\n // Set up credentials for this push\n const remoteUrl = (await git.remote([\"get-url\", \"origin\"])) ?? \"\";\n const normalizedUrl = normalizeGitUrl(remoteUrl);\n if (normalizedUrl.startsWith(\"https://\")) {\n const authedUrl = buildAuthedUrl(normalizedUrl, token, provider);\n await git.remote([\"set-url\", \"origin\", authedUrl]);\n try {\n await git.push([\"-u\", \"origin\", branch]);\n } catch (err) {\n // Strip embedded credentials from error messages to avoid leaking tokens\n const sanitized =\n err instanceof Error\n ? new Error(err.message.replace(/https:\\/\\/[^@]+@/g, \"https://***@\"))\n : err;\n throw sanitized;\n } finally {\n // Restore original URL to avoid leaking token\n await git.remote([\"set-url\", \"origin\", normalizedUrl]);\n }\n return;\n }\n }\n\n await git.push([\"-u\", \"origin\", branch]);\n}\n", "const cache = new WeakMap();\n\nexport function pathspec(...paths: string[]) {\n const key = new String(paths);\n cache.set(key, paths);\n\n return key as string;\n}\n\nexport function isPathSpec(path: string | unknown): path is string {\n return path instanceof String && cache.has(path);\n}\n\nexport function toPaths(pathSpec: string): string[] {\n return cache.get(pathSpec) || [];\n}\n", "import type { SimpleGitTask } from '../types';\n\n/**\n * The `GitError` is thrown when the underlying `git` process throws a\n * fatal exception (eg an `ENOENT` exception when attempting to use a\n * non-writable directory as the root for your repo), and acts as the\n * base class for more specific errors thrown by the parsing of the\n * git response or errors in the configuration of the task about to\n * be run.\n *\n * When an exception is thrown, pending tasks in the same instance will\n * not be executed. The recommended way to run a series of tasks that\n * can independently fail without needing to prevent future tasks from\n * running is to catch them individually:\n *\n * ```typescript\n import { gitP, SimpleGit, GitError, PullResult } from 'simple-git';\n\n function catchTask (e: GitError) {\n return e.\n }\n\n const git = gitP(repoWorkingDir);\n const pulled: PullResult | GitError = await git.pull().catch(catchTask);\n const pushed: string | GitError = await git.pushTags().catch(catchTask);\n ```\n */\nexport class GitError extends Error {\n constructor(\n public task?: SimpleGitTask,\n message?: string\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n", "import { GitError } from './git-error';\n\n/**\n * The `GitResponseError` is the wrapper for a parsed response that is treated as\n * a fatal error, for example attempting a `merge` can leave the repo in a corrupted\n * state when there are conflicts so the task will reject rather than resolve.\n *\n * For example, catching the merge conflict exception:\n *\n * ```typescript\n import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git';\n\n const git = gitP(repoRoot);\n const mergeOptions: string[] = ['--no-ff', 'other-branch'];\n const mergeSummary: MergeSummary = await git.merge(mergeOptions)\n .catch((e: GitResponseError) => e.git);\n\n if (mergeSummary.failed) {\n // deal with the error\n }\n ```\n */\nexport class GitResponseError extends GitError {\n constructor(\n /**\n * `.git` access the parsed response that is treated as being an error\n */\n public readonly git: T,\n message?: string\n ) {\n super(undefined, message || String(git));\n }\n}\n", "import { GitError } from './git-error';\n\n/**\n * The `TaskConfigurationError` is thrown when a command was incorrectly\n * configured. An error of this kind means that no attempt was made to\n * run your command through the underlying `git` binary.\n *\n * Check the `.message` property for more detail on why your configuration\n * resulted in an error.\n */\nexport class TaskConfigurationError extends GitError {\n constructor(message?: string) {\n super(undefined, message);\n }\n}\n", "import { Buffer } from 'node:buffer';\nimport { exists, FOLDER } from '@kwsites/file-exists';\nimport type { Maybe } from '../types';\nimport { filterHasLength } from './argument-filters';\n\ntype Callable = (...args: unknown[]) => unknown;\n\nexport const NULL = '\\0';\n\nexport const NOOP: Callable = () => {};\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function asFunction(source: T | unknown): Callable {\n if (typeof source !== 'function') {\n return NOOP;\n }\n return source as Callable;\n}\n\n/**\n * Determines whether the supplied argument is both a function, and is not\n * the `NOOP` function.\n */\nexport function isUserFunction(source: T | unknown): source is T {\n return typeof source === 'function' && source !== NOOP;\n}\n\nexport function splitOn(input: string, char: string): [string, string] {\n const index = input.indexOf(char);\n if (index <= 0) {\n return [input, ''];\n }\n\n return [input.substr(0, index), input.substr(index + 1)];\n}\n\nexport function first(input: T, offset?: number): Maybe;\nexport function first(input: T, offset?: number): Maybe;\nexport function first(input: unknown[] | IArguments, offset = 0): Maybe {\n return isArrayLike(input) && input.length > offset ? input[offset] : undefined;\n}\n\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: unknown, offset = 0) {\n if (isArrayLike(input) && input.length > offset) {\n return input[input.length - 1 - offset];\n }\n}\n\ntype ArrayLike = T[] | IArguments | { [index: number]: T; length: number };\n\nfunction isArrayLike(input: unknown): input is ArrayLike {\n return filterHasLength(input);\n}\n\nexport function toLinesWithContent(input = '', trimmed = true, separator = '\\n'): string[] {\n return input.split(separator).reduce((output, line) => {\n const lineContent = trimmed ? line.trim() : line;\n if (lineContent) {\n output.push(lineContent);\n }\n return output;\n }, [] as string[]);\n}\n\ntype LineWithContentCallback = (line: string) => T;\n\nexport function forEachLineWithContent(\n input: string,\n callback: LineWithContentCallback\n): T[] {\n return toLinesWithContent(input, true).map((line) => callback(line));\n}\n\nexport function folderExists(path: string): boolean {\n return exists(path, FOLDER);\n}\n\n/**\n * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`.\n */\nexport function append(target: T[] | Set, item: T): typeof item {\n if (Array.isArray(target)) {\n if (!target.includes(item)) {\n target.push(item);\n }\n } else {\n target.add(item);\n }\n return item;\n}\n\n/**\n * Adds `item` into the `target` `Array` when it is not already present and returns the `target`.\n */\nexport function including(target: T[], item: T): typeof target {\n if (Array.isArray(target) && !target.includes(item)) {\n target.push(item);\n }\n\n return target;\n}\n\nexport function remove(target: Set | T[], item: T): T {\n if (Array.isArray(target)) {\n const index = target.indexOf(item);\n if (index >= 0) {\n target.splice(index, 1);\n }\n } else {\n target.delete(item);\n }\n return item;\n}\n\nexport const objectToString = Object.prototype.toString.call.bind(Object.prototype.toString) as (\n input: unknown\n) => string;\n\nexport function asArray(source: T | T[]): T[] {\n return Array.isArray(source) ? source : [source];\n}\n\nexport function asCamelCase(str: string) {\n return str.replace(/[\\s-]+(.)/g, (_all, chr) => {\n return chr.toUpperCase();\n });\n}\n\nexport function asStringArray(source: T | T[]): string[] {\n return asArray(source).map((item) => {\n return item instanceof String ? (item as string) : String(item);\n });\n}\n\nexport function asNumber(source: string | null | undefined, onNaN = 0) {\n if (source == null) {\n return onNaN;\n }\n\n const num = parseInt(source, 10);\n return Number.isNaN(num) ? onNaN : num;\n}\n\nexport function prefixedArray(input: T[], prefix: T): T[] {\n const output: T[] = [];\n for (let i = 0, max = input.length; i < max; i++) {\n output.push(prefix, input[i]);\n }\n return output;\n}\n\nexport function bufferToString(input: Buffer | Buffer[]): string {\n return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8');\n}\n\n/**\n * Get a new object from a source object with only the listed properties.\n */\nexport function pick(source: T, properties: readonly K[]) {\n const out: Partial> = {};\n\n properties.forEach((key) => {\n if (source[key] !== undefined) {\n out[key] = source[key];\n }\n });\n\n return out;\n}\n\nexport function delay(duration = 0): Promise {\n return new Promise((done) => setTimeout(done, duration));\n}\n\nexport function orVoid(input: T | false) {\n if (input === false) {\n return undefined;\n }\n return input;\n}\n", "import { isPathSpec } from '../args/pathspec';\nimport type { Maybe, Options, Primitives } from '../types';\nimport { objectToString } from './util';\n\nexport type ArgumentFilterPredicate = (input: T | unknown) => input is T;\n\nexport function filterType(\n input: K,\n filter: ArgumentFilterPredicate\n): K extends T ? T : undefined;\nexport function filterType(input: K, filter: ArgumentFilterPredicate, def: T): T;\nexport function filterType(input: K, filter: ArgumentFilterPredicate, def?: T): Maybe {\n if (filter(input)) {\n return input;\n }\n return arguments.length > 2 ? def : undefined;\n}\n\nexport const filterArray: ArgumentFilterPredicate> = (\n input\n): input is Array => {\n return Array.isArray(input);\n};\n\nexport function filterPrimitives(\n input: unknown,\n omit?: Array<'boolean' | 'string' | 'number'>\n): input is Primitives {\n const type = isPathSpec(input) ? 'string' : typeof input;\n\n return (\n /number|string|boolean/.test(type) &&\n (!omit || !omit.includes(type as 'boolean' | 'string' | 'number'))\n );\n}\n\nexport const filterNumber: ArgumentFilterPredicate = (input: unknown): input is number => {\n return typeof input === 'number';\n};\n\nexport const filterString: ArgumentFilterPredicate = (input: unknown): input is string => {\n return typeof input === 'string';\n};\n\nexport const filterStringOrStringArray: ArgumentFilterPredicate = (\n input\n): input is string | string[] => {\n return filterString(input) || (Array.isArray(input) && input.every(filterString));\n};\n\nexport function filterPlainObject(input: T | unknown): input is T;\nexport function filterPlainObject>(\n input: T | unknown\n): input is T {\n return !!input && objectToString(input) === '[object Object]';\n}\n\nexport function filterFunction(input: unknown): input is (...args: unknown[]) => unknown {\n return typeof input === 'function';\n}\n\nexport const filterHasLength: ArgumentFilterPredicate<{ length: number }> = (\n input\n): input is { length: number } => {\n if (input == null || 'number|boolean|function'.includes(typeof input)) {\n return false;\n }\n\n return typeof (input as { length?: number }).length === 'number';\n};\n", "/**\n * Known process exit codes used by the task parsers to determine whether an error\n * was one they can automatically handle\n */\nexport enum ExitCodes {\n SUCCESS,\n ERROR,\n NOT_FOUND = -2,\n UNCLEAN = 128,\n}\n", "import { TaskResponseFormat } from '../types';\n\nexport class GitOutputStreams {\n constructor(\n public readonly stdOut: T,\n public readonly stdErr: T\n ) {}\n\n asStrings(): GitOutputStreams {\n return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8'));\n }\n}\n", "function useMatchesDefault() {\n throw new Error(`LineParser:useMatches not implemented`);\n}\n\nexport class LineParser {\n protected matches: string[] = [];\n protected useMatches: (target: T, match: string[]) => boolean | void = useMatchesDefault;\n\n private _regExp: RegExp[];\n\n constructor(\n regExp: RegExp | RegExp[],\n useMatches?: (target: T, match: string[]) => boolean | void\n ) {\n this._regExp = Array.isArray(regExp) ? regExp : [regExp];\n if (useMatches) {\n this.useMatches = useMatches;\n }\n }\n\n parse = (line: (offset: number) => string | undefined, target: T): boolean => {\n this.resetMatches();\n\n if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) {\n return false;\n }\n\n return this.useMatches(target, this.prepareMatches()) !== false;\n };\n\n protected resetMatches() {\n this.matches.length = 0;\n }\n\n protected prepareMatches() {\n return this.matches;\n }\n\n protected addMatch(reg: RegExp, index: number, line?: string) {\n const matched = line && reg.exec(line);\n if (matched) {\n this.pushMatch(index, matched);\n }\n\n return !!matched;\n }\n\n protected pushMatch(_index: number, matched: string[]) {\n this.matches.push(...matched.slice(1));\n }\n}\n\nexport class RemoteLineParser extends LineParser {\n protected addMatch(reg: RegExp, index: number, line?: string): boolean {\n return /^remote:\\s/.test(String(line)) && super.addMatch(reg, index, line);\n }\n\n protected pushMatch(index: number, matched: string[]) {\n if (index > 0 || matched.length > 1) {\n super.pushMatch(index, matched);\n }\n }\n}\n", "import { SimpleGitOptions } from '../types';\n\nconst defaultOptions: Omit = {\n binary: 'git',\n maxConcurrentProcesses: 5,\n config: [],\n trimmed: false,\n};\n\nexport function createInstanceConfig(\n ...options: Array | undefined>\n): SimpleGitOptions {\n const baseDir = process.cwd();\n const config: SimpleGitOptions = Object.assign(\n { baseDir, ...defaultOptions },\n ...options.filter((o) => typeof o === 'object' && o)\n );\n\n config.baseDir = config.baseDir || baseDir;\n config.trimmed = config.trimmed === true;\n\n return config;\n}\n", "import {\n filterArray,\n filterFunction,\n filterPlainObject,\n filterPrimitives,\n filterType,\n} from './argument-filters';\nimport { asFunction, asStringArray, isUserFunction, last } from './util';\nimport { Maybe, Options } from '../types';\nimport { isPathSpec } from '../args/pathspec';\n\nexport function appendTaskOptions(\n options: Maybe,\n commands: string[] = []\n): string[] {\n if (!filterPlainObject(options)) {\n return commands;\n }\n\n return Object.keys(options).reduce((commands: string[], key: string) => {\n const value = options[key];\n\n if (isPathSpec(value)) {\n commands.push(value);\n } else if (filterPrimitives(value, ['boolean'])) {\n commands.push(key + '=' + value);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n if (!filterPrimitives(v, ['string', 'number'])) {\n commands.push(key + '=' + v);\n }\n }\n } else {\n commands.push(key);\n }\n\n return commands;\n }, commands);\n}\n\nexport function getTrailingOptions(\n args: IArguments,\n initialPrimitive = 0,\n objectOnly = false\n): string[] {\n const command: string[] = [];\n\n for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) {\n if ('string|number'.includes(typeof args[i])) {\n command.push(String(args[i]));\n }\n }\n\n appendTaskOptions(trailingOptionsArgument(args), command);\n if (!objectOnly) {\n command.push(...trailingArrayArgument(args));\n }\n\n return command;\n}\n\nfunction trailingArrayArgument(args: IArguments) {\n const hasTrailingCallback = typeof last(args) === 'function';\n return asStringArray(filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, []));\n}\n\n/**\n * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument\n * if there is one. When not found, the return value is null.\n */\nexport function trailingOptionsArgument(args: IArguments): Maybe {\n const hasTrailingCallback = filterFunction(last(args));\n return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject);\n}\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function trailingFunctionArgument(\n args: unknown[] | IArguments | unknown,\n includeNoop = true\n): Maybe<(...args: unknown[]) => unknown> {\n const callback = asFunction(last(args));\n return includeNoop || isUserFunction(callback) ? callback : undefined;\n}\n", "import type { MaybeArray, TaskParser, TaskResponseFormat } from '../types';\nimport { GitOutputStreams } from './git-output-streams';\nimport { LineParser } from './line-parser';\nimport { asArray, toLinesWithContent } from './util';\n\nexport function callTaskParser(\n parser: TaskParser,\n streams: GitOutputStreams\n) {\n return parser(streams.stdOut, streams.stdErr);\n}\n\nexport function parseStringResponse(\n result: T,\n parsers: LineParser[],\n texts: MaybeArray,\n trim = true\n): T {\n asArray(texts).forEach((text) => {\n for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) {\n const line = (offset = 0) => {\n if (i + offset >= max) {\n return;\n }\n return lines[i + offset];\n };\n\n parsers.some(({ parse }) => parse(line, result));\n }\n });\n\n return result;\n}\n", "export * from './argument-filters';\nexport * from './exit-codes';\nexport * from './git-output-streams';\nexport * from './line-parser';\nexport * from './simple-git-options';\nexport * from './task-options';\nexport * from './task-parser';\nexport * from './util';\n", "import { ExitCodes } from '../utils';\nimport { Maybe, StringTask } from '../types';\n\nexport enum CheckRepoActions {\n BARE = 'bare',\n IN_TREE = 'tree',\n IS_REPO_ROOT = 'root',\n}\n\nconst onError: StringTask['onError'] = ({ exitCode }, error, done, fail) => {\n if (exitCode === ExitCodes.UNCLEAN && isNotRepoMessage(error)) {\n return done(Buffer.from('false'));\n }\n\n fail(error);\n};\n\nconst parser: StringTask['parser'] = (text) => {\n return text.trim() === 'true';\n};\n\nexport function checkIsRepoTask(action: Maybe): StringTask {\n switch (action) {\n case CheckRepoActions.BARE:\n return checkIsBareRepoTask();\n case CheckRepoActions.IS_REPO_ROOT:\n return checkIsRepoRootTask();\n }\n\n const commands = ['rev-parse', '--is-inside-work-tree'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nexport function checkIsRepoRootTask(): StringTask {\n const commands = ['rev-parse', '--git-dir'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser(path) {\n return /^\\.(git)?$/.test(path.trim());\n },\n };\n}\n\nexport function checkIsBareRepoTask(): StringTask {\n const commands = ['rev-parse', '--is-bare-repository'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nfunction isNotRepoMessage(error: Error): boolean {\n return /(Not a git repository|Kein Git-Repository)/i.test(String(error));\n}\n", "import { CleanSummary } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\n\nexport class CleanResponse implements CleanSummary {\n public paths: string[] = [];\n public files: string[] = [];\n public folders: string[] = [];\n\n constructor(public readonly dryRun: boolean) {}\n}\n\nconst removalRegexp = /^[a-z]+\\s*/i;\nconst dryRunRemovalRegexp = /^[a-z]+\\s+[a-z]+\\s*/i;\nconst isFolderRegexp = /\\/$/;\n\nexport function cleanSummaryParser(dryRun: boolean, text: string): CleanSummary {\n const summary = new CleanResponse(dryRun);\n const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp;\n\n toLinesWithContent(text).forEach((line) => {\n const removed = line.replace(regexp, '');\n\n summary.paths.push(removed);\n (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed);\n });\n\n return summary;\n}\n", "import { TaskConfigurationError } from '../errors/task-configuration-error';\nimport type { BufferTask, EmptyTaskParser, SimpleGitTask, StringTask } from '../types';\n\nexport const EMPTY_COMMANDS: [] = [];\n\nexport type EmptyTask = {\n commands: typeof EMPTY_COMMANDS;\n format: 'empty';\n parser: EmptyTaskParser;\n onError?: undefined;\n};\n\nexport function adhocExecTask(parser: EmptyTaskParser): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser,\n };\n}\n\nexport function configurationErrorTask(error: Error | string): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser() {\n throw typeof error === 'string' ? new TaskConfigurationError(error) : error;\n },\n };\n}\n\nexport function straightThroughStringTask(commands: string[], trimmed = false): StringTask {\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return trimmed ? String(text).trim() : text;\n },\n };\n}\n\nexport function straightThroughBufferTask(commands: string[]): BufferTask {\n return {\n commands,\n format: 'buffer',\n parser(buffer) {\n return buffer;\n },\n };\n}\n\nexport function isBufferTask(task: SimpleGitTask): task is BufferTask {\n return task.format === 'buffer';\n}\n\nexport function isEmptyTask(task: SimpleGitTask): task is EmptyTask {\n return task.format === 'empty' || !task.commands.length;\n}\n", "import { CleanSummary } from '../../../typings';\nimport { cleanSummaryParser } from '../responses/CleanSummary';\nimport { Maybe, StringTask } from '../types';\nimport { asStringArray } from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport const CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported';\nexport const CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter (\"n\" or \"f\") is required';\nexport const CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: ';\n\n/**\n * All supported option switches available for use in a `git.clean` operation\n */\nexport enum CleanOptions {\n DRY_RUN = 'n',\n FORCE = 'f',\n IGNORED_INCLUDED = 'x',\n IGNORED_ONLY = 'X',\n EXCLUDING = 'e',\n QUIET = 'q',\n RECURSIVE = 'd',\n}\n\n/**\n * The two modes `git.clean` can run in - one of these must be supplied in order\n * for the command to not throw a `TaskConfigurationError`\n */\nexport type CleanMode = CleanOptions.FORCE | CleanOptions.DRY_RUN;\n\nconst CleanOptionValues: Set = new Set([\n 'i',\n ...asStringArray(Object.values(CleanOptions as any)),\n]);\n\nexport function cleanWithOptionsTask(mode: CleanMode | string, customArgs: string[]) {\n const { cleanMode, options, valid } = getCleanOptions(mode);\n\n if (!cleanMode) {\n return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED);\n }\n\n if (!valid.options) {\n return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode));\n }\n\n options.push(...customArgs);\n\n if (options.some(isInteractiveMode)) {\n return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE);\n }\n\n return cleanTask(cleanMode, options);\n}\n\nexport function cleanTask(mode: CleanMode, customArgs: string[]): StringTask {\n const commands: string[] = ['clean', `-${mode}`, ...customArgs];\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): CleanSummary {\n return cleanSummaryParser(mode === CleanOptions.DRY_RUN, text);\n },\n };\n}\n\nexport function isCleanOptionsArray(input: string[]): input is CleanOptions[] {\n return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test));\n}\n\nfunction getCleanOptions(input: string) {\n let cleanMode: Maybe;\n let options: string[] = [];\n let valid = { cleanMode: false, options: true };\n\n input\n .replace(/[^a-z]i/g, '')\n .split('')\n .forEach((char) => {\n if (isCleanMode(char)) {\n cleanMode = char;\n valid.cleanMode = true;\n } else {\n valid.options = valid.options && isKnownOption((options[options.length] = `-${char}`));\n }\n });\n\n return {\n cleanMode,\n options,\n valid,\n };\n}\n\nfunction isCleanMode(cleanMode?: string): cleanMode is CleanMode {\n return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN;\n}\n\nfunction isKnownOption(option: string): boolean {\n return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1));\n}\n\nfunction isInteractiveMode(option: string): boolean {\n if (/^-[^\\-]/.test(option)) {\n return option.indexOf('i') > 0;\n }\n\n return option === '--interactive';\n}\n", "import { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings';\nimport { last, splitOn } from '../utils';\n\nexport class ConfigList implements ConfigListSummary {\n public files: string[] = [];\n public values: { [fileName: string]: ConfigValues } = Object.create(null);\n\n private _all: ConfigValues | undefined;\n\n public get all(): ConfigValues {\n if (!this._all) {\n this._all = this.files.reduce((all: ConfigValues, file: string) => {\n return Object.assign(all, this.values[file]);\n }, {});\n }\n\n return this._all;\n }\n\n public addFile(file: string): ConfigValues {\n if (!(file in this.values)) {\n const latest = last(this.files);\n this.values[file] = latest ? Object.create(this.values[latest]) : {};\n\n this.files.push(file);\n }\n\n return this.values[file];\n }\n\n public addValue(file: string, key: string, value: string) {\n const values = this.addFile(file);\n\n if (!Object.hasOwn(values, key)) {\n values[key] = value;\n } else if (Array.isArray(values[key])) {\n (values[key] as string[]).push(value);\n } else {\n values[key] = [values[key] as string, value];\n }\n\n this._all = undefined;\n }\n}\n\nexport function configListParser(text: string): ConfigList {\n const config = new ConfigList();\n\n for (const item of configParser(text)) {\n config.addValue(item.file, String(item.key), item.value);\n }\n\n return config;\n}\n\nexport function configGetParser(text: string, key: string): ConfigGetResult {\n let value: string | null = null;\n const values: string[] = [];\n const scopes: Map = new Map();\n\n for (const item of configParser(text, key)) {\n if (item.key !== key) {\n continue;\n }\n\n values.push((value = item.value));\n\n if (!scopes.has(item.file)) {\n scopes.set(item.file, []);\n }\n\n scopes.get(item.file)!.push(value);\n }\n\n return {\n key,\n paths: Array.from(scopes.keys()),\n scopes,\n value,\n values,\n };\n}\n\nfunction configFilePath(filePath: string): string {\n return filePath.replace(/^(file):/, '');\n}\n\nfunction* configParser(text: string, requestedKey: string | null = null) {\n const lines = text.split('\\0');\n\n for (let i = 0, max = lines.length - 1; i < max; ) {\n const file = configFilePath(lines[i++]);\n\n let value = lines[i++];\n let key = requestedKey;\n\n if (value.includes('\\n')) {\n const line = splitOn(value, '\\n');\n key = line[0];\n value = line[1];\n }\n\n yield { file, key, value };\n }\n}\n", "import type { ConfigGetResult, ConfigListSummary, SimpleGit } from '../../../typings';\nimport { configGetParser, configListParser } from '../responses/ConfigList';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { trailingFunctionArgument } from '../utils';\n\nexport enum GitConfigScope {\n system = 'system',\n global = 'global',\n local = 'local',\n worktree = 'worktree',\n}\n\nfunction asConfigScope(\n scope: GitConfigScope | unknown,\n fallback: T\n): GitConfigScope | T {\n if (typeof scope === 'string' && Object.hasOwn(GitConfigScope, scope)) {\n return scope as GitConfigScope;\n }\n return fallback;\n}\n\nfunction addConfigTask(\n key: string,\n value: string,\n append: boolean,\n scope: GitConfigScope\n): StringTask {\n const commands: string[] = ['config', `--${scope}`];\n\n if (append) {\n commands.push('--add');\n }\n\n commands.push(key, value);\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): string {\n return text;\n },\n };\n}\n\nfunction getConfigTask(key: string, scope?: GitConfigScope): StringTask {\n const commands: string[] = ['config', '--null', '--show-origin', '--get-all', key];\n\n if (scope) {\n commands.splice(1, 0, `--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return configGetParser(text, key);\n },\n };\n}\n\nfunction listConfigTask(scope?: GitConfigScope): StringTask {\n const commands = ['config', '--list', '--show-origin', '--null'];\n\n if (scope) {\n commands.push(`--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string) {\n return configListParser(text);\n },\n };\n}\n\nexport default function (): Pick {\n return {\n addConfig(this: SimpleGitApi, key: string, value: string, ...rest: unknown[]) {\n return this._runTask(\n addConfigTask(\n key,\n value,\n rest[0] === true,\n asConfigScope(rest[1], GitConfigScope.local)\n ),\n trailingFunctionArgument(arguments)\n );\n },\n\n getConfig(this: SimpleGitApi, key: string, scope?: GitConfigScope) {\n return this._runTask(\n getConfigTask(key, asConfigScope(scope, undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n\n listConfig(this: SimpleGitApi, ...rest: unknown[]) {\n return this._runTask(\n listConfigTask(asConfigScope(rest[0], undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "export enum DiffNameStatus {\n ADDED = 'A',\n COPIED = 'C',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n CHANGED = 'T',\n UNMERGED = 'U',\n UNKNOWN = 'X',\n BROKEN = 'B',\n}\n\nconst diffNameStatus = new Set(Object.values(DiffNameStatus));\n\nexport function isDiffNameStatus(input: string): input is DiffNameStatus {\n return diffNameStatus.has(input as DiffNameStatus);\n}\n", "import { GrepResult, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport {\n asNumber,\n forEachLineWithContent,\n getTrailingOptions,\n NULL,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\n\nimport { configurationErrorTask } from './task';\n\nconst disallowedOptions = ['-h'];\n\nconst Query = Symbol('grepQuery');\n\nexport interface GitGrepQuery extends Iterable {\n /** Adds one or more terms to be grouped as an \"and\" to any other terms */\n and(...and: string[]): this;\n\n /** Adds one or more search terms - git.grep will \"or\" this to other terms */\n param(...param: string[]): this;\n}\n\nclass GrepQuery implements GitGrepQuery {\n private [Query]: string[] = [];\n\n *[Symbol.iterator]() {\n for (const query of this[Query]) {\n yield query;\n }\n }\n\n and(...and: string[]) {\n and.length && this[Query].push('--and', '(', ...prefixedArray(and, '-e'), ')');\n return this;\n }\n\n param(...param: string[]) {\n this[Query].push(...prefixedArray(param, '-e'));\n return this;\n }\n}\n\n/**\n * Creates a new builder for a `git.grep` query with optional params\n */\nexport function grepQueryBuilder(...params: string[]): GitGrepQuery {\n return new GrepQuery().param(...params);\n}\n\nfunction parseGrep(grep: string): GrepResult {\n const paths: GrepResult['paths'] = new Set();\n const results: GrepResult['results'] = {};\n\n forEachLineWithContent(grep, (input) => {\n const [path, line, preview] = input.split(NULL);\n paths.add(path);\n (results[path] = results[path] || []).push({\n line: asNumber(line),\n path,\n preview,\n });\n });\n\n return {\n paths,\n results,\n };\n}\n\nexport default function (): Pick {\n return {\n grep(this: SimpleGitApi, searchTerm: string | GitGrepQuery) {\n const then = trailingFunctionArgument(arguments);\n const options = getTrailingOptions(arguments);\n\n for (const option of disallowedOptions) {\n if (options.includes(option)) {\n return this._runTask(\n configurationErrorTask(`git.grep: use of \"${option}\" is not supported.`),\n then\n );\n }\n }\n\n if (typeof searchTerm === 'string') {\n searchTerm = grepQueryBuilder().param(searchTerm);\n }\n\n const commands = ['grep', '--null', '-n', '--full-name', ...options, ...searchTerm];\n\n return this._runTask(\n {\n commands,\n format: 'utf-8',\n parser(stdOut) {\n return parseGrep(stdOut);\n },\n },\n then\n );\n },\n };\n}\n", "import type { Maybe, OptionFlags, Options } from '../types';\nimport { asStringArray } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport enum ResetMode {\n MIXED = 'mixed',\n SOFT = 'soft',\n HARD = 'hard',\n MERGE = 'merge',\n KEEP = 'keep',\n}\n\nconst validResetModes = asStringArray(Object.values(ResetMode));\n\nexport type ResetOptions = Options &\n OptionFlags<'-q' | '--quiet' | '--no-quiet' | '--pathspec-from-nul'> &\n OptionFlags<'--pathspec-from-file', string>;\n\nexport function resetTask(mode: Maybe, customArgs: string[]) {\n const commands: string[] = ['reset'];\n if (isValidResetMode(mode)) {\n commands.push(`--${mode}`);\n }\n commands.push(...customArgs);\n\n return straightThroughStringTask(commands);\n}\n\nexport function getResetMode(mode: ResetMode | unknown): Maybe {\n if (isValidResetMode(mode)) {\n return mode;\n }\n\n switch (typeof mode) {\n case 'string':\n case 'undefined':\n return ResetMode.SOFT;\n }\n\n return;\n}\n\nfunction isValidResetMode(mode: ResetMode | unknown): mode is ResetMode {\n return typeof mode === 'string' && validResetModes.includes(mode);\n}\n", "import debug, { Debugger } from 'debug';\nimport {\n append,\n filterHasLength,\n filterString,\n filterType,\n NOOP,\n objectToString,\n remove,\n} from './utils';\nimport { Maybe } from './types';\n\ndebug.formatters.L = (value: any) => String(filterHasLength(value) ? value.length : '-');\ndebug.formatters.B = (value: Buffer) => {\n if (Buffer.isBuffer(value)) {\n return value.toString('utf8');\n }\n return objectToString(value);\n};\n\ntype OutputLoggingHandler = (message: string, ...args: any[]) => void;\n\nfunction createLog() {\n return debug('simple-git');\n}\n\nexport interface OutputLogger extends OutputLoggingHandler {\n readonly label: string;\n\n info: OutputLoggingHandler;\n step(nextStep?: string): OutputLogger;\n sibling(name: string): OutputLogger;\n}\n\nfunction prefixedLogger(\n to: Debugger,\n prefix: string,\n forward?: OutputLoggingHandler\n): OutputLoggingHandler {\n if (!prefix || !String(prefix).replace(/\\s*/, '')) {\n return !forward\n ? to\n : (message, ...args) => {\n to(message, ...args);\n forward(message, ...args);\n };\n }\n\n return (message, ...args) => {\n to(`%s ${message}`, prefix, ...args);\n if (forward) {\n forward(message, ...args);\n }\n };\n}\n\nfunction childLoggerName(\n name: Maybe,\n childDebugger: Maybe,\n { namespace: parentNamespace }: Debugger\n): string {\n if (typeof name === 'string') {\n return name;\n }\n const childNamespace = (childDebugger && childDebugger.namespace) || '';\n\n if (childNamespace.startsWith(parentNamespace)) {\n return childNamespace.substr(parentNamespace.length + 1);\n }\n\n return childNamespace || parentNamespace;\n}\n\nexport function createLogger(\n label: string,\n verbose?: string | Debugger,\n initialStep?: string,\n infoDebugger = createLog()\n): OutputLogger {\n const labelPrefix = (label && `[${label}]`) || '';\n\n const spawned: OutputLogger[] = [];\n const debugDebugger: Maybe =\n typeof verbose === 'string' ? infoDebugger.extend(verbose) : verbose;\n const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger);\n\n return step(initialStep);\n\n function sibling(name: string, initial?: string) {\n return append(\n spawned,\n createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)\n );\n }\n\n function step(phase?: string) {\n const stepPrefix = (phase && `[${phase}]`) || '';\n const debug = (debugDebugger && prefixedLogger(debugDebugger, stepPrefix)) || NOOP;\n const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug);\n\n return Object.assign(debugDebugger ? debug : info, {\n label,\n sibling,\n info,\n step,\n });\n }\n}\n\n/**\n * The `GitLogger` is used by the main `SimpleGit` runner to handle logging\n * any warnings or errors.\n */\nexport class GitLogger {\n public error: OutputLoggingHandler;\n\n public warn: OutputLoggingHandler;\n\n constructor(private _out: Debugger = createLog()) {\n this.error = prefixedLogger(_out, '[ERROR]');\n this.warn = prefixedLogger(_out, '[WARN]');\n }\n\n silent(silence = false) {\n if (silence !== this._out.enabled) {\n return;\n }\n\n const { namespace } = this._out;\n const env = (process.env.DEBUG || '').split(',').filter((s) => !!s);\n const hasOn = env.includes(namespace);\n const hasOff = env.includes(`-${namespace}`);\n\n // enabling the log\n if (!silence) {\n if (hasOff) {\n remove(env, `-${namespace}`);\n } else {\n env.push(namespace);\n }\n } else {\n if (hasOn) {\n remove(env, namespace);\n } else {\n env.push(`-${namespace}`);\n }\n }\n\n debug.enable(env.join(','));\n }\n}\n", "import { SimpleGitTask } from '../types';\nimport { GitError } from '../errors/git-error';\nimport { createLogger, OutputLogger } from '../git-logger';\n\ntype AnySimpleGitTask = SimpleGitTask;\n\ntype TaskInProgress = {\n name: string;\n logger: OutputLogger;\n task: AnySimpleGitTask;\n};\n\nexport class TasksPendingQueue {\n private _queue: Map = new Map();\n\n constructor(private logLabel = 'GitExecutor') {}\n\n private withProgress(task: AnySimpleGitTask) {\n return this._queue.get(task);\n }\n\n private createProgress(task: AnySimpleGitTask): TaskInProgress {\n const name = TasksPendingQueue.getName(task.commands[0]);\n const logger = createLogger(this.logLabel, name);\n\n return {\n task,\n logger,\n name,\n };\n }\n\n push(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.createProgress(task);\n progress.logger('Adding task to the queue, commands = %o', task.commands);\n\n this._queue.set(task, progress);\n\n return progress;\n }\n\n fatal(err: GitError) {\n for (const [task, { logger }] of Array.from(this._queue.entries())) {\n if (task === err.task) {\n logger.info(`Failed %o`, err);\n logger(\n `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`\n );\n } else {\n logger.info(\n `A fatal exception occurred in a previous task, the queue has been purged: %o`,\n err.message\n );\n }\n\n this.complete(task);\n }\n\n if (this._queue.size !== 0) {\n throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`);\n }\n }\n\n complete(task: AnySimpleGitTask) {\n const progress = this.withProgress(task);\n if (progress) {\n this._queue.delete(task);\n }\n }\n\n attempt(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.withProgress(task);\n if (!progress) {\n throw new GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task');\n }\n progress.logger('Starting task');\n\n return progress;\n }\n\n static getName(name = 'empty') {\n return `task:${name}:${++TasksPendingQueue.counter}`;\n }\n\n private static counter = 0;\n}\n", "import { spawn, SpawnOptions } from 'child_process';\nimport { GitError } from '../errors/git-error';\nimport { OutputLogger } from '../git-logger';\nimport { PluginStore } from '../plugins';\nimport { EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task';\nimport {\n GitExecutorResult,\n Maybe,\n outputHandler,\n RunnableTask,\n SimpleGitExecutor,\n SimpleGitTask,\n} from '../types';\nimport { callTaskParser, first, GitOutputStreams, objectToString } from '../utils';\nimport { Scheduler } from './scheduler';\nimport { TasksPendingQueue } from './tasks-pending-queue';\n\nexport class GitExecutorChain implements SimpleGitExecutor {\n private _chain: Promise = Promise.resolve();\n private _queue = new TasksPendingQueue();\n private _cwd: string | undefined;\n\n public get cwd() {\n return this._cwd || this._executor.cwd;\n }\n\n public set cwd(cwd: string) {\n this._cwd = cwd;\n }\n\n public get env() {\n return this._executor.env;\n }\n\n public get outputHandler() {\n return this._executor.outputHandler;\n }\n\n constructor(\n private _executor: SimpleGitExecutor,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n public chain() {\n return this;\n }\n\n public push(task: SimpleGitTask): Promise {\n this._queue.push(task);\n\n return (this._chain = this._chain.then(() => this.attemptTask(task)));\n }\n\n private async attemptTask(task: SimpleGitTask): Promise {\n const onScheduleComplete = await this._scheduler.next();\n const onQueueComplete = () => this._queue.complete(task);\n\n try {\n const { logger } = this._queue.attempt(task);\n return (await (isEmptyTask(task)\n ? this.attemptEmptyTask(task, logger)\n : this.attemptRemoteTask(task, logger))) as R;\n } catch (e) {\n throw this.onFatalException(task, e as Error);\n } finally {\n onQueueComplete();\n onScheduleComplete();\n }\n }\n\n private onFatalException(task: SimpleGitTask, e: Error) {\n const gitError =\n e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e));\n\n this._chain = Promise.resolve();\n this._queue.fatal(gitError);\n\n return gitError;\n }\n\n private async attemptRemoteTask(task: RunnableTask, logger: OutputLogger) {\n const binary = this._plugins.exec('spawn.binary', '', pluginContext(task, task.commands));\n const args = this._plugins.exec(\n 'spawn.args',\n [...task.commands],\n pluginContext(task, task.commands)\n );\n\n const raw = await this.gitResponse(\n task,\n binary,\n args,\n this.outputHandler,\n logger.step('SPAWN')\n );\n const outputStreams = await this.handleTaskData(task, args, raw, logger.step('HANDLE'));\n\n logger(`passing response to task's parser as a %s`, task.format);\n\n if (isBufferTask(task)) {\n return callTaskParser(task.parser, outputStreams);\n }\n\n return callTaskParser(task.parser, outputStreams.asStrings());\n }\n\n private async attemptEmptyTask(task: EmptyTask, logger: OutputLogger) {\n logger(`empty task bypassing child process to call to task's parser`);\n return task.parser(this);\n }\n\n private handleTaskData(\n task: SimpleGitTask,\n args: string[],\n result: GitExecutorResult,\n logger: OutputLogger\n ): Promise {\n const { exitCode, rejection, stdOut, stdErr } = result;\n\n return new Promise((done, fail) => {\n logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode);\n\n const { error } = this._plugins.exec(\n 'task.error',\n { error: rejection },\n {\n ...pluginContext(task, args),\n ...result,\n }\n );\n\n if (error && task.onError) {\n logger.info(`exitCode=%s handling with custom error handler`);\n\n return task.onError(\n result,\n error,\n (newStdOut) => {\n logger.info(`custom error handler treated as success`);\n logger(`custom error returned a %s`, objectToString(newStdOut));\n\n done(\n new GitOutputStreams(\n Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut,\n Buffer.concat(stdErr)\n )\n );\n },\n fail\n );\n }\n\n if (error) {\n logger.info(\n `handling as error: exitCode=%s stdErr=%s rejection=%o`,\n exitCode,\n stdErr.length,\n rejection\n );\n return fail(error);\n }\n\n logger.info(`retrieving task output complete`);\n done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr)));\n });\n }\n\n private async gitResponse(\n task: SimpleGitTask,\n command: string,\n args: string[],\n outputHandler: Maybe,\n logger: OutputLogger\n ): Promise {\n const outputLogger = logger.sibling('output');\n const spawnOptions: SpawnOptions = this._plugins.exec(\n 'spawn.options',\n {\n cwd: this.cwd,\n env: this.env,\n windowsHide: true,\n },\n pluginContext(task, task.commands)\n );\n\n return new Promise((done) => {\n const stdOut: Buffer[] = [];\n const stdErr: Buffer[] = [];\n\n logger.info(`%s %o`, command, args);\n logger('%O', spawnOptions);\n\n let rejection = this._beforeSpawn(task, args);\n if (rejection) {\n return done({\n stdOut,\n stdErr,\n exitCode: 9901,\n rejection,\n });\n }\n\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n const spawned = spawn(command, args, spawnOptions);\n\n spawned.stdout!.on(\n 'data',\n onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))\n );\n spawned.stderr!.on(\n 'data',\n onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))\n );\n\n spawned.on('error', onErrorReceived(stdErr, logger));\n\n if (outputHandler) {\n logger(`Passing child process stdOut/stdErr to custom outputHandler`);\n outputHandler(command, spawned.stdout!, spawned.stderr!, [...args]);\n }\n\n this._plugins.exec('spawn.after', undefined, {\n ...pluginContext(task, args),\n spawned,\n close(exitCode: number, reason?: Error) {\n done({\n stdOut,\n stdErr,\n exitCode,\n rejection: rejection || reason,\n });\n },\n kill(reason: Error) {\n if (spawned.killed) {\n return;\n }\n\n rejection = reason;\n spawned.kill('SIGINT');\n },\n });\n });\n }\n\n private _beforeSpawn(task: SimpleGitTask, args: string[]) {\n let rejection: Maybe;\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n return rejection;\n }\n}\n\nfunction pluginContext(task: SimpleGitTask, commands: string[]) {\n return {\n method: first(task.commands) || '',\n commands,\n };\n}\n\nfunction onErrorReceived(target: Buffer[], logger: OutputLogger) {\n return (err: Error) => {\n logger(`[ERROR] child process exception %o`, err);\n target.push(Buffer.from(String(err.stack), 'ascii'));\n };\n}\n\nfunction onDataReceived(\n target: Buffer[],\n name: string,\n logger: OutputLogger,\n output: OutputLogger\n) {\n return (buffer: Buffer) => {\n logger(`%s received %L bytes`, name, buffer);\n output(`%B`, buffer);\n target.push(buffer);\n };\n}\n", "import type { PluginStore } from '../plugins';\nimport type { GitExecutorEnv, outputHandler, SimpleGitExecutor, SimpleGitTask } from '../types';\n\nimport { GitExecutorChain } from './git-executor-chain';\nimport { Scheduler } from './scheduler';\n\nexport class GitExecutor implements SimpleGitExecutor {\n private _chain = new GitExecutorChain(this, this._scheduler, this._plugins);\n\n public env: GitExecutorEnv;\n public outputHandler?: outputHandler;\n\n constructor(\n public cwd: string,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n chain(): SimpleGitExecutor {\n return new GitExecutorChain(this, this._scheduler, this._plugins);\n }\n\n push(task: SimpleGitTask): Promise {\n return this._chain.push(task);\n }\n}\n", "import { GitError } from './errors/git-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport { NOOP } from './utils';\n\nexport function taskCallback(\n task: SimpleGitTask,\n response: Promise,\n callback: SimpleGitTaskCallback = NOOP\n) {\n const onSuccess = (data: R) => {\n callback(null, data);\n };\n\n const onError = (err: GitError | GitResponseError) => {\n if (err?.task === task) {\n callback(\n err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err,\n undefined as any\n );\n }\n };\n\n response.then(onSuccess, onError);\n}\n\nfunction addDeprecationNoticeToError(err: GitResponseError) {\n let log = (name: string) => {\n console.warn(\n `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`\n );\n log = NOOP;\n };\n\n return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {}));\n\n function descriptorReducer(all: PropertyDescriptorMap, name: string): typeof all {\n if (name in err) {\n return all;\n }\n\n all[name] = {\n enumerable: false,\n configurable: false,\n get() {\n log(name);\n return err.git[name];\n },\n };\n\n return all;\n }\n}\n", "import { folderExists } from '../utils';\nimport { SimpleGitExecutor } from '../types';\nimport { adhocExecTask } from './task';\n\nexport function changeWorkingDirectoryTask(directory: string, root?: SimpleGitExecutor) {\n return adhocExecTask((instance: SimpleGitExecutor) => {\n if (!folderExists(directory)) {\n throw new Error(`Git.cwd: cannot change to non-directory \"${directory}\"`);\n }\n\n return ((root || instance).cwd = directory);\n });\n}\n", "import type { SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, remove, trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nfunction checkoutTask(args: string[]) {\n const commands = ['checkout', ...args];\n if (commands[1] === '-b' && commands.includes('-B')) {\n commands[1] = remove(commands, '-B');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport default function (): Pick {\n return {\n checkout(this: SimpleGitApi) {\n return this._runTask(\n checkoutTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutBranch(this: SimpleGitApi, branchName, startPoint) {\n return this._runTask(\n checkoutTask(['-b', branchName, startPoint, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutLocalBranch(this: SimpleGitApi, branchName) {\n return this._runTask(\n checkoutTask(['-b', branchName, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asCamelCase, asNumber, LineParser, parseStringResponse } from '../utils';\n\nexport interface CountObjectsResult {\n count: number;\n size: number;\n inPack: number;\n packs: number;\n sizePack: number;\n prunePackable: number;\n garbage: number;\n sizeGarbage: number;\n}\n\nfunction countObjectsResponse(): CountObjectsResult {\n return {\n count: 0,\n garbage: 0,\n inPack: 0,\n packs: 0,\n prunePackable: 0,\n size: 0,\n sizeGarbage: 0,\n sizePack: 0,\n };\n}\n\nconst parser: LineParser = new LineParser(\n /([a-z-]+): (\\d+)$/,\n (result, [key, value]) => {\n const property = asCamelCase(key);\n if (Object.hasOwn(result, property)) {\n result[property as keyof typeof result] = asNumber(value);\n }\n }\n);\n\nexport default function (): Pick {\n return {\n countObjects(this: SimpleGitApi) {\n return this._runTask({\n commands: ['count-objects', '--verbose'],\n format: 'utf-8',\n parser(stdOut: string) {\n return parseStringResponse(countObjectsResponse(), [parser], stdOut);\n },\n });\n },\n };\n}\n", "import { CommitResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/^\\[([^\\s]+)( \\([^)]+\\))? ([^\\]]+)/, (result, [branch, root, commit]) => {\n result.branch = branch;\n result.commit = commit;\n result.root = !!root;\n }),\n new LineParser(/\\s*Author:\\s(.+)/i, (result, [author]) => {\n const parts = author.split('<');\n const email = parts.pop();\n\n if (!email || !email.includes('@')) {\n return;\n }\n\n result.author = {\n email: email.substr(0, email.length - 1),\n name: parts.join('<').trim(),\n };\n }),\n new LineParser(\n /(\\d+)[^,]*(?:,\\s*(\\d+)[^,]*)(?:,\\s*(\\d+))/g,\n (result, [changes, insertions, deletions]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n result.summary.insertions = parseInt(insertions, 10) || 0;\n result.summary.deletions = parseInt(deletions, 10) || 0;\n }\n ),\n new LineParser(\n /^(\\d+)[^,]*(?:,\\s*(\\d+)[^(]+\\(([+-]))?/,\n (result, [changes, lines, direction]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n const count = parseInt(lines, 10) || 0;\n if (direction === '-') {\n result.summary.deletions = count;\n } else if (direction === '+') {\n result.summary.insertions = count;\n }\n }\n ),\n];\n\nexport function parseCommitResult(stdOut: string): CommitResult {\n const result: CommitResult = {\n author: null,\n branch: '',\n commit: '',\n root: false,\n summary: {\n changes: 0,\n insertions: 0,\n deletions: 0,\n },\n };\n return parseStringResponse(result, parsers, stdOut);\n}\n", "import type { CommitResult, SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { parseCommitResult } from '../parsers/parse-commit';\nimport {\n asArray,\n asStringArray,\n filterArray,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport function commitTask(\n message: string[],\n files: string[],\n customArgs: string[]\n): StringTask {\n const commands: string[] = [\n '-c',\n 'core.abbrev=40',\n 'commit',\n ...prefixedArray(message, '-m'),\n ...files,\n ...customArgs,\n ];\n\n return {\n commands,\n format: 'utf-8',\n parser: parseCommitResult,\n };\n}\n\nexport default function (): Pick {\n return {\n commit(this: SimpleGitApi, message: string | string[], ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const task =\n rejectDeprecatedSignatures(message) ||\n commitTask(\n asArray(message),\n asArray(filterType(rest[0], filterStringOrStringArray, [])),\n [\n ...asStringArray(filterType(rest[1], filterArray, [])),\n ...getTrailingOptions(arguments, 0, true),\n ]\n );\n\n return this._runTask(task, next);\n },\n };\n\n function rejectDeprecatedSignatures(message?: unknown) {\n return (\n !filterStringOrStringArray(message) &&\n configurationErrorTask(\n `git.commit: requires the commit message to be supplied as a string/string[]`\n )\n );\n }\n}\n", "import { Response, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport default function (): Pick {\n return {\n firstCommit(this: SimpleGitApi): Response {\n return this._runTask(\n straightThroughStringTask(['rev-list', '--max-parents=0', 'HEAD'], true),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import { straightThroughStringTask } from './task';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.hashObject`\n */\nexport function hashObjectTask(filePath: string, write: boolean): StringTask {\n const commands = ['hash-object', filePath];\n if (write) {\n commands.push('-w');\n }\n\n return straightThroughStringTask(commands, true);\n}\n", "import { InitResult } from '../../../typings';\n\nexport class InitSummary implements InitResult {\n constructor(\n public readonly bare: boolean,\n public readonly path: string,\n public readonly existing: boolean,\n public readonly gitDir: string\n ) {}\n}\n\nconst initResponseRegex = /^Init.+ repository in (.+)$/;\nconst reInitResponseRegex = /^Rein.+ in (.+)$/;\n\nexport function parseInit(bare: boolean, path: string, text: string) {\n const response = String(text).trim();\n let result;\n\n if ((result = initResponseRegex.exec(response))) {\n return new InitSummary(bare, path, false, result[1]);\n }\n\n if ((result = reInitResponseRegex.exec(response))) {\n return new InitSummary(bare, path, true, result[1]);\n }\n\n let gitDir = '';\n const tokens = response.split(' ');\n while (tokens.length) {\n const token = tokens.shift();\n if (token === 'in') {\n gitDir = tokens.join(' ');\n break;\n }\n }\n\n return new InitSummary(bare, path, /^re/i.test(response), gitDir);\n}\n", "import { InitResult } from '../../../typings';\nimport { parseInit } from '../responses/InitSummary';\nimport { StringTask } from '../types';\n\nconst bareCommand = '--bare';\n\nfunction hasBareCommand(command: string[]) {\n return command.includes(bareCommand);\n}\n\nexport function initTask(bare = false, path: string, customArgs: string[]): StringTask {\n const commands = ['init', ...customArgs];\n if (bare && !hasBareCommand(commands)) {\n commands.splice(1, 0, bareCommand);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): InitResult {\n return parseInit(commands.includes('--bare'), path, text);\n },\n };\n}\n", "export enum LogFormat {\n NONE = '',\n STAT = '--stat',\n NUM_STAT = '--numstat',\n NAME_ONLY = '--name-only',\n NAME_STATUS = '--name-status',\n}\n\nconst logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/;\n\nexport function logFormatFromCommand(customArgs: string[]) {\n for (let i = 0; i < customArgs.length; i++) {\n const format = logFormatRegex.exec(customArgs[i]);\n if (format) {\n return `--${format[1]}` as LogFormat;\n }\n }\n\n return LogFormat.NONE;\n}\n\nexport function isLogFormat(customArg: string | unknown) {\n return logFormatRegex.test(customArg as string);\n}\n", "import { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings';\n\n/***\n * The DiffSummary is returned as a response to getting `git().status()`\n */\nexport class DiffSummary implements DiffResult {\n changed = 0;\n deletions = 0;\n insertions = 0;\n\n files: Array = [];\n}\n", "import { DiffResult } from '../../../typings';\nimport { LogFormat } from '../args/log-format';\nimport { DiffSummary } from '../responses/DiffSummary';\nimport { isDiffNameStatus } from '../tasks/diff-name-status';\nimport { asNumber, LineParser, orVoid, parseStringResponse } from '../utils';\n\nconst statParser = [\n new LineParser(\n /^(.+)\\s+\\|\\s+(\\d+)(\\s+[+\\-]+)?$/,\n (result, [file, changes, alterations = '']) => {\n result.files.push({\n file: file.trim(),\n changes: asNumber(changes),\n insertions: alterations.replace(/[^+]/g, '').length,\n deletions: alterations.replace(/[^-]/g, '').length,\n binary: false,\n });\n }\n ),\n new LineParser(\n /^(.+) \\|\\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/,\n (result, [file, before, after]) => {\n result.files.push({\n file: file.trim(),\n before: asNumber(before),\n after: asNumber(after),\n binary: true,\n });\n }\n ),\n new LineParser(\n /(\\d+) files? changed\\s*((?:, \\d+ [^,]+){0,2})/,\n (result, [changed, summary]) => {\n const inserted = /(\\d+) i/.exec(summary);\n const deleted = /(\\d+) d/.exec(summary);\n\n result.changed = asNumber(changed);\n result.insertions = asNumber(inserted?.[1]);\n result.deletions = asNumber(deleted?.[1]);\n }\n ),\n];\n\nconst numStatParser = [\n new LineParser(\n /(\\d+)\\t(\\d+)\\t(.+)$/,\n (result, [changesInsert, changesDelete, file]) => {\n const insertions = asNumber(changesInsert);\n const deletions = asNumber(changesDelete);\n\n result.changed++;\n result.insertions += insertions;\n result.deletions += deletions;\n\n result.files.push({\n file,\n changes: insertions + deletions,\n insertions,\n deletions,\n binary: false,\n });\n }\n ),\n new LineParser(/-\\t-\\t(.+)$/, (result, [file]) => {\n result.changed++;\n\n result.files.push({\n file,\n after: 0,\n before: 0,\n binary: true,\n });\n }),\n];\n\nconst nameOnlyParser = [\n new LineParser(/(.+)$/, (result, [file]) => {\n result.changed++;\n result.files.push({\n file,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n });\n }),\n];\n\nconst nameStatusParser = [\n new LineParser(\n /([ACDMRTUXB])([0-9]{0,3})\\t(.[^\\t]*)(\\t(.[^\\t]*))?$/,\n (result, [status, similarity, from, _to, to]) => {\n result.changed++;\n result.files.push({\n file: to ?? from,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n status: orVoid(isDiffNameStatus(status) && status),\n from: orVoid(!!to && from !== to && from),\n similarity: asNumber(similarity),\n });\n }\n ),\n];\n\nconst diffSummaryParsers: Record[]> = {\n [LogFormat.NONE]: statParser,\n [LogFormat.STAT]: statParser,\n [LogFormat.NUM_STAT]: numStatParser,\n [LogFormat.NAME_STATUS]: nameStatusParser,\n [LogFormat.NAME_ONLY]: nameOnlyParser,\n};\n\nexport function getDiffParser(format = LogFormat.NONE) {\n const parser = diffSummaryParsers[format];\n\n return (stdOut: string) => parseStringResponse(new DiffSummary(), parser, stdOut, false);\n}\n", "import { ListLogLine, LogResult } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\nimport { getDiffParser } from './parse-diff-summary';\nimport { LogFormat } from '../args/log-format';\n\nexport const START_BOUNDARY = '\u00F2\u00F2\u00F2\u00F2\u00F2\u00F2 ';\n\nexport const COMMIT_BOUNDARY = ' \u00F2\u00F2';\n\nexport const SPLITTER = ' \u00F2 ';\n\nconst defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email'];\n\nfunction lineBuilder(tokens: string[], fields: string[]): any {\n return fields.reduce(\n (line, field, index) => {\n line[field] = tokens[index] || '';\n return line;\n },\n Object.create({ diff: null }) as any\n );\n}\n\nexport function createListLogSummaryParser(\n splitter = SPLITTER,\n fields = defaultFieldNames,\n logFormat = LogFormat.NONE\n) {\n const parseDiffResult = getDiffParser(logFormat);\n\n return function (stdOut: string): LogResult {\n const all: ReadonlyArray = toLinesWithContent(\n stdOut.trim(),\n false,\n START_BOUNDARY\n ).map(function (item) {\n const lineDetail = item.split(COMMIT_BOUNDARY);\n const listLogLine: T & ListLogLine = lineBuilder(lineDetail[0].split(splitter), fields);\n\n if (lineDetail.length > 1 && !!lineDetail[1].trim()) {\n listLogLine.diff = parseDiffResult(lineDetail[1]);\n }\n\n return listLogLine;\n });\n\n return {\n all,\n latest: (all.length && all[0]) || null,\n total: all.length,\n };\n };\n}\n", "import { StringTask } from '../types';\nimport { DiffResult } from '../../../typings';\nimport { isLogFormat, LogFormat, logFormatFromCommand } from '../args/log-format';\nimport { getDiffParser } from '../parsers/parse-diff-summary';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function diffSummaryTask(customArgs: string[]): StringTask | EmptyTask {\n let logFormat = logFormatFromCommand(customArgs);\n\n const commands = ['diff'];\n\n if (logFormat === LogFormat.NONE) {\n logFormat = LogFormat.STAT;\n commands.push('--stat=4096');\n }\n\n commands.push(...customArgs);\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser: getDiffParser(logFormat),\n }\n );\n}\n\nexport function validateLogFormatConfig(customArgs: unknown[]): EmptyTask | void {\n const flags = customArgs.filter(isLogFormat);\n\n if (flags.length > 1) {\n return configurationErrorTask(\n `Summary flags are mutually exclusive - pick one of ${flags.join(',')}`\n );\n }\n\n if (flags.length && customArgs.includes('-z')) {\n return configurationErrorTask(\n `Summary flag ${flags} parsing is not compatible with null termination option '-z'`\n );\n }\n}\n", "import type { LogResult, Options, SimpleGit } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { pathspec } from '../args/pathspec';\nimport {\n COMMIT_BOUNDARY,\n createListLogSummaryParser,\n SPLITTER,\n START_BOUNDARY,\n} from '../parsers/parse-list-log-summary';\nimport {\n appendTaskOptions,\n asStringArray,\n filterArray,\n filterPlainObject,\n filterString,\n filterType,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} from '../utils';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { configurationErrorTask } from './task';\nimport { validateLogFormatConfig } from './diff';\nimport { StringTask } from '../types';\n\nenum excludeOptions {\n '--pretty',\n 'max-count',\n 'maxCount',\n 'n',\n 'file',\n 'format',\n 'from',\n 'to',\n 'splitter',\n 'symmetric',\n 'mailMap',\n 'multiLine',\n 'strictDate',\n}\n\nexport interface DefaultLogFields {\n hash: string;\n date: string;\n message: string;\n refs: string;\n body: string;\n author_name: string;\n author_email: string;\n}\n\nexport type LogOptions = {\n file?: string;\n format?: T;\n from?: string;\n mailMap?: boolean;\n maxCount?: number;\n multiLine?: boolean;\n splitter?: string;\n strictDate?: boolean;\n symmetric?: boolean;\n to?: string;\n};\n\ninterface ParsedLogOptions {\n fields: string[];\n splitter: string;\n commands: string[];\n}\n\nfunction prettyFormat(\n format: Record,\n splitter: string\n): [string[], string] {\n const fields: string[] = [];\n const formatStr: string[] = [];\n\n Object.keys(format).forEach((field) => {\n fields.push(field);\n formatStr.push(String(format[field]));\n });\n\n return [fields, formatStr.join(splitter)];\n}\n\nfunction userOptions(input: T): Options {\n return Object.keys(input).reduce((out, key) => {\n if (!(key in excludeOptions)) {\n out[key] = input[key];\n }\n return out;\n }, {} as Options);\n}\n\nexport function parseLogOptions(\n opt: Options | LogOptions = {},\n customArgs: string[] = []\n): ParsedLogOptions {\n const splitter = filterType(opt.splitter, filterString, SPLITTER);\n const format = filterPlainObject(opt.format)\n ? opt.format\n : {\n hash: '%H',\n date: opt.strictDate === false ? '%ai' : '%aI',\n message: '%s',\n refs: '%D',\n body: opt.multiLine ? '%B' : '%b',\n author_name: opt.mailMap !== false ? '%aN' : '%an',\n author_email: opt.mailMap !== false ? '%aE' : '%ae',\n };\n\n const [fields, formatStr] = prettyFormat(format, splitter);\n\n const suffix: string[] = [];\n const command: string[] = [\n `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`,\n ...customArgs,\n ];\n\n const maxCount: number | undefined = (opt as any).n || (opt as any)['max-count'] || opt.maxCount;\n if (maxCount) {\n command.push(`--max-count=${maxCount}`);\n }\n\n if (opt.from || opt.to) {\n const rangeOperator = opt.symmetric !== false ? '...' : '..';\n suffix.push(`${opt.from || ''}${rangeOperator}${opt.to || ''}`);\n }\n\n if (filterString(opt.file)) {\n command.push('--follow', pathspec(opt.file));\n }\n\n appendTaskOptions(userOptions(opt as Options), command);\n\n return {\n fields,\n splitter,\n commands: [...command, ...suffix],\n };\n}\n\nexport function logTask(\n splitter: string,\n fields: string[],\n customArgs: string[]\n): StringTask> {\n const parser = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs));\n\n return {\n commands: ['log', ...customArgs],\n format: 'utf-8',\n parser,\n };\n}\n\nexport default function (): Pick {\n return {\n log(this: SimpleGitApi, ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const options = parseLogOptions(\n trailingOptionsArgument(arguments),\n asStringArray(filterType(arguments[0], filterArray, []))\n );\n const task =\n rejectDeprecatedSignatures(...rest) ||\n validateLogFormatConfig(options.commands) ||\n createLogTask(options);\n\n return this._runTask(task, next);\n },\n };\n\n function createLogTask(options: ParsedLogOptions) {\n return logTask(options.splitter, options.fields, options.commands);\n }\n\n function rejectDeprecatedSignatures(from?: unknown, to?: unknown) {\n return (\n filterString(from) &&\n filterString(to) &&\n configurationErrorTask(\n `git.log(string, string) should be replaced with git.log({ from: string, to: string })`\n )\n );\n }\n}\n", "import {\n MergeConflict,\n MergeConflictDeletion,\n MergeDetail,\n MergeResultStatus,\n} from '../../../typings';\n\nexport class MergeSummaryConflict implements MergeConflict {\n constructor(\n public readonly reason: string,\n public readonly file: string | null = null,\n public readonly meta?: MergeConflictDeletion\n ) {}\n\n toString() {\n return `${this.file}:${this.reason}`;\n }\n}\n\nexport class MergeSummaryDetail implements MergeDetail {\n public conflicts: MergeConflict[] = [];\n public merges: string[] = [];\n public result: MergeResultStatus = 'success';\n\n get failed() {\n return this.conflicts.length > 0;\n }\n\n get reason() {\n return this.result;\n }\n\n toString() {\n if (this.conflicts.length) {\n return `CONFLICTS: ${this.conflicts.join(', ')}`;\n }\n\n return 'OK';\n }\n}\n", "import {\n PullDetailFileChanges,\n PullDetailSummary,\n PullFailedResult,\n PullResult,\n} from '../../../typings';\n\nexport class PullSummary implements PullResult {\n public remoteMessages = {\n all: [],\n };\n public created = [];\n public deleted: string[] = [];\n public files: string[] = [];\n public deletions: PullDetailFileChanges = {};\n public insertions: PullDetailFileChanges = {};\n public summary: PullDetailSummary = {\n changes: 0,\n deletions: 0,\n insertions: 0,\n };\n}\n\nexport class PullFailedSummary implements PullFailedResult {\n remote = '';\n hash = {\n local: '',\n remote: '',\n };\n branch = {\n local: '',\n remote: '',\n };\n message = '';\n\n toString() {\n return this.message;\n }\n}\n", "import {\n RemoteMessageResult,\n RemoteMessages,\n RemoteMessagesObjectEnumeration,\n} from '../../../typings';\nimport { asNumber, RemoteLineParser } from '../utils';\n\nfunction objectEnumerationResult(\n remoteMessages: T\n): RemoteMessagesObjectEnumeration {\n return (remoteMessages.objects = remoteMessages.objects || {\n compressing: 0,\n counting: 0,\n enumerating: 0,\n packReused: 0,\n reused: { count: 0, delta: 0 },\n total: { count: 0, delta: 0 },\n });\n}\n\nfunction asObjectCount(source: string) {\n const count = /^\\s*(\\d+)/.exec(source);\n const delta = /delta (\\d+)/i.exec(source);\n\n return {\n count: asNumber((count && count[1]) || '0'),\n delta: asNumber((delta && delta[1]) || '0'),\n };\n}\n\nexport const remoteMessagesObjectParsers: RemoteLineParser>[] =\n [\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: (\\d+),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: \\d+% \\(\\d+\\/(\\d+)\\),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /total ([^,]+), reused ([^,]+), pack-reused (\\d+)/i,\n (result, [total, reused, packReused]) => {\n const objects = objectEnumerationResult(result.remoteMessages);\n objects.total = asObjectCount(total);\n objects.reused = asObjectCount(reused);\n objects.packReused = asNumber(packReused);\n }\n ),\n ];\n", "import { PushResultRemoteMessages, RemoteMessageResult, RemoteMessages } from '../../../typings';\nimport { asNumber, parseStringResponse, RemoteLineParser } from '../utils';\nimport { remoteMessagesObjectParsers } from './parse-remote-objects';\n\nconst parsers: RemoteLineParser>[] =\n [\n new RemoteLineParser(/^remote:\\s*(.+)$/, (result, [text]) => {\n result.remoteMessages.all.push(text.trim());\n return false;\n }),\n ...remoteMessagesObjectParsers,\n new RemoteLineParser(\n [/create a (?:pull|merge) request/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [pullRequestUrl]) => {\n (result.remoteMessages as PushResultRemoteMessages).pullRequestUrl = pullRequestUrl;\n }\n ),\n new RemoteLineParser(\n [/found (\\d+) vulnerabilities.+\\(([^)]+)\\)/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [count, summary, url]) => {\n (result.remoteMessages as PushResultRemoteMessages).vulnerabilities = {\n count: asNumber(count),\n summary,\n url,\n };\n }\n ),\n ];\n\nexport function parseRemoteMessages(\n _stdOut: string,\n stdErr: string\n): RemoteMessageResult {\n return parseStringResponse({ remoteMessages: new RemoteMessageSummary() as T }, parsers, stdErr);\n}\n\nexport class RemoteMessageSummary implements RemoteMessages {\n public readonly all: string[] = [];\n}\n", "import { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings';\nimport { PullFailedSummary, PullSummary } from '../responses/PullSummary';\nimport { TaskParser } from '../types';\nimport { append, LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nconst FILE_UPDATE_REGEX = /^\\s*(.+?)\\s+\\|\\s+\\d+\\s*(\\+*)(-*)/;\nconst SUMMARY_REGEX = /(\\d+)\\D+((\\d+)\\D+\\(\\+\\))?(\\D+(\\d+)\\D+\\(-\\))?/;\nconst ACTION_REGEX = /^(create|delete) mode \\d+ (.+)/;\n\nconst parsers: LineParser[] = [\n new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => {\n result.files.push(file);\n\n if (insertions) {\n result.insertions[file] = insertions.length;\n }\n\n if (deletions) {\n result.deletions[file] = deletions.length;\n }\n }),\n new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => {\n if (insertions !== undefined || deletions !== undefined) {\n result.summary.changes = +changes || 0;\n result.summary.insertions = +insertions || 0;\n result.summary.deletions = +deletions || 0;\n return true;\n }\n return false;\n }),\n new LineParser(ACTION_REGEX, (result, [action, file]) => {\n append(result.files, file);\n append(action === 'create' ? result.created : result.deleted, file);\n }),\n];\n\nconst errorParsers: LineParser[] = [\n new LineParser(/^from\\s(.+)$/i, (result, [remote]) => void (result.remote = remote)),\n new LineParser(/^fatal:\\s(.+)$/, (result, [message]) => void (result.message = message)),\n new LineParser(\n /([a-z0-9]+)\\.\\.([a-z0-9]+)\\s+(\\S+)\\s+->\\s+(\\S+)$/,\n (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => {\n result.branch.local = branchLocal;\n result.hash.local = hashLocal;\n result.branch.remote = branchRemote;\n result.hash.remote = hashRemote;\n }\n ),\n];\n\nexport const parsePullDetail: TaskParser = (stdOut, stdErr) => {\n return parseStringResponse(new PullSummary(), parsers, [stdOut, stdErr]);\n};\n\nexport const parsePullResult: TaskParser = (stdOut, stdErr) => {\n return Object.assign(\n new PullSummary(),\n parsePullDetail(stdOut, stdErr),\n parseRemoteMessages(stdOut, stdErr)\n );\n};\n\nexport function parsePullErrorResult(stdOut: string, stdErr: string) {\n const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]);\n\n return pullError.message && pullError;\n}\n", "import { MergeDetail, MergeResult } from '../../../typings';\nimport { MergeSummaryConflict, MergeSummaryDetail } from '../responses/MergeSummary';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parsePullResult } from './parse-pull';\n\nconst parsers: LineParser[] = [\n new LineParser(/^Auto-merging\\s+(.+)$/, (summary, [autoMerge]) => {\n summary.merges.push(autoMerge);\n }),\n new LineParser(/^CONFLICT\\s+\\((.+)\\): Merge conflict in (.+)$/, (summary, [reason, file]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file));\n }),\n new LineParser(\n /^CONFLICT\\s+\\((.+\\/delete)\\): (.+) deleted in (.+) and/,\n (summary, [reason, file, deleteRef]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef }));\n }\n ),\n new LineParser(/^CONFLICT\\s+\\((.+)\\):/, (summary, [reason]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, null));\n }),\n new LineParser(/^Automatic merge failed;\\s+(.+)$/, (summary, [result]) => {\n summary.result = result;\n }),\n];\n\n/**\n * Parse the complete response from `git.merge`\n */\nexport const parseMergeResult: TaskParser = (stdOut, stdErr) => {\n return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr));\n};\n\n/**\n * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge`\n * @param stdOut\n */\nexport const parseMergeDetail: TaskParser = (stdOut) => {\n return parseStringResponse(new MergeSummaryDetail(), parsers, stdOut);\n};\n", "import { MergeResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parseMergeResult } from '../parsers/parse-merge';\nimport { StringTask } from '../types';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function mergeTask(customArgs: string[]): EmptyTask | StringTask {\n if (!customArgs.length) {\n return configurationErrorTask('Git.merge requires at least one option');\n }\n\n return {\n commands: ['merge', ...customArgs],\n format: 'utf-8',\n parser(stdOut, stdErr): MergeResult {\n const merge = parseMergeResult(stdOut, stdErr);\n if (merge.failed) {\n throw new GitResponseError(merge);\n }\n\n return merge;\n },\n };\n}\n", "import {\n PushDetail,\n PushResult,\n PushResultPushedItem,\n PushResultRemoteMessages,\n} from '../../../typings';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nfunction pushResultPushedItem(local: string, remote: string, status: string): PushResultPushedItem {\n const deleted = status.includes('deleted');\n const tag = status.includes('tag') || /^refs\\/tags/.test(local);\n const alreadyUpdated = !status.includes('new');\n\n return {\n deleted,\n tag,\n branch: !tag,\n new: !alreadyUpdated,\n alreadyUpdated,\n local,\n remote,\n };\n}\n\nconst parsers: LineParser[] = [\n new LineParser(/^Pushing to (.+)$/, (result, [repo]) => {\n result.repo = repo;\n }),\n new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => {\n result.ref = {\n ...(result.ref || {}),\n local,\n };\n }),\n new LineParser(/^[=*-]\\s+([^:]+):(\\S+)\\s+\\[(.+)]$/, (result, [local, remote, type]) => {\n result.pushed.push(pushResultPushedItem(local, remote, type));\n }),\n new LineParser(\n /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/,\n (result, [local, remote, remoteName]) => {\n result.branch = {\n ...(result.branch || {}),\n local,\n remote,\n remoteName,\n };\n }\n ),\n new LineParser(\n /^([^:]+):(\\S+)\\s+([a-z0-9]+)\\.\\.([a-z0-9]+)$/,\n (result, [local, remote, from, to]) => {\n result.update = {\n head: {\n local,\n remote,\n },\n hash: {\n from,\n to,\n },\n };\n }\n ),\n];\n\nexport const parsePushResult: TaskParser = (stdOut, stdErr) => {\n const pushDetail = parsePushDetail(stdOut, stdErr);\n const responseDetail = parseRemoteMessages(stdOut, stdErr);\n\n return {\n ...pushDetail,\n ...responseDetail,\n };\n};\n\nexport const parsePushDetail: TaskParser = (stdOut, stdErr) => {\n return parseStringResponse({ pushed: [] }, parsers, [stdOut, stdErr]);\n};\n", "import { PushResult } from '../../../typings';\nimport { parsePushResult as parser } from '../parsers/parse-push';\nimport { StringTask } from '../types';\nimport { append, remove } from '../utils';\n\ntype PushRef = { remote?: string; branch?: string };\n\nexport function pushTagsTask(ref: PushRef = {}, customArgs: string[]): StringTask {\n append(customArgs, '--tags');\n return pushTask(ref, customArgs);\n}\n\nexport function pushTask(ref: PushRef = {}, customArgs: string[]): StringTask {\n const commands = ['push', ...customArgs];\n if (ref.branch) {\n commands.splice(1, 0, ref.branch);\n }\n if (ref.remote) {\n commands.splice(1, 0, ref.remote);\n }\n\n remove(commands, '-v');\n append(commands, '--verbose');\n append(commands, '--porcelain');\n\n return {\n commands,\n format: 'utf-8',\n parser,\n };\n}\n", "import { SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, trailingFunctionArgument } from '../utils';\nimport { straightThroughBufferTask, straightThroughStringTask } from './task';\n\nexport default function (): Pick {\n return {\n showBuffer(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n if (!commands.includes('--binary')) {\n commands.splice(1, 0, '--binary');\n }\n\n return this._runTask(\n straightThroughBufferTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n\n show(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n return this._runTask(\n straightThroughStringTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import { FileStatusResult } from '../../../typings';\n\nexport const fromPathRegex = /^(.+)\\0(.+)$/;\n\nexport class FileStatusSummary implements FileStatusResult {\n public readonly from: string | undefined;\n\n constructor(\n public path: string,\n public index: string,\n public working_dir: string\n ) {\n if (index === 'R' || working_dir === 'R') {\n const detail = fromPathRegex.exec(path) || [null, path, path];\n this.from = detail[2] || '';\n this.path = detail[1] || '';\n }\n }\n}\n", "import { StatusResult } from '../../../typings';\nimport { filterString, filterType, NULL } from '../utils';\nimport { FileStatusSummary } from './FileStatusSummary';\n\ntype StatusLineParser = (result: StatusResult, file: string) => void;\n\nexport class StatusSummary implements StatusResult {\n public not_added = [];\n public conflicted = [];\n public created = [];\n public deleted = [];\n public ignored = undefined;\n public modified = [];\n public renamed = [];\n public files = [];\n public staged = [];\n public ahead = 0;\n public behind = 0;\n public current = null;\n public tracking = null;\n public detached = false;\n\n public isClean = () => {\n return !this.files.length;\n };\n}\n\nenum PorcelainFileStatus {\n ADDED = 'A',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n COPIED = 'C',\n UNMERGED = 'U',\n UNTRACKED = '?',\n IGNORED = '!',\n NONE = ' ',\n}\n\nfunction renamedFile(line: string) {\n const [to, from] = line.split(NULL);\n\n return {\n from: from || to,\n to,\n };\n}\n\nfunction parser(\n indexX: PorcelainFileStatus,\n indexY: PorcelainFileStatus,\n handler: StatusLineParser\n): [string, StatusLineParser] {\n return [`${indexX}${indexY}`, handler];\n}\n\nfunction conflicts(indexX: PorcelainFileStatus, ...indexY: PorcelainFileStatus[]) {\n return indexY.map((y) => parser(indexX, y, (result, file) => result.conflicted.push(file)));\n}\n\nconst parsers: Map = new Map([\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) =>\n result.created.push(file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) =>\n result.deleted.push(file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) =>\n result.modified.push(file)\n ),\n\n parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.NONE, (result, file) => {\n result.created.push(file);\n result.staged.push(file);\n }),\n parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.MODIFIED, (result, file) => {\n result.created.push(file);\n result.staged.push(file);\n result.modified.push(file);\n }),\n\n parser(PorcelainFileStatus.DELETED, PorcelainFileStatus.NONE, (result, file) => {\n result.deleted.push(file);\n result.staged.push(file);\n }),\n\n parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.NONE, (result, file) => {\n result.modified.push(file);\n result.staged.push(file);\n }),\n parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.MODIFIED, (result, file) => {\n result.modified.push(file);\n result.staged.push(file);\n }),\n\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => {\n result.renamed.push(renamedFile(file));\n }),\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => {\n const renamed = renamedFile(file);\n result.renamed.push(renamed);\n result.modified.push(renamed.to);\n }),\n parser(PorcelainFileStatus.IGNORED, PorcelainFileStatus.IGNORED, (_result, _file) => {\n (_result.ignored = _result.ignored || []).push(_file);\n }),\n\n parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) =>\n result.not_added.push(file)\n ),\n\n ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED),\n ...conflicts(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n ...conflicts(\n PorcelainFileStatus.UNMERGED,\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n\n [\n '##',\n (result, line) => {\n const aheadReg = /ahead (\\d+)/;\n const behindReg = /behind (\\d+)/;\n const currentReg = /^(.+?(?=(?:\\.{3}|\\s|$)))/;\n const trackingReg = /\\.{3}(\\S*)/;\n const onEmptyBranchReg = /\\son\\s(\\S+?)(?=\\.{3}|$)/;\n\n let regexResult = aheadReg.exec(line);\n result.ahead = (regexResult && +regexResult[1]) || 0;\n\n regexResult = behindReg.exec(line);\n result.behind = (regexResult && +regexResult[1]) || 0;\n\n regexResult = currentReg.exec(line);\n result.current = filterType(regexResult?.[1], filterString, null);\n\n regexResult = trackingReg.exec(line);\n result.tracking = filterType(regexResult?.[1], filterString, null);\n\n regexResult = onEmptyBranchReg.exec(line);\n if (regexResult) {\n result.current = filterType(regexResult?.[1], filterString, result.current);\n }\n\n result.detached = /\\(no branch\\)/.test(line);\n },\n ],\n]);\n\nexport const parseStatusSummary = function (text: string): StatusResult {\n const lines = text.split(NULL);\n const status = new StatusSummary();\n\n for (let i = 0, l = lines.length; i < l; ) {\n let line = lines[i++].trim();\n\n if (!line) {\n continue;\n }\n\n if (line.charAt(0) === PorcelainFileStatus.RENAMED) {\n line += NULL + (lines[i++] || '');\n }\n\n splitLine(status, line);\n }\n\n return status;\n};\n\nfunction splitLine(result: StatusResult, lineStr: string) {\n const trimmed = lineStr.trim();\n switch (' ') {\n case trimmed.charAt(2):\n return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.slice(3));\n case trimmed.charAt(1):\n return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.slice(2));\n default:\n return;\n }\n\n function data(index: string, workingDir: string, path: string) {\n const raw = `${index}${workingDir}`;\n const handler = parsers.get(raw);\n\n if (handler) {\n handler(result, path);\n }\n\n if (raw !== '##' && raw !== '!!') {\n result.files.push(new FileStatusSummary(path, index, workingDir));\n }\n }\n}\n", "import { StatusResult } from '../../../typings';\nimport { parseStatusSummary } from '../responses/StatusSummary';\nimport { StringTask } from '../types';\n\nconst ignoredOptions = ['--null', '-z'];\n\nexport function statusTask(customArgs: string[]): StringTask {\n const commands = [\n 'status',\n '--porcelain',\n '-b',\n '-u',\n '--null',\n ...customArgs.filter((arg) => !ignoredOptions.includes(arg)),\n ];\n\n return {\n format: 'utf-8',\n commands,\n parser(text: string) {\n return parseStatusSummary(text);\n },\n };\n}\n", "import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asNumber, ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nexport interface VersionResult {\n major: number;\n minor: number;\n patch: number | string;\n agent: string;\n installed: boolean;\n}\n\nconst NOT_INSTALLED = 'installed=false';\n\nfunction versionResponse(\n major = 0,\n minor = 0,\n patch: string | number = 0,\n agent = '',\n installed = true\n): VersionResult {\n return Object.defineProperty(\n {\n major,\n minor,\n patch,\n agent,\n installed,\n },\n 'toString',\n {\n value() {\n return `${this.major}.${this.minor}.${this.patch}`;\n },\n configurable: false,\n enumerable: false,\n }\n );\n}\n\nfunction notInstalledResponse() {\n return versionResponse(0, 0, 0, '', false);\n}\n\nexport default function (): Pick {\n return {\n version(this: SimpleGitApi) {\n return this._runTask({\n commands: ['--version'],\n format: 'utf-8',\n parser: versionParser,\n onError(result, error, done, fail) {\n if (result.exitCode === ExitCodes.NOT_FOUND) {\n return done(Buffer.from(NOT_INSTALLED));\n }\n\n fail(error);\n },\n });\n },\n };\n}\n\nconst parsers: LineParser[] = [\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*\\((.+)\\))?/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(\n result,\n versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)\n );\n }\n ),\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\D+)(.+)?$/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent));\n }\n ),\n];\n\nfunction versionParser(stdOut: string) {\n if (stdOut === NOT_INSTALLED) {\n return notInstalledResponse();\n }\n\n return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers, stdOut);\n}\n", "import { SimpleGitBase } from '../../typings';\nimport { taskCallback } from './task-callback';\nimport { changeWorkingDirectoryTask } from './tasks/change-working-directory';\nimport checkout from './tasks/checkout';\nimport countObjects from './tasks/count-objects';\nimport commit from './tasks/commit';\nimport config from './tasks/config';\nimport firstCommit from './tasks/first-commit';\nimport grep from './tasks/grep';\nimport { hashObjectTask } from './tasks/hash-object';\nimport { initTask } from './tasks/init';\nimport log from './tasks/log';\nimport { mergeTask } from './tasks/merge';\nimport { pushTask } from './tasks/push';\nimport show from './tasks/show';\nimport { statusTask } from './tasks/status';\nimport { configurationErrorTask, straightThroughStringTask } from './tasks/task';\nimport version from './tasks/version';\nimport { outputHandler, SimpleGitExecutor, SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport {\n asArray,\n filterString,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n} from './utils';\n\nexport class SimpleGitApi implements SimpleGitBase {\n constructor(private _executor: SimpleGitExecutor) {}\n\n protected _runTask(task: SimpleGitTask, then?: SimpleGitTaskCallback) {\n const chain = this._executor.chain();\n const promise = chain.push(task);\n\n if (then) {\n taskCallback(task, promise, then);\n }\n\n return Object.create(this, {\n then: { value: promise.then.bind(promise) },\n catch: { value: promise.catch.bind(promise) },\n _executor: { value: chain },\n });\n }\n\n add(files: string | string[]) {\n return this._runTask(\n straightThroughStringTask(['add', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n cwd(directory: string | { path: string; root?: boolean }) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof directory === 'string') {\n return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next);\n }\n\n if (typeof directory?.path === 'string') {\n return this._runTask(\n changeWorkingDirectoryTask(\n directory.path,\n (directory.root && this._executor) || undefined\n ),\n next\n );\n }\n\n return this._runTask(\n configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string'),\n next\n );\n }\n\n hashObject(path: string, write: boolean | unknown) {\n return this._runTask(\n hashObjectTask(path, write === true),\n trailingFunctionArgument(arguments)\n );\n }\n\n init(bare?: boolean | unknown) {\n return this._runTask(\n initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n merge() {\n return this._runTask(\n mergeTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n mergeFromTo(remote: string, branch: string) {\n if (!(filterString(remote) && filterString(branch))) {\n return this._runTask(\n configurationErrorTask(\n `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`\n )\n );\n }\n\n return this._runTask(\n mergeTask([remote, branch, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments, false)\n );\n }\n\n outputHandler(handler: outputHandler) {\n this._executor.outputHandler = handler;\n return this;\n }\n\n push() {\n const task = pushTask(\n {\n remote: filterType(arguments[0], filterString),\n branch: filterType(arguments[1], filterString),\n },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n }\n\n stash() {\n return this._runTask(\n straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n status() {\n return this._runTask(\n statusTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n}\n\nObject.assign(\n SimpleGitApi.prototype,\n checkout(),\n commit(),\n config(),\n countObjects(),\n firstCommit(),\n grep(),\n log(),\n show(),\n version()\n);\n", "import { append, remove } from '../utils';\nimport { createDeferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { createLogger } from '../git-logger';\n\ntype ScheduleCompleteCallback = () => void;\ntype ScheduledTask = Pick, 'promise' | 'done'> & {\n id: number;\n};\n\nconst createScheduledTask: () => ScheduledTask = (() => {\n let id = 0;\n return () => {\n id++;\n const { promise, done } = createDeferred();\n\n return {\n promise,\n done,\n id,\n };\n };\n})();\n\nexport class Scheduler {\n private logger = createLogger('', 'scheduler');\n private pending: ScheduledTask[] = [];\n private running: ScheduledTask[] = [];\n\n constructor(private concurrency = 2) {\n this.logger(`Constructed, concurrency=%s`, concurrency);\n }\n\n private schedule() {\n if (!this.pending.length || this.running.length >= this.concurrency) {\n this.logger(\n `Schedule attempt ignored, pending=%s running=%s concurrency=%s`,\n this.pending.length,\n this.running.length,\n this.concurrency\n );\n return;\n }\n\n const task = append(this.running, this.pending.shift()!);\n this.logger(`Attempting id=%s`, task.id);\n task.done(() => {\n this.logger(`Completing id=`, task.id);\n remove(this.running, task);\n this.schedule();\n });\n }\n\n next(): Promise {\n const { promise, id } = append(this.pending, createScheduledTask());\n this.logger(`Scheduling id=%s`, id);\n\n this.schedule();\n\n return promise;\n }\n}\n", "import { straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\n\nexport type ApplyOptions = Options &\n OptionFlags<\n | '--stat'\n | '--numstat'\n | '--summary'\n | '--check'\n | '--index'\n | '--intent-to-add'\n | '--3way'\n | '--apply'\n | '--no-add'\n | '-R'\n | '--reverse'\n | '--allow-binary-replacement'\n | '--binary'\n | '--reject'\n | '-z'\n | '--inaccurate-eof'\n | '--recount'\n | '--cached'\n | '--ignore-space-change'\n | '--ignore-whitespace'\n | '--verbose'\n | '--unsafe-paths'\n > &\n OptionFlags<'--whitespace', 'nowarn' | 'warn' | 'fix' | 'error' | 'error-all'> &\n OptionFlags<'--build-fake-ancestor' | '--exclude' | '--include' | '--directory', string> &\n OptionFlags<'-p' | '-C', number>;\n\nexport function applyPatchTask(patches: string[], customArgs: string[]): StringTask {\n return straightThroughStringTask(['apply', ...customArgs, ...patches]);\n}\n", "import {\n BranchMultiDeleteResult,\n BranchSingleDeleteFailure,\n BranchSingleDeleteResult,\n BranchSingleDeleteSuccess,\n} from '../../../typings';\n\nexport class BranchDeletionBatch implements BranchMultiDeleteResult {\n all: BranchSingleDeleteResult[] = [];\n branches: { [branchName: string]: BranchSingleDeleteResult } = {};\n errors: BranchSingleDeleteResult[] = [];\n\n get success(): boolean {\n return !this.errors.length;\n }\n}\n\nexport function branchDeletionSuccess(branch: string, hash: string): BranchSingleDeleteSuccess {\n return {\n branch,\n hash,\n success: true,\n };\n}\n\nexport function branchDeletionFailure(branch: string): BranchSingleDeleteFailure {\n return {\n branch,\n hash: null,\n success: false,\n };\n}\n\nexport function isSingleBranchDeleteFailure(\n test: BranchSingleDeleteResult\n): test is BranchSingleDeleteSuccess {\n return test.success;\n}\n", "import { BranchMultiDeleteResult } from '../../../typings';\nimport {\n BranchDeletionBatch,\n branchDeletionFailure,\n branchDeletionSuccess,\n} from '../responses/BranchDeleteSummary';\nimport { TaskParser } from '../types';\nimport { ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nconst deleteSuccessRegex = /(\\S+)\\s+\\(\\S+\\s([^)]+)\\)/;\nconst deleteErrorRegex = /^error[^']+'([^']+)'/m;\n\nconst parsers: LineParser[] = [\n new LineParser(deleteSuccessRegex, (result, [branch, hash]) => {\n const deletion = branchDeletionSuccess(branch, hash);\n\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n new LineParser(deleteErrorRegex, (result, [branch]) => {\n const deletion = branchDeletionFailure(branch);\n\n result.errors.push(deletion);\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n];\n\nexport const parseBranchDeletions: TaskParser = (\n stdOut,\n stdErr\n) => {\n return parseStringResponse(new BranchDeletionBatch(), parsers, [stdOut, stdErr]);\n};\n\nexport function hasBranchDeletionError(data: string, processExitCode: ExitCodes): boolean {\n return processExitCode === ExitCodes.ERROR && deleteErrorRegex.test(data);\n}\n", "import type { BranchSummary, BranchSummaryBranch } from '../../../typings';\n\nexport enum BranchStatusIdentifier {\n CURRENT = '*',\n LINKED = '+',\n}\n\nexport class BranchSummaryResult implements BranchSummary {\n public all: string[] = [];\n public branches: { [p: string]: BranchSummaryBranch } = {};\n public current: string = '';\n public detached: boolean = false;\n\n push(\n status: BranchStatusIdentifier | unknown,\n detached: boolean,\n name: string,\n commit: string,\n label: string\n ) {\n if (status === BranchStatusIdentifier.CURRENT) {\n this.detached = detached;\n this.current = name;\n }\n\n this.all.push(name);\n this.branches[name] = {\n current: status === BranchStatusIdentifier.CURRENT,\n linkedWorkTree: status === BranchStatusIdentifier.LINKED,\n name,\n commit,\n label,\n };\n }\n}\n", "import type { BranchSummary } from '../../../typings';\nimport { BranchStatusIdentifier, BranchSummaryResult } from '../responses/BranchSummary';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(\n /^([*+]\\s)?\\((?:HEAD )?detached (?:from|at) (\\S+)\\)\\s+([a-z0-9]+)\\s(.*)$/,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), true, name, commit, label);\n }\n ),\n new LineParser(\n /^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$/s,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), false, name, commit, label);\n }\n ),\n];\n\nconst currentBranchParser = new LineParser(/^(\\S+)$/s, (result, [name]) => {\n result.push(BranchStatusIdentifier.CURRENT, false, name, '', '');\n});\n\nfunction branchStatus(input?: string) {\n return input ? input.charAt(0) : '';\n}\n\nexport function parseBranchSummary(stdOut: string, currentOnly = false): BranchSummary {\n return parseStringResponse(\n new BranchSummaryResult(),\n currentOnly ? [currentBranchParser] : parsers,\n stdOut\n );\n}\n", "import { BranchMultiDeleteResult, BranchSingleDeleteResult, BranchSummary } from '../../../typings';\nimport { StringTask } from '../types';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete';\nimport { parseBranchSummary } from '../parsers/parse-branch';\nimport { bufferToString } from '../utils';\n\nexport function containsDeleteBranchCommand(commands: string[]) {\n const deleteCommands = ['-d', '-D', '--delete'];\n return commands.some((command) => deleteCommands.includes(command));\n}\n\nexport function branchTask(\n customArgs: string[]\n): StringTask {\n const isDelete = containsDeleteBranchCommand(customArgs);\n const isCurrentOnly = customArgs.includes('--show-current');\n\n const commands = ['branch', ...customArgs];\n\n if (commands.length === 1) {\n commands.push('-a');\n }\n\n if (!commands.includes('-v')) {\n commands.splice(1, 0, '-v');\n }\n\n return {\n format: 'utf-8',\n commands,\n parser(stdOut, stdErr) {\n if (isDelete) {\n return parseBranchDeletions(stdOut, stdErr).all[0];\n }\n\n return parseBranchSummary(stdOut, isCurrentOnly);\n },\n };\n}\n\nexport function branchLocalTask(): StringTask {\n return {\n format: 'utf-8',\n commands: ['branch', '-v'],\n parser(stdOut) {\n return parseBranchSummary(stdOut);\n },\n };\n}\n\nexport function deleteBranchesTask(\n branches: string[],\n forceDelete = false\n): StringTask {\n return {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr);\n },\n onError({ exitCode, stdOut }, error, done, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n done(stdOut);\n },\n };\n}\n\nexport function deleteBranchTask(\n branch: string,\n forceDelete = false\n): StringTask {\n const task: StringTask = {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr).branches[branch]!;\n },\n onError({ exitCode, stdErr, stdOut }, error, _, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n throw new GitResponseError(\n task.parser(bufferToString(stdOut), bufferToString(stdErr)),\n String(error)\n );\n },\n };\n\n return task;\n}\n", "import { normalize } from 'node:path';\n\n/**\n * Parser for the `check-ignore` command - returns each file as a string array\n */\nexport const parseCheckIgnore = (text: string): string[] => {\n return text.split(/\\n/g).map(toPath).filter(Boolean);\n};\n\nfunction toPath(input: string) {\n const path = input.trim().replace(/^[\"']|[\"']$/g, '');\n return path && normalize(path);\n}\n", "import { StringTask } from '../types';\nimport { parseCheckIgnore } from '../responses/CheckIgnore';\n\nexport function checkIgnoreTask(paths: string[]): StringTask {\n return {\n commands: ['check-ignore', ...paths],\n format: 'utf-8',\n parser: parseCheckIgnore,\n };\n}\n", "import { configurationErrorTask, EmptyTask, straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\nimport { append, filterString } from '../utils';\n\nexport type CloneOptions = Options &\n OptionFlags<\n | '--bare'\n | '--dissociate'\n | '--mirror'\n | '--no-checkout'\n | '--no-remote-submodules'\n | '--no-shallow-submodules'\n | '--no-single-branch'\n | '--no-tags'\n | '--remote-submodules'\n | '--single-branch'\n | '--shallow-submodules'\n | '--verbose'\n > &\n OptionFlags<'--depth' | '-j' | '--jobs', number> &\n OptionFlags<\n | '--branch'\n | '--origin'\n | '--recurse-submodules'\n | '--separate-git-dir'\n | '--shallow-exclude'\n | '--shallow-since'\n | '--template',\n string\n >;\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function cloneTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n): StringTask | EmptyTask {\n const commands = ['clone', ...customArgs];\n\n filterString(repo) && commands.push(repo);\n filterString(directory) && commands.push(directory);\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function cloneMirrorTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n) {\n append(customArgs, '--mirror');\n\n return cloneTask(repo, directory, customArgs);\n}\n", "import { FetchResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/From (.+)$/, (result, [remote]) => {\n result.remote = remote;\n }),\n new LineParser(/\\* \\[new branch]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.branches.push({\n name,\n tracking,\n });\n }),\n new LineParser(/\\* \\[new tag]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.tags.push({\n name,\n tracking,\n });\n }),\n new LineParser(/- \\[deleted]\\s+\\S+\\s*-> (.+)$/, (result, [tracking]) => {\n result.deleted.push({\n tracking,\n });\n }),\n new LineParser(\n /\\s*([^.]+)\\.\\.(\\S+)\\s+(\\S+)\\s*-> (.+)$/,\n (result, [from, to, name, tracking]) => {\n result.updated.push({\n name,\n tracking,\n to,\n from,\n });\n }\n ),\n];\n\nexport function parseFetchResult(stdOut: string, stdErr: string): FetchResult {\n const result: FetchResult = {\n raw: stdOut,\n remote: null,\n branches: [],\n tags: [],\n updated: [],\n deleted: [],\n };\n return parseStringResponse(result, parsers, [stdOut, stdErr]);\n}\n", "import { FetchResult } from '../../../typings';\nimport { parseFetchResult } from '../parsers/parse-fetch';\nimport { StringTask } from '../types';\n\nimport { configurationErrorTask, EmptyTask } from './task';\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function fetchTask(\n remote: string,\n branch: string,\n customArgs: string[]\n): StringTask | EmptyTask {\n const commands = ['fetch', ...customArgs];\n if (remote && branch) {\n commands.push(remote, branch);\n }\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: parseFetchResult,\n };\n}\n", "import { MoveResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => {\n result.moves.push({ from, to });\n }),\n];\n\nexport function parseMoveResult(stdOut: string): MoveResult {\n return parseStringResponse({ moves: [] }, parsers, stdOut);\n}\n", "import { MoveResult } from '../../../typings';\nimport { parseMoveResult } from '../parsers/parse-move';\nimport { StringTask } from '../types';\nimport { asArray } from '../utils';\n\nexport function moveTask(from: string | string[], to: string): StringTask {\n return {\n commands: ['mv', '-v', ...asArray(from), to],\n format: 'utf-8',\n parser: parseMoveResult,\n };\n}\n", "import { PullResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parsePullErrorResult, parsePullResult } from '../parsers/parse-pull';\nimport { Maybe, StringTask } from '../types';\nimport { bufferToString } from '../utils';\n\nexport function pullTask(\n remote: Maybe,\n branch: Maybe,\n customArgs: string[]\n): StringTask {\n const commands: string[] = ['pull', ...customArgs];\n if (remote && branch) {\n commands.splice(1, 0, remote, branch);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(stdOut, stdErr): PullResult {\n return parsePullResult(stdOut, stdErr);\n },\n onError(result, _error, _done, fail) {\n const pullError = parsePullErrorResult(\n bufferToString(result.stdOut),\n bufferToString(result.stdErr)\n );\n if (pullError) {\n return fail(new GitResponseError(pullError));\n }\n\n fail(_error);\n },\n };\n}\n", "import { forEachLineWithContent } from '../utils';\n\nexport interface RemoteWithoutRefs {\n name: string;\n}\n\nexport interface RemoteWithRefs extends RemoteWithoutRefs {\n refs: {\n fetch: string;\n push: string;\n };\n}\n\nexport function parseGetRemotes(text: string): RemoteWithoutRefs[] {\n const remotes: { [name: string]: RemoteWithoutRefs } = {};\n\n forEach(text, ([name]) => (remotes[name] = { name }));\n\n return Object.values(remotes);\n}\n\nexport function parseGetRemotesVerbose(text: string): RemoteWithRefs[] {\n const remotes: { [name: string]: RemoteWithRefs } = {};\n\n forEach(text, ([name, url, purpose]) => {\n if (!Object.hasOwn(remotes, name)) {\n remotes[name] = {\n name: name,\n refs: { fetch: '', push: '' },\n };\n }\n\n if (purpose && url) {\n remotes[name].refs[purpose.replace(/[^a-z]/g, '') as keyof RemoteWithRefs['refs']] = url;\n }\n });\n\n return Object.values(remotes);\n}\n\nfunction forEach(text: string, handler: (line: string[]) => void) {\n forEachLineWithContent(text, (line) => handler(line.split(/\\s+/)));\n}\n", "import {\n parseGetRemotes,\n parseGetRemotesVerbose,\n type RemoteWithoutRefs,\n type RemoteWithRefs,\n} from '../responses/GetRemoteSummary';\nimport type { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addRemoteTask(\n remoteName: string,\n remoteRepo: string,\n customArgs: string[]\n): StringTask {\n return straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]);\n}\n\nexport function getRemotesTask(verbose: true): StringTask;\nexport function getRemotesTask(verbose: false): StringTask;\nexport function getRemotesTask(\n verbose: boolean\n): StringTask {\n const commands = ['remote'];\n if (verbose) {\n commands.push('-v');\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: verbose ? parseGetRemotesVerbose : parseGetRemotes,\n };\n}\n\nexport function listRemotesTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'ls-remote') {\n commands.unshift('ls-remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function remoteTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'remote') {\n commands.unshift('remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function removeRemoteTask(remoteName: string) {\n return straightThroughStringTask(['remote', 'remove', remoteName]);\n}\n", "import { LogOptions, LogResult } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { createListLogSummaryParser } from '../parsers/parse-list-log-summary';\nimport type { StringTask } from '../types';\nimport { validateLogFormatConfig } from './diff';\nimport { parseLogOptions } from './log';\nimport type { EmptyTask } from './task';\n\nexport function stashListTask(\n opt: LogOptions = {},\n customArgs: string[]\n): EmptyTask | StringTask {\n const options = parseLogOptions(opt);\n const commands = ['stash', 'list', ...options.commands, ...customArgs];\n const parser = createListLogSummaryParser(\n options.splitter,\n options.fields,\n logFormatFromCommand(commands)\n );\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser,\n }\n );\n}\n", "import { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addSubModuleTask(repo: string, path: string): StringTask {\n return subModuleTask(['add', repo, path]);\n}\n\nexport function initSubModuleTask(customArgs: string[]): StringTask {\n return subModuleTask(['init', ...customArgs]);\n}\n\nexport function subModuleTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'submodule') {\n commands.unshift('submodule');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function updateSubModuleTask(customArgs: string[]): StringTask {\n return subModuleTask(['update', ...customArgs]);\n}\n", "import { TagResult } from '../../../typings';\n\nexport class TagList implements TagResult {\n constructor(\n public readonly all: string[],\n public readonly latest: string | undefined\n ) {}\n}\n\nexport const parseTagList = function (data: string, customSort = false) {\n const tags = data.split('\\n').map(trimmed).filter(Boolean);\n\n if (!customSort) {\n tags.sort(function (tagA, tagB) {\n const partsA = tagA.split('.');\n const partsB = tagB.split('.');\n\n if (partsA.length === 1 || partsB.length === 1) {\n return singleSorted(toNumber(partsA[0]), toNumber(partsB[0]));\n }\n\n for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) {\n const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i]));\n\n if (diff) {\n return diff;\n }\n }\n\n return 0;\n });\n }\n\n const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0);\n\n return new TagList(tags, latest);\n};\n\nfunction singleSorted(a: number, b: number): number {\n const aIsNum = Number.isNaN(a);\n const bIsNum = Number.isNaN(b);\n\n if (aIsNum !== bIsNum) {\n return aIsNum ? 1 : -1;\n }\n\n return aIsNum ? sorted(a, b) : 0;\n}\n\nfunction sorted(a: number, b: number) {\n return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction trimmed(input: string) {\n return input.trim();\n}\n\nfunction toNumber(input: string | undefined) {\n if (typeof input === 'string') {\n return parseInt(input.replace(/^\\D+/g, ''), 10) || 0;\n }\n\n return 0;\n}\n", "import { TagResult } from '../../../typings';\nimport { parseTagList } from '../responses/TagList';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.tags`\n */\nexport function tagListTask(customArgs: string[] = []): StringTask {\n const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option));\n\n return {\n format: 'utf-8',\n commands: ['tag', '-l', ...customArgs],\n parser(text: string) {\n return parseTagList(text, hasCustomSort);\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addTagTask(name: string): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', name],\n parser() {\n return { name };\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addAnnotatedTagTask(\n name: string,\n tagMessage: string\n): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', '-a', '-m', tagMessage, name],\n parser() {\n return { name };\n },\n };\n}\n", "const { GitExecutor } = require('./lib/runners/git-executor');\nconst { SimpleGitApi } = require('./lib/simple-git-api');\n\nconst { Scheduler } = require('./lib/runners/scheduler');\nconst { configurationErrorTask } = require('./lib/tasks/task');\nconst {\n asArray,\n filterArray,\n filterPrimitives,\n filterString,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} = require('./lib/utils');\nconst { applyPatchTask } = require('./lib/tasks/apply-patch');\nconst {\n branchTask,\n branchLocalTask,\n deleteBranchesTask,\n deleteBranchTask,\n} = require('./lib/tasks/branch');\nconst { checkIgnoreTask } = require('./lib/tasks/check-ignore');\nconst { checkIsRepoTask } = require('./lib/tasks/check-is-repo');\nconst { cloneTask, cloneMirrorTask } = require('./lib/tasks/clone');\nconst { cleanWithOptionsTask, isCleanOptionsArray } = require('./lib/tasks/clean');\nconst { diffSummaryTask } = require('./lib/tasks/diff');\nconst { fetchTask } = require('./lib/tasks/fetch');\nconst { moveTask } = require('./lib/tasks/move');\nconst { pullTask } = require('./lib/tasks/pull');\nconst { pushTagsTask } = require('./lib/tasks/push');\nconst {\n addRemoteTask,\n getRemotesTask,\n listRemotesTask,\n remoteTask,\n removeRemoteTask,\n} = require('./lib/tasks/remote');\nconst { getResetMode, resetTask } = require('./lib/tasks/reset');\nconst { stashListTask } = require('./lib/tasks/stash-list');\nconst {\n addSubModuleTask,\n initSubModuleTask,\n subModuleTask,\n updateSubModuleTask,\n} = require('./lib/tasks/sub-module');\nconst { addAnnotatedTagTask, addTagTask, tagListTask } = require('./lib/tasks/tag');\nconst { straightThroughBufferTask, straightThroughStringTask } = require('./lib/tasks/task');\n\nfunction Git(options, plugins) {\n this._plugins = plugins;\n this._executor = new GitExecutor(\n options.baseDir,\n new Scheduler(options.maxConcurrentProcesses),\n plugins\n );\n\n this._trimmed = options.trimmed;\n}\n\n(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git;\n\n/**\n * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on\n * the system path, or a fully qualified path to the executable.\n */\nGit.prototype.customBinary = function (command) {\n this._plugins.reconfigure('binary', command);\n return this;\n};\n\n/**\n * Sets an environment variable for the spawned child process, either supply both a name and value as strings or\n * a single object to entirely replace the current environment variables.\n *\n * @param {string|Object} name\n * @param {string} [value]\n * @returns {Git}\n */\nGit.prototype.env = function (name, value) {\n if (arguments.length === 1 && typeof name === 'object') {\n this._executor.env = name;\n } else {\n (this._executor.env = this._executor.env || {})[name] = value;\n }\n\n return this;\n};\n\n/**\n * List the stash(s) of the local repo\n */\nGit.prototype.stashList = function (options) {\n return this._runTask(\n stashListTask(\n trailingOptionsArgument(arguments) || {},\n (filterArray(options) && options) || []\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\nfunction createCloneTask(api, task, repoPath, localPath) {\n if (typeof repoPath !== 'string') {\n return configurationErrorTask(`git.${api}() requires a string 'repoPath'`);\n }\n\n return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments));\n}\n\n/**\n * Clone a git repo\n */\nGit.prototype.clone = function () {\n return this._runTask(\n createCloneTask('clone', cloneTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Mirror a git repo\n */\nGit.prototype.mirror = function () {\n return this._runTask(\n createCloneTask('mirror', cloneMirrorTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Moves one or more files to a new destination.\n *\n * @see https://git-scm.com/docs/git-mv\n *\n * @param {string|string[]} from\n * @param {string} to\n */\nGit.prototype.mv = function (from, to) {\n return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments));\n};\n\n/**\n * Internally uses pull and tags to get the list of tags then checks out the latest tag.\n *\n * @param {Function} [then]\n */\nGit.prototype.checkoutLatestTag = function (then) {\n var git = this;\n return this.pull(function () {\n git.tags(function (err, tags) {\n git.checkout(tags.latest, then);\n });\n });\n};\n\n/**\n * Pull the updated contents of the current repo\n */\nGit.prototype.pull = function (remote, branch, options, then) {\n return this._runTask(\n pullTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Fetch the updated contents of the current repo.\n *\n * @example\n * .fetch('upstream', 'master') // fetches from master on remote named upstream\n * .fetch(function () {}) // runs fetch against default remote and branch and calls function\n *\n * @param {string} [remote]\n * @param {string} [branch]\n */\nGit.prototype.fetch = function (remote, branch) {\n return this._runTask(\n fetchTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in\n * a production environment.\n *\n * @param {boolean} silence\n * @returns {Git}\n */\nGit.prototype.silent = function (silence) {\n console.warn(\n 'simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'\n );\n return this;\n};\n\n/**\n * List all tags. When using git 2.7.0 or above, include an options object with `\"--sort\": \"property-name\"` to\n * sort the tags by that property instead of using the default semantic versioning sort.\n *\n * Note, supplying this option when it is not supported by your Git version will cause the operation to fail.\n *\n * @param {Object} [options]\n * @param {Function} [then]\n */\nGit.prototype.tags = function (options, then) {\n return this._runTask(\n tagListTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Rebases the current working copy. Options can be supplied either as an array of string parameters\n * to be sent to the `git rebase` command, or a standard options object.\n */\nGit.prototype.rebase = function () {\n return this._runTask(\n straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Reset a repo\n */\nGit.prototype.reset = function (mode) {\n return this._runTask(\n resetTask(getResetMode(mode), getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Revert one or more commits in the local working copy\n */\nGit.prototype.revert = function (commit) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof commit !== 'string') {\n return this._runTask(configurationErrorTask('Commit must be a string'), next);\n }\n\n return this._runTask(\n straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]),\n next\n );\n};\n\n/**\n * Add a lightweight tag to the head of the current branch\n */\nGit.prototype.addTag = function (name) {\n const task =\n typeof name === 'string'\n ? addTagTask(name)\n : configurationErrorTask('Git.addTag requires a tag name');\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Add an annotated tag to the head of the current branch\n */\nGit.prototype.addAnnotatedTag = function (tagName, tagMessage) {\n return this._runTask(\n addAnnotatedTagTask(tagName, tagMessage),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete a local branch\n */\nGit.prototype.deleteLocalBranch = function (branchName, forceDelete, then) {\n return this._runTask(\n deleteBranchTask(branchName, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete one or more local branches\n */\nGit.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) {\n return this._runTask(\n deleteBranchesTask(branchNames, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * List all branches\n *\n * @param {Object | string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.branch = function (options, then) {\n return this._runTask(\n branchTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Return list of local branches\n *\n * @param {Function} [then]\n */\nGit.prototype.branchLocal = function (then) {\n return this._runTask(branchLocalTask(), trailingFunctionArgument(arguments));\n};\n\n/**\n * Executes any command against the git binary.\n */\nGit.prototype.raw = function (commands) {\n const createRestCommands = !Array.isArray(commands);\n const command = [].slice.call(createRestCommands ? arguments : commands, 0);\n\n for (let i = 0; i < command.length && createRestCommands; i++) {\n if (!filterPrimitives(command[i])) {\n command.splice(i, command.length - i);\n break;\n }\n }\n\n command.push(...getTrailingOptions(arguments, 0, true));\n\n var next = trailingFunctionArgument(arguments);\n\n if (!command.length) {\n return this._runTask(\n configurationErrorTask('Raw: must supply one or more command to execute'),\n next\n );\n }\n\n return this._runTask(straightThroughStringTask(command, this._trimmed), next);\n};\n\nGit.prototype.submoduleAdd = function (repo, path, then) {\n return this._runTask(addSubModuleTask(repo, path), trailingFunctionArgument(arguments));\n};\n\nGit.prototype.submoduleUpdate = function (args, then) {\n return this._runTask(\n updateSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.submoduleInit = function (args, then) {\n return this._runTask(\n initSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.subModule = function (options, then) {\n return this._runTask(\n subModuleTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.listRemote = function () {\n return this._runTask(\n listRemotesTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Adds a remote to the list of remotes.\n */\nGit.prototype.addRemote = function (remoteName, remoteRepo, then) {\n return this._runTask(\n addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes an entry by name from the list of remotes.\n */\nGit.prototype.removeRemote = function (remoteName, then) {\n return this._runTask(removeRemoteTask(remoteName), trailingFunctionArgument(arguments));\n};\n\n/**\n * Gets the currently available remotes, setting the optional verbose argument to true includes additional\n * detail on the remotes themselves.\n */\nGit.prototype.getRemotes = function (verbose, then) {\n return this._runTask(getRemotesTask(verbose === true), trailingFunctionArgument(arguments));\n};\n\n/**\n * Call any `git remote` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.remote = function (options, then) {\n return this._runTask(\n remoteTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Call any `git tag` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.tag = function (options, then) {\n const command = getTrailingOptions(arguments);\n\n if (command[0] !== 'tag') {\n command.unshift('tag');\n }\n\n return this._runTask(straightThroughStringTask(command), trailingFunctionArgument(arguments));\n};\n\n/**\n * Updates repository server info\n *\n * @param {Function} [then]\n */\nGit.prototype.updateServerInfo = function (then) {\n return this._runTask(\n straightThroughStringTask(['update-server-info']),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the\n * default configured remote spec.\n *\n * @param {string} [remote]\n * @param {Function} [then]\n */\nGit.prototype.pushTags = function (remote, then) {\n const task = pushTagsTask(\n { remote: filterType(remote, filterString) },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Removes the named files from source control.\n */\nGit.prototype.rm = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '-f', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To\n * completely remove the files, use `rm`.\n *\n * @param {string|string[]} files\n */\nGit.prototype.rmKeepLocal = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '--cached', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content,\n * size, and type.\n *\n * Passing \"-p\" will instruct cat-file to determine the object type, and display its formatted contents.\n *\n * @param {string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.catFile = function (options, then) {\n return this._catFile('utf-8', arguments);\n};\n\nGit.prototype.binaryCatFile = function () {\n return this._catFile('buffer', arguments);\n};\n\nGit.prototype._catFile = function (format, args) {\n var handler = trailingFunctionArgument(args);\n var command = ['cat-file'];\n var options = args[0];\n\n if (typeof options === 'string') {\n return this._runTask(\n configurationErrorTask('Git.catFile: options must be supplied as an array of strings'),\n handler\n );\n }\n\n if (Array.isArray(options)) {\n command.push.apply(command, options);\n }\n\n const task =\n format === 'buffer' ? straightThroughBufferTask(command) : straightThroughStringTask(command);\n\n return this._runTask(task, handler);\n};\n\nGit.prototype.diff = function (options, then) {\n const task = filterString(options)\n ? configurationErrorTask(\n 'git.diff: supplying options as a single string is no longer supported, switch to an array of strings'\n )\n : straightThroughStringTask(['diff', ...getTrailingOptions(arguments)]);\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.diffSummary = function () {\n return this._runTask(\n diffSummaryTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.applyPatch = function (patches) {\n const task = !filterStringOrStringArray(patches)\n ? configurationErrorTask(\n `git.applyPatch requires one or more string patches as the first argument`\n )\n : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1)));\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.revparse = function () {\n const commands = ['rev-parse', ...getTrailingOptions(arguments, true)];\n return this._runTask(\n straightThroughStringTask(commands, true),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n */\nGit.prototype.clean = function (mode, options, then) {\n const usingCleanOptionsArray = isCleanOptionsArray(mode);\n const cleanMode =\n (usingCleanOptionsArray && mode.join('')) || filterType(mode, filterString) || '';\n const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0));\n\n return this._runTask(\n cleanWithOptionsTask(cleanMode, customArgs),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.exec = function (then) {\n const task = {\n commands: [],\n format: 'utf-8',\n parser() {\n if (typeof then === 'function') {\n then();\n }\n },\n };\n\n return this._runTask(task);\n};\n\n/**\n * Clears the queue of pending commands and returns the wrapper instance for chaining.\n *\n * @returns {Git}\n */\nGit.prototype.clearQueue = function () {\n // TODO:\n // this._executor.clear();\n return this;\n};\n\n/**\n * Check if a pathname or pathnames are excluded by .gitignore\n *\n * @param {string|string[]} pathnames\n * @param {Function} [then]\n */\nGit.prototype.checkIgnore = function (pathnames, then) {\n return this._runTask(\n checkIgnoreTask(asArray(filterType(pathnames, filterStringOrStringArray, []))),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.checkIsRepo = function (checkType, then) {\n return this._runTask(\n checkIsRepoTask(filterType(checkType, filterString)),\n trailingFunctionArgument(arguments)\n );\n};\n\nmodule.exports = Git;\n", "import { pathspec } from './args/pathspec';\nimport { GitConstructError } from './errors/git-construct-error';\nimport { GitError } from './errors/git-error';\nimport { GitPluginError } from './errors/git-plugin-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { TaskConfigurationError } from './errors/task-configuration-error';\nimport { CheckRepoActions } from './tasks/check-is-repo';\nimport { CleanOptions } from './tasks/clean';\nimport { GitConfigScope } from './tasks/config';\nimport { DiffNameStatus } from './tasks/diff-name-status';\nimport { grepQueryBuilder } from './tasks/grep';\nimport { ResetMode } from './tasks/reset';\n\nexport {\n CheckRepoActions,\n CleanOptions,\n DiffNameStatus,\n GitConfigScope,\n GitConstructError,\n GitError,\n GitPluginError,\n GitResponseError,\n ResetMode,\n TaskConfigurationError,\n grepQueryBuilder,\n pathspec,\n};\n", "import { GitError } from './git-error';\nimport { SimpleGitOptions } from '../types';\n\n/**\n * The `GitConstructError` is thrown when an error occurs in the constructor\n * of the `simple-git` instance itself. Most commonly as a result of using\n * a `baseDir` option that points to a folder that either does not exist,\n * or cannot be read by the user the node script is running as.\n *\n * Check the `.message` property for more detail including the properties\n * passed to the constructor.\n */\nexport class GitConstructError extends GitError {\n constructor(\n public readonly config: SimpleGitOptions,\n message: string\n ) {\n super(undefined, message);\n }\n}\n", "import { SimpleGitOptions, SimpleGitTask } from '../types';\nimport { GitError } from './git-error';\n\nexport class GitPluginError extends GitError {\n constructor(\n public task?: SimpleGitTask,\n public readonly plugin?: keyof SimpleGitOptions,\n message?: string\n ) {\n super(task, message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n", "import { SimpleGitOptions } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function abortPlugin(signal: SimpleGitOptions['abort']) {\n if (!signal) {\n return;\n }\n\n const onSpawnAfter: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n function kill() {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort signal received'));\n }\n\n signal.addEventListener('abort', kill);\n\n context.spawned.on('close', () => signal.removeEventListener('abort', kill));\n },\n };\n\n const onSpawnBefore: SimpleGitPlugin<'spawn.before'> = {\n type: 'spawn.before',\n action(_data, context) {\n if (signal.aborted) {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort already signaled'));\n }\n },\n };\n\n return [onSpawnBefore, onSpawnAfter];\n}\n", "import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport type { SimpleGitPluginConfig } from '../types';\n\nfunction isConfigSwitch(arg: string | unknown) {\n return typeof arg === 'string' && arg.trim().toLowerCase() === '-c';\n}\n\nfunction preventProtocolOverride(arg: string, next: string) {\n if (!isConfigSwitch(arg)) {\n return;\n }\n\n if (!/^\\s*protocol(.[a-z]+)?.allow/.test(next)) {\n return;\n }\n\n throw new GitPluginError(\n undefined,\n 'unsafe',\n 'Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol'\n );\n}\n\nfunction preventUploadPack(arg: string, method: string) {\n if (/^\\s*--(upload|receive)-pack/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'clone' && /^\\s*-u\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of clone with option -u is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'push' && /^\\s*--exec\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of push with option --exec is not permitted without enabling allowUnsafePack`\n );\n }\n}\n\nexport function blockUnsafeOperationsPlugin({\n allowUnsafeProtocolOverride = false,\n allowUnsafePack = false,\n}: SimpleGitPluginConfig['unsafe'] = {}): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(args, context) {\n args.forEach((current, index) => {\n const next = index < args.length ? args[index + 1] : '';\n\n allowUnsafeProtocolOverride || preventProtocolOverride(current, next);\n allowUnsafePack || preventUploadPack(current, context.method);\n });\n\n return args;\n },\n };\n}\n", "import { prefixedArray } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function commandConfigPrefixingPlugin(\n configuration: string[]\n): SimpleGitPlugin<'spawn.args'> {\n const prefix = prefixedArray(configuration, '-c');\n\n return {\n type: 'spawn.args',\n action(data) {\n return [...prefix, ...data];\n },\n };\n}\n", "import { deferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { SimpleGitPluginConfig } from '../types';\nimport { delay } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nconst never = deferred().promise;\n\nexport function completionDetectionPlugin({\n onClose = true,\n onExit = 50,\n}: SimpleGitPluginConfig['completion'] = {}): SimpleGitPlugin<'spawn.after'> {\n function createEvents() {\n let exitCode = -1;\n const events = {\n close: deferred(),\n closeTimeout: deferred(),\n exit: deferred(),\n exitTimeout: deferred(),\n };\n\n const result = Promise.race([\n onClose === false ? never : events.closeTimeout.promise,\n onExit === false ? never : events.exitTimeout.promise,\n ]);\n\n configureTimeout(onClose, events.close, events.closeTimeout);\n configureTimeout(onExit, events.exit, events.exitTimeout);\n\n return {\n close(code: number) {\n exitCode = code;\n events.close.done();\n },\n exit(code: number) {\n exitCode = code;\n events.exit.done();\n },\n get exitCode() {\n return exitCode;\n },\n result,\n };\n }\n\n function configureTimeout(\n flag: boolean | number,\n event: DeferredPromise,\n timeout: DeferredPromise\n ) {\n if (flag === false) {\n return;\n }\n\n (flag === true ? event.promise : event.promise.then(() => delay(flag))).then(timeout.done);\n }\n\n return {\n type: 'spawn.after',\n async action(_data, { spawned, close }) {\n const events = createEvents();\n\n let deferClose = true;\n let quickClose = () => void (deferClose = false);\n\n spawned.stdout?.on('data', quickClose);\n spawned.stderr?.on('data', quickClose);\n spawned.on('error', quickClose);\n\n spawned.on('close', (code: number) => events.close(code));\n spawned.on('exit', (code: number) => events.exit(code));\n\n try {\n await events.result;\n if (deferClose) {\n await delay(50);\n }\n close(events.exitCode);\n } catch (err) {\n close(events.exitCode, err as Error);\n }\n },\n };\n}\n", "import type { SimpleGitOptions } from '../types';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport { asArray } from '../utils';\nimport { PluginStore } from './plugin-store';\n\nconst WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`;\nconst WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`;\n\nfunction isBadArgument(arg: string) {\n return !arg || !/^([a-z]:)?([a-z0-9/.\\\\_~-]+)$/i.test(arg);\n}\n\nfunction toBinaryConfig(\n input: string[],\n allowUnsafe: boolean\n): { binary: string; prefix?: string } {\n if (input.length < 1 || input.length > 2) {\n throw new GitPluginError(undefined, 'binary', WRONG_NUMBER_ERR);\n }\n\n const isBad = input.some(isBadArgument);\n if (isBad) {\n if (allowUnsafe) {\n console.warn(WRONG_CHARS_ERR);\n } else {\n throw new GitPluginError(undefined, 'binary', WRONG_CHARS_ERR);\n }\n }\n\n const [binary, prefix] = input;\n return {\n binary,\n prefix,\n };\n}\n\nexport function customBinaryPlugin(\n plugins: PluginStore,\n input: SimpleGitOptions['binary'] = ['git'],\n allowUnsafe = false\n) {\n let config = toBinaryConfig(asArray(input), allowUnsafe);\n\n plugins.on('binary', (input) => {\n config = toBinaryConfig(asArray(input), allowUnsafe);\n });\n\n plugins.append('spawn.binary', () => {\n return config.binary;\n });\n\n plugins.append('spawn.args', (data) => {\n return config.prefix ? [config.prefix, ...data] : data;\n });\n}\n", "import { GitError } from '../errors/git-error';\nimport { GitExecutorResult, SimpleGitPluginConfig } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\ntype TaskResult = Omit;\n\nfunction isTaskError(result: TaskResult) {\n return !!(result.exitCode && result.stdErr.length);\n}\n\nfunction getErrorMessage(result: TaskResult) {\n return Buffer.concat([...result.stdOut, ...result.stdErr]);\n}\n\nexport function errorDetectionHandler(\n overwrite = false,\n isError = isTaskError,\n errorMessage: (result: TaskResult) => Buffer | Error = getErrorMessage\n) {\n return (error: Buffer | Error | undefined, result: TaskResult) => {\n if ((!overwrite && error) || !isError(result)) {\n return error;\n }\n\n return errorMessage(result);\n };\n}\n\nexport function errorDetectionPlugin(\n config: SimpleGitPluginConfig['errors']\n): SimpleGitPlugin<'task.error'> {\n return {\n type: 'task.error',\n action(data, context) {\n const error = config(data.error, {\n stdErr: context.stdErr,\n stdOut: context.stdOut,\n exitCode: context.exitCode,\n });\n\n if (Buffer.isBuffer(error)) {\n return { error: new GitError(undefined, error.toString('utf-8')) };\n }\n\n return {\n error,\n };\n },\n };\n}\n", "import { EventEmitter } from 'node:events';\n\nimport type {\n SimpleGitPlugin,\n SimpleGitPluginType,\n SimpleGitPluginTypes,\n} from './simple-git-plugin';\nimport { append, asArray } from '../utils';\nimport type { SimpleGitPluginConfig } from '../types';\n\nexport class PluginStore {\n private plugins: Set> = new Set();\n private events = new EventEmitter();\n\n on(\n type: K,\n listener: (data: SimpleGitPluginConfig[K]) => void\n ) {\n this.events.on(type, listener);\n }\n\n reconfigure(type: K, data: SimpleGitPluginConfig[K]) {\n this.events.emit(type, data);\n }\n\n public append(type: T, action: SimpleGitPlugin['action']) {\n const plugin = append(this.plugins, { type, action });\n\n return () => this.plugins.delete(plugin);\n }\n\n public add(\n plugin: void | SimpleGitPlugin | SimpleGitPlugin[]\n ) {\n const plugins: SimpleGitPlugin[] = [];\n\n asArray(plugin).forEach((plugin) => plugin && this.plugins.add(append(plugins, plugin)));\n\n return () => {\n plugins.forEach((plugin) => this.plugins.delete(plugin));\n };\n }\n\n public exec(\n type: T,\n data: SimpleGitPluginTypes[T]['data'],\n context: SimpleGitPluginTypes[T]['context']\n ): typeof data {\n let output = data;\n const contextual = Object.freeze(Object.create(context));\n\n for (const plugin of this.plugins) {\n if (plugin.type === type) {\n output = plugin.action(output, contextual);\n }\n }\n\n return output;\n }\n}\n", "import { SimpleGitOptions } from '../types';\nimport { asNumber, including } from '../utils';\n\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function progressMonitorPlugin(progress: Exclude) {\n const progressCommand = '--progress';\n const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push'];\n\n const onProgress: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n if (!context.commands.includes(progressCommand)) {\n return;\n }\n\n context.spawned.stderr?.on('data', (chunk: Buffer) => {\n const message = /^([\\s\\S]+?):\\s*(\\d+)% \\((\\d+)\\/(\\d+)\\)/.exec(chunk.toString('utf8'));\n if (!message) {\n return;\n }\n\n progress({\n method: context.method,\n stage: progressEventStage(message[1]),\n progress: asNumber(message[2]),\n processed: asNumber(message[3]),\n total: asNumber(message[4]),\n });\n });\n },\n };\n\n const onArgs: SimpleGitPlugin<'spawn.args'> = {\n type: 'spawn.args',\n action(args, context) {\n if (!progressMethods.includes(context.method)) {\n return args;\n }\n\n return including(args, progressCommand);\n },\n };\n\n return [onArgs, onProgress];\n}\n\nfunction progressEventStage(input: string) {\n return String(input.toLowerCase().split(' ', 1)) || 'unknown';\n}\n", "import { SpawnOptions } from 'child_process';\nimport { pick } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function spawnOptionsPlugin(\n spawnOptions: Partial\n): SimpleGitPlugin<'spawn.options'> {\n const options = pick(spawnOptions, ['uid', 'gid']);\n\n return {\n type: 'spawn.options',\n action(data) {\n return { ...options, ...data };\n },\n };\n}\n", "import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport type { SimpleGitOptions } from '../types';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function timeoutPlugin({\n block,\n stdErr = true,\n stdOut = true,\n}: Exclude): SimpleGitPlugin<'spawn.after'> | void {\n if (block > 0) {\n return {\n type: 'spawn.after',\n action(_data, context) {\n let timeout: NodeJS.Timeout;\n\n function wait() {\n timeout && clearTimeout(timeout);\n timeout = setTimeout(kill, block);\n }\n\n function stop() {\n context.spawned.stdout?.off('data', wait);\n context.spawned.stderr?.off('data', wait);\n context.spawned.off('exit', stop);\n context.spawned.off('close', stop);\n timeout && clearTimeout(timeout);\n }\n\n function kill() {\n stop();\n context.kill(new GitPluginError(undefined, 'timeout', `block timeout reached`));\n }\n\n stdOut && context.spawned.stdout?.on('data', wait);\n stdErr && context.spawned.stderr?.on('data', wait);\n context.spawned.on('exit', stop);\n context.spawned.on('close', stop);\n\n wait();\n },\n };\n }\n}\n", "import { SimpleGitPlugin } from './simple-git-plugin';\nimport { isPathSpec, toPaths } from '../args/pathspec';\n\nexport function suffixPathsPlugin(): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(data) {\n const prefix: string[] = [];\n let suffix: undefined | string[];\n function append(args: string[]) {\n (suffix = suffix || []).push(...args);\n }\n\n for (let i = 0; i < data.length; i++) {\n const param = data[i];\n\n if (isPathSpec(param)) {\n append(toPaths(param));\n continue;\n }\n\n if (param === '--') {\n append(\n data.slice(i + 1).flatMap((item) => (isPathSpec(item) && toPaths(item)) || item)\n );\n break;\n }\n\n prefix.push(param);\n }\n\n return !suffix ? prefix : [...prefix, '--', ...suffix.map(String)];\n },\n };\n}\n", "import { SimpleGitFactory } from '../../typings';\n\nimport * as api from './api';\nimport {\n abortPlugin,\n blockUnsafeOperationsPlugin,\n commandConfigPrefixingPlugin,\n completionDetectionPlugin,\n customBinaryPlugin,\n errorDetectionHandler,\n errorDetectionPlugin,\n PluginStore,\n progressMonitorPlugin,\n spawnOptionsPlugin,\n timeoutPlugin,\n} from './plugins';\nimport { suffixPathsPlugin } from './plugins/suffix-paths.plugin';\nimport { createInstanceConfig, folderExists } from './utils';\nimport { SimpleGitOptions } from './types';\n\nconst Git = require('../git');\n\n/**\n * Adds the necessary properties to the supplied object to enable it for use as\n * the default export of a module.\n *\n * Eg: `module.exports = esModuleFactory({ something () {} })`\n */\nexport function esModuleFactory(defaultExport: T) {\n return Object.defineProperties(defaultExport, {\n __esModule: { value: true },\n default: { value: defaultExport },\n }) as T & { __esModule: true; default: T };\n}\n\nexport function gitExportFactory(factory: SimpleGitFactory) {\n return Object.assign(factory.bind(null), api);\n}\n\nexport function gitInstanceFactory(\n baseDir?: string | Partial,\n options?: Partial\n) {\n const plugins = new PluginStore();\n const config = createInstanceConfig(\n (baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir)) || {},\n options\n );\n\n if (!folderExists(config.baseDir)) {\n throw new api.GitConstructError(\n config,\n `Cannot use simple-git on a directory that does not exist`\n );\n }\n\n if (Array.isArray(config.config)) {\n plugins.add(commandConfigPrefixingPlugin(config.config));\n }\n\n plugins.add(blockUnsafeOperationsPlugin(config.unsafe));\n plugins.add(suffixPathsPlugin());\n plugins.add(completionDetectionPlugin(config.completion));\n config.abort && plugins.add(abortPlugin(config.abort));\n config.progress && plugins.add(progressMonitorPlugin(config.progress));\n config.timeout && plugins.add(timeoutPlugin(config.timeout));\n config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions));\n\n plugins.add(errorDetectionPlugin(errorDetectionHandler(true)));\n config.errors && plugins.add(errorDetectionPlugin(config.errors));\n\n customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary);\n\n return new Git(config, plugins);\n}\n", "import { SimpleGit, SimpleGitOptions } from '../../../typings';\n\nimport { GitResponseError } from '../errors/git-response-error';\nimport { gitInstanceFactory } from '../git-factory';\nimport { SimpleGitTaskCallback } from '../types';\n\nconst functionNamesBuilderApi = ['customBinary', 'env', 'outputHandler', 'silent'];\n\nconst functionNamesPromiseApi = [\n 'add',\n 'addAnnotatedTag',\n 'addConfig',\n 'addRemote',\n 'addTag',\n 'applyPatch',\n 'binaryCatFile',\n 'branch',\n 'branchLocal',\n 'catFile',\n 'checkIgnore',\n 'checkIsRepo',\n 'checkout',\n 'checkoutBranch',\n 'checkoutLatestTag',\n 'checkoutLocalBranch',\n 'clean',\n 'clone',\n 'commit',\n 'cwd',\n 'deleteLocalBranch',\n 'deleteLocalBranches',\n 'diff',\n 'diffSummary',\n 'exec',\n 'fetch',\n 'getRemotes',\n 'init',\n 'listConfig',\n 'listRemote',\n 'log',\n 'merge',\n 'mergeFromTo',\n 'mirror',\n 'mv',\n 'pull',\n 'push',\n 'pushTags',\n 'raw',\n 'rebase',\n 'remote',\n 'removeRemote',\n 'reset',\n 'revert',\n 'revparse',\n 'rm',\n 'rmKeepLocal',\n 'show',\n 'stash',\n 'stashList',\n 'status',\n 'subModule',\n 'submoduleAdd',\n 'submoduleInit',\n 'submoduleUpdate',\n 'tag',\n 'tags',\n 'updateServerInfo',\n];\n\nexport function gitP(\n ...args: [] | [string] | [Partial] | [string, Partial]\n): SimpleGit {\n let git: any;\n\n let chain = Promise.resolve();\n\n try {\n git = gitInstanceFactory(...args);\n } catch (e) {\n chain = Promise.reject(e);\n }\n\n function builderReturn() {\n return promiseApi;\n }\n\n function chainReturn() {\n return chain;\n }\n\n const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce(\n (api: any, name: string) => {\n const isAsync = functionNamesPromiseApi.includes(name);\n\n const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api);\n const alternative = isAsync ? chainReturn : builderReturn;\n\n Object.defineProperty(api, name, {\n enumerable: false,\n configurable: false,\n value: git ? valid : alternative,\n });\n\n return api;\n },\n {}\n );\n\n return promiseApi as SimpleGit;\n\n function asyncWrapper(fn: string, git: any): (...args: any[]) => Promise {\n return function (...args: any[]) {\n if (typeof args[args.length] === 'function') {\n throw new TypeError(\n 'Promise interface requires that handlers are not supplied inline, ' +\n 'trailing function not allowed in call to ' +\n fn\n );\n }\n\n return chain.then(function () {\n return new Promise(function (resolve, reject) {\n const callback: SimpleGitTaskCallback = (err: Error | null, result?: any) => {\n if (err) {\n return reject(toError(err));\n }\n\n resolve(result);\n };\n args.push(callback);\n\n git[fn].apply(git, args);\n });\n });\n };\n }\n\n function syncWrapper(fn: string, git: any, api: SimpleGit) {\n return (...args: any[]) => {\n git[fn](...args);\n\n return api;\n };\n }\n}\n\nfunction toError(error: Error | string | any): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n return new GitResponseError(error);\n}\n", "import { gitInstanceFactory } from './lib/git-factory';\n\nexport { gitP } from './lib/runners/promise-wrapped';\nexport * from './lib/api';\n\nexport const simpleGit = gitInstanceFactory;\n\nexport default gitInstanceFactory;\n", "import path from \"path\";\n\nimport { ensureDir, safeWriteFile } from \"../utils/fs\";\n\nimport type { RepoAnalysis } from \"./analyzer\";\n\nexport type FileAction = {\n path: string;\n action: \"wrote\" | \"skipped\";\n};\n\nexport type GenerateResult = {\n files: FileAction[];\n};\n\nexport type GenerateOptions = {\n repoPath: string;\n analysis: RepoAnalysis;\n selections: string[];\n force: boolean;\n};\n\nexport async function generateConfigs(options: GenerateOptions): Promise {\n const { repoPath, analysis, selections, force } = options;\n const files: FileAction[] = [];\n\n if (selections.includes(\"mcp\")) {\n const filePath = path.join(repoPath, \".vscode\", \"mcp.json\");\n await ensureDir(path.dirname(filePath));\n const content = renderMcp();\n const { wrote } = await safeWriteFile(filePath, content, force);\n files.push({\n path: path.relative(process.cwd(), filePath),\n action: wrote ? \"wrote\" : \"skipped\"\n });\n }\n\n if (selections.includes(\"vscode\")) {\n const filePath = path.join(repoPath, \".vscode\", \"settings.json\");\n await ensureDir(path.dirname(filePath));\n const content = renderVscodeSettings(analysis);\n const { wrote } = await safeWriteFile(filePath, content, force);\n files.push({\n path: path.relative(process.cwd(), filePath),\n action: wrote ? \"wrote\" : \"skipped\"\n });\n }\n\n return { files };\n}\n\nfunction renderMcp(): string {\n return JSON.stringify(\n {\n servers: {\n github: {\n command: \"npx\",\n args: [\"-y\", \"@modelcontextprotocol/server-github\"],\n env: {\n GITHUB_PERSONAL_ACCESS_TOKEN: \"${input:github_token}\"\n }\n },\n filesystem: {\n command: \"npx\",\n args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"${workspaceFolder}\"]\n }\n },\n inputs: [\n {\n id: \"github_token\",\n type: \"promptString\",\n description: \"GitHub Personal Access Token\"\n }\n ]\n },\n null,\n 2\n );\n}\n\nfunction renderVscodeSettings(analysis: RepoAnalysis): string {\n const reviewFocus = analysis.frameworks.length\n ? `Focus on ${analysis.frameworks.join(\", \")} best practices and repo conventions.`\n : \"Focus on repo conventions and maintainability.\";\n\n return JSON.stringify(\n {\n \"github.copilot.chat.codeGeneration.instructions\": [\n { file: \".github/copilot-instructions.md\" }\n ],\n \"github.copilot.chat.reviewSelection.instructions\": [{ text: reviewFocus }],\n \"chat.promptFiles\": true,\n \"chat.mcp.enabled\": true\n },\n null,\n 2\n );\n}\n", "export const DEFAULT_MODEL = \"claude-sonnet-4.5\";\nexport const DEFAULT_JUDGE_MODEL = \"claude-sonnet-4.5\";\n", "import fs from \"fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport path from \"path\";\n\nimport fg from \"fast-glob\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type CopilotCliConfig = {\n cliPath: string;\n cliArgs?: string[];\n};\n\nlet cachedCliConfig: CopilotCliConfig | null = null;\nlet cachedCliConfigTimestamp = 0;\nconst CLI_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\nfunction cacheConfig(config: CopilotCliConfig): CopilotCliConfig {\n cachedCliConfig = config;\n cachedCliConfigTimestamp = Date.now();\n return config;\n}\n\nexport async function assertCopilotCliReady(): Promise {\n const config = await findCopilotCliConfig();\n\n try {\n const [cmd, args] = buildExecArgs(config, [\"--version\"]);\n await execFileAsync(cmd, args, { timeout: 5000 });\n } catch {\n const desc = config.cliArgs ? `${config.cliPath} ${config.cliArgs.join(\" \")}` : config.cliPath;\n throw new Error(`Copilot CLI at ${desc} is not working.`);\n }\n\n return config;\n}\n\nexport async function listCopilotModels(): Promise {\n const config = await assertCopilotCliReady();\n const [cmd, args] = buildExecArgs(config, [\"--help\"]);\n const { stdout } = await execFileAsync(cmd, args, { timeout: 5000 });\n return extractModelChoices(stdout);\n}\n\nfunction buildExecArgs(config: CopilotCliConfig, extraArgs: string[]): [string, string[]] {\n if (config.cliArgs && config.cliArgs.length > 0) {\n return [config.cliPath, [...config.cliArgs, ...extraArgs]];\n }\n if (\n process.platform === \"win32\" &&\n (config.cliPath.endsWith(\".bat\") || config.cliPath.endsWith(\".cmd\"))\n ) {\n return [\"cmd\", [\"/c\", config.cliPath, ...extraArgs]];\n }\n return [config.cliPath, extraArgs];\n}\n\nasync function findCopilotCliConfig(): Promise {\n if (cachedCliConfig && Date.now() - cachedCliConfigTimestamp < CLI_CACHE_TTL_MS) {\n return cachedCliConfig;\n }\n\n const isWindows = process.platform === \"win32\";\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n const appData = process.env.APPDATA ?? \"\";\n\n // On Windows, prefer npm-installed binary and use node + cliArgs approach.\n // This bypasses .cmd/.bat wrapper issues that prevent direct spawning.\n // See: https://github.com/microsoft/vscode/issues/291990\n if (isWindows && appData) {\n const npmLoaderPath = path.join(\n appData,\n \"npm\",\n \"node_modules\",\n \"@github\",\n \"copilot\",\n \"npm-loader.js\"\n );\n try {\n await fs.access(npmLoaderPath);\n return cacheConfig({ cliPath: process.execPath, cliArgs: [npmLoaderPath] });\n } catch {\n // npm binary not found, will try PATH and VS Code locations\n }\n }\n\n const whichCmd = isWindows ? \"where\" : \"which\";\n try {\n const { stdout } = await execFileAsync(whichCmd, [\"copilot\"], { timeout: 5000 });\n const found = stdout.trim().split(/\\r?\\n/)[0];\n if (found) {\n return cacheConfig({ cliPath: found });\n }\n } catch {\n // Not on PATH, will try VS Code locations\n }\n\n const staticLocations: string[] = [];\n\n if (process.platform === \"darwin\") {\n staticLocations.push(\n `${home}/Library/Application Support/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`,\n `${home}/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`\n );\n } else if (process.platform === \"linux\") {\n staticLocations.push(\n `${home}/.config/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`,\n `${home}/.config/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`\n );\n } else if (isWindows && appData) {\n staticLocations.push(\n `${appData}\\\\Code - Insiders\\\\User\\\\globalStorage\\\\github.copilot-chat\\\\copilotCli\\\\copilot.bat`,\n `${appData}\\\\Code\\\\User\\\\globalStorage\\\\github.copilot-chat\\\\copilotCli\\\\copilot.bat`\n );\n }\n\n for (const location of staticLocations) {\n try {\n await fs.access(location);\n return cacheConfig({ cliPath: location });\n } catch {\n // Try next\n }\n }\n\n const exts = isWindows ? \"{.exe,.bat,.cmd}\" : \"\";\n const normalizedHome = home.replace(/\\\\/g, \"/\");\n const globPatterns = [\n `${normalizedHome}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot${exts}`,\n `${normalizedHome}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot${exts}`\n ];\n\n for (const pattern of globPatterns) {\n const matches = await fg(pattern, { onlyFiles: true });\n if (matches.length > 0) {\n return cacheConfig({ cliPath: path.normalize(matches[0]) });\n }\n }\n\n const platformHint = isWindows\n ? \" Searched APPDATA and VS Code extension paths.\"\n : process.platform === \"linux\"\n ? \" Searched ~/.config/Code and VS Code extension paths.\"\n : \" Searched ~/Library/Application Support/Code and VS Code extension paths.\";\n\n throw new Error(\n `Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code or run: npm install -g @github/copilot.${platformHint}`\n );\n}\n\nfunction extractModelChoices(helpText: string): string[] {\n const lines = helpText.split(\"\\n\");\n let captured = \"\";\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n if (!line.includes(\"--model\")) continue;\n\n captured = line.trim();\n while (!captured.includes(\")\") && index + 1 < lines.length) {\n index += 1;\n captured += ` ${lines[index].trim()}`;\n }\n break;\n }\n\n const match = captured.match(/choices:\\s*([^)]*)/);\n if (!match) return [];\n\n const models: string[] = [];\n const matcher = /\"([^\"]+)\"/g;\n let entry = matcher.exec(match[1]);\n while (entry) {\n models.push(entry[1]);\n entry = matcher.exec(match[1]);\n }\n\n return models;\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { DEFAULT_MODEL } from \"../config\";\nimport { ensureDir, fileExists } from \"../utils/fs\";\n\nimport type { Area } from \"./analyzer\";\nimport { sanitizeAreaName } from \"./analyzer\";\nimport { assertCopilotCliReady } from \"./copilot\";\n\ntype GenerateInstructionsOptions = {\n repoPath: string;\n instructionFile?: string;\n model?: string;\n onProgress?: (message: string) => void;\n};\n\nexport async function generateCopilotInstructions(\n options: GenerateInstructionsOptions\n): Promise {\n const repoPath = options.repoPath;\n const progress = options.onProgress ?? (() => {});\n\n progress(\"Checking Copilot CLI...\");\n const cliConfig = await assertCopilotCliReady();\n\n progress(\"Starting Copilot SDK...\");\n const sdk = await import(\"@github/copilot-sdk\");\n const client = new sdk.CopilotClient(cliConfig);\n\n try {\n progress(\"Creating session...\");\n const preferredModel = options.model ?? DEFAULT_MODEL;\n const session = await client.createSession({\n model: preferredModel,\n streaming: true,\n workingDirectory: repoPath,\n systemMessage: {\n content:\n \"You are an expert codebase analyst. Your task is to generate a concise .github/copilot-instructions.md file. Use the available tools (glob, view, grep) to explore the codebase. Output ONLY the final markdown content, no explanations.\"\n },\n infiniteSessions: { enabled: false }\n });\n\n let content = \"\";\n\n // Subscribe to events for progress and to capture content\n session.on((event) => {\n const e = event as { type: string; data?: Record };\n if (e.type === \"assistant.message_delta\") {\n const delta = e.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(\"Generating instructions...\");\n }\n } else if (e.type === \"tool.execution_start\") {\n const toolName = e.data?.toolName as string | undefined;\n progress(`Using tool: ${toolName ?? \"...\"}`);\n } else if (e.type === \"session.error\") {\n const errorMsg = (e.data?.message as string) ?? \"Unknown error\";\n if (errorMsg.toLowerCase().includes(\"auth\") || errorMsg.toLowerCase().includes(\"login\")) {\n throw new Error(\n \"Copilot CLI not logged in. Run `copilot` then `/login` to authenticate.\"\n );\n }\n }\n });\n\n // Simple prompt - let the agent use tools to explore\n const prompt = `Analyze this codebase and generate a .github/copilot-instructions.md file.\n\nUse tools to explore:\n1. Check for existing instruction files: glob for **/{.github/copilot-instructions.md,AGENT.md,CLAUDE.md,.cursorrules,README.md}\n2. Identify the tech stack: look at package.json, tsconfig.json, pyproject.toml, Cargo.toml, go.mod, *.csproj, *.sln, build.gradle, pom.xml, etc.\n3. Understand the structure: list key directories\n4. Detect monorepo structures: check for workspace configs (npm/pnpm/yarn workspaces, Cargo.toml [workspace], go.work, .sln solution files, settings.gradle include directives, pom.xml modules)\n\nGenerate concise instructions (~20-50 lines) covering:\n- Tech stack and architecture\n- Build/test commands\n- Project-specific conventions\n- Key files/directories\n- Monorepo structure and per-app layout (if this is a monorepo, describe the workspace organization, how apps relate to each other, and any shared libraries)\n\nOutput ONLY the markdown content for the instructions file.`;\n\n progress(\"Analyzing codebase...\");\n await session.sendAndWait({ prompt }, 180000);\n await session.destroy();\n\n return content.trim() || \"\";\n } finally {\n await client.stop();\n }\n}\n\ntype GenerateAreaInstructionsOptions = {\n repoPath: string;\n area: Area;\n model?: string;\n onProgress?: (message: string) => void;\n};\n\nexport async function generateAreaInstructions(\n options: GenerateAreaInstructionsOptions\n): Promise {\n const { repoPath, area } = options;\n const progress = options.onProgress ?? (() => {});\n\n progress(`Checking Copilot CLI for area \"${area.name}\"...`);\n const cliConfig = await assertCopilotCliReady();\n\n progress(`Starting Copilot SDK for area \"${area.name}\"...`);\n const sdk = await import(\"@github/copilot-sdk\");\n const client = new sdk.CopilotClient(cliConfig);\n\n try {\n const applyToPatterns = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo];\n const applyToStr = applyToPatterns.join(\", \");\n\n progress(`Creating session for area \"${area.name}\"...`);\n const preferredModel = options.model ?? DEFAULT_MODEL;\n const session = await client.createSession({\n model: preferredModel,\n streaming: true,\n workingDirectory: repoPath,\n systemMessage: {\n content: `You are an expert codebase analyst. Your task is to generate a concise .instructions.md file for a specific area of a codebase. This file will be used as a file-based custom instruction in VS Code Copilot, automatically applied when working on files matching certain patterns. Use the available tools (glob, view, grep) to explore the codebase. Output ONLY the final markdown content (no frontmatter, no explanations).`\n },\n infiniteSessions: { enabled: false }\n });\n\n let content = \"\";\n\n session.on((event) => {\n const e = event as { type: string; data?: Record };\n if (e.type === \"assistant.message_delta\") {\n const delta = e.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(`Generating instructions for \"${area.name}\"...`);\n }\n } else if (e.type === \"tool.execution_start\") {\n const toolName = e.data?.toolName as string | undefined;\n progress(`${area.name}: using tool ${toolName ?? \"...\"}`);\n } else if (e.type === \"session.error\") {\n const errorMsg = (e.data?.message as string) ?? \"Unknown error\";\n if (errorMsg.toLowerCase().includes(\"auth\") || errorMsg.toLowerCase().includes(\"login\")) {\n throw new Error(\n \"Copilot CLI not logged in. Run `copilot` then `/login` to authenticate.\"\n );\n }\n }\n });\n\n const prompt = `Analyze the \"${area.name}\" area of this codebase and generate a file-based instruction file.\n\nThis area covers files matching: ${applyToStr}\n${area.description ? `Description: ${area.description}` : \"\"}\n\nUse tools to explore ONLY the files and directories within this area:\n1. List the key files: glob for ${applyToPatterns.map((p) => `\"${p}\"`).join(\", \")}\n2. Identify the tech stack, dependencies, and frameworks used in this area\n3. Look at key source files to understand patterns and conventions specific to this area\n\nGenerate concise instructions (~10-30 lines) covering:\n- What this area does and its role in the overall project\n- Area-specific tech stack, dependencies, and frameworks\n- Coding conventions and patterns specific to this area\n- Build/test commands relevant to this area (if different from root)\n- Key files and directory structure within this area\n\nIMPORTANT:\n- Focus ONLY on this specific area, not the whole repo\n- Do NOT repeat repo-wide information (that goes in the root copilot-instructions.md)\n- Keep it complementary to root instructions\n- Output ONLY the markdown content, no YAML frontmatter, no code fences`;\n\n progress(`Analyzing area \"${area.name}\"...`);\n await session.sendAndWait({ prompt }, 180000);\n await session.destroy();\n\n return content.trim() || \"\";\n } finally {\n await client.stop();\n }\n}\n\nfunction escapeYamlString(value: string): string {\n return value\n .replace(/\\0/gu, \"\")\n .replace(/\\\\/gu, \"\\\\\\\\\")\n .replace(/\"/gu, '\\\\\"')\n .replace(/\\n/gu, \"\\\\n\")\n .replace(/\\r/gu, \"\\\\r\")\n .replace(/\\t/gu, \"\\\\t\");\n}\n\nexport function buildAreaFrontmatter(area: Area): string {\n const applyTo = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo];\n const applyToValue =\n applyTo.length === 1\n ? `\"${escapeYamlString(applyTo[0])}\"`\n : `[${applyTo.map((p) => `\"${escapeYamlString(p)}\"`).join(\", \")}]`;\n const desc = area.description\n ? `Use when working on ${area.name}. ${area.description}`\n : `Use when working on ${area.name}`;\n\n return `---\ndescription: \"${escapeYamlString(desc)}\"\napplyTo: ${applyToValue}\n---`;\n}\n\nexport function buildAreaInstructionContent(area: Area, body: string): string {\n return `${buildAreaFrontmatter(area)}\\n\\n${body}\\n`;\n}\n\nexport function areaInstructionPath(repoPath: string, area: Area): string {\n return path.join(\n repoPath,\n \".github\",\n \"instructions\",\n `${sanitizeAreaName(area.name)}.instructions.md`\n );\n}\n\nexport type WriteAreaResult = { status: \"written\" | \"skipped\" | \"empty\"; filePath: string };\n\nexport async function writeAreaInstruction(\n repoPath: string,\n area: Area,\n body: string,\n force?: boolean\n): Promise {\n const filePath = areaInstructionPath(repoPath, area);\n if (!body.trim()) return { status: \"empty\", filePath };\n if (!force && (await fileExists(filePath))) return { status: \"skipped\", filePath };\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, buildAreaInstructionContent(area, body), \"utf8\");\n return { status: \"written\", filePath };\n}\n\n// Re-export for backward compatibility\nexport { sanitizeAreaName } from \"./analyzer\";\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { buildTimestampedName } from \"../utils/fs\";\n\nimport { assertCopilotCliReady } from \"./copilot\";\nimport type { EvalConfig } from \"./evalScaffold\";\n\nconst DEFAULT_SYSTEM_MESSAGE =\n \"You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them.\";\n\ninterface CopilotSession {\n on(handler: (event: { type: string; data?: Record }) => void): void;\n sendAndWait(params: { prompt: string }, timeoutMs?: number): Promise;\n destroy(): Promise;\n}\n\ninterface CopilotClient {\n createSession(config?: Record): Promise;\n stop(): Promise;\n}\n\ntype EvalRunOptions = {\n configPath: string;\n repoPath: string;\n model: string;\n judgeModel: string;\n outputPath?: string;\n onProgress?: (message: string) => void;\n};\n\ntype TokenUsage = {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n};\n\ntype ToolCallSummary = {\n count: number;\n byName: Record;\n totalDurationMs: number;\n};\n\ntype AskMetrics = {\n durationMs: number;\n tokenUsage?: TokenUsage;\n toolCalls: ToolCallSummary;\n};\n\ntype EvalMetrics = {\n withoutInstructions: AskMetrics;\n withInstructions: AskMetrics;\n judge: AskMetrics;\n totalDurationMs: number;\n};\n\ntype EvalPhase = \"withoutInstructions\" | \"withInstructions\" | \"judge\";\n\ntype TrajectoryEvent = {\n timestampMs: number;\n phase: EvalPhase;\n type: string;\n data?: Record;\n};\n\nexport type EvalResult = {\n id: string;\n prompt: string;\n expectation: string;\n withInstructions?: string;\n withoutInstructions?: string;\n verdict?: \"pass\" | \"fail\" | \"unknown\";\n score?: number;\n rationale?: string;\n metrics?: EvalMetrics;\n trajectory?: TrajectoryEvent[];\n};\n\nexport async function runEval(\n options: EvalRunOptions\n): Promise<{ summary: string; results: EvalResult[]; viewerPath?: string }> {\n const config = await loadConfig(options.configPath);\n const instructionFile = config.instructionFile ?? \".github/copilot-instructions.md\";\n const instructionPath = path.resolve(options.repoPath, instructionFile);\n const instructionText = await readOptionalFile(instructionPath);\n const baseSystemMessage = config.systemMessage ?? DEFAULT_SYSTEM_MESSAGE;\n const progress = options.onProgress ?? (() => {});\n const defaultOutputPath = path.resolve(\n options.repoPath,\n \".primer\",\n \"evals\",\n buildTimestampedName(\"eval-results\")\n );\n const outputPath =\n resolveOutputPath(options.repoPath, options.outputPath, config.outputPath) ?? defaultOutputPath;\n const runStartedAt = Date.now();\n\n progress(\"Starting Copilot SDK...\");\n const cliConfig = await assertCopilotCliReady();\n const sdk = await import(\"@github/copilot-sdk\");\n const client = new sdk.CopilotClient(cliConfig);\n\n try {\n const results: EvalResult[] = [];\n const total = config.cases.length;\n\n for (const [index, testCase] of config.cases.entries()) {\n const id = testCase.id ?? `case-${index + 1}`;\n const prompt = buildPrompt(options.repoPath, testCase.prompt);\n const caseStartedAt = Date.now();\n\n progress(`Running eval ${index + 1}/${total}: ${id} (without instructions)...`);\n const withoutResult = await askOnce(client, {\n prompt,\n model: options.model,\n systemMessage: baseSystemMessage,\n phase: \"withoutInstructions\"\n });\n\n progress(`Running eval ${index + 1}/${total}: ${id} (with instructions)...`);\n const withResult = await askOnce(client, {\n prompt,\n model: options.model,\n systemMessage: [baseSystemMessage, instructionText].filter(Boolean).join(\"\\n\\n\"),\n phase: \"withInstructions\"\n });\n\n progress(`Running eval ${index + 1}/${total}: ${id} (judging)...`);\n const judgment = await judge(client, {\n model: options.judgeModel,\n prompt: testCase.prompt,\n expectation: testCase.expectation,\n withoutInstructions: withoutResult.content,\n withInstructions: withResult.content\n });\n\n const metrics: EvalMetrics = {\n withoutInstructions: withoutResult.metrics,\n withInstructions: withResult.metrics,\n judge: judgment.metrics,\n totalDurationMs: Date.now() - caseStartedAt\n };\n\n const trajectory = [\n ...withoutResult.trajectory,\n ...withResult.trajectory,\n ...judgment.trajectory\n ];\n\n results.push({\n id,\n prompt: testCase.prompt,\n expectation: testCase.expectation,\n withInstructions: withResult.content,\n withoutInstructions: withoutResult.content,\n verdict: judgment.result.verdict,\n score: judgment.result.score,\n rationale: judgment.result.rationale,\n metrics,\n trajectory\n });\n\n progress(\n `Eval ${index + 1}/${total}: ${id} \u2192 ${judgment.result.verdict} (score: ${judgment.result.score})`\n );\n }\n\n const runFinishedAt = Date.now();\n const output = {\n repoPath: options.repoPath,\n model: options.model,\n judgeModel: options.judgeModel,\n runMetrics: {\n startedAt: new Date(runStartedAt).toISOString(),\n finishedAt: new Date(runFinishedAt).toISOString(),\n durationMs: runFinishedAt - runStartedAt\n },\n results\n };\n let viewerPath: string | undefined;\n if (outputPath) {\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, JSON.stringify(output, null, 2), \"utf8\");\n viewerPath = buildViewerPath(outputPath);\n await fs.writeFile(viewerPath, buildTrajectoryViewerHtml(output), \"utf8\");\n }\n\n const summary = formatSummary(results, runFinishedAt - runStartedAt);\n return { summary, results, viewerPath };\n } finally {\n await client.stop();\n }\n}\n\ntype AskOptions = {\n prompt: string;\n model: string;\n systemMessage?: string;\n phase: EvalPhase;\n};\n\ntype AskResult = {\n content: string;\n metrics: AskMetrics;\n trajectory: TrajectoryEvent[];\n};\n\nasync function askOnce(client: CopilotClient, options: AskOptions): Promise {\n const session = await client.createSession({\n model: options.model,\n streaming: true,\n infiniteSessions: { enabled: false },\n systemMessage: options.systemMessage ? { content: options.systemMessage } : undefined\n });\n\n let content = \"\";\n const telemetry = createTelemetry(options.phase);\n const startedAt = Date.now();\n session.on((event: { type: string; data?: Record }) => {\n captureTelemetryEvent(event, telemetry);\n if (event.type === \"assistant.message_delta\") {\n const delta = event.data?.deltaContent as string | undefined;\n if (delta) content += delta;\n }\n });\n\n await session.sendAndWait({ prompt: options.prompt }, 120000);\n await session.destroy();\n const finishedAt = Date.now();\n return {\n content: content.trim(),\n metrics: {\n durationMs: finishedAt - startedAt,\n tokenUsage: normalizeTokenUsage(telemetry.tokenUsage),\n toolCalls: telemetry.toolCalls\n },\n trajectory: telemetry.trajectory\n };\n}\n\ntype JudgeOptions = {\n model: string;\n prompt: string;\n expectation: string;\n withoutInstructions: string;\n withInstructions: string;\n};\n\ntype JudgeResult = {\n verdict: \"pass\" | \"fail\" | \"unknown\";\n score: number;\n rationale: string;\n};\n\nasync function judge(\n client: CopilotClient,\n options: JudgeOptions\n): Promise<{ result: JudgeResult; metrics: AskMetrics; trajectory: TrajectoryEvent[] }> {\n const session = await client.createSession({\n model: options.model,\n streaming: true,\n infiniteSessions: { enabled: false },\n systemMessage: {\n content:\n \"You are a strict evaluator. Return JSON with keys: verdict (pass|fail|unknown), score (0-100), rationale. Do not include any other text.\"\n }\n });\n\n let content = \"\";\n const telemetry = createTelemetry(\"judge\");\n const startedAt = Date.now();\n session.on((event: { type: string; data?: Record }) => {\n captureTelemetryEvent(event, telemetry);\n if (event.type === \"assistant.message_delta\") {\n const delta = event.data?.deltaContent as string | undefined;\n if (delta) content += delta;\n }\n });\n\n const prompt = [\n \"Evaluate which response best matches the expectation.\",\n \"\",\n `Expectation: ${options.expectation}`,\n \"\",\n \"Response A (without custom instructions):\",\n options.withoutInstructions,\n \"\",\n \"Response B (with custom instructions):\",\n options.withInstructions,\n \"\",\n \"Return JSON only.\"\n ].join(\"\\n\");\n\n await session.sendAndWait({ prompt }, 120000);\n await session.destroy();\n\n const finishedAt = Date.now();\n return {\n result: parseJudge(content),\n metrics: {\n durationMs: finishedAt - startedAt,\n tokenUsage: normalizeTokenUsage(telemetry.tokenUsage),\n toolCalls: telemetry.toolCalls\n },\n trajectory: telemetry.trajectory\n };\n}\n\nfunction parseJudge(content: string): JudgeResult {\n try {\n const match = content.match(/\\{[\\s\\S]*\\}/);\n if (!match) throw new Error(\"No JSON detected\");\n const parsed = JSON.parse(match[0]) as JudgeResult;\n if (!parsed.verdict) throw new Error(\"Missing verdict\");\n return {\n verdict: parsed.verdict,\n score: Number(parsed.score ?? 0),\n rationale: String(parsed.rationale ?? \"\")\n };\n } catch {\n return {\n verdict: \"unknown\",\n score: 0,\n rationale: content.trim()\n };\n }\n}\n\nasync function loadConfig(configPath: string): Promise {\n const raw = await fs.readFile(configPath, \"utf8\");\n const parsed = JSON.parse(raw) as EvalConfig;\n if (!parsed || !Array.isArray(parsed.cases)) {\n throw new Error(\"Eval config must have a 'cases' array.\");\n }\n return parsed;\n}\n\nasync function readOptionalFile(filePath: string): Promise {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\nfunction buildPrompt(repoPath: string, userPrompt: string): string {\n return [\n \"You are working in this repository:\",\n repoPath,\n \"Use the file system tools when needed to inspect the codebase.\",\n \"\",\n userPrompt\n ].join(\"\\n\");\n}\n\nfunction formatSummary(results: EvalResult[], runDurationMs: number): string {\n const total = results.length;\n const passed = results.filter((r) => r.verdict === \"pass\").length;\n const failed = results.filter((r) => r.verdict === \"fail\").length;\n const unknown = results.filter((r) => r.verdict === \"unknown\").length;\n const totalUsage = aggregateTokenUsage(results);\n const hasUsage = Boolean(\n totalUsage.promptTokens || totalUsage.completionTokens || totalUsage.totalTokens\n );\n\n const lines = [\n `Eval results: ${passed}/${total} pass, ${failed} fail, ${unknown} unknown.`,\n `Runtime: ${formatDuration(runDurationMs)}.`,\n hasUsage ? `Token usage: ${formatTokenUsage(totalUsage)}.` : \"Token usage: unavailable.\"\n ];\n\n for (const result of results) {\n lines.push(`- ${result.id}: ${result.verdict ?? \"unknown\"} (score: ${result.score ?? 0})`);\n }\n\n return `\\n${lines.join(\"\\n\")}`;\n}\n\ntype TelemetryCollector = {\n trajectory: TrajectoryEvent[];\n tokenUsage: TokenUsage;\n toolCalls: ToolCallSummary;\n toolCallMap: Map;\n phase: EvalPhase;\n};\n\nfunction createTelemetry(phase: EvalPhase): TelemetryCollector {\n return {\n trajectory: [],\n tokenUsage: {},\n toolCalls: { count: 0, byName: {}, totalDurationMs: 0 },\n toolCallMap: new Map(),\n phase\n };\n}\n\nfunction captureTelemetryEvent(\n event: { type: string; data?: Record },\n telemetry: TelemetryCollector\n): void {\n const timestampMs = Date.now();\n telemetry.trajectory.push({\n timestampMs,\n phase: telemetry.phase,\n type: event.type,\n data: sanitizeEventData(event.data)\n });\n\n if (event.type === \"tool.execution_start\") {\n const toolName = (event.data?.toolName as string | undefined) ?? \"unknown\";\n const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size);\n telemetry.toolCallMap.set(toolId, { name: toolName, startMs: timestampMs });\n telemetry.toolCalls.count += 1;\n telemetry.toolCalls.byName[toolName] = (telemetry.toolCalls.byName[toolName] ?? 0) + 1;\n } else if (event.type === \"tool.execution_finish\" || event.type === \"tool.execution_error\") {\n const toolName = (event.data?.toolName as string | undefined) ?? \"unknown\";\n const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size);\n const entry =\n telemetry.toolCallMap.get(toolId) ?? findLatestToolByName(telemetry.toolCallMap, toolName);\n if (entry) {\n const durationMs = timestampMs - entry.startMs;\n telemetry.toolCalls.totalDurationMs += durationMs;\n telemetry.toolCallMap.delete(toolId);\n }\n }\n\n const usage = extractTokenUsage(event.data);\n if (usage) {\n telemetry.tokenUsage = mergeTokenUsage(telemetry.tokenUsage, usage);\n }\n}\n\nfunction resolveToolId(\n data: Record | undefined,\n toolName: string,\n index: number\n): string {\n const rawId = data?.executionId ?? data?.toolCallId ?? data?.callId ?? data?.id;\n if (typeof rawId === \"string\" || typeof rawId === \"number\") {\n return String(rawId);\n }\n return `${toolName}-${index + 1}`;\n}\n\nfunction findLatestToolByName(\n map: Map,\n toolName: string\n): { name?: string; startMs: number } | undefined {\n const entries = Array.from(map.values()).filter((entry) => entry.name === toolName);\n return entries.at(-1);\n}\n\nfunction extractTokenUsage(data: Record | undefined): TokenUsage | null {\n if (!data) return null;\n const usage = findUsageObject(data);\n const promptTokens = getNumber(\n usage?.prompt_tokens ?? usage?.promptTokens ?? data.promptTokens ?? data.inputTokens\n );\n const completionTokens = getNumber(\n usage?.completion_tokens ??\n usage?.completionTokens ??\n data.completionTokens ??\n data.outputTokens\n );\n const totalTokens = getNumber(usage?.total_tokens ?? usage?.totalTokens ?? data.totalTokens);\n\n if (promptTokens == null && completionTokens == null && totalTokens == null) {\n return null;\n }\n\n return {\n promptTokens: promptTokens ?? undefined,\n completionTokens: completionTokens ?? undefined,\n totalTokens: totalTokens ?? undefined\n };\n}\n\nfunction findUsageObject(data: Record): Record | undefined {\n const direct = (data.usage ?? data.tokenUsage ?? data.tokens) as\n | Record\n | undefined;\n if (direct) return direct;\n\n const candidates = [data.response, data.result, data.message, data.metrics, data.output];\n\n for (const candidate of candidates) {\n if (candidate && typeof candidate === \"object\") {\n const nested =\n (candidate as Record).usage ??\n (candidate as Record).tokenUsage;\n if (nested && typeof nested === \"object\") return nested as Record;\n }\n }\n\n return scanForUsage(data, 0);\n}\n\nfunction scanForUsage(value: unknown, depth: number): Record | undefined {\n if (!value || typeof value !== \"object\" || depth > 4) return undefined;\n if (Array.isArray(value)) {\n for (const entry of value) {\n const found = scanForUsage(entry, depth + 1);\n if (found) return found;\n }\n return undefined;\n }\n\n const record = value as Record;\n if (hasTokenFields(record)) return record;\n\n for (const entry of Object.values(record)) {\n const found = scanForUsage(entry, depth + 1);\n if (found) return found;\n }\n\n return undefined;\n}\n\nfunction hasTokenFields(record: Record): boolean {\n const keys = Object.keys(record);\n return (\n keys.includes(\"prompt_tokens\") ||\n keys.includes(\"completion_tokens\") ||\n keys.includes(\"total_tokens\") ||\n keys.includes(\"promptTokens\") ||\n keys.includes(\"completionTokens\") ||\n keys.includes(\"totalTokens\") ||\n keys.includes(\"inputTokens\") ||\n keys.includes(\"outputTokens\")\n );\n}\n\nfunction getNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\n// The SDK reports cumulative token counts per session, so we keep the peak (max) value\n// rather than summing incremental deltas.\nfunction mergeTokenUsage(existing: TokenUsage, next: TokenUsage): TokenUsage {\n return {\n promptTokens: Math.max(existing.promptTokens ?? 0, next.promptTokens ?? 0) || undefined,\n completionTokens:\n Math.max(existing.completionTokens ?? 0, next.completionTokens ?? 0) || undefined,\n totalTokens: Math.max(existing.totalTokens ?? 0, next.totalTokens ?? 0) || undefined\n };\n}\n\nfunction normalizeTokenUsage(usage: TokenUsage): TokenUsage | undefined {\n if (!usage.promptTokens && !usage.completionTokens && !usage.totalTokens) return undefined;\n if (!usage.totalTokens) {\n const prompt = usage.promptTokens ?? 0;\n const completion = usage.completionTokens ?? 0;\n const total = prompt + completion;\n return {\n ...usage,\n totalTokens: total || undefined\n };\n }\n return usage;\n}\n\nfunction aggregateTokenUsage(results: EvalResult[]): TokenUsage {\n const total: TokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n for (const result of results) {\n const metrics = result.metrics;\n if (!metrics) continue;\n const usages = [\n metrics.withoutInstructions.tokenUsage,\n metrics.withInstructions.tokenUsage,\n metrics.judge.tokenUsage\n ];\n for (const usage of usages) {\n if (!usage) continue;\n total.promptTokens = (total.promptTokens ?? 0) + (usage.promptTokens ?? 0);\n total.completionTokens = (total.completionTokens ?? 0) + (usage.completionTokens ?? 0);\n total.totalTokens = (total.totalTokens ?? 0) + (usage.totalTokens ?? 0);\n }\n }\n return total;\n}\n\nfunction formatDuration(durationMs: number): string {\n const seconds = Math.round(durationMs / 100) / 10;\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remaining = Math.round((seconds % 60) * 10) / 10;\n return `${minutes}m ${remaining}s`;\n}\n\nfunction formatTokenUsage(usage: TokenUsage): string {\n const prompt = usage.promptTokens ?? 0;\n const completion = usage.completionTokens ?? 0;\n const total = usage.totalTokens ?? prompt + completion;\n return `prompt ${prompt}, completion ${completion}, total ${total}`;\n}\n\nfunction resolveOutputPath(\n repoPath: string,\n override?: string,\n configValue?: string\n): string | undefined {\n const chosen = override ?? configValue;\n if (!chosen) return undefined;\n return path.isAbsolute(chosen) ? chosen : path.resolve(repoPath, chosen);\n}\n\nfunction buildViewerPath(outputPath: string): string {\n if (outputPath.endsWith(\".json\")) {\n return outputPath.replace(/\\.json$/u, \".html\");\n }\n return `${outputPath}.html`;\n}\n\nfunction buildTrajectoryViewerHtml(data: Record): string {\n const serialized = JSON.stringify(data).replace(/\n\n\n\n\n\nPrimer Eval Results\n\n\n\n
    \n
    \n \n
    \n

    Eval Results

    \n
    \n
    \n
    \n \n
    \n\n
    \n\n
    \n
    Impact of Instructions
    \n
    \n
    \n\n
    \n
    Results by Case
    \n
    \n
    \n\n
    \n
    Case Details
    \n
    \n
    \n\n\n\n`;\n}\n\nfunction sanitizeEventData(\n data: Record | undefined\n): Record | undefined {\n if (!data) return undefined;\n const sanitized: Record = {};\n for (const [key, value] of Object.entries(data)) {\n if (key === \"deltaContent\" && typeof value === \"string\") {\n sanitized.deltaChars = value.length;\n sanitized.deltaPreview = value.slice(0, 120);\n continue;\n }\n sanitized[key] = sanitizeValue(value, 0);\n }\n return sanitized;\n}\n\nfunction sanitizeValue(value: unknown, depth: number): unknown {\n if (depth > 4) return \"[depth-limit]\";\n if (typeof value === \"string\") {\n return value.length > 2000 ? `${value.slice(0, 2000)}\u2026` : value;\n }\n if (Array.isArray(value)) {\n return value.slice(0, 50).map((entry) => sanitizeValue(entry, depth + 1));\n }\n if (value && typeof value === \"object\") {\n const obj: Record = {};\n for (const [key, entry] of Object.entries(value as Record)) {\n obj[key] = sanitizeValue(entry, depth + 1);\n }\n return obj;\n }\n return value;\n}\n", "import { DEFAULT_MODEL } from \"../config\";\n\nimport type { Area } from \"./analyzer\";\nimport { assertCopilotCliReady } from \"./copilot\";\n\nconst EVAL_SCAFFOLD_TIMEOUT_MS = 600000;\nconst EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS = 90000;\n\nexport type EvalCase = {\n id?: string;\n prompt: string;\n expectation: string;\n area?: string;\n};\n\nexport type EvalConfig = {\n instructionFile?: string;\n cases: EvalCase[];\n systemMessage?: string;\n outputPath?: string;\n ui?: {\n modelPicker?: \"visible\" | \"hidden\";\n };\n};\n\ntype EvalScaffoldOptions = {\n repoPath: string;\n count: number;\n model?: string;\n areas?: Area[];\n onProgress?: (message: string) => void;\n};\n\nexport async function generateEvalScaffold(options: EvalScaffoldOptions): Promise {\n const repoPath = options.repoPath;\n const count = Math.max(1, options.count);\n const progress = options.onProgress ?? (() => {});\n\n progress(\"Checking Copilot CLI...\");\n const cliConfig = await assertCopilotCliReady();\n\n progress(\"Starting Copilot SDK...\");\n const sdk = await import(\"@github/copilot-sdk\");\n const client = new sdk.CopilotClient(cliConfig);\n\n try {\n progress(\"Creating session...\");\n const preferredModel = options.model ?? DEFAULT_MODEL;\n const session = await client.createSession({\n model: preferredModel,\n streaming: true,\n workingDirectory: repoPath,\n systemMessage: {\n content:\n \"You are an expert codebase analyst specializing in deep architectural analysis. Generate challenging, cross-cutting eval cases for this repository that require synthesizing information from multiple files and tracing logic across layers. Avoid trivial questions answerable from a single file read or grep. Use tools (glob, view, grep) extensively to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation}).\"\n },\n infiniteSessions: { enabled: false }\n });\n\n let content = \"\";\n session.on((event: { type: string; data?: Record }) => {\n if (event.type === \"assistant.message_delta\") {\n const delta = event.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(\"Generating eval cases...\");\n }\n } else if (event.type === \"tool.execution_start\") {\n const toolName = event.data?.toolName as string | undefined;\n progress(`Using tool: ${toolName ?? \"...\"}`);\n } else if (event.type === \"session.error\") {\n const errorMsg = (event.data?.message as string) ?? \"Unknown error\";\n if (errorMsg.toLowerCase().includes(\"auth\") || errorMsg.toLowerCase().includes(\"login\")) {\n throw new Error(\n \"Copilot CLI not logged in. Run `copilot` then `/login` to authenticate.\"\n );\n }\n }\n });\n\n const areaContext = options.areas?.length\n ? [\n \"\",\n \"AREA CONTEXT:\",\n \"This repo has the following areas:\",\n ...options.areas.map((a) => {\n const patterns = Array.isArray(a.applyTo) ? a.applyTo.join(\", \") : a.applyTo;\n return `- ${a.name} (${patterns})`;\n }),\n \"\",\n \"Generate a mix of:\",\n \"- Single-area cases that go deep into one area's internals\",\n \"- Cross-area cases that test interactions between areas\",\n 'Include an optional \"area\" field in each case to tag which area(s) it targets.'\n ].join(\"\\n\")\n : \"\";\n\n const prompt = [\n `Analyze this repository and generate ${count} eval cases.`,\n \"\",\n \"IMPORTANT: Generate HARD eval cases that require deep, cross-cutting understanding of the codebase.\",\n \"Each case should require synthesizing information from MULTIPLE files or tracing logic across several layers.\",\n \"Do NOT generate simple questions that can be answered by reading a single file or running a single grep.\",\n \"\",\n \"Good eval case examples (adapt to this repo):\",\n \"- Questions about how data flows end-to-end through multiple modules (e.g., 'Trace what happens when X is called \u2014 which services, transforms, and side effects are involved?')\",\n \"- Questions about implicit conventions or patterns that span many files (e.g., 'What error-handling pattern is used across the service layer, and where does it deviate?')\",\n \"- Questions requiring understanding of runtime behavior not obvious from static code (e.g., 'What is the order of initialization and what would break if module X loaded before Y?')\",\n \"- Questions about non-obvious interactions between components (e.g., 'How does changing config option X affect the behavior of feature Y?')\",\n \"- Questions about edge cases or failure modes that require reading implementation details across files\",\n \"- Questions that require understanding the type system, generics, or shared interfaces across module boundaries\",\n \"\",\n \"Bad eval case examples (avoid these):\",\n \"- 'What does this project do?' (answered by README alone)\",\n \"- 'How do I build/test?' (answered by package.json alone)\",\n \"- 'What is the entrypoint?' (answered by a single file)\",\n \"- Any question answerable by reading one file or searching for one keyword\",\n \"\",\n \"Use tools extensively to inspect the codebase \u2014 read multiple files, trace imports, follow call chains.\",\n \"If this is a monorepo (npm/pnpm/yarn workspaces, Cargo workspace, Go workspace, .NET solution, Gradle/Maven multi-module), generate cases that involve cross-app dependencies, shared libraries, and how changes in one app affect others.\",\n \"Ensure cases cover cross-cutting concerns: data flow, error propagation, configuration impact, implicit coupling, architectural invariants.\",\n \"Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).\",\n \"Return JSON ONLY (no markdown, no commentary) in this schema:\",\n '{\\n \"instructionFile\": \".github/copilot-instructions.md\",\\n \"systemMessage\": \"...\",\\n \"cases\": [\\n {\"id\": \"case-1\", \"prompt\": \"...\", \"expectation\": \"...\", \"area\": \"optional-area-name\"}\\n ]\\n}',\n areaContext\n ].join(\"\\n\");\n\n progress(\"Analyzing codebase...\");\n let timedOutWaitingForIdle = false;\n try {\n await session.sendAndWait({ prompt }, EVAL_SCAFFOLD_TIMEOUT_MS);\n } catch (error) {\n if (!isSessionIdleTimeoutError(error)) {\n throw error;\n }\n\n timedOutWaitingForIdle = true;\n progress(\"Generation took longer than expected; requesting final JSON output...\");\n\n try {\n await session.sendAndWait(\n {\n prompt:\n \"Stop analysis and return only the final JSON scaffold now. Do not include markdown or commentary.\"\n },\n EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS\n );\n } catch (recoveryError) {\n if (!isSessionIdleTimeoutError(recoveryError)) {\n throw recoveryError;\n }\n progress(\"Still waiting on idle; attempting to parse partial output...\");\n }\n } finally {\n await session.destroy();\n }\n\n let parsed: EvalConfig;\n try {\n parsed = parseEvalConfig(content);\n } catch (error) {\n if (timedOutWaitingForIdle) {\n throw new Error(\n \"Timed out waiting for scaffold generation to become idle before a complete JSON payload was returned. Try again or lower `--count`.\"\n );\n }\n throw error;\n }\n\n const normalized = normalizeEvalConfig(parsed, count);\n return normalized;\n } finally {\n await client.stop();\n }\n}\n\nfunction isSessionIdleTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return message.includes(\"timeout\") && message.includes(\"session.idle\");\n}\n\nfunction parseEvalConfig(raw: string): EvalConfig {\n const match = raw.match(/\\{[\\s\\S]*\\}/u);\n if (!match) {\n throw new Error(\"Failed to parse eval scaffold JSON.\");\n }\n const parsed = JSON.parse(match[0]) as EvalConfig;\n if (!parsed || !Array.isArray(parsed.cases)) {\n throw new Error(\"Eval scaffold JSON is missing cases.\");\n }\n return parsed;\n}\n\nfunction normalizeEvalConfig(parsed: EvalConfig, count: number): EvalConfig {\n const cases = (parsed.cases ?? []).slice(0, count).map((entry, index) => {\n const id = typeof entry.id === \"string\" && entry.id.trim() ? entry.id : `case-${index + 1}`;\n return {\n id,\n prompt: String(entry.prompt ?? \"\").trim(),\n expectation: String(entry.expectation ?? \"\").trim(),\n area: typeof entry.area === \"string\" && entry.area.trim() ? entry.area.trim() : undefined\n };\n });\n\n if (!cases.length) {\n throw new Error(\"Eval scaffold JSON did not include any usable cases.\");\n }\n\n const defaultSystemMessage =\n \"You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them.\";\n\n return {\n instructionFile: parsed.instructionFile ?? \".github/copilot-instructions.md\",\n systemMessage: parsed.systemMessage ?? defaultSystemMessage,\n cases\n };\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { fileExists, safeReadDir, readJson } from \"../utils/fs\";\n\nimport type { RepoApp, RepoAnalysis, Area } from \"./analyzer\";\nimport { analyzeRepo, sanitizeAreaName, loadPrimerConfig } from \"./analyzer\";\nimport type { ExtraDefinition, PolicyConfig } from \"./policy\";\nimport { loadPolicy, resolveChain } from \"./policy\";\n\nexport type ReadinessPillar =\n | \"style-validation\"\n | \"build-system\"\n | \"testing\"\n | \"documentation\"\n | \"dev-environment\"\n | \"code-quality\"\n | \"observability\"\n | \"security-governance\"\n | \"ai-tooling\";\n\nexport type ReadinessScope = \"repo\" | \"app\" | \"area\";\n\nexport type ReadinessStatus = \"pass\" | \"fail\" | \"skip\";\n\nexport type ReadinessCriterionResult = {\n id: string;\n title: string;\n pillar: ReadinessPillar;\n level: number;\n scope: ReadinessScope;\n impact: \"high\" | \"medium\" | \"low\";\n effort: \"low\" | \"medium\" | \"high\";\n status: ReadinessStatus;\n reason?: string;\n evidence?: string[];\n passRate?: number;\n appSummary?: { passed: number; total: number };\n appFailures?: string[];\n areaSummary?: { passed: number; total: number };\n areaFailures?: string[];\n};\n\nexport type ReadinessExtraResult = {\n id: string;\n title: string;\n status: ReadinessStatus;\n reason?: string;\n};\n\nexport type ReadinessPillarSummary = {\n id: ReadinessPillar;\n name: string;\n passed: number;\n total: number;\n passRate: number;\n};\n\nexport type ReadinessLevelSummary = {\n level: number;\n name: string;\n passed: number;\n total: number;\n passRate: number;\n achieved: boolean;\n};\n\nexport type AreaReadinessReport = {\n area: Area;\n criteria: ReadinessCriterionResult[];\n pillars: ReadinessPillarSummary[];\n};\n\nexport type ReadinessReport = {\n repoPath: string;\n generatedAt: string;\n isMonorepo: boolean;\n apps: Array<{ name: string; path: string }>;\n pillars: ReadinessPillarSummary[];\n levels: ReadinessLevelSummary[];\n achievedLevel: number;\n criteria: ReadinessCriterionResult[];\n extras: ReadinessExtraResult[];\n areaReports?: AreaReadinessReport[];\n policies?: { chain: string[]; criteriaCount: number };\n};\n\ntype ReadinessOptions = {\n repoPath: string;\n includeExtras?: boolean;\n perArea?: boolean;\n policies?: string[];\n};\n\nexport type ReadinessContext = {\n repoPath: string;\n analysis: RepoAnalysis;\n apps: RepoApp[];\n rootFiles: string[];\n rootPackageJson?: Record;\n areaPath?: string;\n areaFiles?: string[];\n};\n\nexport type ReadinessCriterion = {\n id: string;\n title: string;\n pillar: ReadinessPillar;\n level: number;\n scope: ReadinessScope;\n impact: \"high\" | \"medium\" | \"low\";\n effort: \"low\" | \"medium\" | \"high\";\n check: (context: ReadinessContext, app?: RepoApp, area?: Area) => Promise;\n};\n\nexport type CheckResult = {\n status: ReadinessStatus;\n reason?: string;\n evidence?: string[];\n};\n\nexport async function runReadinessReport(options: ReadinessOptions): Promise {\n const repoPath = options.repoPath;\n const analysis = await analyzeRepo(repoPath);\n const rootFiles = await safeReadDir(repoPath);\n const rootPackageJson = await readJson(path.join(repoPath, \"package.json\"));\n const apps = analysis.apps?.length ? analysis.apps : [];\n\n const context: ReadinessContext = {\n repoPath,\n analysis,\n apps,\n rootFiles,\n rootPackageJson\n };\n\n // \u2500\u2500 Policy resolution \u2500\u2500\n let policySources = options.policies;\n if (!policySources?.length) {\n // Check primer.config.json for policy config\n const primerConfig = await loadPrimerConfig(repoPath);\n if (primerConfig?.policies?.length) {\n policySources = primerConfig.policies;\n }\n }\n\n const baseCriteria = buildCriteria();\n const baseExtras = buildExtras();\n let resolvedCriteria: ReadinessCriterion[];\n let resolvedExtras: ExtraDefinition[];\n let passRateThreshold = 0.8;\n let policyInfo: { chain: string[]; criteriaCount: number } | undefined;\n\n if (policySources?.length) {\n const policyConfigs: PolicyConfig[] = [];\n // Config-sourced policies are restricted to JSON-only (no import())\n const isConfigSourced = policySources !== options.policies;\n for (const source of policySources) {\n policyConfigs.push(await loadPolicy(source, { jsonOnly: isConfigSourced }));\n }\n const resolved = resolveChain(baseCriteria, baseExtras, policyConfigs);\n resolvedCriteria = resolved.criteria;\n resolvedExtras = resolved.extras;\n passRateThreshold = resolved.thresholds.passRate;\n policyInfo = { chain: resolved.chain, criteriaCount: resolved.criteria.length };\n } else {\n resolvedCriteria = baseCriteria;\n resolvedExtras = baseExtras;\n }\n\n const criteriaResults: ReadinessCriterionResult[] = [];\n\n for (const criterion of resolvedCriteria) {\n if (criterion.scope === \"repo\") {\n const result = await criterion.check(context);\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: result.status,\n reason: result.reason,\n evidence: result.evidence\n });\n continue;\n }\n\n if (criterion.scope === \"area\") {\n if (!options.perArea) continue; // Exclude area criteria unless --per-area\n // Area criteria get a placeholder \u2014 populated by per-area loop below\n const areas = analysis.areas ?? [];\n if (areas.length === 0) continue; // No areas, nothing to aggregate\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: \"skip\",\n reason: \"Run with --per-area for area breakdown.\"\n });\n continue;\n }\n\n const appResults = await Promise.all(\n apps.map(async (app) => ({\n app,\n result: await criterion.check(context, app)\n }))\n );\n\n if (!appResults.length) {\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: \"skip\",\n reason: \"No application packages detected.\"\n });\n continue;\n }\n\n const passed = appResults.filter((entry) => entry.result.status === \"pass\").length;\n const total = appResults.length;\n const passRate = total ? passed / total : 0;\n const status: ReadinessStatus = passRate >= passRateThreshold ? \"pass\" : \"fail\";\n const failures = appResults\n .filter((entry) => entry.result.status !== \"pass\")\n .map((entry) => entry.app.name);\n\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status,\n reason: status === \"pass\" ? undefined : `Only ${passed}/${total} apps pass this check.`,\n passRate,\n appSummary: { passed, total },\n appFailures: failures\n });\n }\n\n // Per-area breakdown\n let areaReports: AreaReadinessReport[] | undefined;\n const areas = analysis.areas ?? [];\n\n if (options.perArea && areas.length > 0) {\n const areaCriteria = resolvedCriteria.filter((c) => c.scope === \"area\");\n areaReports = [];\n\n for (const area of areas) {\n if (!area.path) continue;\n const areaFiles = await safeReadDir(area.path);\n const areaContext: ReadinessContext = {\n ...context,\n areaPath: area.path,\n areaFiles\n };\n\n const areaResults: ReadinessCriterionResult[] = [];\n for (const criterion of areaCriteria) {\n const result = await criterion.check(areaContext, undefined, area);\n areaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: result.status,\n reason: result.reason,\n evidence: result.evidence\n });\n }\n\n const areaPillars = summarizePillars(areaResults);\n areaReports.push({ area, criteria: areaResults, pillars: areaPillars });\n }\n\n // Update aggregate area criteria in main results\n for (const criterion of criteriaResults) {\n if (criterion.scope !== \"area\") continue;\n const perAreaResults = areaReports\n .map((ar) => ar.criteria.find((c) => c.id === criterion.id))\n .filter(Boolean) as ReadinessCriterionResult[];\n if (!perAreaResults.length) continue;\n\n const passed = perAreaResults.filter((r) => r.status === \"pass\").length;\n const total = perAreaResults.length;\n const passRate = total ? passed / total : 0;\n criterion.status = passRate >= passRateThreshold ? \"pass\" : \"fail\";\n criterion.reason =\n criterion.status === \"pass\" ? undefined : `Only ${passed}/${total} areas pass this check.`;\n criterion.passRate = passRate;\n criterion.areaSummary = { passed, total };\n criterion.areaFailures = areaReports\n .filter((ar) => ar.criteria.find((c) => c.id === criterion.id)?.status !== \"pass\")\n .map((ar) => ar.area.name);\n }\n }\n\n // Compute summaries after area aggregation so they reflect final statuses\n const pillars = summarizePillars(criteriaResults);\n const levels = summarizeLevels(criteriaResults, passRateThreshold);\n const achievedLevel = levels\n .filter((level) => level.achieved)\n .reduce((acc, level) => Math.max(acc, level.level), 0);\n\n const extras = options.includeExtras === false ? [] : await runExtras(context, resolvedExtras);\n\n return {\n repoPath,\n generatedAt: new Date().toISOString(),\n isMonorepo: analysis.isMonorepo ?? false,\n apps: apps.map((app) => ({ name: app.name, path: app.path })),\n pillars,\n levels,\n achievedLevel,\n criteria: criteriaResults,\n extras,\n areaReports,\n policies: policyInfo\n };\n}\n\nexport function buildCriteria(): ReadinessCriterion[] {\n return [\n {\n id: \"lint-config\",\n title: \"Linting configured\",\n pillar: \"style-validation\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasLintConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing ESLint/Biome/Prettier configuration.\",\n evidence: [\"eslint.config.js\", \".eslintrc\", \"biome.json\", \".prettierrc\"]\n };\n }\n },\n {\n id: \"typecheck-config\",\n title: \"Type checking configured\",\n pillar: \"style-validation\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasTypecheckConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing type checking config (tsconfig or equivalent).\",\n evidence: [\"tsconfig.json\", \"pyproject.toml\", \"mypy.ini\"]\n };\n }\n },\n {\n id: \"build-script\",\n title: \"Build script present\",\n pillar: \"build-system\",\n level: 1,\n scope: \"app\",\n impact: \"high\",\n effort: \"low\",\n check: async (_context, app) => {\n const found = Boolean(app?.scripts?.build);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing build script in package.json.\"\n };\n }\n },\n {\n id: \"ci-config\",\n title: \"CI workflow configured\",\n pillar: \"build-system\",\n level: 2,\n scope: \"repo\",\n impact: \"high\",\n effort: \"medium\",\n check: async (context) => {\n const found = await hasGithubWorkflows(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing .github/workflows CI configuration.\",\n evidence: [\".github/workflows\"]\n };\n }\n },\n {\n id: \"test-script\",\n title: \"Test script present\",\n pillar: \"testing\",\n level: 1,\n scope: \"app\",\n impact: \"high\",\n effort: \"low\",\n check: async (_context, app) => {\n const found = Boolean(app?.scripts?.test);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing test script in package.json.\"\n };\n }\n },\n {\n id: \"readme\",\n title: \"README present\",\n pillar: \"documentation\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasReadme(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing README documentation.\",\n evidence: [\"README.md\"]\n };\n }\n },\n {\n id: \"contributing\",\n title: \"CONTRIBUTING guide present\",\n pillar: \"documentation\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \"CONTRIBUTING.md\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing CONTRIBUTING.md for contributor workflows.\"\n };\n }\n },\n {\n id: \"lockfile\",\n title: \"Lockfile present\",\n pillar: \"dev-environment\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = hasAnyFile(context.rootFiles, [\n \"pnpm-lock.yaml\",\n \"yarn.lock\",\n \"package-lock.json\",\n \"bun.lockb\"\n ]);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing package manager lockfile.\"\n };\n }\n },\n {\n id: \"env-example\",\n title: \"Environment example present\",\n pillar: \"dev-environment\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = hasAnyFile(context.rootFiles, [\".env.example\", \".env.sample\"]);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing .env.example or .env.sample for setup guidance.\"\n };\n }\n },\n {\n id: \"format-config\",\n title: \"Formatter configured\",\n pillar: \"code-quality\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasFormatterConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing Prettier/Biome formatting config.\"\n };\n }\n },\n {\n id: \"codeowners\",\n title: \"CODEOWNERS present\",\n pillar: \"security-governance\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasCodeowners(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing CODEOWNERS file.\"\n };\n }\n },\n {\n id: \"license\",\n title: \"LICENSE present\",\n pillar: \"security-governance\",\n level: 1,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasLicense(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing LICENSE file.\"\n };\n }\n },\n {\n id: \"security-policy\",\n title: \"Security policy present\",\n pillar: \"security-governance\",\n level: 3,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \"SECURITY.md\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing SECURITY.md policy.\"\n };\n }\n },\n {\n id: \"dependabot\",\n title: \"Dependabot configured\",\n pillar: \"security-governance\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \".github\", \"dependabot.yml\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing .github/dependabot.yml configuration.\"\n };\n }\n },\n {\n id: \"observability\",\n title: \"Observability tooling present\",\n pillar: \"observability\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const deps = await readAllDependencies(context);\n const has = deps.some((dep) =>\n [\"@opentelemetry/api\", \"@opentelemetry/sdk\", \"pino\", \"winston\", \"bunyan\"].includes(dep)\n );\n return {\n status: has ? \"pass\" : \"fail\",\n reason: \"No observability dependencies detected (OpenTelemetry/logging).\"\n };\n }\n },\n {\n id: \"custom-instructions\",\n title: \"Custom AI instructions or agent guidance\",\n pillar: \"ai-tooling\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const rootFound = await hasCustomInstructions(context.repoPath);\n if (rootFound.length === 0) {\n return {\n status: \"fail\",\n reason:\n \"Missing custom AI instructions (e.g. copilot-instructions.md, CLAUDE.md, AGENTS.md, .cursorrules).\",\n evidence: [\n \"copilot-instructions.md\",\n \"CLAUDE.md\",\n \"AGENTS.md\",\n \".cursorrules\",\n \".github/copilot-instructions.md\"\n ]\n };\n }\n\n // Check for file-based instructions (.github/instructions/*.instructions.md)\n const fileBasedInstructions = await hasFileBasedInstructions(context.repoPath);\n const areas = context.analysis.areas ?? [];\n\n // For monorepos or repos with detected areas, check coverage\n if (areas.length > 0) {\n if (fileBasedInstructions.length === 0) {\n return {\n status: \"pass\",\n reason: `Root instructions found, but no file-based instructions for ${areas.length} detected areas. Run \\`primer instructions --areas\\` to generate.`,\n evidence: [...rootFound, ...areas.map((a) => `${a.name}: missing .instructions.md`)]\n };\n }\n return {\n status: \"pass\",\n reason: `Root + ${fileBasedInstructions.length} file-based instruction(s) found.`,\n evidence: [...rootFound, ...fileBasedInstructions]\n };\n }\n\n // For monorepos without areas, check per-app instructions (legacy behavior)\n if (context.analysis.isMonorepo && context.apps.length > 1) {\n const appsMissing: string[] = [];\n for (const app of context.apps) {\n const appFound = await hasCustomInstructions(app.path);\n if (appFound.length === 0) {\n appsMissing.push(app.name);\n }\n }\n if (appsMissing.length > 0) {\n return {\n status: \"pass\",\n reason: `Root instructions found, but ${appsMissing.length}/${context.apps.length} apps missing their own: ${appsMissing.join(\", \")}`,\n evidence: [\n ...rootFound,\n ...appsMissing.map((name) => `${name}: missing app-level instructions`)\n ]\n };\n }\n }\n\n return {\n status: \"pass\",\n evidence: rootFound\n };\n }\n },\n {\n id: \"mcp-config\",\n title: \"MCP configuration present\",\n pillar: \"ai-tooling\",\n level: 2,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasMcpConfig(context.repoPath);\n return {\n status: found.length > 0 ? \"pass\" : \"fail\",\n reason: \"Missing MCP (Model Context Protocol) configuration (e.g. .vscode/mcp.json).\",\n evidence:\n found.length > 0\n ? found\n : [\".vscode/mcp.json\", \".vscode/settings.json (mcp section)\", \"mcp.json\"]\n };\n }\n },\n {\n id: \"custom-agents\",\n title: \"Custom AI agents configured\",\n pillar: \"ai-tooling\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const found = await hasCustomAgents(context.repoPath);\n return {\n status: found.length > 0 ? \"pass\" : \"fail\",\n reason: \"No custom AI agents configured (e.g. .github/agents/, .copilot/agents/).\",\n evidence:\n found.length > 0\n ? found\n : [\".github/agents/\", \".copilot/agents/\", \".github/copilot/agents/\"]\n };\n }\n },\n {\n id: \"copilot-skills\",\n title: \"Copilot/Claude skills present\",\n pillar: \"ai-tooling\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const found = await hasCopilotSkills(context.repoPath);\n return {\n status: found.length > 0 ? \"pass\" : \"fail\",\n reason: \"No Copilot or Claude skills found (e.g. .copilot/skills/, .github/skills/).\",\n evidence:\n found.length > 0 ? found : [\".copilot/skills/\", \".github/skills/\", \".claude/skills/\"]\n };\n }\n },\n // \u2500\u2500 Area-scoped criteria (only run when areaPath is set) \u2500\u2500\n {\n id: \"area-readme\",\n title: \"Area README present\",\n pillar: \"documentation\",\n level: 1,\n scope: \"area\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n if (!context.areaPath || !context.areaFiles) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n const found = context.areaFiles.some(\n (f) => f.toLowerCase() === \"readme.md\" || f.toLowerCase() === \"readme\"\n );\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing README in area directory.\"\n };\n }\n },\n {\n id: \"area-build-script\",\n title: \"Area build script present\",\n pillar: \"build-system\",\n level: 1,\n scope: \"area\",\n impact: \"high\",\n effort: \"low\",\n check: async (context, _app, area) => {\n if (!context.areaPath || !context.areaFiles) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n // Check area.scripts from enriched Area type\n if (area?.scripts?.build) {\n return { status: \"pass\" };\n }\n // Fallback: check for package.json with build script in area\n const pkgPath = path.join(context.areaPath, \"package.json\");\n const pkg = await readJson(pkgPath);\n const scripts = (pkg?.scripts ?? {}) as Record;\n const found = Boolean(scripts.build);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing build script in area.\"\n };\n }\n },\n {\n id: \"area-test-script\",\n title: \"Area test script present\",\n pillar: \"testing\",\n level: 1,\n scope: \"area\",\n impact: \"high\",\n effort: \"low\",\n check: async (context, _app, area) => {\n if (!context.areaPath || !context.areaFiles) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n if (area?.scripts?.test) {\n return { status: \"pass\" };\n }\n const pkgPath = path.join(context.areaPath, \"package.json\");\n const pkg = await readJson(pkgPath);\n const scripts = (pkg?.scripts ?? {}) as Record;\n const found = Boolean(scripts.test);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing test script in area.\"\n };\n }\n },\n {\n id: \"area-instructions\",\n title: \"Area-specific instructions present\",\n pillar: \"ai-tooling\",\n level: 2,\n scope: \"area\",\n impact: \"high\",\n effort: \"low\",\n check: async (context, _app, area) => {\n if (!area) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n const sanitized = sanitizeAreaName(area.name);\n const instructionPath = path.join(\n context.repoPath,\n \".github\",\n \"instructions\",\n `${sanitized}.instructions.md`\n );\n const found = await fileExists(instructionPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : `Missing .github/instructions/${sanitized}.instructions.md`\n };\n }\n }\n ];\n}\n\nexport function buildExtras(): ExtraDefinition[] {\n return [\n {\n id: \"agents-doc\",\n title: \"AGENTS.md present\",\n check: async (context) => ({\n status: (await fileExists(path.join(context.repoPath, \"AGENTS.md\"))) ? \"pass\" : \"fail\",\n reason: \"Missing AGENTS.md to guide coding agents.\"\n })\n },\n {\n id: \"pr-template\",\n title: \"Pull request template present\",\n check: async (context) => ({\n status: (await hasPullRequestTemplate(context.repoPath)) ? \"pass\" : \"fail\",\n reason: \"Missing PR template for consistent reviews.\"\n })\n },\n {\n id: \"pre-commit\",\n title: \"Pre-commit hooks configured\",\n check: async (context) => ({\n status: (await hasPrecommitConfig(context.repoPath)) ? \"pass\" : \"fail\",\n reason: \"Missing pre-commit or Husky configuration for fast feedback.\"\n })\n },\n {\n id: \"architecture-doc\",\n title: \"Architecture guide present\",\n check: async (context) => ({\n status: (await hasArchitectureDoc(context.repoPath)) ? \"pass\" : \"fail\",\n reason: \"Missing architecture documentation.\"\n })\n }\n ];\n}\n\nasync function runExtras(\n context: ReadinessContext,\n extraDefs: ExtraDefinition[]\n): Promise {\n const results: ReadinessExtraResult[] = [];\n for (const def of extraDefs) {\n const result = await def.check(context);\n results.push({\n id: def.id,\n title: def.title,\n status: result.status,\n reason: result.reason\n });\n }\n return results;\n}\n\nfunction summarizePillars(criteria: ReadinessCriterionResult[]): ReadinessPillarSummary[] {\n const pillarNames: Record = {\n \"style-validation\": \"Style & Validation\",\n \"build-system\": \"Build System\",\n testing: \"Testing\",\n documentation: \"Documentation\",\n \"dev-environment\": \"Dev Environment\",\n \"code-quality\": \"Code Quality\",\n observability: \"Observability\",\n \"security-governance\": \"Security & Governance\",\n \"ai-tooling\": \"AI Tooling\"\n };\n\n return (Object.keys(pillarNames) as ReadinessPillar[]).map((pillar) => {\n const items = criteria.filter((criterion) => criterion.pillar === pillar);\n const { passed, total } = countStatus(items);\n return {\n id: pillar,\n name: pillarNames[pillar],\n passed,\n total,\n passRate: total ? passed / total : 0\n };\n });\n}\n\nfunction summarizeLevels(\n criteria: ReadinessCriterionResult[],\n passRateThreshold = 0.8\n): ReadinessLevelSummary[] {\n const levelNames: Record = {\n 1: \"Functional\",\n 2: \"Documented\",\n 3: \"Standardized\",\n 4: \"Optimized\",\n 5: \"Autonomous\"\n };\n\n const summaries: ReadinessLevelSummary[] = [];\n for (let level = 1; level <= 5; level += 1) {\n const items = criteria.filter((criterion) => criterion.level === level);\n const { passed, total } = countStatus(items);\n const passRate = total ? passed / total : 0;\n summaries.push({\n level,\n name: levelNames[level],\n passed,\n total,\n passRate,\n achieved: false\n });\n }\n\n for (const summary of summaries) {\n const allPrior = summaries.filter((candidate) => candidate.level <= summary.level);\n const achieved = allPrior.every(\n (candidate) => candidate.total > 0 && candidate.passRate >= passRateThreshold\n );\n summary.achieved = achieved;\n }\n\n return summaries;\n}\n\nfunction countStatus(items: ReadinessCriterionResult[]): { passed: number; total: number } {\n const relevant = items.filter((item) => item.status !== \"skip\");\n const passed = relevant.filter((item) => item.status === \"pass\").length;\n return { passed, total: relevant.length };\n}\n\nfunction hasAnyFile(files: string[], candidates: string[]): boolean {\n return candidates.some((candidate) => files.includes(candidate));\n}\n\nasync function hasReadme(repoPath: string): Promise {\n const files = await safeReadDir(repoPath);\n return files.some(\n (file) => file.toLowerCase() === \"readme.md\" || file.toLowerCase() === \"readme\"\n );\n}\n\nasync function hasLintConfig(repoPath: string): Promise {\n return hasAnyFile(await safeReadDir(repoPath), [\n \"eslint.config.js\",\n \"eslint.config.mjs\",\n \".eslintrc\",\n \".eslintrc.js\",\n \".eslintrc.cjs\",\n \".eslintrc.json\",\n \".eslintrc.yml\",\n \".eslintrc.yaml\",\n \"biome.json\",\n \"biome.jsonc\",\n \".prettierrc\",\n \".prettierrc.json\",\n \".prettierrc.js\",\n \".prettierrc.cjs\",\n \"prettier.config.js\",\n \"prettier.config.cjs\"\n ]);\n}\n\nasync function hasFormatterConfig(repoPath: string): Promise {\n return hasAnyFile(await safeReadDir(repoPath), [\n \"biome.json\",\n \"biome.jsonc\",\n \".prettierrc\",\n \".prettierrc.json\",\n \".prettierrc.js\",\n \".prettierrc.cjs\",\n \"prettier.config.js\",\n \"prettier.config.cjs\"\n ]);\n}\n\nasync function hasTypecheckConfig(repoPath: string): Promise {\n return hasAnyFile(await safeReadDir(repoPath), [\n \"tsconfig.json\",\n \"tsconfig.base.json\",\n \"pyproject.toml\",\n \"mypy.ini\"\n ]);\n}\n\nasync function hasGithubWorkflows(repoPath: string): Promise {\n return fileExists(path.join(repoPath, \".github\", \"workflows\"));\n}\n\nasync function hasCodeowners(repoPath: string): Promise {\n const root = await fileExists(path.join(repoPath, \"CODEOWNERS\"));\n const github = await fileExists(path.join(repoPath, \".github\", \"CODEOWNERS\"));\n return root || github;\n}\n\nasync function hasLicense(repoPath: string): Promise {\n const files = await safeReadDir(repoPath);\n return files.some((file) => file.toLowerCase().startsWith(\"license\"));\n}\n\nasync function hasPullRequestTemplate(repoPath: string): Promise {\n const direct = await fileExists(path.join(repoPath, \".github\", \"PULL_REQUEST_TEMPLATE.md\"));\n if (direct) return true;\n const dir = path.join(repoPath, \".github\", \"PULL_REQUEST_TEMPLATE\");\n try {\n const entries = await fs.readdir(dir);\n return entries.some((entry) => entry.toLowerCase().endsWith(\".md\"));\n } catch {\n return false;\n }\n}\n\nasync function hasPrecommitConfig(repoPath: string): Promise {\n const precommit = await fileExists(path.join(repoPath, \".pre-commit-config.yaml\"));\n if (precommit) return true;\n return fileExists(path.join(repoPath, \".husky\"));\n}\n\nasync function hasArchitectureDoc(repoPath: string): Promise {\n const files = await safeReadDir(repoPath);\n if (files.some((file) => file.toLowerCase() === \"architecture.md\")) return true;\n return fileExists(path.join(repoPath, \"docs\", \"architecture.md\"));\n}\n\nasync function hasCustomInstructions(repoPath: string): Promise {\n const found: string[] = [];\n const candidates = [\n \".github/copilot-instructions.md\",\n \"CLAUDE.md\",\n \".claude/CLAUDE.md\",\n \"AGENTS.md\",\n \".github/AGENTS.md\",\n \".cursorrules\",\n \".cursorignore\",\n \".windsurfrules\",\n \".github/instructions.md\",\n \"copilot-instructions.md\"\n ];\n for (const candidate of candidates) {\n if (await fileExists(path.join(repoPath, candidate))) {\n found.push(candidate);\n }\n }\n return found;\n}\n\nasync function hasFileBasedInstructions(repoPath: string): Promise {\n const instructionsDir = path.join(repoPath, \".github\", \"instructions\");\n try {\n const entries = await fs.readdir(instructionsDir);\n return entries\n .filter((e) => e.endsWith(\".instructions.md\"))\n .map((e) => `.github/instructions/${e}`);\n } catch {\n return [];\n }\n}\n\nasync function hasMcpConfig(repoPath: string): Promise {\n const found: string[] = [];\n // Check .vscode/mcp.json\n if (await fileExists(path.join(repoPath, \".vscode\", \"mcp.json\"))) {\n found.push(\".vscode/mcp.json\");\n }\n // Check root mcp.json\n if (await fileExists(path.join(repoPath, \"mcp.json\"))) {\n found.push(\"mcp.json\");\n }\n // Check .vscode/settings.json for MCP section\n const settings = await readJson(path.join(repoPath, \".vscode\", \"settings.json\"));\n if (settings && (settings[\"mcp\"] || settings[\"github.copilot.chat.mcp.enabled\"])) {\n found.push(\".vscode/settings.json (mcp section)\");\n }\n // Check .claude/mcp.json\n if (await fileExists(path.join(repoPath, \".claude\", \"mcp.json\"))) {\n found.push(\".claude/mcp.json\");\n }\n return found;\n}\n\nasync function hasCustomAgents(repoPath: string): Promise {\n const found: string[] = [];\n const agentDirs = [\".github/agents\", \".copilot/agents\", \".github/copilot/agents\"];\n for (const dir of agentDirs) {\n if (await fileExists(path.join(repoPath, dir))) {\n found.push(dir);\n }\n }\n // Check for agent config files\n const agentFiles = [\".github/copilot-agents.yml\", \".github/copilot-agents.yaml\"];\n for (const agentFile of agentFiles) {\n if (await fileExists(path.join(repoPath, agentFile))) {\n found.push(agentFile);\n }\n }\n return found;\n}\n\nasync function hasCopilotSkills(repoPath: string): Promise {\n const found: string[] = [];\n const skillDirs = [\n \".copilot/skills\",\n \".github/skills\",\n \".claude/skills\",\n \".github/copilot/skills\"\n ];\n for (const dir of skillDirs) {\n if (await fileExists(path.join(repoPath, dir))) {\n found.push(dir);\n }\n }\n return found;\n}\n\nasync function readAllDependencies(context: ReadinessContext): Promise {\n const dependencies: string[] = [];\n const apps = context.apps.length ? context.apps : [];\n for (const app of apps) {\n if (!app.packageJsonPath) continue;\n const pkg = await readJson(app.packageJsonPath);\n const deps = (pkg?.dependencies ?? {}) as Record;\n const devDeps = (pkg?.devDependencies ?? {}) as Record;\n dependencies.push(\n ...Object.keys({\n ...deps,\n ...devDeps\n })\n );\n }\n\n if (!apps.length && context.rootPackageJson) {\n const rootDeps = (context.rootPackageJson.dependencies ?? {}) as Record;\n const rootDevDeps = (context.rootPackageJson.devDependencies ?? {}) as Record;\n dependencies.push(\n ...Object.keys({\n ...rootDeps,\n ...rootDevDeps\n })\n );\n }\n\n return Array.from(new Set(dependencies));\n}\n", "import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { readJson } from \"../utils/fs\";\n\nimport type { ReadinessCriterion, ReadinessContext } from \"./readiness\";\n\n// \u2500\u2500\u2500 Policy configuration types \u2500\u2500\u2500\n\ntype CriterionMetadata = Pick<\n ReadinessCriterion,\n \"title\" | \"pillar\" | \"level\" | \"scope\" | \"impact\" | \"effort\"\n>;\n\nexport type ExtraDefinition = {\n id: string;\n title: string;\n check: (context: ReadinessContext) => Promise<{ status: \"pass\" | \"fail\"; reason?: string }>;\n};\n\nexport type PolicyConfig = {\n name: string;\n version?: string;\n criteria?: {\n disable?: string[];\n add?: ReadinessCriterion[];\n override?: Record>;\n };\n extras?: {\n disable?: string[];\n add?: ExtraDefinition[];\n };\n thresholds?: {\n passRate?: number;\n };\n};\n\nexport type ResolvedPolicy = {\n chain: string[];\n criteria: ReadinessCriterion[];\n extras: ExtraDefinition[];\n thresholds: { passRate: number };\n};\n\n// \u2500\u2500\u2500 Default thresholds \u2500\u2500\u2500\n\nconst DEFAULT_PASS_RATE = 0.8;\n\n// \u2500\u2500\u2500 Validation \u2500\u2500\u2500\n\nfunction validatePolicyConfig(\n obj: unknown,\n source: string,\n format: \"json\" | \"module\" = \"module\"\n): PolicyConfig {\n if (typeof obj !== \"object\" || obj === null) {\n throw new Error(`Policy \"${source}\" is invalid: expected an object, got ${typeof obj}`);\n }\n const record = obj as Record;\n if (typeof record.name !== \"string\" || !record.name.trim()) {\n throw new Error(`Policy \"${source}\" is invalid: missing required field \"name\" at root`);\n }\n if (record.criteria !== undefined) {\n if (typeof record.criteria !== \"object\") {\n throw new Error(`Policy \"${source}\" is invalid: \"criteria\" must be an object`);\n }\n const criteria = record.criteria as Record;\n if (criteria.disable !== undefined && !isStringArray(criteria.disable)) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"criteria.disable\" must be an array of strings`\n );\n }\n if (criteria.override !== undefined) {\n if (\n typeof criteria.override !== \"object\" ||\n criteria.override === null ||\n Array.isArray(criteria.override)\n ) {\n throw new Error(`Policy \"${source}\" is invalid: \"criteria.override\" must be an object`);\n }\n const ALLOWED_OVERRIDE_KEYS = new Set([\n \"title\",\n \"pillar\",\n \"level\",\n \"scope\",\n \"impact\",\n \"effort\"\n ]);\n for (const [id, value] of Object.entries(\n criteria.override as Record>\n )) {\n if (typeof value !== \"object\" || value === null) continue;\n for (const key of Object.keys(value)) {\n if (!ALLOWED_OVERRIDE_KEYS.has(key)) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"criteria.override.${id}\" contains disallowed key \"${key}\". Allowed keys: ${[...ALLOWED_OVERRIDE_KEYS].join(\", \")}`\n );\n }\n }\n }\n }\n if (format === \"json\" && criteria.add !== undefined) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"criteria.add\" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.`\n );\n }\n }\n if (record.extras !== undefined) {\n if (typeof record.extras !== \"object\" || record.extras === null) {\n throw new Error(`Policy \"${source}\" is invalid: \"extras\" must be an object`);\n }\n const extras = record.extras as Record;\n if (extras.disable !== undefined && !isStringArray(extras.disable)) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"extras.disable\" must be an array of strings`\n );\n }\n if (format === \"json\" && extras.add !== undefined) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"extras.add\" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.`\n );\n }\n }\n if (record.thresholds !== undefined) {\n if (typeof record.thresholds !== \"object\" || record.thresholds === null) {\n throw new Error(`Policy \"${source}\" is invalid: \"thresholds\" must be an object`);\n }\n const thresholds = record.thresholds as Record;\n if (thresholds.passRate !== undefined && typeof thresholds.passRate !== \"number\") {\n throw new Error(`Policy \"${source}\" is invalid: \"thresholds.passRate\" must be a number`);\n }\n if (\n typeof thresholds.passRate === \"number\" &&\n (thresholds.passRate < 0 || thresholds.passRate > 1)\n ) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"thresholds.passRate\" must be between 0 and 1`\n );\n }\n }\n return record as unknown as PolicyConfig;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\n\nexport function parsePolicySources(raw: string | undefined): string[] | undefined {\n if (!raw) return undefined;\n const sources = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return sources.length ? sources : undefined;\n}\n\n// \u2500\u2500\u2500 Loading \u2500\u2500\u2500\n\nexport async function loadPolicy(\n source: string,\n options?: { jsonOnly?: boolean }\n): Promise {\n const jsonOnly = options?.jsonOnly ?? false;\n\n // Local file path (relative or absolute)\n if (source.startsWith(\".\") || path.isAbsolute(source)) {\n const resolved = path.resolve(source);\n if (resolved.endsWith(\".json\")) {\n const data = await readJson(resolved);\n if (!data) {\n throw new Error(`Policy \"${source}\" not found at: ${resolved}`);\n }\n return validatePolicyConfig(data, source, \"json\");\n }\n // TS/JS module \u2014 blocked when jsonOnly\n if (/\\.[mc]?[jt]s$/u.test(resolved)) {\n if (jsonOnly) {\n throw new Error(\n `Policy \"${source}\" rejected: only JSON policies are allowed from primer.config.json. Module policies (.ts/.js) must be passed via --policy.`\n );\n }\n try {\n const mod = (await import(resolved)) as Record;\n const config = (mod.default ?? mod) as unknown;\n return validatePolicyConfig(config, source);\n } catch (err) {\n if (\n err instanceof Error &&\n (err.message.includes(\"Cannot find module\") || err.message.includes(\"MODULE_NOT_FOUND\"))\n ) {\n throw new Error(`Policy \"${source}\" not found at: ${resolved}`);\n }\n throw err;\n }\n }\n // Unsupported extension \u2014 try as JSON\n try {\n const raw = await fs.readFile(resolved, \"utf8\");\n const data = JSON.parse(raw) as unknown;\n return validatePolicyConfig(data, source, \"json\");\n } catch {\n throw new Error(\n `Policy \"${source}\" could not be loaded from: ${resolved}. Supported formats: .json, .js, .ts, .mjs`\n );\n }\n }\n\n // npm package (bare specifier or scoped) \u2014 blocked when jsonOnly\n if (jsonOnly) {\n throw new Error(\n `Policy \"${source}\" rejected: only JSON file policies are allowed from primer.config.json. npm policies must be passed via --policy.`\n );\n }\n try {\n const mod = (await import(source)) as Record;\n const config = (mod.default ?? mod) as unknown;\n return validatePolicyConfig(config, source);\n } catch (err) {\n if (\n err instanceof Error &&\n (err.message.includes(\"Cannot find module\") ||\n err.message.includes(\"Cannot find package\") ||\n err.message.includes(\"MODULE_NOT_FOUND\") ||\n err.message.includes(\"ERR_MODULE_NOT_FOUND\"))\n ) {\n throw new Error(`Policy \"${source}\" not found. Install it with: npm install ${source}`);\n }\n throw err;\n }\n}\n\n// \u2500\u2500\u2500 Chain resolution \u2500\u2500\u2500\n\nexport function resolveChain(\n baseCriteria: ReadinessCriterion[],\n baseExtras: ExtraDefinition[],\n policies: PolicyConfig[]\n): ResolvedPolicy {\n const chain: string[] = [];\n let criteria = [...baseCriteria];\n let extras = [...baseExtras];\n let passRate = DEFAULT_PASS_RATE;\n\n for (const policy of policies) {\n chain.push(policy.name);\n\n if (policy.criteria) {\n // Disable criteria by id\n if (policy.criteria.disable?.length) {\n const disableSet = new Set(policy.criteria.disable);\n criteria = criteria.filter((c) => !disableSet.has(c.id));\n }\n\n // Override metadata by id\n if (policy.criteria.override) {\n for (const [id, overrides] of Object.entries(policy.criteria.override)) {\n const idx = criteria.findIndex((c) => c.id === id);\n if (idx >= 0) {\n criteria[idx] = { ...criteria[idx], ...overrides };\n }\n }\n }\n\n // Add new criteria\n if (policy.criteria.add?.length) {\n for (const newCriterion of policy.criteria.add) {\n // Replace if same id exists, otherwise append\n const existingIdx = criteria.findIndex((c) => c.id === newCriterion.id);\n if (existingIdx >= 0) {\n criteria[existingIdx] = newCriterion;\n } else {\n criteria.push(newCriterion);\n }\n }\n }\n }\n\n if (policy.extras) {\n if (policy.extras.disable?.length) {\n const disableSet = new Set(policy.extras.disable);\n extras = extras.filter((e) => !disableSet.has(e.id));\n }\n if (policy.extras.add?.length) {\n for (const newExtra of policy.extras.add) {\n const existingIdx = extras.findIndex((e) => e.id === newExtra.id);\n if (existingIdx >= 0) {\n extras[existingIdx] = newExtra;\n } else {\n extras.push(newExtra);\n }\n }\n }\n }\n\n if (policy.thresholds?.passRate !== undefined) {\n passRate = policy.thresholds.passRate;\n }\n }\n\n return { chain, criteria, extras, thresholds: { passRate } };\n}\n", "import type { ReadinessReport, AreaReadinessReport } from \"./readiness\";\n\ntype VisualReportOptions = {\n reports: Array<{ repo: string; report: ReadinessReport; error?: string }>;\n title?: string;\n generatedAt?: string;\n};\n\nexport function generateVisualReport(options: VisualReportOptions): string {\n const {\n reports,\n title = \"AI Readiness Report\",\n generatedAt = new Date().toISOString()\n } = options;\n\n const successfulReports = reports.filter((r) => !r.error);\n const failedReports = reports.filter((r) => r.error);\n\n const totalRepos = reports.length;\n const successfulRepos = successfulReports.length;\n const avgLevel =\n successfulReports.length > 0\n ? successfulReports.reduce((sum, r) => sum + r.report.achievedLevel, 0) /\n successfulReports.length\n : 0;\n\n const pillarStats = calculatePillarStats(successfulReports);\n const aiToolingData = calculateAiToolingData(successfulReports);\n\n return `\n\n\n \n \n \n ${escapeHtml(title)}\n \n\n\n
    \n
    \n \n \n \n
    \n

    ${escapeHtml(title)}

    \n

    Generated ${new Date(generatedAt).toLocaleString()}

    \n
    \n \n
    \n\n
    \n
    \n
    Repositories
    \n
    ${totalRepos}
    \n
    ${successfulRepos} analyzed successfully
    \n
    \n
    \n
    Avg Maturity
    \n
    ${avgLevel.toFixed(1)}
    \n
    ${getLevelName(Math.round(avgLevel))}
    \n
    \n
    \n
    Success Rate
    \n
    ${totalRepos > 0 ? Math.round((successfulRepos / totalRepos) * 100) : 0}%
    \n
    ${failedReports.length > 0 ? failedReports.length + \" failed\" : \"All succeeded\"}
    \n
    \n
    \n\n ${\n successfulReports.length > 0\n ? `\n ${buildAiToolingHeroHtml(aiToolingData, successfulReports)}\n\n
    \n

    Pillar Performance

    \n
    \n ${pillarStats\n .map(\n (pillar) => `\n
    \n
    ${escapeHtml(pillar.name)}
    \n
    \n
    \n
    0 ? 2 : 0)}%\">
    \n
    \n ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%)\n
    \n
    \n `\n )\n .join(\"\")}\n
    \n
    \n\n
    \n

    Maturity Model

    \n
    \n ${[1, 2, 3, 4, 5]\n .map((level) => {\n const count = successfulReports.filter((r) => r.report.achievedLevel === level).length;\n return `\n
    0 ? \" has-repos\" : \"\"}\">\n
    \n ${level}\n ${getLevelName(level)}\n ${count} repo${count !== 1 ? \"s\" : \"\"}\n
    \n
    ${getLevelDescription(level)}
    \n
    \n `;\n })\n .join(\"\")}\n
    \n\n

    Distribution

    \n
    \n ${[1, 2, 3, 4, 5]\n .map((level) => {\n const count = successfulReports.filter((r) => r.report.achievedLevel === level).length;\n const percent =\n successfulReports.length > 0 ? (count / successfulReports.length) * 100 : 0;\n const barHeight = count > 0 ? Math.max(40, percent * 2) : 0;\n return `\n
    \n
    ${count}
    \n
    \n
    ${level}
    ${getLevelName(level)}
    \n
    \n `;\n })\n .join(\"\")}\n
    \n
    \n `\n : \"\"\n }\n\n
    \n

    Repository Details

    \n
    \n ${reports\n .map(({ repo, report, error }) => {\n if (error) {\n return `\n
    \n
    \n
    ${escapeHtml(repo)}
    \n Error\n
    \n
    ${escapeHtml(error)}
    \n
    \n `;\n }\n\n return `\n
    \n
    \n
    ${escapeHtml(repo)}
    \n
    \n Maturity ${report.achievedLevel}: ${getLevelName(report.achievedLevel)}\n
    \n
    \n ${report.isMonorepo ? `
    Monorepo · ${report.apps.length} apps
    ` : \"\"}\n
    \n ${report.pillars\n .map((pillar) => {\n const pillarCriteria = report.criteria.filter((c) => c.pillar === pillar.id);\n return `\n
    \n
    \n \n ${escapeHtml(pillar.name)}\n ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%)\n \n
    \n ${pillarCriteria\n .map(\n (c) => `\n
    \n ${escapeHtml(c.title)}\n ${c.status === \"pass\" ? \"Pass\" : c.status === \"fail\" ? \"Fail\" : \"Skip\"}\n
    \n `\n )\n .join(\"\")}\n ${pillarCriteria.length === 0 ? '
    No criteria
    ' : \"\"}\n
    \n
    \n
    \n `;\n })\n .join(\"\")}\n
    \n ${getTopFixesHtml(report)}\n ${buildAreaReportsHtml(report.areaReports)}\n
    \n `;\n })\n .join(\"\")}\n
    \n
    \n\n ${\n failedReports.length > 0\n ? `\n
    \n

    Failed Repositories

    \n
    \n ${failedReports\n .map(\n ({ repo, error }) => `\n
    \n
    ${escapeHtml(repo)}
    \n
    ${escapeHtml(error || \"Unknown error\")}
    \n
    \n `\n )\n .join(\"\")}\n
    \n
    \n `\n : \"\"\n }\n\n
    \n

    Generated with Primer · AI Readiness Tool

    \n
    \n
    \n \n\n`;\n}\n\n// \u2500\u2500 Helper Functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction calculatePillarStats(reports: Array<{ repo: string; report: ReadinessReport }>): Array<{\n id: string;\n name: string;\n passed: number;\n total: number;\n passRate: number;\n}> {\n const pillarMap = new Map();\n\n for (const { report } of reports) {\n for (const pillar of report.pillars) {\n const existing = pillarMap.get(pillar.id);\n if (existing) {\n existing.passed += pillar.passed;\n existing.total += pillar.total;\n } else {\n pillarMap.set(pillar.id, {\n name: pillar.name,\n passed: pillar.passed,\n total: pillar.total\n });\n }\n }\n }\n\n return Array.from(pillarMap.entries()).map(([id, stats]) => ({\n id,\n name: stats.name,\n passed: stats.passed,\n total: stats.total,\n passRate: stats.total > 0 ? stats.passed / stats.total : 0\n }));\n}\n\nfunction getTopFixesHtml(report: ReadinessReport): string {\n const failedCriteria = report.criteria\n .filter((c) => c.status === \"fail\")\n .sort((a, b) => {\n const impactWeight = { high: 3, medium: 2, low: 1 };\n const effortWeight = { low: 1, medium: 2, high: 3 };\n const impactDelta = impactWeight[b.impact] - impactWeight[a.impact];\n if (impactDelta !== 0) return impactDelta;\n return effortWeight[a.effort] - effortWeight[b.effort];\n })\n .slice(0, 3);\n\n if (failedCriteria.length === 0) {\n return '
    All criteria passing
    ';\n }\n\n return `\n
    \n
    Top Fixes Needed
    \n
      \n ${failedCriteria\n .map(\n (c) => `\n
    • \n \n ${escapeHtml(c.title)}\n ${c.impact} impact, ${c.effort} effort\n
    • \n `\n )\n .join(\"\")}\n
    \n
    \n `;\n}\n\nfunction getLevelName(level: number): string {\n const names: Record = {\n 1: \"Functional\",\n 2: \"Documented\",\n 3: \"Standardized\",\n 4: \"Optimized\",\n 5: \"Autonomous\"\n };\n return names[level] || \"Unknown\";\n}\n\nfunction getLevelDescription(level: number): string {\n const descriptions: Record = {\n 1: \"Repo builds, tests run, and basic tooling (linter, lockfile) is in place. AI agents can clone and get started.\",\n 2: \"README, CONTRIBUTING guide, and custom AI instructions exist. Agents understand project context and conventions.\",\n 3: \"CI/CD, security policies, CODEOWNERS, and observability are configured. Agents operate within well-defined guardrails.\",\n 4: \"MCP servers, custom agents, and AI skills are set up. Agents have deep integration with project-specific tools and workflows.\",\n 5: \"Full AI-native development: agents can independently plan, implement, test, and ship changes with minimal human oversight.\"\n };\n return descriptions[level] || \"\";\n}\n\nfunction getProgressClass(passRate: number): string {\n if (passRate >= 0.8) return \"high\";\n if (passRate >= 0.5) return \"medium\";\n return \"low\";\n}\n\n// \u2500\u2500 AI Tooling Hero \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype AiToolingCriterionSummary = {\n id: string;\n title: string;\n passCount: number;\n totalRepos: number;\n status: \"pass\" | \"fail\";\n evidence: string[];\n reason: string;\n};\n\ntype AiToolingData = {\n criteria: AiToolingCriterionSummary[];\n passed: number;\n total: number;\n passRate: number;\n};\n\nfunction calculateAiToolingData(\n reports: Array<{ repo: string; report: ReadinessReport }>\n): AiToolingData {\n const criterionMap = new Map();\n\n for (const { report } of reports) {\n const aiCriteria = report.criteria.filter((c) => c.pillar === \"ai-tooling\");\n for (const c of aiCriteria) {\n const existing = criterionMap.get(c.id);\n if (existing) {\n existing.totalRepos += 1;\n if (c.status === \"pass\") existing.passCount += 1;\n if (c.evidence) existing.evidence.push(...c.evidence);\n } else {\n criterionMap.set(c.id, {\n id: c.id,\n title: c.title,\n passCount: c.status === \"pass\" ? 1 : 0,\n totalRepos: 1,\n status: c.status === \"pass\" ? \"pass\" : \"fail\",\n evidence: c.evidence ? [...c.evidence] : [],\n reason: c.reason || \"\"\n });\n }\n }\n }\n\n const criteria = Array.from(criterionMap.values()).map((c) => ({\n ...c,\n status: (c.passCount / c.totalRepos >= 0.5 ? \"pass\" : \"fail\") as \"pass\" | \"fail\",\n evidence: [...new Set(c.evidence)]\n }));\n\n const passed = criteria.filter((c) => c.status === \"pass\").length;\n return {\n criteria,\n passed,\n total: criteria.length,\n passRate: criteria.length > 0 ? passed / criteria.length : 0\n };\n}\n\nfunction getAiScoreClass(passRate: number): string {\n if (passRate >= 0.6) return \"score-high\";\n if (passRate >= 0.3) return \"score-medium\";\n return \"score-low\";\n}\n\nfunction getAiScoreLabel(passRate: number): string {\n if (passRate >= 0.8) return \"Excellent\";\n if (passRate >= 0.6) return \"Good\";\n if (passRate >= 0.4) return \"Fair\";\n if (passRate >= 0.2) return \"Getting Started\";\n return \"Not Started\";\n}\n\nfunction getAiCriterionIcon(id: string): string {\n const icons: Record = {\n \"custom-instructions\": \"📝\",\n \"mcp-config\": \"🔌\",\n \"custom-agents\": \"🤖\",\n \"copilot-skills\": \"⚡\"\n };\n return icons[id] || \"🔧\";\n}\n\nfunction buildAiToolingHeroHtml(\n data: AiToolingData,\n reports: Array<{ repo: string; report: ReadinessReport }>\n): string {\n if (data.criteria.length === 0) return \"\";\n\n const pct = Math.round(data.passRate * 100);\n const scoreClass = getAiScoreClass(data.passRate);\n const scoreLabel = getAiScoreLabel(data.passRate);\n\n const multiRepo = reports.length > 1;\n const perRepoHtml = multiRepo\n ? `\n
    \n
    Per Repository
    \n
    \n ${reports\n .map(({ repo, report }) => {\n const aiPillar = report.pillars.find((p) => p.id === \"ai-tooling\");\n const repoPct = aiPillar ? Math.round(aiPillar.passRate * 100) : 0;\n const repoPass = aiPillar?.passed ?? 0;\n const repoTotal = aiPillar?.total ?? 0;\n return `
    \n ${escapeHtml(repo)}\n = 60 ? \"var(--color-success-fg)\" : repoPct >= 30 ? \"var(--color-attention-fg)\" : \"var(--color-danger-fg)\"};\">${repoPass}/${repoTotal} (${repoPct}%)\n
    `;\n })\n .join(\"\")}\n
    \n
    \n `\n : \"\";\n\n return `\n
    \n

    AI Tooling Readiness

    \n

    How well prepared ${multiRepo ? \"your repositories are\" : \"this repository is\"} for AI-assisted development

    \n\n
    \n
    ${pct}%
    \n
    \n
    ${scoreLabel}
    \n
    ${data.passed} of ${data.total} AI tooling checks passing${multiRepo ? ` across ${reports.length} repositories` : \"\"}
    \n
    \n
    \n\n
    \n ${data.criteria\n .map(\n (c) => `\n
    \n
    \n ${c.status === \"pass\" ? \"✓\" : \"✗\"}\n
    \n
    \n
    ${getAiCriterionIcon(c.id)} ${escapeHtml(c.title)}
    \n
    ${\n c.status === \"pass\"\n ? multiRepo\n ? `${c.passCount}/${c.totalRepos} repos`\n : \"Detected\"\n : escapeHtml(c.reason)\n }
    \n
    \n
    \n `\n )\n .join(\"\")}\n
    \n ${perRepoHtml}\n
    \n `;\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\"\n };\n return text.replace(/[&<>\"']/g, (m) => map[m]);\n}\n\nfunction buildAreaReportsHtml(areaReports?: AreaReadinessReport[]): string {\n if (!areaReports?.length) return \"\";\n\n return `\n
    \n
    Per-Area Breakdown
    \n
    \n ${areaReports\n .map((ar) => {\n const relevant = ar.criteria.filter((c) => c.status !== \"skip\");\n const passed = relevant.filter((c) => c.status === \"pass\").length;\n const total = relevant.length;\n const pct = total ? Math.round((passed / total) * 100) : 0;\n const sourceLabel = ar.area.source === \"config\" ? \"config\" : \"auto\";\n const applyTo = Array.isArray(ar.area.applyTo)\n ? ar.area.applyTo.join(\", \")\n : ar.area.applyTo;\n\n return `\n
    \n
    \n \n ${escapeHtml(ar.area.name)}\n \n ${sourceLabel}\n = 80 ? \"var(--color-success-fg)\" : pct >= 50 ? \"var(--color-attention-fg)\" : \"var(--color-danger-fg)\"};\">${passed}/${total} (${pct}%)\n \n \n
    \n
    ${escapeHtml(applyTo)}
    \n ${ar.criteria\n .map(\n (c) => `\n
    \n ${escapeHtml(c.title)}\n ${c.status === \"pass\" ? \"Pass\" : c.status === \"fail\" ? \"Fail\" : \"Skip\"}\n
    \n `\n )\n .join(\"\")}\n
    \n
    \n
    \n `;\n })\n .join(\"\")}\n
    \n
    \n `;\n}\n", "import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nimport { Octokit } from \"@octokit/rest\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Get a GitHub token from environment variables or the GitHub CLI.\n * Tries GITHUB_TOKEN, GH_TOKEN, then `gh auth token` in that order.\n */\nexport async function getGitHubToken(): Promise {\n // Check environment variables first\n const envToken = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;\n if (envToken) {\n return envToken;\n }\n\n // Fall back to GitHub CLI\n try {\n const { stdout } = await execFileAsync(\"gh\", [\"auth\", \"token\"], { timeout: 5000 });\n const token = stdout.trim();\n if (token) {\n return token;\n }\n } catch {\n // gh CLI not installed or not authenticated\n }\n\n return null;\n}\n\nexport type GitHubRepo = {\n name: string;\n owner: string;\n fullName: string;\n cloneUrl: string;\n isPrivate: boolean;\n defaultBranch: string;\n hasInstructions?: boolean;\n};\n\nexport function createGitHubClient(token: string): Octokit {\n return new Octokit({ auth: token });\n}\n\nexport async function listAccessibleRepos(token: string, limit = 100): Promise {\n const client = createGitHubClient(token);\n\n // Fetch only first page - avoids timeout for users with many repos\n const repos = await client.rest.repos.listForAuthenticatedUser({\n visibility: \"all\",\n affiliation: \"owner\",\n sort: \"pushed\",\n per_page: Math.min(limit, 100)\n });\n\n return repos.data.slice(0, limit).map((repo) => ({\n name: repo.name,\n owner: repo.owner?.login ?? \"unknown\",\n fullName: repo.full_name,\n cloneUrl: repo.clone_url ?? \"\",\n isPrivate: repo.private,\n defaultBranch: repo.default_branch ?? \"main\"\n }));\n}\n\nexport async function getRepo(token: string, owner: string, repo: string): Promise {\n const client = createGitHubClient(token);\n const response = await client.rest.repos.get({ owner, repo });\n\n return {\n name: response.data.name,\n owner: response.data.owner?.login ?? owner,\n fullName: response.data.full_name,\n cloneUrl: response.data.clone_url,\n isPrivate: response.data.private,\n defaultBranch: response.data.default_branch\n };\n}\n\nexport async function createPullRequest(params: {\n token: string;\n owner: string;\n repo: string;\n title: string;\n body: string;\n head: string;\n base: string;\n}): Promise {\n const client = createGitHubClient(params.token);\n const response = await client.rest.pulls.create({\n owner: params.owner,\n repo: params.repo,\n title: params.title,\n body: params.body,\n head: params.head,\n base: params.base\n });\n\n return response.data.html_url;\n}\n\nexport type GitHubOrg = {\n login: string;\n name: string | null;\n};\n\nexport async function listUserOrgs(token: string): Promise {\n const client = createGitHubClient(token);\n const orgs = await client.paginate(client.rest.orgs.listForAuthenticatedUser, {\n per_page: 100\n });\n\n return orgs.map((org) => ({\n login: org.login,\n name: org.description ?? null\n }));\n}\n\nexport async function listOrgRepos(token: string, org: string, limit = 100): Promise {\n const client = createGitHubClient(token);\n\n // Fetch only the first page(s) up to limit - avoids timeout on huge orgs\n const repos = await client.rest.repos.listForOrg({\n org,\n type: \"all\",\n sort: \"pushed\",\n per_page: Math.min(limit, 100)\n });\n\n return repos.data.slice(0, limit).map((repo) => ({\n name: repo.name,\n owner: repo.owner?.login ?? org,\n fullName: repo.full_name,\n cloneUrl: repo.clone_url ?? \"\",\n isPrivate: repo.private,\n defaultBranch: repo.default_branch ?? \"main\"\n }));\n}\n\n/**\n * Check if a repo has .github/copilot-instructions.md\n */\nexport async function checkRepoHasInstructions(\n token: string,\n owner: string,\n repo: string\n): Promise {\n const client = createGitHubClient(token);\n try {\n await client.rest.repos.getContent({\n owner,\n repo,\n path: \".github/copilot-instructions.md\"\n });\n return true;\n } catch (error: unknown) {\n if (\n error &&\n typeof error === \"object\" &&\n \"status\" in error &&\n (error as { status: number }).status === 404\n ) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Check multiple repos for instructions in parallel (with concurrency limit)\n */\nexport async function checkReposForInstructions(\n token: string,\n repos: GitHubRepo[],\n onProgress?: (checked: number, total: number) => void\n): Promise {\n const concurrency = 10;\n const results: GitHubRepo[] = [];\n let checked = 0;\n\n for (let i = 0; i < repos.length; i += concurrency) {\n const batch = repos.slice(i, i + concurrency);\n const checks = await Promise.all(\n batch.map(async (repo) => {\n const hasInstructions = await checkRepoHasInstructions(token, repo.owner, repo.name);\n return { ...repo, hasInstructions };\n })\n );\n results.push(...checks);\n checked += batch.length;\n onProgress?.(checked, repos.length);\n }\n\n return results;\n}\n", "export function getUserAgent() {\n if (typeof navigator === \"object\" && \"userAgent\" in navigator) {\n return navigator.userAgent;\n }\n\n if (typeof process === \"object\" && process.version !== undefined) {\n return `Node.js/${process.version.substr(1)} (${process.platform}; ${\n process.arch\n })`;\n }\n\n return \"\";\n}\n", "// @ts-check\n\nexport function register(state, name, method, options) {\n if (typeof method !== \"function\") {\n throw new Error(\"method for before hook must be a function\");\n }\n\n if (!options) {\n options = {};\n }\n\n if (Array.isArray(name)) {\n return name.reverse().reduce((callback, name) => {\n return register.bind(null, state, name, callback, options);\n }, method)();\n }\n\n return Promise.resolve().then(() => {\n if (!state.registry[name]) {\n return method(options);\n }\n\n return state.registry[name].reduce((method, registered) => {\n return registered.hook.bind(null, method, options);\n }, method)();\n });\n}\n", "// @ts-check\n\nexport function addHook(state, kind, name, hook) {\n const orig = hook;\n if (!state.registry[name]) {\n state.registry[name] = [];\n }\n\n if (kind === \"before\") {\n hook = (method, options) => {\n return Promise.resolve()\n .then(orig.bind(null, options))\n .then(method.bind(null, options));\n };\n }\n\n if (kind === \"after\") {\n hook = (method, options) => {\n let result;\n return Promise.resolve()\n .then(method.bind(null, options))\n .then((result_) => {\n result = result_;\n return orig(result, options);\n })\n .then(() => {\n return result;\n });\n };\n }\n\n if (kind === \"error\") {\n hook = (method, options) => {\n return Promise.resolve()\n .then(method.bind(null, options))\n .catch((error) => {\n return orig(error, options);\n });\n };\n }\n\n state.registry[name].push({\n hook: hook,\n orig: orig,\n });\n}\n", "// @ts-check\n\nexport function removeHook(state, name, method) {\n if (!state.registry[name]) {\n return;\n }\n\n const index = state.registry[name]\n .map((registered) => {\n return registered.orig;\n })\n .indexOf(method);\n\n if (index === -1) {\n return;\n }\n\n state.registry[name].splice(index, 1);\n}\n", "// @ts-check\n\nimport { register } from \"./lib/register.js\";\nimport { addHook } from \"./lib/add.js\";\nimport { removeHook } from \"./lib/remove.js\";\n\n// bind with array of arguments: https://stackoverflow.com/a/21792913\nconst bind = Function.bind;\nconst bindable = bind.bind(bind);\n\nfunction bindApi(hook, state, name) {\n const removeHookRef = bindable(removeHook, null).apply(\n null,\n name ? [state, name] : [state]\n );\n hook.api = { remove: removeHookRef };\n hook.remove = removeHookRef;\n [\"before\", \"error\", \"after\", \"wrap\"].forEach((kind) => {\n const args = name ? [state, kind, name] : [state, kind];\n hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args);\n });\n}\n\nfunction Singular() {\n const singularHookName = Symbol(\"Singular\");\n const singularHookState = {\n registry: {},\n };\n const singularHook = register.bind(null, singularHookState, singularHookName);\n bindApi(singularHook, singularHookState, singularHookName);\n return singularHook;\n}\n\nfunction Collection() {\n const state = {\n registry: {},\n };\n\n const hook = register.bind(null, state);\n bindApi(hook, state);\n\n return hook;\n}\n\nexport default { Singular, Collection };\n", "// pkg/dist-src/defaults.js\nimport { getUserAgent } from \"universal-user-agent\";\n\n// pkg/dist-src/version.js\nvar VERSION = \"0.0.0-development\";\n\n// pkg/dist-src/defaults.js\nvar userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;\nvar DEFAULTS = {\n method: \"GET\",\n baseUrl: \"https://api.github.com\",\n headers: {\n accept: \"application/vnd.github.v3+json\",\n \"user-agent\": userAgent\n },\n mediaType: {\n format: \"\"\n }\n};\n\n// pkg/dist-src/util/lowercase-keys.js\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\n// pkg/dist-src/util/is-plain-object.js\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null) return false;\n if (Object.prototype.toString.call(value) !== \"[object Object]\") return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null) return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n return typeof Ctor === \"function\" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n// pkg/dist-src/util/merge-deep.js\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach((key) => {\n if (isPlainObject(options[key])) {\n if (!(key in defaults)) Object.assign(result, { [key]: options[key] });\n else result[key] = mergeDeep(defaults[key], options[key]);\n } else {\n Object.assign(result, { [key]: options[key] });\n }\n });\n return result;\n}\n\n// pkg/dist-src/util/remove-undefined-properties.js\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === void 0) {\n delete obj[key];\n }\n }\n return obj;\n}\n\n// pkg/dist-src/merge.js\nfunction merge(defaults, route, options) {\n if (typeof route === \"string\") {\n let [method, url] = route.split(\" \");\n options = Object.assign(url ? { method, url } : { url: method }, options);\n } else {\n options = Object.assign({}, route);\n }\n options.headers = lowercaseKeys(options.headers);\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options);\n if (options.url === \"/graphql\") {\n if (defaults && defaults.mediaType.previews?.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(\n (preview) => !mergedOptions.mediaType.previews.includes(preview)\n ).concat(mergedOptions.mediaType.previews);\n }\n mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, \"\"));\n }\n return mergedOptions;\n}\n\n// pkg/dist-src/util/add-query-parameters.js\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? \"&\" : \"?\";\n const names = Object.keys(parameters);\n if (names.length === 0) {\n return url;\n }\n return url + separator + names.map((name) => {\n if (name === \"q\") {\n return \"q=\" + parameters.q.split(\"+\").map(encodeURIComponent).join(\"+\");\n }\n return `${name}=${encodeURIComponent(parameters[name])}`;\n }).join(\"&\");\n}\n\n// pkg/dist-src/util/extract-url-variable-names.js\nvar urlVariableRegex = /\\{[^{}}]+\\}/g;\nfunction removeNonChars(variableName) {\n return variableName.replace(/(?:^\\W+)|(?:(? a.concat(b), []);\n}\n\n// pkg/dist-src/util/omit.js\nfunction omit(object, keysToOmit) {\n const result = { __proto__: null };\n for (const key of Object.keys(object)) {\n if (keysToOmit.indexOf(key) === -1) {\n result[key] = object[key];\n }\n }\n return result;\n}\n\n// pkg/dist-src/util/url-template.js\nfunction encodeReserved(str) {\n return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, \"[\").replace(/%5D/g, \"]\");\n }\n return part;\n }).join(\"\");\n}\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {\n return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nfunction encodeValue(operator, value, key) {\n value = operator === \"+\" || operator === \"#\" ? encodeReserved(value) : encodeUnreserved(value);\n if (key) {\n return encodeUnreserved(key) + \"=\" + value;\n } else {\n return value;\n }\n}\nfunction isDefined(value) {\n return value !== void 0 && value !== null;\n}\nfunction isKeyOperator(operator) {\n return operator === \";\" || operator === \"&\" || operator === \"?\";\n}\nfunction getValues(context, operator, key, modifier) {\n var value = context[key], result = [];\n if (isDefined(value) && value !== \"\") {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n value = value.toString();\n if (modifier && modifier !== \"*\") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n result.push(\n encodeValue(operator, value, isKeyOperator(operator) ? key : \"\")\n );\n } else {\n if (modifier === \"*\") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n result.push(\n encodeValue(operator, value2, isKeyOperator(operator) ? key : \"\")\n );\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n } else {\n const tmp = [];\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n tmp.push(encodeValue(operator, value2));\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + \"=\" + tmp.join(\",\"));\n } else if (tmp.length !== 0) {\n result.push(tmp.join(\",\"));\n }\n }\n }\n } else {\n if (operator === \";\") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n } else if (value === \"\" && (operator === \"&\" || operator === \"?\")) {\n result.push(encodeUnreserved(key) + \"=\");\n } else if (value === \"\") {\n result.push(\"\");\n }\n }\n return result;\n}\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template)\n };\n}\nfunction expand(template, context) {\n var operators = [\"+\", \"#\", \".\", \"/\", \";\", \"?\", \"&\"];\n template = template.replace(\n /\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g,\n function(_, expression, literal) {\n if (expression) {\n let operator = \"\";\n const values = [];\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n expression.split(/,/g).forEach(function(variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n if (operator && operator !== \"+\") {\n var separator = \",\";\n if (operator === \"?\") {\n separator = \"&\";\n } else if (operator !== \"#\") {\n separator = operator;\n }\n return (values.length !== 0 ? operator : \"\") + values.join(separator);\n } else {\n return values.join(\",\");\n }\n } else {\n return encodeReserved(literal);\n }\n }\n );\n if (template === \"/\") {\n return template;\n } else {\n return template.replace(/\\/$/, \"\");\n }\n}\n\n// pkg/dist-src/parse.js\nfunction parse(options) {\n let method = options.method.toUpperCase();\n let url = (options.url || \"/\").replace(/:([a-z]\\w+)/g, \"{$1}\");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"mediaType\"\n ]);\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat(\"baseUrl\");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n headers.accept = headers.accept.split(/,/).map(\n (format) => format.replace(\n /application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/,\n `application/vnd$1$2.${options.mediaType.format}`\n )\n ).join(\",\");\n }\n if (url.endsWith(\"/graphql\")) {\n if (options.mediaType.previews?.length) {\n const previewsFromAcceptHeader = headers.accept.match(/(? {\n const format = options.mediaType.format ? `.${options.mediaType.format}` : \"+json\";\n return `application/vnd.github.${preview}-preview${format}`;\n }).join(\",\");\n }\n }\n }\n if ([\"GET\", \"HEAD\"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n } else {\n if (\"data\" in remainingParameters) {\n body = remainingParameters.data;\n } else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n }\n }\n }\n if (!headers[\"content-type\"] && typeof body !== \"undefined\") {\n headers[\"content-type\"] = \"application/json; charset=utf-8\";\n }\n if ([\"PATCH\", \"PUT\"].includes(method) && typeof body === \"undefined\") {\n body = \"\";\n }\n return Object.assign(\n { method, url, headers },\n typeof body !== \"undefined\" ? { body } : null,\n options.request ? { request: options.request } : null\n );\n}\n\n// pkg/dist-src/endpoint-with-defaults.js\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS2 = merge(oldDefaults, newDefaults);\n const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2);\n return Object.assign(endpoint2, {\n DEFAULTS: DEFAULTS2,\n defaults: withDefaults.bind(null, DEFAULTS2),\n merge: merge.bind(null, DEFAULTS2),\n parse\n });\n}\n\n// pkg/dist-src/index.js\nvar endpoint = withDefaults(null, DEFAULTS);\nexport {\n endpoint\n};\n", "// pkg/dist-src/index.js\nimport { endpoint } from \"@octokit/endpoint\";\n\n// pkg/dist-src/defaults.js\nimport { getUserAgent } from \"universal-user-agent\";\n\n// pkg/dist-src/version.js\nvar VERSION = \"10.0.7\";\n\n// pkg/dist-src/defaults.js\nvar defaults_default = {\n headers: {\n \"user-agent\": `octokit-request.js/${VERSION} ${getUserAgent()}`\n }\n};\n\n// pkg/dist-src/fetch-wrapper.js\nimport { safeParse } from \"fast-content-type-parse\";\n\n// pkg/dist-src/is-plain-object.js\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null) return false;\n if (Object.prototype.toString.call(value) !== \"[object Object]\") return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null) return true;\n const Ctor = Object.prototype.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n return typeof Ctor === \"function\" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);\n}\n\n// pkg/dist-src/fetch-wrapper.js\nimport { RequestError } from \"@octokit/request-error\";\nvar noop = () => \"\";\nasync function fetchWrapper(requestOptions) {\n const fetch = requestOptions.request?.fetch || globalThis.fetch;\n if (!fetch) {\n throw new Error(\n \"fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing\"\n );\n }\n const log = requestOptions.request?.log || console;\n const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false;\n const body = isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body) ? JSON.stringify(requestOptions.body) : requestOptions.body;\n const requestHeaders = Object.fromEntries(\n Object.entries(requestOptions.headers).map(([name, value]) => [\n name,\n String(value)\n ])\n );\n let fetchResponse;\n try {\n fetchResponse = await fetch(requestOptions.url, {\n method: requestOptions.method,\n body,\n redirect: requestOptions.request?.redirect,\n headers: requestHeaders,\n signal: requestOptions.request?.signal,\n // duplex must be set if request.body is ReadableStream or Async Iterables.\n // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.\n ...requestOptions.body && { duplex: \"half\" }\n });\n } catch (error) {\n let message = \"Unknown Error\";\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n error.status = 500;\n throw error;\n }\n message = error.message;\n if (error.name === \"TypeError\" && \"cause\" in error) {\n if (error.cause instanceof Error) {\n message = error.cause.message;\n } else if (typeof error.cause === \"string\") {\n message = error.cause;\n }\n }\n }\n const requestError = new RequestError(message, 500, {\n request: requestOptions\n });\n requestError.cause = error;\n throw requestError;\n }\n const status = fetchResponse.status;\n const url = fetchResponse.url;\n const responseHeaders = {};\n for (const [key, value] of fetchResponse.headers) {\n responseHeaders[key] = value;\n }\n const octokitResponse = {\n url,\n status,\n headers: responseHeaders,\n data: \"\"\n };\n if (\"deprecation\" in responseHeaders) {\n const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel=\"deprecation\"/);\n const deprecationLink = matches && matches.pop();\n log.warn(\n `[@octokit/request] \"${requestOptions.method} ${requestOptions.url}\" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : \"\"}`\n );\n }\n if (status === 204 || status === 205) {\n return octokitResponse;\n }\n if (requestOptions.method === \"HEAD\") {\n if (status < 400) {\n return octokitResponse;\n }\n throw new RequestError(fetchResponse.statusText, status, {\n response: octokitResponse,\n request: requestOptions\n });\n }\n if (status === 304) {\n octokitResponse.data = await getResponseData(fetchResponse);\n throw new RequestError(\"Not modified\", status, {\n response: octokitResponse,\n request: requestOptions\n });\n }\n if (status >= 400) {\n octokitResponse.data = await getResponseData(fetchResponse);\n throw new RequestError(toErrorMessage(octokitResponse.data), status, {\n response: octokitResponse,\n request: requestOptions\n });\n }\n octokitResponse.data = parseSuccessResponseBody ? await getResponseData(fetchResponse) : fetchResponse.body;\n return octokitResponse;\n}\nasync function getResponseData(response) {\n const contentType = response.headers.get(\"content-type\");\n if (!contentType) {\n return response.text().catch(noop);\n }\n const mimetype = safeParse(contentType);\n if (isJSONResponse(mimetype)) {\n let text = \"\";\n try {\n text = await response.text();\n return JSON.parse(text);\n } catch (err) {\n return text;\n }\n } else if (mimetype.type.startsWith(\"text/\") || mimetype.parameters.charset?.toLowerCase() === \"utf-8\") {\n return response.text().catch(noop);\n } else {\n return response.arrayBuffer().catch(\n /* v8 ignore next -- @preserve */\n () => new ArrayBuffer(0)\n );\n }\n}\nfunction isJSONResponse(mimetype) {\n return mimetype.type === \"application/json\" || mimetype.type === \"application/scim+json\";\n}\nfunction toErrorMessage(data) {\n if (typeof data === \"string\") {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return \"Unknown error\";\n }\n if (\"message\" in data) {\n const suffix = \"documentation_url\" in data ? ` - ${data.documentation_url}` : \"\";\n return Array.isArray(data.errors) ? `${data.message}: ${data.errors.map((v) => JSON.stringify(v)).join(\", \")}${suffix}` : `${data.message}${suffix}`;\n }\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldEndpoint, newDefaults) {\n const endpoint2 = oldEndpoint.defaults(newDefaults);\n const newApi = function(route, parameters) {\n const endpointOptions = endpoint2.merge(route, parameters);\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint2.parse(endpointOptions));\n }\n const request2 = (route2, parameters2) => {\n return fetchWrapper(\n endpoint2.parse(endpoint2.merge(route2, parameters2))\n );\n };\n Object.assign(request2, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n return endpointOptions.request.hook(request2, endpointOptions);\n };\n return Object.assign(newApi, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n}\n\n// pkg/dist-src/index.js\nvar request = withDefaults(endpoint, defaults_default);\nexport {\n request\n};\n/* v8 ignore next -- @preserve */\n/* v8 ignore else -- @preserve */\n", "class RequestError extends Error {\n name;\n /**\n * http status code\n */\n status;\n /**\n * Request options that lead to the error.\n */\n request;\n /**\n * Response object if a response was received\n */\n response;\n constructor(message, statusCode, options) {\n super(message, { cause: options.cause });\n this.name = \"HttpError\";\n this.status = Number.parseInt(statusCode);\n if (Number.isNaN(this.status)) {\n this.status = 0;\n }\n /* v8 ignore else -- @preserve -- Bug with vitest coverage where it sees an else branch that doesn't exist */\n if (\"response\" in options) {\n this.response = options.response;\n }\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(\n /(? ` - ${e.message}`).join(\"\\n\");\n}\nvar GraphqlResponseError = class extends Error {\n constructor(request2, headers, response) {\n super(_buildMessageForResponseErrors(response));\n this.request = request2;\n this.headers = headers;\n this.response = response;\n this.errors = response.errors;\n this.data = response.data;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n name = \"GraphqlResponseError\";\n errors;\n data;\n};\n\n// pkg/dist-src/graphql.js\nvar NON_VARIABLE_OPTIONS = [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"query\",\n \"mediaType\",\n \"operationName\"\n];\nvar FORBIDDEN_VARIABLE_OPTIONS = [\"query\", \"method\", \"url\"];\nvar GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request2, query, options) {\n if (options) {\n if (typeof query === \"string\" && \"query\" in options) {\n return Promise.reject(\n new Error(`[@octokit/graphql] \"query\" cannot be used as variable name`)\n );\n }\n for (const key in options) {\n if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue;\n return Promise.reject(\n new Error(\n `[@octokit/graphql] \"${key}\" cannot be used as variable name`\n )\n );\n }\n }\n const parsedOptions = typeof query === \"string\" ? Object.assign({ query }, options) : query;\n const requestOptions = Object.keys(\n parsedOptions\n ).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = parsedOptions[key];\n return result;\n }, {});\n const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, \"/api/graphql\");\n }\n return request2(requestOptions).then((response) => {\n if (response.data.errors) {\n const headers = {};\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n throw new GraphqlResponseError(\n requestOptions,\n headers,\n response.data\n );\n }\n return response.data.data;\n });\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(request2, newDefaults) {\n const newRequest = request2.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: withDefaults.bind(null, newRequest),\n endpoint: newRequest.endpoint\n });\n}\n\n// pkg/dist-src/index.js\nvar graphql2 = withDefaults(request, {\n headers: {\n \"user-agent\": `octokit-graphql.js/${VERSION} ${getUserAgent()}`\n },\n method: \"POST\",\n url: \"/graphql\"\n});\nfunction withCustomRequest(customRequest) {\n return withDefaults(customRequest, {\n method: \"POST\",\n url: \"/graphql\"\n });\n}\nexport {\n GraphqlResponseError,\n graphql2 as graphql,\n withCustomRequest\n};\n", "// pkg/dist-src/is-jwt.js\nvar b64url = \"(?:[a-zA-Z0-9_-]+)\";\nvar sep = \"\\\\.\";\nvar jwtRE = new RegExp(`^${b64url}${sep}${b64url}${sep}${b64url}$`);\nvar isJWT = jwtRE.test.bind(jwtRE);\n\n// pkg/dist-src/auth.js\nasync function auth(token) {\n const isApp = isJWT(token);\n const isInstallation = token.startsWith(\"v1.\") || token.startsWith(\"ghs_\");\n const isUserToServer = token.startsWith(\"ghu_\");\n const tokenType = isApp ? \"app\" : isInstallation ? \"installation\" : isUserToServer ? \"user-to-server\" : \"oauth\";\n return {\n type: \"token\",\n token,\n tokenType\n };\n}\n\n// pkg/dist-src/with-authorization-prefix.js\nfunction withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n\n// pkg/dist-src/hook.js\nasync function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(\n route,\n parameters\n );\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n\n// pkg/dist-src/index.js\nvar createTokenAuth = function createTokenAuth2(token) {\n if (!token) {\n throw new Error(\"[@octokit/auth-token] No token passed to createTokenAuth\");\n }\n if (typeof token !== \"string\") {\n throw new Error(\n \"[@octokit/auth-token] Token passed to createTokenAuth is not a string\"\n );\n }\n token = token.replace(/^(token|bearer) +/i, \"\");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token)\n });\n};\nexport {\n createTokenAuth\n};\n", "const VERSION = \"7.0.6\";\nexport {\n VERSION\n};\n", "import { getUserAgent } from \"universal-user-agent\";\nimport Hook from \"before-after-hook\";\nimport { request } from \"@octokit/request\";\nimport { withCustomRequest } from \"@octokit/graphql\";\nimport { createTokenAuth } from \"@octokit/auth-token\";\nimport { VERSION } from \"./version.js\";\nconst noop = () => {\n};\nconst consoleWarn = console.warn.bind(console);\nconst consoleError = console.error.bind(console);\nfunction createLogger(logger = {}) {\n if (typeof logger.debug !== \"function\") {\n logger.debug = noop;\n }\n if (typeof logger.info !== \"function\") {\n logger.info = noop;\n }\n if (typeof logger.warn !== \"function\") {\n logger.warn = consoleWarn;\n }\n if (typeof logger.error !== \"function\") {\n logger.error = consoleError;\n }\n return logger;\n}\nconst userAgentTrail = `octokit-core.js/${VERSION} ${getUserAgent()}`;\nclass Octokit {\n static VERSION = VERSION;\n static defaults(defaults) {\n const OctokitWithDefaults = class extends this {\n constructor(...args) {\n const options = args[0] || {};\n if (typeof defaults === \"function\") {\n super(defaults(options));\n return;\n }\n super(\n Object.assign(\n {},\n defaults,\n options,\n options.userAgent && defaults.userAgent ? {\n userAgent: `${options.userAgent} ${defaults.userAgent}`\n } : null\n )\n );\n }\n };\n return OctokitWithDefaults;\n }\n static plugins = [];\n /**\n * Attach a plugin (or many) to your Octokit instance.\n *\n * @example\n * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin(...newPlugins) {\n const currentPlugins = this.plugins;\n const NewOctokit = class extends this {\n static plugins = currentPlugins.concat(\n newPlugins.filter((plugin) => !currentPlugins.includes(plugin))\n );\n };\n return NewOctokit;\n }\n constructor(options = {}) {\n const hook = new Hook.Collection();\n const requestDefaults = {\n baseUrl: request.endpoint.DEFAULTS.baseUrl,\n headers: {},\n request: Object.assign({}, options.request, {\n // @ts-ignore internal usage only, no need to type\n hook: hook.bind(null, \"request\")\n }),\n mediaType: {\n previews: [],\n format: \"\"\n }\n };\n requestDefaults.headers[\"user-agent\"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail;\n if (options.baseUrl) {\n requestDefaults.baseUrl = options.baseUrl;\n }\n if (options.previews) {\n requestDefaults.mediaType.previews = options.previews;\n }\n if (options.timeZone) {\n requestDefaults.headers[\"time-zone\"] = options.timeZone;\n }\n this.request = request.defaults(requestDefaults);\n this.graphql = withCustomRequest(this.request).defaults(requestDefaults);\n this.log = createLogger(options.log);\n this.hook = hook;\n if (!options.authStrategy) {\n if (!options.auth) {\n this.auth = async () => ({\n type: \"unauthenticated\"\n });\n } else {\n const auth = createTokenAuth(options.auth);\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n }\n } else {\n const { authStrategy, ...otherOptions } = options;\n const auth = authStrategy(\n Object.assign(\n {\n request: this.request,\n log: this.log,\n // we pass the current octokit instance as well as its constructor options\n // to allow for authentication strategies that return a new octokit instance\n // that shares the same internal state as the current one. The original\n // requirement for this was the \"event-octokit\" authentication strategy\n // of https://github.com/probot/octokit-auth-probot.\n octokit: this,\n octokitOptions: otherOptions\n },\n options.auth\n )\n );\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n }\n const classConstructor = this.constructor;\n for (let i = 0; i < classConstructor.plugins.length; ++i) {\n Object.assign(this, classConstructor.plugins[i](this, options));\n }\n }\n // assigned during constructor\n request;\n graphql;\n log;\n hook;\n // TODO: type `octokit.auth` based on passed options.authStrategy\n auth;\n}\nexport {\n Octokit\n};\n", "const VERSION = \"6.0.0\";\nexport {\n VERSION\n};\n", "import { VERSION } from \"./version.js\";\nfunction requestLog(octokit) {\n octokit.hook.wrap(\"request\", (request, options) => {\n octokit.log.debug(\"request\", options);\n const start = Date.now();\n const requestOptions = octokit.request.endpoint.parse(options);\n const path = requestOptions.url.replace(options.baseUrl, \"\");\n return request(options).then((response) => {\n const requestId = response.headers[\"x-github-request-id\"];\n octokit.log.info(\n `${requestOptions.method} ${path} - ${response.status} with id ${requestId} in ${Date.now() - start}ms`\n );\n return response;\n }).catch((error) => {\n const requestId = error.response?.headers[\"x-github-request-id\"] || \"UNKNOWN\";\n octokit.log.error(\n `${requestOptions.method} ${path} - ${error.status} with id ${requestId} in ${Date.now() - start}ms`\n );\n throw error;\n });\n });\n}\nrequestLog.VERSION = VERSION;\nexport {\n requestLog\n};\n", "// pkg/dist-src/version.js\nvar VERSION = \"0.0.0-development\";\n\n// pkg/dist-src/normalize-paginated-list-response.js\nfunction normalizePaginatedListResponse(response) {\n if (!response.data) {\n return {\n ...response,\n data: []\n };\n }\n const responseNeedsNormalization = (\"total_count\" in response.data || \"total_commits\" in response.data) && !(\"url\" in response.data);\n if (!responseNeedsNormalization) return response;\n const incompleteResults = response.data.incomplete_results;\n const repositorySelection = response.data.repository_selection;\n const totalCount = response.data.total_count;\n const totalCommits = response.data.total_commits;\n delete response.data.incomplete_results;\n delete response.data.repository_selection;\n delete response.data.total_count;\n delete response.data.total_commits;\n const namespaceKey = Object.keys(response.data)[0];\n const data = response.data[namespaceKey];\n response.data = data;\n if (typeof incompleteResults !== \"undefined\") {\n response.data.incomplete_results = incompleteResults;\n }\n if (typeof repositorySelection !== \"undefined\") {\n response.data.repository_selection = repositorySelection;\n }\n response.data.total_count = totalCount;\n response.data.total_commits = totalCommits;\n return response;\n}\n\n// pkg/dist-src/iterator.js\nfunction iterator(octokit, route, parameters) {\n const options = typeof route === \"function\" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters);\n const requestMethod = typeof route === \"function\" ? route : octokit.request;\n const method = options.method;\n const headers = options.headers;\n let url = options.url;\n return {\n [Symbol.asyncIterator]: () => ({\n async next() {\n if (!url) return { done: true };\n try {\n const response = await requestMethod({ method, url, headers });\n const normalizedResponse = normalizePaginatedListResponse(response);\n url = ((normalizedResponse.headers.link || \"\").match(\n /<([^<>]+)>;\\s*rel=\"next\"/\n ) || [])[1];\n if (!url && \"total_commits\" in normalizedResponse.data) {\n const parsedUrl = new URL(normalizedResponse.url);\n const params = parsedUrl.searchParams;\n const page = parseInt(params.get(\"page\") || \"1\", 10);\n const per_page = parseInt(params.get(\"per_page\") || \"250\", 10);\n if (page * per_page < normalizedResponse.data.total_commits) {\n params.set(\"page\", String(page + 1));\n url = parsedUrl.toString();\n }\n }\n return { value: normalizedResponse };\n } catch (error) {\n if (error.status !== 409) throw error;\n url = \"\";\n return {\n value: {\n status: 200,\n headers: {},\n data: []\n }\n };\n }\n }\n })\n };\n}\n\n// pkg/dist-src/paginate.js\nfunction paginate(octokit, route, parameters, mapFn) {\n if (typeof parameters === \"function\") {\n mapFn = parameters;\n parameters = void 0;\n }\n return gather(\n octokit,\n [],\n iterator(octokit, route, parameters)[Symbol.asyncIterator](),\n mapFn\n );\n}\nfunction gather(octokit, results, iterator2, mapFn) {\n return iterator2.next().then((result) => {\n if (result.done) {\n return results;\n }\n let earlyExit = false;\n function done() {\n earlyExit = true;\n }\n results = results.concat(\n mapFn ? mapFn(result.value, done) : result.value.data\n );\n if (earlyExit) {\n return results;\n }\n return gather(octokit, results, iterator2, mapFn);\n });\n}\n\n// pkg/dist-src/compose-paginate.js\nvar composePaginateRest = Object.assign(paginate, {\n iterator\n});\n\n// pkg/dist-src/generated/paginating-endpoints.js\nvar paginatingEndpoints = [\n \"GET /advisories\",\n \"GET /app/hook/deliveries\",\n \"GET /app/installation-requests\",\n \"GET /app/installations\",\n \"GET /assignments/{assignment_id}/accepted_assignments\",\n \"GET /classrooms\",\n \"GET /classrooms/{classroom_id}/assignments\",\n \"GET /enterprises/{enterprise}/code-security/configurations\",\n \"GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories\",\n \"GET /enterprises/{enterprise}/dependabot/alerts\",\n \"GET /enterprises/{enterprise}/teams\",\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships\",\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations\",\n \"GET /events\",\n \"GET /gists\",\n \"GET /gists/public\",\n \"GET /gists/starred\",\n \"GET /gists/{gist_id}/comments\",\n \"GET /gists/{gist_id}/commits\",\n \"GET /gists/{gist_id}/forks\",\n \"GET /installation/repositories\",\n \"GET /issues\",\n \"GET /licenses\",\n \"GET /marketplace_listing/plans\",\n \"GET /marketplace_listing/plans/{plan_id}/accounts\",\n \"GET /marketplace_listing/stubbed/plans\",\n \"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts\",\n \"GET /networks/{owner}/{repo}/events\",\n \"GET /notifications\",\n \"GET /organizations\",\n \"GET /organizations/{org}/dependabot/repository-access\",\n \"GET /orgs/{org}/actions/cache/usage-by-repository\",\n \"GET /orgs/{org}/actions/hosted-runners\",\n \"GET /orgs/{org}/actions/permissions/repositories\",\n \"GET /orgs/{org}/actions/permissions/self-hosted-runners/repositories\",\n \"GET /orgs/{org}/actions/runner-groups\",\n \"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners\",\n \"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories\",\n \"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners\",\n \"GET /orgs/{org}/actions/runners\",\n \"GET /orgs/{org}/actions/secrets\",\n \"GET /orgs/{org}/actions/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/actions/variables\",\n \"GET /orgs/{org}/actions/variables/{name}/repositories\",\n \"GET /orgs/{org}/attestations/repositories\",\n \"GET /orgs/{org}/attestations/{subject_digest}\",\n \"GET /orgs/{org}/blocks\",\n \"GET /orgs/{org}/campaigns\",\n \"GET /orgs/{org}/code-scanning/alerts\",\n \"GET /orgs/{org}/code-security/configurations\",\n \"GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories\",\n \"GET /orgs/{org}/codespaces\",\n \"GET /orgs/{org}/codespaces/secrets\",\n \"GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/copilot/billing/seats\",\n \"GET /orgs/{org}/copilot/metrics\",\n \"GET /orgs/{org}/dependabot/alerts\",\n \"GET /orgs/{org}/dependabot/secrets\",\n \"GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/events\",\n \"GET /orgs/{org}/failed_invitations\",\n \"GET /orgs/{org}/hooks\",\n \"GET /orgs/{org}/hooks/{hook_id}/deliveries\",\n \"GET /orgs/{org}/insights/api/route-stats/{actor_type}/{actor_id}\",\n \"GET /orgs/{org}/insights/api/subject-stats\",\n \"GET /orgs/{org}/insights/api/user-stats/{user_id}\",\n \"GET /orgs/{org}/installations\",\n \"GET /orgs/{org}/invitations\",\n \"GET /orgs/{org}/invitations/{invitation_id}/teams\",\n \"GET /orgs/{org}/issues\",\n \"GET /orgs/{org}/members\",\n \"GET /orgs/{org}/members/{username}/codespaces\",\n \"GET /orgs/{org}/migrations\",\n \"GET /orgs/{org}/migrations/{migration_id}/repositories\",\n \"GET /orgs/{org}/organization-roles/{role_id}/teams\",\n \"GET /orgs/{org}/organization-roles/{role_id}/users\",\n \"GET /orgs/{org}/outside_collaborators\",\n \"GET /orgs/{org}/packages\",\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n \"GET /orgs/{org}/personal-access-token-requests\",\n \"GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories\",\n \"GET /orgs/{org}/personal-access-tokens\",\n \"GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories\",\n \"GET /orgs/{org}/private-registries\",\n \"GET /orgs/{org}/projects\",\n \"GET /orgs/{org}/projectsV2\",\n \"GET /orgs/{org}/projectsV2/{project_number}/fields\",\n \"GET /orgs/{org}/projectsV2/{project_number}/items\",\n \"GET /orgs/{org}/properties/values\",\n \"GET /orgs/{org}/public_members\",\n \"GET /orgs/{org}/repos\",\n \"GET /orgs/{org}/rulesets\",\n \"GET /orgs/{org}/rulesets/rule-suites\",\n \"GET /orgs/{org}/rulesets/{ruleset_id}/history\",\n \"GET /orgs/{org}/secret-scanning/alerts\",\n \"GET /orgs/{org}/security-advisories\",\n \"GET /orgs/{org}/settings/immutable-releases/repositories\",\n \"GET /orgs/{org}/settings/network-configurations\",\n \"GET /orgs/{org}/team/{team_slug}/copilot/metrics\",\n \"GET /orgs/{org}/teams\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\",\n \"GET /orgs/{org}/teams/{team_slug}/invitations\",\n \"GET /orgs/{org}/teams/{team_slug}/members\",\n \"GET /orgs/{org}/teams/{team_slug}/projects\",\n \"GET /orgs/{org}/teams/{team_slug}/repos\",\n \"GET /orgs/{org}/teams/{team_slug}/teams\",\n \"GET /projects/{project_id}/collaborators\",\n \"GET /repos/{owner}/{repo}/actions/artifacts\",\n \"GET /repos/{owner}/{repo}/actions/caches\",\n \"GET /repos/{owner}/{repo}/actions/organization-secrets\",\n \"GET /repos/{owner}/{repo}/actions/organization-variables\",\n \"GET /repos/{owner}/{repo}/actions/runners\",\n \"GET /repos/{owner}/{repo}/actions/runs\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs\",\n \"GET /repos/{owner}/{repo}/actions/secrets\",\n \"GET /repos/{owner}/{repo}/actions/variables\",\n \"GET /repos/{owner}/{repo}/actions/workflows\",\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs\",\n \"GET /repos/{owner}/{repo}/activity\",\n \"GET /repos/{owner}/{repo}/assignees\",\n \"GET /repos/{owner}/{repo}/attestations/{subject_digest}\",\n \"GET /repos/{owner}/{repo}/branches\",\n \"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations\",\n \"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs\",\n \"GET /repos/{owner}/{repo}/code-scanning/alerts\",\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n \"GET /repos/{owner}/{repo}/code-scanning/analyses\",\n \"GET /repos/{owner}/{repo}/codespaces\",\n \"GET /repos/{owner}/{repo}/codespaces/devcontainers\",\n \"GET /repos/{owner}/{repo}/codespaces/secrets\",\n \"GET /repos/{owner}/{repo}/collaborators\",\n \"GET /repos/{owner}/{repo}/comments\",\n \"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/commits\",\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments\",\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/check-runs\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/check-suites\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/status\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/statuses\",\n \"GET /repos/{owner}/{repo}/compare/{basehead}\",\n \"GET /repos/{owner}/{repo}/compare/{base}...{head}\",\n \"GET /repos/{owner}/{repo}/contributors\",\n \"GET /repos/{owner}/{repo}/dependabot/alerts\",\n \"GET /repos/{owner}/{repo}/dependabot/secrets\",\n \"GET /repos/{owner}/{repo}/deployments\",\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\",\n \"GET /repos/{owner}/{repo}/environments\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/secrets\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/variables\",\n \"GET /repos/{owner}/{repo}/events\",\n \"GET /repos/{owner}/{repo}/forks\",\n \"GET /repos/{owner}/{repo}/hooks\",\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries\",\n \"GET /repos/{owner}/{repo}/invitations\",\n \"GET /repos/{owner}/{repo}/issues\",\n \"GET /repos/{owner}/{repo}/issues/comments\",\n \"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/issues/events\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/comments\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/events\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/labels\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline\",\n \"GET /repos/{owner}/{repo}/keys\",\n \"GET /repos/{owner}/{repo}/labels\",\n \"GET /repos/{owner}/{repo}/milestones\",\n \"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels\",\n \"GET /repos/{owner}/{repo}/notifications\",\n \"GET /repos/{owner}/{repo}/pages/builds\",\n \"GET /repos/{owner}/{repo}/projects\",\n \"GET /repos/{owner}/{repo}/pulls\",\n \"GET /repos/{owner}/{repo}/pulls/comments\",\n \"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/files\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments\",\n \"GET /repos/{owner}/{repo}/releases\",\n \"GET /repos/{owner}/{repo}/releases/{release_id}/assets\",\n \"GET /repos/{owner}/{repo}/releases/{release_id}/reactions\",\n \"GET /repos/{owner}/{repo}/rules/branches/{branch}\",\n \"GET /repos/{owner}/{repo}/rulesets\",\n \"GET /repos/{owner}/{repo}/rulesets/rule-suites\",\n \"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history\",\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts\",\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations\",\n \"GET /repos/{owner}/{repo}/security-advisories\",\n \"GET /repos/{owner}/{repo}/stargazers\",\n \"GET /repos/{owner}/{repo}/subscribers\",\n \"GET /repos/{owner}/{repo}/tags\",\n \"GET /repos/{owner}/{repo}/teams\",\n \"GET /repos/{owner}/{repo}/topics\",\n \"GET /repositories\",\n \"GET /search/code\",\n \"GET /search/commits\",\n \"GET /search/issues\",\n \"GET /search/labels\",\n \"GET /search/repositories\",\n \"GET /search/topics\",\n \"GET /search/users\",\n \"GET /teams/{team_id}/discussions\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/comments\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/reactions\",\n \"GET /teams/{team_id}/invitations\",\n \"GET /teams/{team_id}/members\",\n \"GET /teams/{team_id}/projects\",\n \"GET /teams/{team_id}/repos\",\n \"GET /teams/{team_id}/teams\",\n \"GET /user/blocks\",\n \"GET /user/codespaces\",\n \"GET /user/codespaces/secrets\",\n \"GET /user/emails\",\n \"GET /user/followers\",\n \"GET /user/following\",\n \"GET /user/gpg_keys\",\n \"GET /user/installations\",\n \"GET /user/installations/{installation_id}/repositories\",\n \"GET /user/issues\",\n \"GET /user/keys\",\n \"GET /user/marketplace_purchases\",\n \"GET /user/marketplace_purchases/stubbed\",\n \"GET /user/memberships/orgs\",\n \"GET /user/migrations\",\n \"GET /user/migrations/{migration_id}/repositories\",\n \"GET /user/orgs\",\n \"GET /user/packages\",\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n \"GET /user/public_emails\",\n \"GET /user/repos\",\n \"GET /user/repository_invitations\",\n \"GET /user/social_accounts\",\n \"GET /user/ssh_signing_keys\",\n \"GET /user/starred\",\n \"GET /user/subscriptions\",\n \"GET /user/teams\",\n \"GET /users\",\n \"GET /users/{username}/attestations/{subject_digest}\",\n \"GET /users/{username}/events\",\n \"GET /users/{username}/events/orgs/{org}\",\n \"GET /users/{username}/events/public\",\n \"GET /users/{username}/followers\",\n \"GET /users/{username}/following\",\n \"GET /users/{username}/gists\",\n \"GET /users/{username}/gpg_keys\",\n \"GET /users/{username}/keys\",\n \"GET /users/{username}/orgs\",\n \"GET /users/{username}/packages\",\n \"GET /users/{username}/projects\",\n \"GET /users/{username}/projectsV2\",\n \"GET /users/{username}/projectsV2/{project_number}/fields\",\n \"GET /users/{username}/projectsV2/{project_number}/items\",\n \"GET /users/{username}/received_events\",\n \"GET /users/{username}/received_events/public\",\n \"GET /users/{username}/repos\",\n \"GET /users/{username}/social_accounts\",\n \"GET /users/{username}/ssh_signing_keys\",\n \"GET /users/{username}/starred\",\n \"GET /users/{username}/subscriptions\"\n];\n\n// pkg/dist-src/paginating-endpoints.js\nfunction isPaginatingEndpoint(arg) {\n if (typeof arg === \"string\") {\n return paginatingEndpoints.includes(arg);\n } else {\n return false;\n }\n}\n\n// pkg/dist-src/index.js\nfunction paginateRest(octokit) {\n return {\n paginate: Object.assign(paginate.bind(null, octokit), {\n iterator: iterator.bind(null, octokit)\n })\n };\n}\npaginateRest.VERSION = VERSION;\nexport {\n composePaginateRest,\n isPaginatingEndpoint,\n paginateRest,\n paginatingEndpoints\n};\n", "export const VERSION = \"17.0.0\";\n", "import type { EndpointsDefaultsAndDecorations } from \"../types.js\";\nconst Endpoints: EndpointsDefaultsAndDecorations = {\n actions: {\n addCustomLabelsToSelfHostedRunnerForOrg: [\n \"POST /orgs/{org}/actions/runners/{runner_id}/labels\",\n ],\n addCustomLabelsToSelfHostedRunnerForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\",\n ],\n addRepoAccessToSelfHostedRunnerGroupInOrg: [\n \"PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}\",\n ],\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n addSelectedRepoToOrgVariable: [\n \"PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}\",\n ],\n approveWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve\",\n ],\n cancelWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel\",\n ],\n createEnvironmentVariable: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/variables\",\n ],\n createHostedRunnerForOrg: [\"POST /orgs/{org}/actions/hosted-runners\"],\n createOrUpdateEnvironmentSecret: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}\",\n ],\n createOrUpdateOrgSecret: [\"PUT /orgs/{org}/actions/secrets/{secret_name}\"],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}\",\n ],\n createOrgVariable: [\"POST /orgs/{org}/actions/variables\"],\n createRegistrationTokenForOrg: [\n \"POST /orgs/{org}/actions/runners/registration-token\",\n ],\n createRegistrationTokenForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/registration-token\",\n ],\n createRemoveTokenForOrg: [\"POST /orgs/{org}/actions/runners/remove-token\"],\n createRemoveTokenForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/remove-token\",\n ],\n createRepoVariable: [\"POST /repos/{owner}/{repo}/actions/variables\"],\n createWorkflowDispatch: [\n \"POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches\",\n ],\n deleteActionsCacheById: [\n \"DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}\",\n ],\n deleteActionsCacheByKey: [\n \"DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}\",\n ],\n deleteArtifact: [\n \"DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\",\n ],\n deleteCustomImageFromOrg: [\n \"DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}\",\n ],\n deleteCustomImageVersionFromOrg: [\n \"DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}\",\n ],\n deleteEnvironmentSecret: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}\",\n ],\n deleteEnvironmentVariable: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}\",\n ],\n deleteHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}\",\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/actions/secrets/{secret_name}\"],\n deleteOrgVariable: [\"DELETE /orgs/{org}/actions/variables/{name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}\",\n ],\n deleteRepoVariable: [\n \"DELETE /repos/{owner}/{repo}/actions/variables/{name}\",\n ],\n deleteSelfHostedRunnerFromOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}\",\n ],\n deleteSelfHostedRunnerFromRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}\",\n ],\n deleteWorkflowRun: [\"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n deleteWorkflowRunLogs: [\n \"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs\",\n ],\n disableSelectedRepositoryGithubActionsOrganization: [\n \"DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}\",\n ],\n disableWorkflow: [\n \"PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable\",\n ],\n downloadArtifact: [\n \"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}\",\n ],\n downloadJobLogsForWorkflowRun: [\n \"GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs\",\n ],\n downloadWorkflowRunAttemptLogs: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs\",\n ],\n downloadWorkflowRunLogs: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs\",\n ],\n enableSelectedRepositoryGithubActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/repositories/{repository_id}\",\n ],\n enableWorkflow: [\n \"PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable\",\n ],\n forceCancelWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel\",\n ],\n generateRunnerJitconfigForOrg: [\n \"POST /orgs/{org}/actions/runners/generate-jitconfig\",\n ],\n generateRunnerJitconfigForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig\",\n ],\n getActionsCacheList: [\"GET /repos/{owner}/{repo}/actions/caches\"],\n getActionsCacheUsage: [\"GET /repos/{owner}/{repo}/actions/cache/usage\"],\n getActionsCacheUsageByRepoForOrg: [\n \"GET /orgs/{org}/actions/cache/usage-by-repository\",\n ],\n getActionsCacheUsageForOrg: [\"GET /orgs/{org}/actions/cache/usage\"],\n getAllowedActionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/selected-actions\",\n ],\n getAllowedActionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/selected-actions\",\n ],\n getArtifact: [\"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\"],\n getCustomImageForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}\",\n ],\n getCustomImageVersionForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions/{version}\",\n ],\n getCustomOidcSubClaimForRepo: [\n \"GET /repos/{owner}/{repo}/actions/oidc/customization/sub\",\n ],\n getEnvironmentPublicKey: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key\",\n ],\n getEnvironmentSecret: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}\",\n ],\n getEnvironmentVariable: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}\",\n ],\n getGithubActionsDefaultWorkflowPermissionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/workflow\",\n ],\n getGithubActionsDefaultWorkflowPermissionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/workflow\",\n ],\n getGithubActionsPermissionsOrganization: [\n \"GET /orgs/{org}/actions/permissions\",\n ],\n getGithubActionsPermissionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions\",\n ],\n getHostedRunnerForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}\",\n ],\n getHostedRunnersGithubOwnedImagesForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/github-owned\",\n ],\n getHostedRunnersLimitsForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/limits\",\n ],\n getHostedRunnersMachineSpecsForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/machine-sizes\",\n ],\n getHostedRunnersPartnerImagesForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/partner\",\n ],\n getHostedRunnersPlatformsForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/platforms\",\n ],\n getJobForWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/jobs/{job_id}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/actions/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/actions/secrets/{secret_name}\"],\n getOrgVariable: [\"GET /orgs/{org}/actions/variables/{name}\"],\n getPendingDeploymentsForRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments\",\n ],\n getRepoPermissions: [\n \"GET /repos/{owner}/{repo}/actions/permissions\",\n {},\n { renamed: [\"actions\", \"getGithubActionsPermissionsRepository\"] },\n ],\n getRepoPublicKey: [\"GET /repos/{owner}/{repo}/actions/secrets/public-key\"],\n getRepoSecret: [\"GET /repos/{owner}/{repo}/actions/secrets/{secret_name}\"],\n getRepoVariable: [\"GET /repos/{owner}/{repo}/actions/variables/{name}\"],\n getReviewsForRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals\",\n ],\n getSelfHostedRunnerForOrg: [\"GET /orgs/{org}/actions/runners/{runner_id}\"],\n getSelfHostedRunnerForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/{runner_id}\",\n ],\n getWorkflow: [\"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}\"],\n getWorkflowAccessToRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/access\",\n ],\n getWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n getWorkflowRunAttempt: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}\",\n ],\n getWorkflowRunUsage: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing\",\n ],\n getWorkflowUsage: [\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing\",\n ],\n listArtifactsForRepo: [\"GET /repos/{owner}/{repo}/actions/artifacts\"],\n listCustomImageVersionsForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}/versions\",\n ],\n listCustomImagesForOrg: [\n \"GET /orgs/{org}/actions/hosted-runners/images/custom\",\n ],\n listEnvironmentSecrets: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/secrets\",\n ],\n listEnvironmentVariables: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/variables\",\n ],\n listGithubHostedRunnersInGroupForOrg: [\n \"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners\",\n ],\n listHostedRunnersForOrg: [\"GET /orgs/{org}/actions/hosted-runners\"],\n listJobsForWorkflowRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs\",\n ],\n listJobsForWorkflowRunAttempt: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs\",\n ],\n listLabelsForSelfHostedRunnerForOrg: [\n \"GET /orgs/{org}/actions/runners/{runner_id}/labels\",\n ],\n listLabelsForSelfHostedRunnerForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\",\n ],\n listOrgSecrets: [\"GET /orgs/{org}/actions/secrets\"],\n listOrgVariables: [\"GET /orgs/{org}/actions/variables\"],\n listRepoOrganizationSecrets: [\n \"GET /repos/{owner}/{repo}/actions/organization-secrets\",\n ],\n listRepoOrganizationVariables: [\n \"GET /repos/{owner}/{repo}/actions/organization-variables\",\n ],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/actions/secrets\"],\n listRepoVariables: [\"GET /repos/{owner}/{repo}/actions/variables\"],\n listRepoWorkflows: [\"GET /repos/{owner}/{repo}/actions/workflows\"],\n listRunnerApplicationsForOrg: [\"GET /orgs/{org}/actions/runners/downloads\"],\n listRunnerApplicationsForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/downloads\",\n ],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/actions/secrets/{secret_name}/repositories\",\n ],\n listSelectedReposForOrgVariable: [\n \"GET /orgs/{org}/actions/variables/{name}/repositories\",\n ],\n listSelectedRepositoriesEnabledGithubActionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/repositories\",\n ],\n listSelfHostedRunnersForOrg: [\"GET /orgs/{org}/actions/runners\"],\n listSelfHostedRunnersForRepo: [\"GET /repos/{owner}/{repo}/actions/runners\"],\n listWorkflowRunArtifacts: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts\",\n ],\n listWorkflowRuns: [\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs\",\n ],\n listWorkflowRunsForRepo: [\"GET /repos/{owner}/{repo}/actions/runs\"],\n reRunJobForWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun\",\n ],\n reRunWorkflow: [\"POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun\"],\n reRunWorkflowFailedJobs: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs\",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}/labels\",\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\",\n ],\n removeCustomLabelFromSelfHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}\",\n ],\n removeCustomLabelFromSelfHostedRunnerForRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}\",\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n removeSelectedRepoFromOrgVariable: [\n \"DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}\",\n ],\n reviewCustomGatesForRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule\",\n ],\n reviewPendingDeploymentsForRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments\",\n ],\n setAllowedActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/selected-actions\",\n ],\n setAllowedActionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/selected-actions\",\n ],\n setCustomLabelsForSelfHostedRunnerForOrg: [\n \"PUT /orgs/{org}/actions/runners/{runner_id}/labels\",\n ],\n setCustomLabelsForSelfHostedRunnerForRepo: [\n \"PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\",\n ],\n setCustomOidcSubClaimForRepo: [\n \"PUT /repos/{owner}/{repo}/actions/oidc/customization/sub\",\n ],\n setGithubActionsDefaultWorkflowPermissionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/workflow\",\n ],\n setGithubActionsDefaultWorkflowPermissionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/workflow\",\n ],\n setGithubActionsPermissionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions\",\n ],\n setGithubActionsPermissionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions\",\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories\",\n ],\n setSelectedReposForOrgVariable: [\n \"PUT /orgs/{org}/actions/variables/{name}/repositories\",\n ],\n setSelectedRepositoriesEnabledGithubActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/repositories\",\n ],\n setWorkflowAccessToRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/access\",\n ],\n updateEnvironmentVariable: [\n \"PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}\",\n ],\n updateHostedRunnerForOrg: [\n \"PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}\",\n ],\n updateOrgVariable: [\"PATCH /orgs/{org}/actions/variables/{name}\"],\n updateRepoVariable: [\n \"PATCH /repos/{owner}/{repo}/actions/variables/{name}\",\n ],\n },\n activity: {\n checkRepoIsStarredByAuthenticatedUser: [\"GET /user/starred/{owner}/{repo}\"],\n deleteRepoSubscription: [\"DELETE /repos/{owner}/{repo}/subscription\"],\n deleteThreadSubscription: [\n \"DELETE /notifications/threads/{thread_id}/subscription\",\n ],\n getFeeds: [\"GET /feeds\"],\n getRepoSubscription: [\"GET /repos/{owner}/{repo}/subscription\"],\n getThread: [\"GET /notifications/threads/{thread_id}\"],\n getThreadSubscriptionForAuthenticatedUser: [\n \"GET /notifications/threads/{thread_id}/subscription\",\n ],\n listEventsForAuthenticatedUser: [\"GET /users/{username}/events\"],\n listNotificationsForAuthenticatedUser: [\"GET /notifications\"],\n listOrgEventsForAuthenticatedUser: [\n \"GET /users/{username}/events/orgs/{org}\",\n ],\n listPublicEvents: [\"GET /events\"],\n listPublicEventsForRepoNetwork: [\"GET /networks/{owner}/{repo}/events\"],\n listPublicEventsForUser: [\"GET /users/{username}/events/public\"],\n listPublicOrgEvents: [\"GET /orgs/{org}/events\"],\n listReceivedEventsForUser: [\"GET /users/{username}/received_events\"],\n listReceivedPublicEventsForUser: [\n \"GET /users/{username}/received_events/public\",\n ],\n listRepoEvents: [\"GET /repos/{owner}/{repo}/events\"],\n listRepoNotificationsForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/notifications\",\n ],\n listReposStarredByAuthenticatedUser: [\"GET /user/starred\"],\n listReposStarredByUser: [\"GET /users/{username}/starred\"],\n listReposWatchedByUser: [\"GET /users/{username}/subscriptions\"],\n listStargazersForRepo: [\"GET /repos/{owner}/{repo}/stargazers\"],\n listWatchedReposForAuthenticatedUser: [\"GET /user/subscriptions\"],\n listWatchersForRepo: [\"GET /repos/{owner}/{repo}/subscribers\"],\n markNotificationsAsRead: [\"PUT /notifications\"],\n markRepoNotificationsAsRead: [\"PUT /repos/{owner}/{repo}/notifications\"],\n markThreadAsDone: [\"DELETE /notifications/threads/{thread_id}\"],\n markThreadAsRead: [\"PATCH /notifications/threads/{thread_id}\"],\n setRepoSubscription: [\"PUT /repos/{owner}/{repo}/subscription\"],\n setThreadSubscription: [\n \"PUT /notifications/threads/{thread_id}/subscription\",\n ],\n starRepoForAuthenticatedUser: [\"PUT /user/starred/{owner}/{repo}\"],\n unstarRepoForAuthenticatedUser: [\"DELETE /user/starred/{owner}/{repo}\"],\n },\n apps: {\n addRepoToInstallation: [\n \"PUT /user/installations/{installation_id}/repositories/{repository_id}\",\n {},\n { renamed: [\"apps\", \"addRepoToInstallationForAuthenticatedUser\"] },\n ],\n addRepoToInstallationForAuthenticatedUser: [\n \"PUT /user/installations/{installation_id}/repositories/{repository_id}\",\n ],\n checkToken: [\"POST /applications/{client_id}/token\"],\n createFromManifest: [\"POST /app-manifests/{code}/conversions\"],\n createInstallationAccessToken: [\n \"POST /app/installations/{installation_id}/access_tokens\",\n ],\n deleteAuthorization: [\"DELETE /applications/{client_id}/grant\"],\n deleteInstallation: [\"DELETE /app/installations/{installation_id}\"],\n deleteToken: [\"DELETE /applications/{client_id}/token\"],\n getAuthenticated: [\"GET /app\"],\n getBySlug: [\"GET /apps/{app_slug}\"],\n getInstallation: [\"GET /app/installations/{installation_id}\"],\n getOrgInstallation: [\"GET /orgs/{org}/installation\"],\n getRepoInstallation: [\"GET /repos/{owner}/{repo}/installation\"],\n getSubscriptionPlanForAccount: [\n \"GET /marketplace_listing/accounts/{account_id}\",\n ],\n getSubscriptionPlanForAccountStubbed: [\n \"GET /marketplace_listing/stubbed/accounts/{account_id}\",\n ],\n getUserInstallation: [\"GET /users/{username}/installation\"],\n getWebhookConfigForApp: [\"GET /app/hook/config\"],\n getWebhookDelivery: [\"GET /app/hook/deliveries/{delivery_id}\"],\n listAccountsForPlan: [\"GET /marketplace_listing/plans/{plan_id}/accounts\"],\n listAccountsForPlanStubbed: [\n \"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts\",\n ],\n listInstallationReposForAuthenticatedUser: [\n \"GET /user/installations/{installation_id}/repositories\",\n ],\n listInstallationRequestsForAuthenticatedApp: [\n \"GET /app/installation-requests\",\n ],\n listInstallations: [\"GET /app/installations\"],\n listInstallationsForAuthenticatedUser: [\"GET /user/installations\"],\n listPlans: [\"GET /marketplace_listing/plans\"],\n listPlansStubbed: [\"GET /marketplace_listing/stubbed/plans\"],\n listReposAccessibleToInstallation: [\"GET /installation/repositories\"],\n listSubscriptionsForAuthenticatedUser: [\"GET /user/marketplace_purchases\"],\n listSubscriptionsForAuthenticatedUserStubbed: [\n \"GET /user/marketplace_purchases/stubbed\",\n ],\n listWebhookDeliveries: [\"GET /app/hook/deliveries\"],\n redeliverWebhookDelivery: [\n \"POST /app/hook/deliveries/{delivery_id}/attempts\",\n ],\n removeRepoFromInstallation: [\n \"DELETE /user/installations/{installation_id}/repositories/{repository_id}\",\n {},\n { renamed: [\"apps\", \"removeRepoFromInstallationForAuthenticatedUser\"] },\n ],\n removeRepoFromInstallationForAuthenticatedUser: [\n \"DELETE /user/installations/{installation_id}/repositories/{repository_id}\",\n ],\n resetToken: [\"PATCH /applications/{client_id}/token\"],\n revokeInstallationAccessToken: [\"DELETE /installation/token\"],\n scopeToken: [\"POST /applications/{client_id}/token/scoped\"],\n suspendInstallation: [\"PUT /app/installations/{installation_id}/suspended\"],\n unsuspendInstallation: [\n \"DELETE /app/installations/{installation_id}/suspended\",\n ],\n updateWebhookConfigForApp: [\"PATCH /app/hook/config\"],\n },\n billing: {\n getGithubActionsBillingOrg: [\"GET /orgs/{org}/settings/billing/actions\"],\n getGithubActionsBillingUser: [\n \"GET /users/{username}/settings/billing/actions\",\n ],\n getGithubBillingPremiumRequestUsageReportOrg: [\n \"GET /organizations/{org}/settings/billing/premium_request/usage\",\n ],\n getGithubBillingPremiumRequestUsageReportUser: [\n \"GET /users/{username}/settings/billing/premium_request/usage\",\n ],\n getGithubBillingUsageReportOrg: [\n \"GET /organizations/{org}/settings/billing/usage\",\n ],\n getGithubBillingUsageReportUser: [\n \"GET /users/{username}/settings/billing/usage\",\n ],\n getGithubPackagesBillingOrg: [\"GET /orgs/{org}/settings/billing/packages\"],\n getGithubPackagesBillingUser: [\n \"GET /users/{username}/settings/billing/packages\",\n ],\n getSharedStorageBillingOrg: [\n \"GET /orgs/{org}/settings/billing/shared-storage\",\n ],\n getSharedStorageBillingUser: [\n \"GET /users/{username}/settings/billing/shared-storage\",\n ],\n },\n campaigns: {\n createCampaign: [\"POST /orgs/{org}/campaigns\"],\n deleteCampaign: [\"DELETE /orgs/{org}/campaigns/{campaign_number}\"],\n getCampaignSummary: [\"GET /orgs/{org}/campaigns/{campaign_number}\"],\n listOrgCampaigns: [\"GET /orgs/{org}/campaigns\"],\n updateCampaign: [\"PATCH /orgs/{org}/campaigns/{campaign_number}\"],\n },\n checks: {\n create: [\"POST /repos/{owner}/{repo}/check-runs\"],\n createSuite: [\"POST /repos/{owner}/{repo}/check-suites\"],\n get: [\"GET /repos/{owner}/{repo}/check-runs/{check_run_id}\"],\n getSuite: [\"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}\"],\n listAnnotations: [\n \"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations\",\n ],\n listForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-runs\"],\n listForSuite: [\n \"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs\",\n ],\n listSuitesForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-suites\"],\n rerequestRun: [\n \"POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest\",\n ],\n rerequestSuite: [\n \"POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest\",\n ],\n setSuitesPreferences: [\n \"PATCH /repos/{owner}/{repo}/check-suites/preferences\",\n ],\n update: [\"PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}\"],\n },\n codeScanning: {\n commitAutofix: [\n \"POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits\",\n ],\n createAutofix: [\n \"POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix\",\n ],\n createVariantAnalysis: [\n \"POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses\",\n ],\n deleteAnalysis: [\n \"DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}\",\n ],\n deleteCodeqlDatabase: [\n \"DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}\",\n ],\n getAlert: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\",\n {},\n { renamedParameters: { alert_id: \"alert_number\" } },\n ],\n getAnalysis: [\n \"GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}\",\n ],\n getAutofix: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix\",\n ],\n getCodeqlDatabase: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}\",\n ],\n getDefaultSetup: [\"GET /repos/{owner}/{repo}/code-scanning/default-setup\"],\n getSarif: [\"GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}\"],\n getVariantAnalysis: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}\",\n ],\n getVariantAnalysisRepoTask: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}\",\n ],\n listAlertInstances: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/code-scanning/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/code-scanning/alerts\"],\n listAlertsInstances: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n {},\n { renamed: [\"codeScanning\", \"listAlertInstances\"] },\n ],\n listCodeqlDatabases: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/databases\",\n ],\n listRecentAnalyses: [\"GET /repos/{owner}/{repo}/code-scanning/analyses\"],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\",\n ],\n updateDefaultSetup: [\n \"PATCH /repos/{owner}/{repo}/code-scanning/default-setup\",\n ],\n uploadSarif: [\"POST /repos/{owner}/{repo}/code-scanning/sarifs\"],\n },\n codeSecurity: {\n attachConfiguration: [\n \"POST /orgs/{org}/code-security/configurations/{configuration_id}/attach\",\n ],\n attachEnterpriseConfiguration: [\n \"POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach\",\n ],\n createConfiguration: [\"POST /orgs/{org}/code-security/configurations\"],\n createConfigurationForEnterprise: [\n \"POST /enterprises/{enterprise}/code-security/configurations\",\n ],\n deleteConfiguration: [\n \"DELETE /orgs/{org}/code-security/configurations/{configuration_id}\",\n ],\n deleteConfigurationForEnterprise: [\n \"DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}\",\n ],\n detachConfiguration: [\n \"DELETE /orgs/{org}/code-security/configurations/detach\",\n ],\n getConfiguration: [\n \"GET /orgs/{org}/code-security/configurations/{configuration_id}\",\n ],\n getConfigurationForRepository: [\n \"GET /repos/{owner}/{repo}/code-security-configuration\",\n ],\n getConfigurationsForEnterprise: [\n \"GET /enterprises/{enterprise}/code-security/configurations\",\n ],\n getConfigurationsForOrg: [\"GET /orgs/{org}/code-security/configurations\"],\n getDefaultConfigurations: [\n \"GET /orgs/{org}/code-security/configurations/defaults\",\n ],\n getDefaultConfigurationsForEnterprise: [\n \"GET /enterprises/{enterprise}/code-security/configurations/defaults\",\n ],\n getRepositoriesForConfiguration: [\n \"GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories\",\n ],\n getRepositoriesForEnterpriseConfiguration: [\n \"GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories\",\n ],\n getSingleConfigurationForEnterprise: [\n \"GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}\",\n ],\n setConfigurationAsDefault: [\n \"PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults\",\n ],\n setConfigurationAsDefaultForEnterprise: [\n \"PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults\",\n ],\n updateConfiguration: [\n \"PATCH /orgs/{org}/code-security/configurations/{configuration_id}\",\n ],\n updateEnterpriseConfiguration: [\n \"PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}\",\n ],\n },\n codesOfConduct: {\n getAllCodesOfConduct: [\"GET /codes_of_conduct\"],\n getConductCode: [\"GET /codes_of_conduct/{key}\"],\n },\n codespaces: {\n addRepositoryForSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n checkPermissionsForDevcontainer: [\n \"GET /repos/{owner}/{repo}/codespaces/permissions_check\",\n ],\n codespaceMachinesForAuthenticatedUser: [\n \"GET /user/codespaces/{codespace_name}/machines\",\n ],\n createForAuthenticatedUser: [\"POST /user/codespaces\"],\n createOrUpdateOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}\",\n ],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\",\n ],\n createOrUpdateSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}\",\n ],\n createWithPrForAuthenticatedUser: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces\",\n ],\n createWithRepoForAuthenticatedUser: [\n \"POST /repos/{owner}/{repo}/codespaces\",\n ],\n deleteForAuthenticatedUser: [\"DELETE /user/codespaces/{codespace_name}\"],\n deleteFromOrganization: [\n \"DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}\",\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/codespaces/secrets/{secret_name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\",\n ],\n deleteSecretForAuthenticatedUser: [\n \"DELETE /user/codespaces/secrets/{secret_name}\",\n ],\n exportForAuthenticatedUser: [\n \"POST /user/codespaces/{codespace_name}/exports\",\n ],\n getCodespacesForUserInOrg: [\n \"GET /orgs/{org}/members/{username}/codespaces\",\n ],\n getExportDetailsForAuthenticatedUser: [\n \"GET /user/codespaces/{codespace_name}/exports/{export_id}\",\n ],\n getForAuthenticatedUser: [\"GET /user/codespaces/{codespace_name}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/codespaces/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/codespaces/secrets/{secret_name}\"],\n getPublicKeyForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/public-key\",\n ],\n getRepoPublicKey: [\n \"GET /repos/{owner}/{repo}/codespaces/secrets/public-key\",\n ],\n getRepoSecret: [\n \"GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\",\n ],\n getSecretForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/{secret_name}\",\n ],\n listDevcontainersInRepositoryForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/devcontainers\",\n ],\n listForAuthenticatedUser: [\"GET /user/codespaces\"],\n listInOrganization: [\n \"GET /orgs/{org}/codespaces\",\n {},\n { renamedParameters: { org_id: \"org\" } },\n ],\n listInRepositoryForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces\",\n ],\n listOrgSecrets: [\"GET /orgs/{org}/codespaces/secrets\"],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/codespaces/secrets\"],\n listRepositoriesForSecretForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/{secret_name}/repositories\",\n ],\n listSecretsForAuthenticatedUser: [\"GET /user/codespaces/secrets\"],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories\",\n ],\n preFlightWithRepoForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/new\",\n ],\n publishForAuthenticatedUser: [\n \"POST /user/codespaces/{codespace_name}/publish\",\n ],\n removeRepositoryForSecretForAuthenticatedUser: [\n \"DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n repoMachinesForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/machines\",\n ],\n setRepositoriesForSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}/repositories\",\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories\",\n ],\n startForAuthenticatedUser: [\"POST /user/codespaces/{codespace_name}/start\"],\n stopForAuthenticatedUser: [\"POST /user/codespaces/{codespace_name}/stop\"],\n stopInOrganization: [\n \"POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop\",\n ],\n updateForAuthenticatedUser: [\"PATCH /user/codespaces/{codespace_name}\"],\n },\n copilot: {\n addCopilotSeatsForTeams: [\n \"POST /orgs/{org}/copilot/billing/selected_teams\",\n ],\n addCopilotSeatsForUsers: [\n \"POST /orgs/{org}/copilot/billing/selected_users\",\n ],\n cancelCopilotSeatAssignmentForTeams: [\n \"DELETE /orgs/{org}/copilot/billing/selected_teams\",\n ],\n cancelCopilotSeatAssignmentForUsers: [\n \"DELETE /orgs/{org}/copilot/billing/selected_users\",\n ],\n copilotMetricsForOrganization: [\"GET /orgs/{org}/copilot/metrics\"],\n copilotMetricsForTeam: [\"GET /orgs/{org}/team/{team_slug}/copilot/metrics\"],\n getCopilotOrganizationDetails: [\"GET /orgs/{org}/copilot/billing\"],\n getCopilotSeatDetailsForUser: [\n \"GET /orgs/{org}/members/{username}/copilot\",\n ],\n listCopilotSeats: [\"GET /orgs/{org}/copilot/billing/seats\"],\n },\n credentials: { revoke: [\"POST /credentials/revoke\"] },\n dependabot: {\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n createOrUpdateOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}\",\n ],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\",\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/dependabot/secrets/{secret_name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\",\n ],\n getAlert: [\"GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/dependabot/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/dependabot/secrets/{secret_name}\"],\n getRepoPublicKey: [\n \"GET /repos/{owner}/{repo}/dependabot/secrets/public-key\",\n ],\n getRepoSecret: [\n \"GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\",\n ],\n listAlertsForEnterprise: [\n \"GET /enterprises/{enterprise}/dependabot/alerts\",\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/dependabot/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/dependabot/alerts\"],\n listOrgSecrets: [\"GET /orgs/{org}/dependabot/secrets\"],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/dependabot/secrets\"],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories\",\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}\",\n ],\n repositoryAccessForOrg: [\n \"GET /organizations/{org}/dependabot/repository-access\",\n ],\n setRepositoryAccessDefaultLevel: [\n \"PUT /organizations/{org}/dependabot/repository-access/default-level\",\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories\",\n ],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}\",\n ],\n updateRepositoryAccessForOrg: [\n \"PATCH /organizations/{org}/dependabot/repository-access\",\n ],\n },\n dependencyGraph: {\n createRepositorySnapshot: [\n \"POST /repos/{owner}/{repo}/dependency-graph/snapshots\",\n ],\n diffRange: [\n \"GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}\",\n ],\n exportSbom: [\"GET /repos/{owner}/{repo}/dependency-graph/sbom\"],\n },\n emojis: { get: [\"GET /emojis\"] },\n enterpriseTeamMemberships: {\n add: [\n \"PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}\",\n ],\n bulkAdd: [\n \"POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add\",\n ],\n bulkRemove: [\n \"POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/remove\",\n ],\n get: [\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}\",\n ],\n list: [\"GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships\"],\n remove: [\n \"DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}\",\n ],\n },\n enterpriseTeamOrganizations: {\n add: [\n \"PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}\",\n ],\n bulkAdd: [\n \"POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add\",\n ],\n bulkRemove: [\n \"POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/remove\",\n ],\n delete: [\n \"DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}\",\n ],\n getAssignment: [\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}\",\n ],\n getAssignments: [\n \"GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations\",\n ],\n },\n enterpriseTeams: {\n create: [\"POST /enterprises/{enterprise}/teams\"],\n delete: [\"DELETE /enterprises/{enterprise}/teams/{team_slug}\"],\n get: [\"GET /enterprises/{enterprise}/teams/{team_slug}\"],\n list: [\"GET /enterprises/{enterprise}/teams\"],\n update: [\"PATCH /enterprises/{enterprise}/teams/{team_slug}\"],\n },\n gists: {\n checkIsStarred: [\"GET /gists/{gist_id}/star\"],\n create: [\"POST /gists\"],\n createComment: [\"POST /gists/{gist_id}/comments\"],\n delete: [\"DELETE /gists/{gist_id}\"],\n deleteComment: [\"DELETE /gists/{gist_id}/comments/{comment_id}\"],\n fork: [\"POST /gists/{gist_id}/forks\"],\n get: [\"GET /gists/{gist_id}\"],\n getComment: [\"GET /gists/{gist_id}/comments/{comment_id}\"],\n getRevision: [\"GET /gists/{gist_id}/{sha}\"],\n list: [\"GET /gists\"],\n listComments: [\"GET /gists/{gist_id}/comments\"],\n listCommits: [\"GET /gists/{gist_id}/commits\"],\n listForUser: [\"GET /users/{username}/gists\"],\n listForks: [\"GET /gists/{gist_id}/forks\"],\n listPublic: [\"GET /gists/public\"],\n listStarred: [\"GET /gists/starred\"],\n star: [\"PUT /gists/{gist_id}/star\"],\n unstar: [\"DELETE /gists/{gist_id}/star\"],\n update: [\"PATCH /gists/{gist_id}\"],\n updateComment: [\"PATCH /gists/{gist_id}/comments/{comment_id}\"],\n },\n git: {\n createBlob: [\"POST /repos/{owner}/{repo}/git/blobs\"],\n createCommit: [\"POST /repos/{owner}/{repo}/git/commits\"],\n createRef: [\"POST /repos/{owner}/{repo}/git/refs\"],\n createTag: [\"POST /repos/{owner}/{repo}/git/tags\"],\n createTree: [\"POST /repos/{owner}/{repo}/git/trees\"],\n deleteRef: [\"DELETE /repos/{owner}/{repo}/git/refs/{ref}\"],\n getBlob: [\"GET /repos/{owner}/{repo}/git/blobs/{file_sha}\"],\n getCommit: [\"GET /repos/{owner}/{repo}/git/commits/{commit_sha}\"],\n getRef: [\"GET /repos/{owner}/{repo}/git/ref/{ref}\"],\n getTag: [\"GET /repos/{owner}/{repo}/git/tags/{tag_sha}\"],\n getTree: [\"GET /repos/{owner}/{repo}/git/trees/{tree_sha}\"],\n listMatchingRefs: [\"GET /repos/{owner}/{repo}/git/matching-refs/{ref}\"],\n updateRef: [\"PATCH /repos/{owner}/{repo}/git/refs/{ref}\"],\n },\n gitignore: {\n getAllTemplates: [\"GET /gitignore/templates\"],\n getTemplate: [\"GET /gitignore/templates/{name}\"],\n },\n hostedCompute: {\n createNetworkConfigurationForOrg: [\n \"POST /orgs/{org}/settings/network-configurations\",\n ],\n deleteNetworkConfigurationFromOrg: [\n \"DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}\",\n ],\n getNetworkConfigurationForOrg: [\n \"GET /orgs/{org}/settings/network-configurations/{network_configuration_id}\",\n ],\n getNetworkSettingsForOrg: [\n \"GET /orgs/{org}/settings/network-settings/{network_settings_id}\",\n ],\n listNetworkConfigurationsForOrg: [\n \"GET /orgs/{org}/settings/network-configurations\",\n ],\n updateNetworkConfigurationForOrg: [\n \"PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}\",\n ],\n },\n interactions: {\n getRestrictionsForAuthenticatedUser: [\"GET /user/interaction-limits\"],\n getRestrictionsForOrg: [\"GET /orgs/{org}/interaction-limits\"],\n getRestrictionsForRepo: [\"GET /repos/{owner}/{repo}/interaction-limits\"],\n getRestrictionsForYourPublicRepos: [\n \"GET /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"getRestrictionsForAuthenticatedUser\"] },\n ],\n removeRestrictionsForAuthenticatedUser: [\"DELETE /user/interaction-limits\"],\n removeRestrictionsForOrg: [\"DELETE /orgs/{org}/interaction-limits\"],\n removeRestrictionsForRepo: [\n \"DELETE /repos/{owner}/{repo}/interaction-limits\",\n ],\n removeRestrictionsForYourPublicRepos: [\n \"DELETE /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"removeRestrictionsForAuthenticatedUser\"] },\n ],\n setRestrictionsForAuthenticatedUser: [\"PUT /user/interaction-limits\"],\n setRestrictionsForOrg: [\"PUT /orgs/{org}/interaction-limits\"],\n setRestrictionsForRepo: [\"PUT /repos/{owner}/{repo}/interaction-limits\"],\n setRestrictionsForYourPublicRepos: [\n \"PUT /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"setRestrictionsForAuthenticatedUser\"] },\n ],\n },\n issues: {\n addAssignees: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/assignees\",\n ],\n addBlockedByDependency: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by\",\n ],\n addLabels: [\"POST /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n addSubIssue: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues\",\n ],\n checkUserCanBeAssigned: [\"GET /repos/{owner}/{repo}/assignees/{assignee}\"],\n checkUserCanBeAssignedToIssue: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}\",\n ],\n create: [\"POST /repos/{owner}/{repo}/issues\"],\n createComment: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/comments\",\n ],\n createLabel: [\"POST /repos/{owner}/{repo}/labels\"],\n createMilestone: [\"POST /repos/{owner}/{repo}/milestones\"],\n deleteComment: [\n \"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}\",\n ],\n deleteLabel: [\"DELETE /repos/{owner}/{repo}/labels/{name}\"],\n deleteMilestone: [\n \"DELETE /repos/{owner}/{repo}/milestones/{milestone_number}\",\n ],\n get: [\"GET /repos/{owner}/{repo}/issues/{issue_number}\"],\n getComment: [\"GET /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n getEvent: [\"GET /repos/{owner}/{repo}/issues/events/{event_id}\"],\n getLabel: [\"GET /repos/{owner}/{repo}/labels/{name}\"],\n getMilestone: [\"GET /repos/{owner}/{repo}/milestones/{milestone_number}\"],\n getParent: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/parent\"],\n list: [\"GET /issues\"],\n listAssignees: [\"GET /repos/{owner}/{repo}/assignees\"],\n listComments: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/comments\"],\n listCommentsForRepo: [\"GET /repos/{owner}/{repo}/issues/comments\"],\n listDependenciesBlockedBy: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by\",\n ],\n listDependenciesBlocking: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking\",\n ],\n listEvents: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/events\"],\n listEventsForRepo: [\"GET /repos/{owner}/{repo}/issues/events\"],\n listEventsForTimeline: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline\",\n ],\n listForAuthenticatedUser: [\"GET /user/issues\"],\n listForOrg: [\"GET /orgs/{org}/issues\"],\n listForRepo: [\"GET /repos/{owner}/{repo}/issues\"],\n listLabelsForMilestone: [\n \"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels\",\n ],\n listLabelsForRepo: [\"GET /repos/{owner}/{repo}/labels\"],\n listLabelsOnIssue: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/labels\",\n ],\n listMilestones: [\"GET /repos/{owner}/{repo}/milestones\"],\n listSubIssues: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues\",\n ],\n lock: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n removeAllLabels: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels\",\n ],\n removeAssignees: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees\",\n ],\n removeDependencyBlockedBy: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}\",\n ],\n removeLabel: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}\",\n ],\n removeSubIssue: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue\",\n ],\n reprioritizeSubIssue: [\n \"PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority\",\n ],\n setLabels: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n unlock: [\"DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n update: [\"PATCH /repos/{owner}/{repo}/issues/{issue_number}\"],\n updateComment: [\"PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n updateLabel: [\"PATCH /repos/{owner}/{repo}/labels/{name}\"],\n updateMilestone: [\n \"PATCH /repos/{owner}/{repo}/milestones/{milestone_number}\",\n ],\n },\n licenses: {\n get: [\"GET /licenses/{license}\"],\n getAllCommonlyUsed: [\"GET /licenses\"],\n getForRepo: [\"GET /repos/{owner}/{repo}/license\"],\n },\n markdown: {\n render: [\"POST /markdown\"],\n renderRaw: [\n \"POST /markdown/raw\",\n { headers: { \"content-type\": \"text/plain; charset=utf-8\" } },\n ],\n },\n meta: {\n get: [\"GET /meta\"],\n getAllVersions: [\"GET /versions\"],\n getOctocat: [\"GET /octocat\"],\n getZen: [\"GET /zen\"],\n root: [\"GET /\"],\n },\n migrations: {\n deleteArchiveForAuthenticatedUser: [\n \"DELETE /user/migrations/{migration_id}/archive\",\n ],\n deleteArchiveForOrg: [\n \"DELETE /orgs/{org}/migrations/{migration_id}/archive\",\n ],\n downloadArchiveForOrg: [\n \"GET /orgs/{org}/migrations/{migration_id}/archive\",\n ],\n getArchiveForAuthenticatedUser: [\n \"GET /user/migrations/{migration_id}/archive\",\n ],\n getStatusForAuthenticatedUser: [\"GET /user/migrations/{migration_id}\"],\n getStatusForOrg: [\"GET /orgs/{org}/migrations/{migration_id}\"],\n listForAuthenticatedUser: [\"GET /user/migrations\"],\n listForOrg: [\"GET /orgs/{org}/migrations\"],\n listReposForAuthenticatedUser: [\n \"GET /user/migrations/{migration_id}/repositories\",\n ],\n listReposForOrg: [\"GET /orgs/{org}/migrations/{migration_id}/repositories\"],\n listReposForUser: [\n \"GET /user/migrations/{migration_id}/repositories\",\n {},\n { renamed: [\"migrations\", \"listReposForAuthenticatedUser\"] },\n ],\n startForAuthenticatedUser: [\"POST /user/migrations\"],\n startForOrg: [\"POST /orgs/{org}/migrations\"],\n unlockRepoForAuthenticatedUser: [\n \"DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock\",\n ],\n unlockRepoForOrg: [\n \"DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock\",\n ],\n },\n oidc: {\n getOidcCustomSubTemplateForOrg: [\n \"GET /orgs/{org}/actions/oidc/customization/sub\",\n ],\n updateOidcCustomSubTemplateForOrg: [\n \"PUT /orgs/{org}/actions/oidc/customization/sub\",\n ],\n },\n orgs: {\n addSecurityManagerTeam: [\n \"PUT /orgs/{org}/security-managers/teams/{team_slug}\",\n {},\n {\n deprecated:\n \"octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team\",\n },\n ],\n assignTeamToOrgRole: [\n \"PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}\",\n ],\n assignUserToOrgRole: [\n \"PUT /orgs/{org}/organization-roles/users/{username}/{role_id}\",\n ],\n blockUser: [\"PUT /orgs/{org}/blocks/{username}\"],\n cancelInvitation: [\"DELETE /orgs/{org}/invitations/{invitation_id}\"],\n checkBlockedUser: [\"GET /orgs/{org}/blocks/{username}\"],\n checkMembershipForUser: [\"GET /orgs/{org}/members/{username}\"],\n checkPublicMembershipForUser: [\"GET /orgs/{org}/public_members/{username}\"],\n convertMemberToOutsideCollaborator: [\n \"PUT /orgs/{org}/outside_collaborators/{username}\",\n ],\n createArtifactStorageRecord: [\n \"POST /orgs/{org}/artifacts/metadata/storage-record\",\n ],\n createInvitation: [\"POST /orgs/{org}/invitations\"],\n createIssueType: [\"POST /orgs/{org}/issue-types\"],\n createWebhook: [\"POST /orgs/{org}/hooks\"],\n customPropertiesForOrgsCreateOrUpdateOrganizationValues: [\n \"PATCH /organizations/{org}/org-properties/values\",\n ],\n customPropertiesForOrgsGetOrganizationValues: [\n \"GET /organizations/{org}/org-properties/values\",\n ],\n customPropertiesForReposCreateOrUpdateOrganizationDefinition: [\n \"PUT /orgs/{org}/properties/schema/{custom_property_name}\",\n ],\n customPropertiesForReposCreateOrUpdateOrganizationDefinitions: [\n \"PATCH /orgs/{org}/properties/schema\",\n ],\n customPropertiesForReposCreateOrUpdateOrganizationValues: [\n \"PATCH /orgs/{org}/properties/values\",\n ],\n customPropertiesForReposDeleteOrganizationDefinition: [\n \"DELETE /orgs/{org}/properties/schema/{custom_property_name}\",\n ],\n customPropertiesForReposGetOrganizationDefinition: [\n \"GET /orgs/{org}/properties/schema/{custom_property_name}\",\n ],\n customPropertiesForReposGetOrganizationDefinitions: [\n \"GET /orgs/{org}/properties/schema\",\n ],\n customPropertiesForReposGetOrganizationValues: [\n \"GET /orgs/{org}/properties/values\",\n ],\n delete: [\"DELETE /orgs/{org}\"],\n deleteAttestationsBulk: [\"POST /orgs/{org}/attestations/delete-request\"],\n deleteAttestationsById: [\n \"DELETE /orgs/{org}/attestations/{attestation_id}\",\n ],\n deleteAttestationsBySubjectDigest: [\n \"DELETE /orgs/{org}/attestations/digest/{subject_digest}\",\n ],\n deleteIssueType: [\"DELETE /orgs/{org}/issue-types/{issue_type_id}\"],\n deleteWebhook: [\"DELETE /orgs/{org}/hooks/{hook_id}\"],\n disableSelectedRepositoryImmutableReleasesOrganization: [\n \"DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}\",\n ],\n enableSelectedRepositoryImmutableReleasesOrganization: [\n \"PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}\",\n ],\n get: [\"GET /orgs/{org}\"],\n getImmutableReleasesSettings: [\n \"GET /orgs/{org}/settings/immutable-releases\",\n ],\n getImmutableReleasesSettingsRepositories: [\n \"GET /orgs/{org}/settings/immutable-releases/repositories\",\n ],\n getMembershipForAuthenticatedUser: [\"GET /user/memberships/orgs/{org}\"],\n getMembershipForUser: [\"GET /orgs/{org}/memberships/{username}\"],\n getOrgRole: [\"GET /orgs/{org}/organization-roles/{role_id}\"],\n getOrgRulesetHistory: [\"GET /orgs/{org}/rulesets/{ruleset_id}/history\"],\n getOrgRulesetVersion: [\n \"GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}\",\n ],\n getWebhook: [\"GET /orgs/{org}/hooks/{hook_id}\"],\n getWebhookConfigForOrg: [\"GET /orgs/{org}/hooks/{hook_id}/config\"],\n getWebhookDelivery: [\n \"GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}\",\n ],\n list: [\"GET /organizations\"],\n listAppInstallations: [\"GET /orgs/{org}/installations\"],\n listArtifactStorageRecords: [\n \"GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records\",\n ],\n listAttestationRepositories: [\"GET /orgs/{org}/attestations/repositories\"],\n listAttestations: [\"GET /orgs/{org}/attestations/{subject_digest}\"],\n listAttestationsBulk: [\n \"POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}\",\n ],\n listBlockedUsers: [\"GET /orgs/{org}/blocks\"],\n listFailedInvitations: [\"GET /orgs/{org}/failed_invitations\"],\n listForAuthenticatedUser: [\"GET /user/orgs\"],\n listForUser: [\"GET /users/{username}/orgs\"],\n listInvitationTeams: [\"GET /orgs/{org}/invitations/{invitation_id}/teams\"],\n listIssueTypes: [\"GET /orgs/{org}/issue-types\"],\n listMembers: [\"GET /orgs/{org}/members\"],\n listMembershipsForAuthenticatedUser: [\"GET /user/memberships/orgs\"],\n listOrgRoleTeams: [\"GET /orgs/{org}/organization-roles/{role_id}/teams\"],\n listOrgRoleUsers: [\"GET /orgs/{org}/organization-roles/{role_id}/users\"],\n listOrgRoles: [\"GET /orgs/{org}/organization-roles\"],\n listOrganizationFineGrainedPermissions: [\n \"GET /orgs/{org}/organization-fine-grained-permissions\",\n ],\n listOutsideCollaborators: [\"GET /orgs/{org}/outside_collaborators\"],\n listPatGrantRepositories: [\n \"GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories\",\n ],\n listPatGrantRequestRepositories: [\n \"GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories\",\n ],\n listPatGrantRequests: [\"GET /orgs/{org}/personal-access-token-requests\"],\n listPatGrants: [\"GET /orgs/{org}/personal-access-tokens\"],\n listPendingInvitations: [\"GET /orgs/{org}/invitations\"],\n listPublicMembers: [\"GET /orgs/{org}/public_members\"],\n listSecurityManagerTeams: [\n \"GET /orgs/{org}/security-managers\",\n {},\n {\n deprecated:\n \"octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams\",\n },\n ],\n listWebhookDeliveries: [\"GET /orgs/{org}/hooks/{hook_id}/deliveries\"],\n listWebhooks: [\"GET /orgs/{org}/hooks\"],\n pingWebhook: [\"POST /orgs/{org}/hooks/{hook_id}/pings\"],\n redeliverWebhookDelivery: [\n \"POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts\",\n ],\n removeMember: [\"DELETE /orgs/{org}/members/{username}\"],\n removeMembershipForUser: [\"DELETE /orgs/{org}/memberships/{username}\"],\n removeOutsideCollaborator: [\n \"DELETE /orgs/{org}/outside_collaborators/{username}\",\n ],\n removePublicMembershipForAuthenticatedUser: [\n \"DELETE /orgs/{org}/public_members/{username}\",\n ],\n removeSecurityManagerTeam: [\n \"DELETE /orgs/{org}/security-managers/teams/{team_slug}\",\n {},\n {\n deprecated:\n \"octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team\",\n },\n ],\n reviewPatGrantRequest: [\n \"POST /orgs/{org}/personal-access-token-requests/{pat_request_id}\",\n ],\n reviewPatGrantRequestsInBulk: [\n \"POST /orgs/{org}/personal-access-token-requests\",\n ],\n revokeAllOrgRolesTeam: [\n \"DELETE /orgs/{org}/organization-roles/teams/{team_slug}\",\n ],\n revokeAllOrgRolesUser: [\n \"DELETE /orgs/{org}/organization-roles/users/{username}\",\n ],\n revokeOrgRoleTeam: [\n \"DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}\",\n ],\n revokeOrgRoleUser: [\n \"DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}\",\n ],\n setImmutableReleasesSettings: [\n \"PUT /orgs/{org}/settings/immutable-releases\",\n ],\n setImmutableReleasesSettingsRepositories: [\n \"PUT /orgs/{org}/settings/immutable-releases/repositories\",\n ],\n setMembershipForUser: [\"PUT /orgs/{org}/memberships/{username}\"],\n setPublicMembershipForAuthenticatedUser: [\n \"PUT /orgs/{org}/public_members/{username}\",\n ],\n unblockUser: [\"DELETE /orgs/{org}/blocks/{username}\"],\n update: [\"PATCH /orgs/{org}\"],\n updateIssueType: [\"PUT /orgs/{org}/issue-types/{issue_type_id}\"],\n updateMembershipForAuthenticatedUser: [\n \"PATCH /user/memberships/orgs/{org}\",\n ],\n updatePatAccess: [\"POST /orgs/{org}/personal-access-tokens/{pat_id}\"],\n updatePatAccesses: [\"POST /orgs/{org}/personal-access-tokens\"],\n updateWebhook: [\"PATCH /orgs/{org}/hooks/{hook_id}\"],\n updateWebhookConfigForOrg: [\"PATCH /orgs/{org}/hooks/{hook_id}/config\"],\n },\n packages: {\n deletePackageForAuthenticatedUser: [\n \"DELETE /user/packages/{package_type}/{package_name}\",\n ],\n deletePackageForOrg: [\n \"DELETE /orgs/{org}/packages/{package_type}/{package_name}\",\n ],\n deletePackageForUser: [\n \"DELETE /users/{username}/packages/{package_type}/{package_name}\",\n ],\n deletePackageVersionForAuthenticatedUser: [\n \"DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n deletePackageVersionForOrg: [\n \"DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n deletePackageVersionForUser: [\n \"DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n getAllPackageVersionsForAPackageOwnedByAnOrg: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n {},\n { renamed: [\"packages\", \"getAllPackageVersionsForPackageOwnedByOrg\"] },\n ],\n getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n {},\n {\n renamed: [\n \"packages\",\n \"getAllPackageVersionsForPackageOwnedByAuthenticatedUser\",\n ],\n },\n ],\n getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n ],\n getAllPackageVersionsForPackageOwnedByOrg: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n ],\n getAllPackageVersionsForPackageOwnedByUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}/versions\",\n ],\n getPackageForAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}\",\n ],\n getPackageForOrganization: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}\",\n ],\n getPackageForUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}\",\n ],\n getPackageVersionForAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n getPackageVersionForOrganization: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n getPackageVersionForUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}\",\n ],\n listDockerMigrationConflictingPackagesForAuthenticatedUser: [\n \"GET /user/docker/conflicts\",\n ],\n listDockerMigrationConflictingPackagesForOrganization: [\n \"GET /orgs/{org}/docker/conflicts\",\n ],\n listDockerMigrationConflictingPackagesForUser: [\n \"GET /users/{username}/docker/conflicts\",\n ],\n listPackagesForAuthenticatedUser: [\"GET /user/packages\"],\n listPackagesForOrganization: [\"GET /orgs/{org}/packages\"],\n listPackagesForUser: [\"GET /users/{username}/packages\"],\n restorePackageForAuthenticatedUser: [\n \"POST /user/packages/{package_type}/{package_name}/restore{?token}\",\n ],\n restorePackageForOrg: [\n \"POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}\",\n ],\n restorePackageForUser: [\n \"POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}\",\n ],\n restorePackageVersionForAuthenticatedUser: [\n \"POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\",\n ],\n restorePackageVersionForOrg: [\n \"POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\",\n ],\n restorePackageVersionForUser: [\n \"POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\",\n ],\n },\n privateRegistries: {\n createOrgPrivateRegistry: [\"POST /orgs/{org}/private-registries\"],\n deleteOrgPrivateRegistry: [\n \"DELETE /orgs/{org}/private-registries/{secret_name}\",\n ],\n getOrgPrivateRegistry: [\"GET /orgs/{org}/private-registries/{secret_name}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/private-registries/public-key\"],\n listOrgPrivateRegistries: [\"GET /orgs/{org}/private-registries\"],\n updateOrgPrivateRegistry: [\n \"PATCH /orgs/{org}/private-registries/{secret_name}\",\n ],\n },\n projects: {\n addItemForOrg: [\"POST /orgs/{org}/projectsV2/{project_number}/items\"],\n addItemForUser: [\n \"POST /users/{username}/projectsV2/{project_number}/items\",\n ],\n deleteItemForOrg: [\n \"DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}\",\n ],\n deleteItemForUser: [\n \"DELETE /users/{username}/projectsV2/{project_number}/items/{item_id}\",\n ],\n getFieldForOrg: [\n \"GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}\",\n ],\n getFieldForUser: [\n \"GET /users/{username}/projectsV2/{project_number}/fields/{field_id}\",\n ],\n getForOrg: [\"GET /orgs/{org}/projectsV2/{project_number}\"],\n getForUser: [\"GET /users/{username}/projectsV2/{project_number}\"],\n getOrgItem: [\"GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}\"],\n getUserItem: [\n \"GET /users/{username}/projectsV2/{project_number}/items/{item_id}\",\n ],\n listFieldsForOrg: [\"GET /orgs/{org}/projectsV2/{project_number}/fields\"],\n listFieldsForUser: [\n \"GET /users/{username}/projectsV2/{project_number}/fields\",\n ],\n listForOrg: [\"GET /orgs/{org}/projectsV2\"],\n listForUser: [\"GET /users/{username}/projectsV2\"],\n listItemsForOrg: [\"GET /orgs/{org}/projectsV2/{project_number}/items\"],\n listItemsForUser: [\n \"GET /users/{username}/projectsV2/{project_number}/items\",\n ],\n updateItemForOrg: [\n \"PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}\",\n ],\n updateItemForUser: [\n \"PATCH /users/{username}/projectsV2/{project_number}/items/{item_id}\",\n ],\n },\n pulls: {\n checkIfMerged: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n create: [\"POST /repos/{owner}/{repo}/pulls\"],\n createReplyForReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies\",\n ],\n createReview: [\"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n createReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments\",\n ],\n deletePendingReview: [\n \"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\",\n ],\n deleteReviewComment: [\n \"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}\",\n ],\n dismissReview: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals\",\n ],\n get: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}\"],\n getReview: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\",\n ],\n getReviewComment: [\"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}\"],\n list: [\"GET /repos/{owner}/{repo}/pulls\"],\n listCommentsForReview: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments\",\n ],\n listCommits: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits\"],\n listFiles: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/files\"],\n listRequestedReviewers: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\",\n ],\n listReviewComments: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments\",\n ],\n listReviewCommentsForRepo: [\"GET /repos/{owner}/{repo}/pulls/comments\"],\n listReviews: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n merge: [\"PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n removeRequestedReviewers: [\n \"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\",\n ],\n requestReviewers: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\",\n ],\n submitReview: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events\",\n ],\n update: [\"PATCH /repos/{owner}/{repo}/pulls/{pull_number}\"],\n updateBranch: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch\",\n ],\n updateReview: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\",\n ],\n updateReviewComment: [\n \"PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}\",\n ],\n },\n rateLimit: { get: [\"GET /rate_limit\"] },\n reactions: {\n createForCommitComment: [\n \"POST /repos/{owner}/{repo}/comments/{comment_id}/reactions\",\n ],\n createForIssue: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/reactions\",\n ],\n createForIssueComment: [\n \"POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\",\n ],\n createForPullRequestReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\",\n ],\n createForRelease: [\n \"POST /repos/{owner}/{repo}/releases/{release_id}/reactions\",\n ],\n createForTeamDiscussionCommentInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n ],\n createForTeamDiscussionInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\",\n ],\n deleteForCommitComment: [\n \"DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}\",\n ],\n deleteForIssue: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}\",\n ],\n deleteForIssueComment: [\n \"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}\",\n ],\n deleteForPullRequestComment: [\n \"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}\",\n ],\n deleteForRelease: [\n \"DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}\",\n ],\n deleteForTeamDiscussion: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}\",\n ],\n deleteForTeamDiscussionComment: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}\",\n ],\n listForCommitComment: [\n \"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions\",\n ],\n listForIssue: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions\"],\n listForIssueComment: [\n \"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\",\n ],\n listForPullRequestReviewComment: [\n \"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\",\n ],\n listForRelease: [\n \"GET /repos/{owner}/{repo}/releases/{release_id}/reactions\",\n ],\n listForTeamDiscussionCommentInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n ],\n listForTeamDiscussionInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\",\n ],\n },\n repos: {\n acceptInvitation: [\n \"PATCH /user/repository_invitations/{invitation_id}\",\n {},\n { renamed: [\"repos\", \"acceptInvitationForAuthenticatedUser\"] },\n ],\n acceptInvitationForAuthenticatedUser: [\n \"PATCH /user/repository_invitations/{invitation_id}\",\n ],\n addAppAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" },\n ],\n addCollaborator: [\"PUT /repos/{owner}/{repo}/collaborators/{username}\"],\n addStatusCheckContexts: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" },\n ],\n addTeamAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" },\n ],\n addUserAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" },\n ],\n cancelPagesDeployment: [\n \"POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel\",\n ],\n checkAutomatedSecurityFixes: [\n \"GET /repos/{owner}/{repo}/automated-security-fixes\",\n ],\n checkCollaborator: [\"GET /repos/{owner}/{repo}/collaborators/{username}\"],\n checkImmutableReleases: [\"GET /repos/{owner}/{repo}/immutable-releases\"],\n checkPrivateVulnerabilityReporting: [\n \"GET /repos/{owner}/{repo}/private-vulnerability-reporting\",\n ],\n checkVulnerabilityAlerts: [\n \"GET /repos/{owner}/{repo}/vulnerability-alerts\",\n ],\n codeownersErrors: [\"GET /repos/{owner}/{repo}/codeowners/errors\"],\n compareCommits: [\"GET /repos/{owner}/{repo}/compare/{base}...{head}\"],\n compareCommitsWithBasehead: [\n \"GET /repos/{owner}/{repo}/compare/{basehead}\",\n ],\n createAttestation: [\"POST /repos/{owner}/{repo}/attestations\"],\n createAutolink: [\"POST /repos/{owner}/{repo}/autolinks\"],\n createCommitComment: [\n \"POST /repos/{owner}/{repo}/commits/{commit_sha}/comments\",\n ],\n createCommitSignatureProtection: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\",\n ],\n createCommitStatus: [\"POST /repos/{owner}/{repo}/statuses/{sha}\"],\n createDeployKey: [\"POST /repos/{owner}/{repo}/keys\"],\n createDeployment: [\"POST /repos/{owner}/{repo}/deployments\"],\n createDeploymentBranchPolicy: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\",\n ],\n createDeploymentProtectionRule: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules\",\n ],\n createDeploymentStatus: [\n \"POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\",\n ],\n createDispatchEvent: [\"POST /repos/{owner}/{repo}/dispatches\"],\n createForAuthenticatedUser: [\"POST /user/repos\"],\n createFork: [\"POST /repos/{owner}/{repo}/forks\"],\n createInOrg: [\"POST /orgs/{org}/repos\"],\n createOrUpdateEnvironment: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}\",\n ],\n createOrUpdateFileContents: [\"PUT /repos/{owner}/{repo}/contents/{path}\"],\n createOrgRuleset: [\"POST /orgs/{org}/rulesets\"],\n createPagesDeployment: [\"POST /repos/{owner}/{repo}/pages/deployments\"],\n createPagesSite: [\"POST /repos/{owner}/{repo}/pages\"],\n createRelease: [\"POST /repos/{owner}/{repo}/releases\"],\n createRepoRuleset: [\"POST /repos/{owner}/{repo}/rulesets\"],\n createUsingTemplate: [\n \"POST /repos/{template_owner}/{template_repo}/generate\",\n ],\n createWebhook: [\"POST /repos/{owner}/{repo}/hooks\"],\n customPropertiesForReposCreateOrUpdateRepositoryValues: [\n \"PATCH /repos/{owner}/{repo}/properties/values\",\n ],\n customPropertiesForReposGetRepositoryValues: [\n \"GET /repos/{owner}/{repo}/properties/values\",\n ],\n declineInvitation: [\n \"DELETE /user/repository_invitations/{invitation_id}\",\n {},\n { renamed: [\"repos\", \"declineInvitationForAuthenticatedUser\"] },\n ],\n declineInvitationForAuthenticatedUser: [\n \"DELETE /user/repository_invitations/{invitation_id}\",\n ],\n delete: [\"DELETE /repos/{owner}/{repo}\"],\n deleteAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\",\n ],\n deleteAdminBranchProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\",\n ],\n deleteAnEnvironment: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}\",\n ],\n deleteAutolink: [\"DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}\"],\n deleteBranchProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection\",\n ],\n deleteCommitComment: [\"DELETE /repos/{owner}/{repo}/comments/{comment_id}\"],\n deleteCommitSignatureProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\",\n ],\n deleteDeployKey: [\"DELETE /repos/{owner}/{repo}/keys/{key_id}\"],\n deleteDeployment: [\n \"DELETE /repos/{owner}/{repo}/deployments/{deployment_id}\",\n ],\n deleteDeploymentBranchPolicy: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\",\n ],\n deleteFile: [\"DELETE /repos/{owner}/{repo}/contents/{path}\"],\n deleteInvitation: [\n \"DELETE /repos/{owner}/{repo}/invitations/{invitation_id}\",\n ],\n deleteOrgRuleset: [\"DELETE /orgs/{org}/rulesets/{ruleset_id}\"],\n deletePagesSite: [\"DELETE /repos/{owner}/{repo}/pages\"],\n deletePullRequestReviewProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\",\n ],\n deleteRelease: [\"DELETE /repos/{owner}/{repo}/releases/{release_id}\"],\n deleteReleaseAsset: [\n \"DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}\",\n ],\n deleteRepoRuleset: [\"DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n deleteWebhook: [\"DELETE /repos/{owner}/{repo}/hooks/{hook_id}\"],\n disableAutomatedSecurityFixes: [\n \"DELETE /repos/{owner}/{repo}/automated-security-fixes\",\n ],\n disableDeploymentProtectionRule: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}\",\n ],\n disableImmutableReleases: [\n \"DELETE /repos/{owner}/{repo}/immutable-releases\",\n ],\n disablePrivateVulnerabilityReporting: [\n \"DELETE /repos/{owner}/{repo}/private-vulnerability-reporting\",\n ],\n disableVulnerabilityAlerts: [\n \"DELETE /repos/{owner}/{repo}/vulnerability-alerts\",\n ],\n downloadArchive: [\n \"GET /repos/{owner}/{repo}/zipball/{ref}\",\n {},\n { renamed: [\"repos\", \"downloadZipballArchive\"] },\n ],\n downloadTarballArchive: [\"GET /repos/{owner}/{repo}/tarball/{ref}\"],\n downloadZipballArchive: [\"GET /repos/{owner}/{repo}/zipball/{ref}\"],\n enableAutomatedSecurityFixes: [\n \"PUT /repos/{owner}/{repo}/automated-security-fixes\",\n ],\n enableImmutableReleases: [\"PUT /repos/{owner}/{repo}/immutable-releases\"],\n enablePrivateVulnerabilityReporting: [\n \"PUT /repos/{owner}/{repo}/private-vulnerability-reporting\",\n ],\n enableVulnerabilityAlerts: [\n \"PUT /repos/{owner}/{repo}/vulnerability-alerts\",\n ],\n generateReleaseNotes: [\n \"POST /repos/{owner}/{repo}/releases/generate-notes\",\n ],\n get: [\"GET /repos/{owner}/{repo}\"],\n getAccessRestrictions: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\",\n ],\n getAdminBranchProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\",\n ],\n getAllDeploymentProtectionRules: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules\",\n ],\n getAllEnvironments: [\"GET /repos/{owner}/{repo}/environments\"],\n getAllStatusCheckContexts: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n ],\n getAllTopics: [\"GET /repos/{owner}/{repo}/topics\"],\n getAppsWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n ],\n getAutolink: [\"GET /repos/{owner}/{repo}/autolinks/{autolink_id}\"],\n getBranch: [\"GET /repos/{owner}/{repo}/branches/{branch}\"],\n getBranchProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection\",\n ],\n getBranchRules: [\"GET /repos/{owner}/{repo}/rules/branches/{branch}\"],\n getClones: [\"GET /repos/{owner}/{repo}/traffic/clones\"],\n getCodeFrequencyStats: [\"GET /repos/{owner}/{repo}/stats/code_frequency\"],\n getCollaboratorPermissionLevel: [\n \"GET /repos/{owner}/{repo}/collaborators/{username}/permission\",\n ],\n getCombinedStatusForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/status\"],\n getCommit: [\"GET /repos/{owner}/{repo}/commits/{ref}\"],\n getCommitActivityStats: [\"GET /repos/{owner}/{repo}/stats/commit_activity\"],\n getCommitComment: [\"GET /repos/{owner}/{repo}/comments/{comment_id}\"],\n getCommitSignatureProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\",\n ],\n getCommunityProfileMetrics: [\"GET /repos/{owner}/{repo}/community/profile\"],\n getContent: [\"GET /repos/{owner}/{repo}/contents/{path}\"],\n getContributorsStats: [\"GET /repos/{owner}/{repo}/stats/contributors\"],\n getCustomDeploymentProtectionRule: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}\",\n ],\n getDeployKey: [\"GET /repos/{owner}/{repo}/keys/{key_id}\"],\n getDeployment: [\"GET /repos/{owner}/{repo}/deployments/{deployment_id}\"],\n getDeploymentBranchPolicy: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\",\n ],\n getDeploymentStatus: [\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}\",\n ],\n getEnvironment: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}\",\n ],\n getLatestPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/latest\"],\n getLatestRelease: [\"GET /repos/{owner}/{repo}/releases/latest\"],\n getOrgRuleSuite: [\"GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}\"],\n getOrgRuleSuites: [\"GET /orgs/{org}/rulesets/rule-suites\"],\n getOrgRuleset: [\"GET /orgs/{org}/rulesets/{ruleset_id}\"],\n getOrgRulesets: [\"GET /orgs/{org}/rulesets\"],\n getPages: [\"GET /repos/{owner}/{repo}/pages\"],\n getPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/{build_id}\"],\n getPagesDeployment: [\n \"GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}\",\n ],\n getPagesHealthCheck: [\"GET /repos/{owner}/{repo}/pages/health\"],\n getParticipationStats: [\"GET /repos/{owner}/{repo}/stats/participation\"],\n getPullRequestReviewProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\",\n ],\n getPunchCardStats: [\"GET /repos/{owner}/{repo}/stats/punch_card\"],\n getReadme: [\"GET /repos/{owner}/{repo}/readme\"],\n getReadmeInDirectory: [\"GET /repos/{owner}/{repo}/readme/{dir}\"],\n getRelease: [\"GET /repos/{owner}/{repo}/releases/{release_id}\"],\n getReleaseAsset: [\"GET /repos/{owner}/{repo}/releases/assets/{asset_id}\"],\n getReleaseByTag: [\"GET /repos/{owner}/{repo}/releases/tags/{tag}\"],\n getRepoRuleSuite: [\n \"GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}\",\n ],\n getRepoRuleSuites: [\"GET /repos/{owner}/{repo}/rulesets/rule-suites\"],\n getRepoRuleset: [\"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n getRepoRulesetHistory: [\n \"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history\",\n ],\n getRepoRulesetVersion: [\n \"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}\",\n ],\n getRepoRulesets: [\"GET /repos/{owner}/{repo}/rulesets\"],\n getStatusChecksProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n ],\n getTeamsWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n ],\n getTopPaths: [\"GET /repos/{owner}/{repo}/traffic/popular/paths\"],\n getTopReferrers: [\"GET /repos/{owner}/{repo}/traffic/popular/referrers\"],\n getUsersWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n ],\n getViews: [\"GET /repos/{owner}/{repo}/traffic/views\"],\n getWebhook: [\"GET /repos/{owner}/{repo}/hooks/{hook_id}\"],\n getWebhookConfigForRepo: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/config\",\n ],\n getWebhookDelivery: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}\",\n ],\n listActivities: [\"GET /repos/{owner}/{repo}/activity\"],\n listAttestations: [\n \"GET /repos/{owner}/{repo}/attestations/{subject_digest}\",\n ],\n listAutolinks: [\"GET /repos/{owner}/{repo}/autolinks\"],\n listBranches: [\"GET /repos/{owner}/{repo}/branches\"],\n listBranchesForHeadCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head\",\n ],\n listCollaborators: [\"GET /repos/{owner}/{repo}/collaborators\"],\n listCommentsForCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments\",\n ],\n listCommitCommentsForRepo: [\"GET /repos/{owner}/{repo}/comments\"],\n listCommitStatusesForRef: [\n \"GET /repos/{owner}/{repo}/commits/{ref}/statuses\",\n ],\n listCommits: [\"GET /repos/{owner}/{repo}/commits\"],\n listContributors: [\"GET /repos/{owner}/{repo}/contributors\"],\n listCustomDeploymentRuleIntegrations: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps\",\n ],\n listDeployKeys: [\"GET /repos/{owner}/{repo}/keys\"],\n listDeploymentBranchPolicies: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\",\n ],\n listDeploymentStatuses: [\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\",\n ],\n listDeployments: [\"GET /repos/{owner}/{repo}/deployments\"],\n listForAuthenticatedUser: [\"GET /user/repos\"],\n listForOrg: [\"GET /orgs/{org}/repos\"],\n listForUser: [\"GET /users/{username}/repos\"],\n listForks: [\"GET /repos/{owner}/{repo}/forks\"],\n listInvitations: [\"GET /repos/{owner}/{repo}/invitations\"],\n listInvitationsForAuthenticatedUser: [\"GET /user/repository_invitations\"],\n listLanguages: [\"GET /repos/{owner}/{repo}/languages\"],\n listPagesBuilds: [\"GET /repos/{owner}/{repo}/pages/builds\"],\n listPublic: [\"GET /repositories\"],\n listPullRequestsAssociatedWithCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls\",\n ],\n listReleaseAssets: [\n \"GET /repos/{owner}/{repo}/releases/{release_id}/assets\",\n ],\n listReleases: [\"GET /repos/{owner}/{repo}/releases\"],\n listTags: [\"GET /repos/{owner}/{repo}/tags\"],\n listTeams: [\"GET /repos/{owner}/{repo}/teams\"],\n listWebhookDeliveries: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries\",\n ],\n listWebhooks: [\"GET /repos/{owner}/{repo}/hooks\"],\n merge: [\"POST /repos/{owner}/{repo}/merges\"],\n mergeUpstream: [\"POST /repos/{owner}/{repo}/merge-upstream\"],\n pingWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/pings\"],\n redeliverWebhookDelivery: [\n \"POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts\",\n ],\n removeAppAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" },\n ],\n removeCollaborator: [\n \"DELETE /repos/{owner}/{repo}/collaborators/{username}\",\n ],\n removeStatusCheckContexts: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" },\n ],\n removeStatusCheckProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n ],\n removeTeamAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" },\n ],\n removeUserAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" },\n ],\n renameBranch: [\"POST /repos/{owner}/{repo}/branches/{branch}/rename\"],\n replaceAllTopics: [\"PUT /repos/{owner}/{repo}/topics\"],\n requestPagesBuild: [\"POST /repos/{owner}/{repo}/pages/builds\"],\n setAdminBranchProtection: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\",\n ],\n setAppAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" },\n ],\n setStatusCheckContexts: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" },\n ],\n setTeamAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" },\n ],\n setUserAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" },\n ],\n testPushWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/tests\"],\n transfer: [\"POST /repos/{owner}/{repo}/transfer\"],\n update: [\"PATCH /repos/{owner}/{repo}\"],\n updateBranchProtection: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection\",\n ],\n updateCommitComment: [\"PATCH /repos/{owner}/{repo}/comments/{comment_id}\"],\n updateDeploymentBranchPolicy: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\",\n ],\n updateInformationAboutPagesSite: [\"PUT /repos/{owner}/{repo}/pages\"],\n updateInvitation: [\n \"PATCH /repos/{owner}/{repo}/invitations/{invitation_id}\",\n ],\n updateOrgRuleset: [\"PUT /orgs/{org}/rulesets/{ruleset_id}\"],\n updatePullRequestReviewProtection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\",\n ],\n updateRelease: [\"PATCH /repos/{owner}/{repo}/releases/{release_id}\"],\n updateReleaseAsset: [\n \"PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}\",\n ],\n updateRepoRuleset: [\"PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n updateStatusCheckPotection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n {},\n { renamed: [\"repos\", \"updateStatusCheckProtection\"] },\n ],\n updateStatusCheckProtection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n ],\n updateWebhook: [\"PATCH /repos/{owner}/{repo}/hooks/{hook_id}\"],\n updateWebhookConfigForRepo: [\n \"PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config\",\n ],\n uploadReleaseAsset: [\n \"POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}\",\n { baseUrl: \"https://uploads.github.com\" },\n ],\n },\n search: {\n code: [\"GET /search/code\"],\n commits: [\"GET /search/commits\"],\n issuesAndPullRequests: [\"GET /search/issues\"],\n labels: [\"GET /search/labels\"],\n repos: [\"GET /search/repositories\"],\n topics: [\"GET /search/topics\"],\n users: [\"GET /search/users\"],\n },\n secretScanning: {\n createPushProtectionBypass: [\n \"POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses\",\n ],\n getAlert: [\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}\",\n ],\n getScanHistory: [\"GET /repos/{owner}/{repo}/secret-scanning/scan-history\"],\n listAlertsForOrg: [\"GET /orgs/{org}/secret-scanning/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/secret-scanning/alerts\"],\n listLocationsForAlert: [\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations\",\n ],\n listOrgPatternConfigs: [\n \"GET /orgs/{org}/secret-scanning/pattern-configurations\",\n ],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}\",\n ],\n updateOrgPatternConfigs: [\n \"PATCH /orgs/{org}/secret-scanning/pattern-configurations\",\n ],\n },\n securityAdvisories: {\n createFork: [\n \"POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks\",\n ],\n createPrivateVulnerabilityReport: [\n \"POST /repos/{owner}/{repo}/security-advisories/reports\",\n ],\n createRepositoryAdvisory: [\n \"POST /repos/{owner}/{repo}/security-advisories\",\n ],\n createRepositoryAdvisoryCveRequest: [\n \"POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve\",\n ],\n getGlobalAdvisory: [\"GET /advisories/{ghsa_id}\"],\n getRepositoryAdvisory: [\n \"GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}\",\n ],\n listGlobalAdvisories: [\"GET /advisories\"],\n listOrgRepositoryAdvisories: [\"GET /orgs/{org}/security-advisories\"],\n listRepositoryAdvisories: [\"GET /repos/{owner}/{repo}/security-advisories\"],\n updateRepositoryAdvisory: [\n \"PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}\",\n ],\n },\n teams: {\n addOrUpdateMembershipForUserInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/memberships/{username}\",\n ],\n addOrUpdateRepoPermissionsInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\",\n ],\n checkPermissionsForRepoInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\",\n ],\n create: [\"POST /orgs/{org}/teams\"],\n createDiscussionCommentInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\",\n ],\n createDiscussionInOrg: [\"POST /orgs/{org}/teams/{team_slug}/discussions\"],\n deleteDiscussionCommentInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\",\n ],\n deleteDiscussionInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\",\n ],\n deleteInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}\"],\n getByName: [\"GET /orgs/{org}/teams/{team_slug}\"],\n getDiscussionCommentInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\",\n ],\n getDiscussionInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\",\n ],\n getMembershipForUserInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/memberships/{username}\",\n ],\n list: [\"GET /orgs/{org}/teams\"],\n listChildInOrg: [\"GET /orgs/{org}/teams/{team_slug}/teams\"],\n listDiscussionCommentsInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\",\n ],\n listDiscussionsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions\"],\n listForAuthenticatedUser: [\"GET /user/teams\"],\n listMembersInOrg: [\"GET /orgs/{org}/teams/{team_slug}/members\"],\n listPendingInvitationsInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/invitations\",\n ],\n listReposInOrg: [\"GET /orgs/{org}/teams/{team_slug}/repos\"],\n removeMembershipForUserInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}\",\n ],\n removeRepoInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\",\n ],\n updateDiscussionCommentInOrg: [\n \"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\",\n ],\n updateDiscussionInOrg: [\n \"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\",\n ],\n updateInOrg: [\"PATCH /orgs/{org}/teams/{team_slug}\"],\n },\n users: {\n addEmailForAuthenticated: [\n \"POST /user/emails\",\n {},\n { renamed: [\"users\", \"addEmailForAuthenticatedUser\"] },\n ],\n addEmailForAuthenticatedUser: [\"POST /user/emails\"],\n addSocialAccountForAuthenticatedUser: [\"POST /user/social_accounts\"],\n block: [\"PUT /user/blocks/{username}\"],\n checkBlocked: [\"GET /user/blocks/{username}\"],\n checkFollowingForUser: [\"GET /users/{username}/following/{target_user}\"],\n checkPersonIsFollowedByAuthenticated: [\"GET /user/following/{username}\"],\n createGpgKeyForAuthenticated: [\n \"POST /user/gpg_keys\",\n {},\n { renamed: [\"users\", \"createGpgKeyForAuthenticatedUser\"] },\n ],\n createGpgKeyForAuthenticatedUser: [\"POST /user/gpg_keys\"],\n createPublicSshKeyForAuthenticated: [\n \"POST /user/keys\",\n {},\n { renamed: [\"users\", \"createPublicSshKeyForAuthenticatedUser\"] },\n ],\n createPublicSshKeyForAuthenticatedUser: [\"POST /user/keys\"],\n createSshSigningKeyForAuthenticatedUser: [\"POST /user/ssh_signing_keys\"],\n deleteAttestationsBulk: [\n \"POST /users/{username}/attestations/delete-request\",\n ],\n deleteAttestationsById: [\n \"DELETE /users/{username}/attestations/{attestation_id}\",\n ],\n deleteAttestationsBySubjectDigest: [\n \"DELETE /users/{username}/attestations/digest/{subject_digest}\",\n ],\n deleteEmailForAuthenticated: [\n \"DELETE /user/emails\",\n {},\n { renamed: [\"users\", \"deleteEmailForAuthenticatedUser\"] },\n ],\n deleteEmailForAuthenticatedUser: [\"DELETE /user/emails\"],\n deleteGpgKeyForAuthenticated: [\n \"DELETE /user/gpg_keys/{gpg_key_id}\",\n {},\n { renamed: [\"users\", \"deleteGpgKeyForAuthenticatedUser\"] },\n ],\n deleteGpgKeyForAuthenticatedUser: [\"DELETE /user/gpg_keys/{gpg_key_id}\"],\n deletePublicSshKeyForAuthenticated: [\n \"DELETE /user/keys/{key_id}\",\n {},\n { renamed: [\"users\", \"deletePublicSshKeyForAuthenticatedUser\"] },\n ],\n deletePublicSshKeyForAuthenticatedUser: [\"DELETE /user/keys/{key_id}\"],\n deleteSocialAccountForAuthenticatedUser: [\"DELETE /user/social_accounts\"],\n deleteSshSigningKeyForAuthenticatedUser: [\n \"DELETE /user/ssh_signing_keys/{ssh_signing_key_id}\",\n ],\n follow: [\"PUT /user/following/{username}\"],\n getAuthenticated: [\"GET /user\"],\n getById: [\"GET /user/{account_id}\"],\n getByUsername: [\"GET /users/{username}\"],\n getContextForUser: [\"GET /users/{username}/hovercard\"],\n getGpgKeyForAuthenticated: [\n \"GET /user/gpg_keys/{gpg_key_id}\",\n {},\n { renamed: [\"users\", \"getGpgKeyForAuthenticatedUser\"] },\n ],\n getGpgKeyForAuthenticatedUser: [\"GET /user/gpg_keys/{gpg_key_id}\"],\n getPublicSshKeyForAuthenticated: [\n \"GET /user/keys/{key_id}\",\n {},\n { renamed: [\"users\", \"getPublicSshKeyForAuthenticatedUser\"] },\n ],\n getPublicSshKeyForAuthenticatedUser: [\"GET /user/keys/{key_id}\"],\n getSshSigningKeyForAuthenticatedUser: [\n \"GET /user/ssh_signing_keys/{ssh_signing_key_id}\",\n ],\n list: [\"GET /users\"],\n listAttestations: [\"GET /users/{username}/attestations/{subject_digest}\"],\n listAttestationsBulk: [\n \"POST /users/{username}/attestations/bulk-list{?per_page,before,after}\",\n ],\n listBlockedByAuthenticated: [\n \"GET /user/blocks\",\n {},\n { renamed: [\"users\", \"listBlockedByAuthenticatedUser\"] },\n ],\n listBlockedByAuthenticatedUser: [\"GET /user/blocks\"],\n listEmailsForAuthenticated: [\n \"GET /user/emails\",\n {},\n { renamed: [\"users\", \"listEmailsForAuthenticatedUser\"] },\n ],\n listEmailsForAuthenticatedUser: [\"GET /user/emails\"],\n listFollowedByAuthenticated: [\n \"GET /user/following\",\n {},\n { renamed: [\"users\", \"listFollowedByAuthenticatedUser\"] },\n ],\n listFollowedByAuthenticatedUser: [\"GET /user/following\"],\n listFollowersForAuthenticatedUser: [\"GET /user/followers\"],\n listFollowersForUser: [\"GET /users/{username}/followers\"],\n listFollowingForUser: [\"GET /users/{username}/following\"],\n listGpgKeysForAuthenticated: [\n \"GET /user/gpg_keys\",\n {},\n { renamed: [\"users\", \"listGpgKeysForAuthenticatedUser\"] },\n ],\n listGpgKeysForAuthenticatedUser: [\"GET /user/gpg_keys\"],\n listGpgKeysForUser: [\"GET /users/{username}/gpg_keys\"],\n listPublicEmailsForAuthenticated: [\n \"GET /user/public_emails\",\n {},\n { renamed: [\"users\", \"listPublicEmailsForAuthenticatedUser\"] },\n ],\n listPublicEmailsForAuthenticatedUser: [\"GET /user/public_emails\"],\n listPublicKeysForUser: [\"GET /users/{username}/keys\"],\n listPublicSshKeysForAuthenticated: [\n \"GET /user/keys\",\n {},\n { renamed: [\"users\", \"listPublicSshKeysForAuthenticatedUser\"] },\n ],\n listPublicSshKeysForAuthenticatedUser: [\"GET /user/keys\"],\n listSocialAccountsForAuthenticatedUser: [\"GET /user/social_accounts\"],\n listSocialAccountsForUser: [\"GET /users/{username}/social_accounts\"],\n listSshSigningKeysForAuthenticatedUser: [\"GET /user/ssh_signing_keys\"],\n listSshSigningKeysForUser: [\"GET /users/{username}/ssh_signing_keys\"],\n setPrimaryEmailVisibilityForAuthenticated: [\n \"PATCH /user/email/visibility\",\n {},\n { renamed: [\"users\", \"setPrimaryEmailVisibilityForAuthenticatedUser\"] },\n ],\n setPrimaryEmailVisibilityForAuthenticatedUser: [\n \"PATCH /user/email/visibility\",\n ],\n unblock: [\"DELETE /user/blocks/{username}\"],\n unfollow: [\"DELETE /user/following/{username}\"],\n updateAuthenticated: [\"PATCH /user\"],\n },\n};\n\nexport default Endpoints;\n", "import type { Octokit } from \"@octokit/core\";\nimport type { EndpointOptions, RequestParameters, Route } from \"@octokit/types\";\nimport ENDPOINTS from \"./generated/endpoints.js\";\nimport type { RestEndpointMethods } from \"./generated/method-types.js\";\nimport type { EndpointDecorations } from \"./types.js\";\n\n// The following code was refactored in: https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/622\n// to optimise the runtime performance of Octokit initialization.\n//\n// This optimization involves two key changes:\n// 1. Pre-Computation: The endpoint methods are pre-computed once at module load\n// time instead of each invocation of `endpointsToMethods()`.\n// 2. Lazy initialization and caching: We use a Proxy for each scope to only\n// initialize methods that are actually called. This reduces runtime overhead\n// as the initialization involves deep merging of objects. The initialized\n// methods are then cached for future use.\n\nconst endpointMethodsMap = new Map();\nfor (const [scope, endpoints] of Object.entries(ENDPOINTS)) {\n for (const [methodName, endpoint] of Object.entries(endpoints)) {\n const [route, defaults, decorations] = endpoint;\n const [method, url] = route.split(/ /);\n const endpointDefaults = Object.assign(\n {\n method,\n url,\n },\n defaults,\n );\n\n if (!endpointMethodsMap.has(scope)) {\n endpointMethodsMap.set(scope, new Map());\n }\n\n endpointMethodsMap.get(scope).set(methodName, {\n scope,\n methodName,\n endpointDefaults,\n decorations,\n });\n }\n}\n\ntype ProxyTarget = {\n octokit: Octokit;\n scope: string;\n cache: Record any>;\n};\n\nconst handler = {\n has({ scope }: ProxyTarget, methodName: string) {\n return endpointMethodsMap.get(scope).has(methodName);\n },\n getOwnPropertyDescriptor(target: ProxyTarget, methodName: string) {\n return {\n value: this.get(target, methodName), // ensures method is in the cache\n configurable: true,\n writable: true,\n enumerable: true,\n };\n },\n defineProperty(\n target: ProxyTarget,\n methodName: string,\n descriptor: PropertyDescriptor,\n ) {\n Object.defineProperty(target.cache, methodName, descriptor);\n return true;\n },\n deleteProperty(target: ProxyTarget, methodName: string) {\n delete target.cache[methodName];\n return true;\n },\n ownKeys({ scope }: ProxyTarget) {\n return [...endpointMethodsMap.get(scope).keys()];\n },\n set(target: ProxyTarget, methodName: string, value: any) {\n return (target.cache[methodName] = value);\n },\n get({ octokit, scope, cache }: ProxyTarget, methodName: string) {\n if (cache[methodName]) {\n return cache[methodName];\n }\n\n const method = endpointMethodsMap.get(scope).get(methodName);\n if (!method) {\n return undefined;\n }\n\n const { endpointDefaults, decorations } = method;\n\n if (decorations) {\n cache[methodName] = decorate(\n octokit,\n scope,\n methodName,\n endpointDefaults,\n decorations,\n );\n } else {\n cache[methodName] = octokit.request.defaults(endpointDefaults);\n }\n\n return cache[methodName];\n },\n};\n\nexport function endpointsToMethods(octokit: Octokit): RestEndpointMethods {\n const newMethods = {} as { [key: string]: object };\n\n for (const scope of endpointMethodsMap.keys()) {\n newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler);\n }\n\n return newMethods as RestEndpointMethods;\n}\n\nfunction decorate(\n octokit: Octokit,\n scope: string,\n methodName: string,\n defaults: EndpointOptions,\n decorations: EndpointDecorations,\n) {\n const requestWithDefaults = octokit.request.defaults(defaults);\n\n /* istanbul ignore next */\n function withDecorations(\n ...args: [Route, RequestParameters?] | [EndpointOptions]\n ) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n let options = requestWithDefaults.endpoint.merge(...args);\n\n // There are currently no other decorations than `.mapToData`\n if (decorations.mapToData) {\n options = Object.assign({}, options, {\n data: options[decorations.mapToData],\n [decorations.mapToData]: undefined,\n });\n return requestWithDefaults(options);\n }\n\n if (decorations.renamed) {\n const [newScope, newMethodName] = decorations.renamed;\n octokit.log.warn(\n `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`,\n );\n }\n if (decorations.deprecated) {\n octokit.log.warn(decorations.deprecated);\n }\n\n if (decorations.renamedParameters) {\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n const options = requestWithDefaults.endpoint.merge(...args);\n\n for (const [name, alias] of Object.entries(\n decorations.renamedParameters,\n )) {\n if (name in options) {\n octokit.log.warn(\n `\"${name}\" parameter is deprecated for \"octokit.${scope}.${methodName}()\". Use \"${alias}\" instead`,\n );\n if (!(alias in options)) {\n options[alias] = options[name];\n }\n delete options[name];\n }\n }\n return requestWithDefaults(options);\n }\n\n // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488\n return requestWithDefaults(...args);\n }\n return Object.assign(withDecorations, requestWithDefaults);\n}\n", "import type { Octokit } from \"@octokit/core\";\n\nexport type { RestEndpointMethodTypes } from \"./generated/parameters-and-response-types.js\";\nimport { VERSION } from \"./version.js\";\nimport type { Api } from \"./types.js\";\nimport { endpointsToMethods } from \"./endpoints-to-methods.js\";\n\n// Export the type for downstream users in order to fix a TypeScript error\n// The inferred type of 'Octokit' cannot be named without a reference to '../node_modules/@octokit/plugin-rest-endpoint-methods/dist-types/types.js'. This is likely not portable. A type annotation is necessary.\nexport type { Api };\n\nexport function restEndpointMethods(octokit: Octokit): Api {\n const api = endpointsToMethods(octokit);\n return {\n rest: api,\n };\n}\nrestEndpointMethods.VERSION = VERSION;\n\nexport function legacyRestEndpointMethods(octokit: Octokit): Api[\"rest\"] & Api {\n const api = endpointsToMethods(octokit);\n return {\n ...api,\n rest: api,\n };\n}\nlegacyRestEndpointMethods.VERSION = VERSION;\n", "const VERSION = \"22.0.1\";\nexport {\n VERSION\n};\n", "import { Octokit as Core } from \"@octokit/core\";\nimport { requestLog } from \"@octokit/plugin-request-log\";\nimport {\n paginateRest\n} from \"@octokit/plugin-paginate-rest\";\nimport { legacyRestEndpointMethods } from \"@octokit/plugin-rest-endpoint-methods\";\nimport { VERSION } from \"./version.js\";\nconst Octokit = Core.plugin(requestLog, legacyRestEndpointMethods, paginateRest).defaults(\n {\n userAgent: `octokit-rest.js/${VERSION}`\n }\n);\nexport {\n Octokit\n};\n", "import * as vscode from \"vscode\";\nimport { generateConfigs, analyzeRepo } from \"../services.js\";\nimport { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from \"./analyze.js\";\n\nconst GENERATE_OPTIONS = [\n { label: \"MCP Config\", value: \"mcp\", description: \".vscode/mcp.json\" },\n { label: \"VS Code Settings\", value: \"vscode\", description: \".vscode/settings.json\" },\n] as const;\n\nexport async function generateCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const picked = await vscode.window.showQuickPick(\n GENERATE_OPTIONS.map((o) => ({ label: o.label, description: o.description, value: o.value })),\n { placeHolder: \"Select config type to generate\" },\n );\n if (!picked) return;\n\n let analysis = getCachedAnalysis();\n\n const result = await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: `Primer: Generating ${picked.label}\u2026` },\n async () => {\n try {\n if (!analysis) {\n analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n }\n\n return await generateConfigs({\n repoPath: workspacePath,\n analysis,\n selections: [picked.value],\n force: false,\n });\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Config generation failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n return undefined;\n }\n },\n );\n\n if (!result) return;\n\n const wrote = result.files.filter((f) => f.action === \"wrote\");\n const skipped = result.files.filter((f) => f.action === \"skipped\");\n\n if (wrote.length > 0) {\n const openAction = \"Open File\";\n const msg = `Generated ${wrote.map((f) => f.path).join(\", \")}${skipped.length ? ` (${skipped.length} skipped)` : \"\"}`;\n const action = await vscode.window.showInformationMessage(`Primer: ${msg}`, openAction);\n if (action === openAction && wrote[0]) {\n const doc = await vscode.workspace.openTextDocument(wrote[0].path);\n await vscode.window.showTextDocument(doc);\n }\n } else if (skipped.length > 0) {\n const overwrite = \"Overwrite\";\n const action = await vscode.window.showWarningMessage(\n \"Primer: All config files already exist.\",\n overwrite,\n );\n if (action === overwrite) {\n await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: `Primer: Overwriting ${picked.label}\u2026` },\n async () => {\n const forceResult = await generateConfigs({\n repoPath: workspacePath,\n analysis: analysis!,\n selections: [picked.value],\n force: true,\n });\n const forceWrote = forceResult.files.filter((f) => f.action === \"wrote\");\n if (forceWrote.length > 0) {\n const doc = await vscode.workspace.openTextDocument(forceWrote[0]!.path);\n await vscode.window.showTextDocument(doc);\n }\n },\n );\n }\n }\n}\n", "import * as vscode from \"vscode\";\nimport { generateCopilotInstructions, generateAreaInstructions, analyzeRepo } from \"../services.js\";\nimport { VscodeProgressReporter } from \"../progress.js\";\nimport { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from \"./analyze.js\";\n\nexport async function instructionsCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const model = vscode.workspace.getConfiguration(\"primer\").get(\"model\");\n\n // Ensure analysis is available before starting progress\n let analysis = getCachedAnalysis();\n if (!analysis) {\n await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: \"Primer: Analyzing repository\u2026\" },\n async () => {\n analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis!);\n },\n );\n }\n if (!analysis) return;\n\n // Collect area selections before starting generation progress\n let selectedAreas: typeof analysis.areas = undefined;\n if (analysis.areas && analysis.areas.length > 0) {\n const picked = await vscode.window.showQuickPick(\n analysis.areas.map((a) => ({ label: a.name, description: a.description, area: a })),\n { placeHolder: \"Select areas for instructions (or Escape for root only)\", canPickMany: true },\n );\n if (picked && picked.length > 0) {\n selectedAreas = picked.map((p) => p.area);\n }\n }\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Generating Copilot instructions\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n reporter.update(\"Generating root instructions\u2026\");\n await generateCopilotInstructions({\n repoPath: workspacePath,\n model,\n onProgress: (msg) => reporter.update(msg),\n });\n\n if (selectedAreas) {\n for (const area of selectedAreas) {\n reporter.update(`Generating instructions for ${area.name}\u2026`);\n await generateAreaInstructions({\n repoPath: workspacePath,\n area,\n model,\n onProgress: (msg) => reporter.update(msg),\n });\n }\n }\n\n reporter.succeed(\"Instructions generated.\");\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Instruction generation failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import type * as vscode from \"vscode\";\nimport type { ProgressReporter } from \"primer/utils/output.js\";\n\n/**\n * Adapts VS Code's `Progress<{ message, increment }>` to Primer's `ProgressReporter` interface.\n */\nexport class VscodeProgressReporter implements ProgressReporter {\n constructor(\n private readonly progress: vscode.Progress<{ message?: string; increment?: number }>,\n ) {}\n\n update(message: string): void {\n this.progress.report({ message });\n }\n\n succeed(message: string): void {\n this.progress.report({ message: `$(check) ${message}` });\n }\n\n fail(message: string): void {\n this.progress.report({ message: `$(error) ${message}` });\n }\n\n done(): void {\n // VS Code progress auto-closes when the withProgress callback resolves\n }\n}\n", "import * as vscode from \"vscode\";\nimport { runReadinessReport, generateVisualReport, analyzeRepo } from \"../services.js\";\nimport { VscodeProgressReporter } from \"../progress.js\";\nimport { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from \"./analyze.js\";\nimport { createWebviewPanel } from \"../webview.js\";\nimport { readinessTreeProvider } from \"../views/providers.js\";\n\nexport async function readinessCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Running readiness assessment\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n let analysis = getCachedAnalysis();\n if (!analysis) {\n reporter.update(\"Analyzing repository\u2026\");\n analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n }\n\n reporter.update(\"Evaluating readiness pillars\u2026\");\n const report = await runReadinessReport({ repoPath: workspacePath });\n\n reporter.update(\"Generating report\u2026\");\n const repoName = vscode.workspace.workspaceFolders?.[0]?.name ?? \"Repository\";\n const html = generateVisualReport({\n reports: [{ repo: repoName, report }],\n title: `${repoName} \u2014 AI Readiness`,\n });\n\n createWebviewPanel(\"primer.readinessReport\", \"AI Readiness Report\", html);\n readinessTreeProvider.setReport(report);\n reporter.succeed(`Readiness: Level ${report.achievedLevel} achieved.`);\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Readiness assessment failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import * as vscode from \"vscode\";\n\nconst panels = new Map();\n\n/**\n * Create or reuse a webview panel to display HTML content.\n */\nexport function createWebviewPanel(id: string, title: string, html: string): vscode.WebviewPanel {\n const existing = panels.get(id);\n if (existing) {\n existing.webview.html = html;\n existing.reveal();\n return existing;\n }\n\n const panel = vscode.window.createWebviewPanel(id, title, vscode.ViewColumn.One, {\n enableScripts: true,\n localResourceRoots: [],\n });\n\n panel.webview.html = html;\n panel.onDidDispose(() => panels.delete(id));\n panels.set(id, panel);\n return panel;\n}\n", "import * as vscode from \"vscode\";\nimport type { RepoAnalysis } from \"../types.js\";\nimport { getCachedAnalysis } from \"../commands/analyze.js\";\n\nexport class AnalysisTreeProvider implements vscode.TreeDataProvider {\n private _onDidChangeTreeData = new vscode.EventEmitter();\n readonly onDidChangeTreeData = this._onDidChangeTreeData.event;\n\n refresh(): void {\n this._onDidChangeTreeData.fire(undefined);\n }\n\n getTreeItem(element: AnalysisItem): vscode.TreeItem {\n return element;\n }\n\n getChildren(element?: AnalysisItem): AnalysisItem[] {\n if (element) return element.children ?? [];\n const analysis = getCachedAnalysis();\n if (!analysis) return [];\n return this.getRootItems(analysis);\n }\n\n private getRootItems(analysis: RepoAnalysis): AnalysisItem[] {\n const items: AnalysisItem[] = [];\n\n if (analysis.languages.length > 0) {\n const langs = new AnalysisItem(\n \"Languages\",\n vscode.TreeItemCollapsibleState.Expanded,\n analysis.languages.map((l) => {\n const item = new AnalysisItem(l, vscode.TreeItemCollapsibleState.None);\n item.contextValue = \"language\";\n return item;\n }),\n );\n langs.iconPath = new vscode.ThemeIcon(\"code\");\n langs.description = `${analysis.languages.length}`;\n langs.contextValue = \"category\";\n items.push(langs);\n }\n\n if (analysis.frameworks.length > 0) {\n const frameworks = new AnalysisItem(\n \"Frameworks\",\n vscode.TreeItemCollapsibleState.Expanded,\n analysis.frameworks.map((f) => {\n const item = new AnalysisItem(f, vscode.TreeItemCollapsibleState.None);\n item.contextValue = \"framework\";\n return item;\n }),\n );\n frameworks.iconPath = new vscode.ThemeIcon(\"extensions\");\n frameworks.description = `${analysis.frameworks.length}`;\n frameworks.contextValue = \"category\";\n items.push(frameworks);\n }\n\n if (analysis.isMonorepo && analysis.areas) {\n const areas = new AnalysisItem(\n \"Monorepo\",\n vscode.TreeItemCollapsibleState.Expanded,\n analysis.areas.map((a) => {\n const item = new AnalysisItem(a.name, vscode.TreeItemCollapsibleState.None);\n item.description = typeof a.applyTo === \"string\" ? a.applyTo : a.applyTo.join(\", \");\n item.iconPath = new vscode.ThemeIcon(\"folder\");\n item.contextValue = \"area\";\n const md = new vscode.MarkdownString();\n md.appendMarkdown(`**${a.name}**`);\n if (a.description) md.appendMarkdown(`\\n\\n${a.description}`);\n md.appendMarkdown(`\\n\\nGlobs: \\`${typeof a.applyTo === \"string\" ? a.applyTo : a.applyTo.join(\"\\`, \\`\")}\\``);\n item.tooltip = md;\n return item;\n }),\n );\n areas.iconPath = new vscode.ThemeIcon(\"folder-library\");\n areas.description = analysis.workspaceType ?? undefined;\n areas.contextValue = \"category\";\n items.push(areas);\n }\n\n if (analysis.packageManager) {\n const pm = new AnalysisItem(\n \"Package Manager\",\n vscode.TreeItemCollapsibleState.None,\n );\n pm.description = analysis.packageManager;\n pm.iconPath = new vscode.ThemeIcon(\"package\");\n pm.contextValue = \"info\";\n items.push(pm);\n }\n\n return items;\n }\n}\n\nclass AnalysisItem extends vscode.TreeItem {\n constructor(\n label: string,\n collapsibleState: vscode.TreeItemCollapsibleState,\n public readonly children?: AnalysisItem[],\n ) {\n super(label, collapsibleState);\n }\n}\n", "import * as vscode from \"vscode\";\nimport type { ReadinessReport, ReadinessPillarSummary, ReadinessCriterionResult } from \"../types.js\";\n\nexport class ReadinessTreeProvider implements vscode.TreeDataProvider {\n private _onDidChangeTreeData = new vscode.EventEmitter();\n readonly onDidChangeTreeData = this._onDidChangeTreeData.event;\n\n private report: ReadinessReport | undefined;\n\n setReport(report: ReadinessReport): void {\n this.report = report;\n this._onDidChangeTreeData.fire(undefined);\n }\n\n getReport(): ReadinessReport | undefined {\n return this.report;\n }\n\n refresh(): void {\n this._onDidChangeTreeData.fire(undefined);\n }\n\n getTreeItem(element: ReadinessItem): vscode.TreeItem {\n return element;\n }\n\n getChildren(element?: ReadinessItem): ReadinessItem[] {\n if (element) return element.children ?? [];\n if (!this.report) return [];\n return this.getRootItems(this.report);\n }\n\n private getRootItems(report: ReadinessReport): ReadinessItem[] {\n const items: ReadinessItem[] = [];\n\n const levelInfo = report.levels.find((l) => l.level === report.achievedLevel);\n const level = new ReadinessItem(\n levelInfo?.name ?? `Level ${report.achievedLevel}`,\n vscode.TreeItemCollapsibleState.None,\n );\n level.description = `Level ${report.achievedLevel}`;\n level.iconPath = new vscode.ThemeIcon(\n report.achievedLevel >= 3 ? \"pass\" : \"warning\",\n new vscode.ThemeColor(report.achievedLevel >= 3 ? \"testing.iconPassed\" : \"problemsWarningIcon.foreground\"),\n );\n level.contextValue = \"level\";\n items.push(level);\n\n for (const pillar of report.pillars) {\n const criteria = report.criteria.filter((c) => c.pillar === pillar.id);\n items.push(this.createPillarItem(pillar, criteria));\n }\n\n return items;\n }\n\n private createPillarItem(pillar: ReadinessPillarSummary, criteria: ReadinessCriterionResult[]): ReadinessItem {\n const pct = Math.round(pillar.passRate * 100);\n const item = new ReadinessItem(\n pillar.name,\n criteria.length > 0 ? vscode.TreeItemCollapsibleState.Collapsed : vscode.TreeItemCollapsibleState.None,\n criteria.map((c) => {\n const ci = new ReadinessItem(c.title, vscode.TreeItemCollapsibleState.None);\n ci.iconPath = new vscode.ThemeIcon(\n c.status === \"pass\" ? \"pass\" : c.status === \"fail\" ? \"error\" : \"circle-outline\",\n c.status === \"pass\"\n ? new vscode.ThemeColor(\"testing.iconPassed\")\n : c.status === \"fail\"\n ? new vscode.ThemeColor(\"testing.iconFailed\")\n : undefined,\n );\n ci.description = c.reason;\n ci.contextValue = `criterion.${c.status}`;\n const md = new vscode.MarkdownString();\n md.appendMarkdown(`**${c.title}**\\n\\n`);\n if (c.reason) md.appendMarkdown(`${c.reason}\\n\\n`);\n if (c.evidence && c.evidence.length > 0) {\n md.appendMarkdown(\"**Evidence:**\\n\");\n for (const e of c.evidence) {\n md.appendMarkdown(`- ${e}\\n`);\n }\n }\n ci.tooltip = md;\n return ci;\n }),\n );\n item.iconPath = new vscode.ThemeIcon(\n pct === 100 ? \"pass\" : pct >= 50 ? \"warning\" : \"error\",\n pct === 100\n ? new vscode.ThemeColor(\"testing.iconPassed\")\n : pct >= 50\n ? new vscode.ThemeColor(\"problemsWarningIcon.foreground\")\n : new vscode.ThemeColor(\"testing.iconFailed\"),\n );\n item.description = `${pillar.passed}/${pillar.total} (${pct}%)`;\n item.contextValue = \"pillar\";\n return item;\n }\n}\n\nclass ReadinessItem extends vscode.TreeItem {\n constructor(\n label: string,\n collapsibleState: vscode.TreeItemCollapsibleState,\n public readonly children?: ReadinessItem[],\n ) {\n super(label, collapsibleState);\n }\n}\n", "import { AnalysisTreeProvider } from \"./AnalysisTreeProvider.js\";\nimport { ReadinessTreeProvider } from \"./ReadinessTreeProvider.js\";\n\nexport const analysisTreeProvider = new AnalysisTreeProvider();\nexport const readinessTreeProvider = new ReadinessTreeProvider();\n", "import * as vscode from \"vscode\";\nimport path from \"node:path\";\nimport { runEval, generateEvalScaffold, analyzeRepo, safeWriteFile } from \"../services.js\";\nimport { VscodeProgressReporter } from \"../progress.js\";\nimport { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from \"./analyze.js\";\nimport { createWebviewPanel } from \"../webview.js\";\nimport fs from \"node:fs\";\n\nexport async function evalCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const configPath = path.join(workspacePath, \"primer.eval.json\");\n if (!fs.existsSync(configPath)) {\n const action = await vscode.window.showWarningMessage(\n \"Primer: No primer.eval.json found. Create one?\",\n \"Scaffold\",\n \"Cancel\",\n );\n if (action === \"Scaffold\") {\n await evalInitCommand();\n }\n return;\n }\n\n const config = vscode.workspace.getConfiguration(\"primer\");\n const model = config.get(\"model\") ?? \"claude-sonnet-4.5\";\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Running eval\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n reporter.update(\"Running evaluation\u2026\");\n const result = await runEval({\n configPath,\n repoPath: workspacePath,\n model,\n judgeModel: model,\n onProgress: (msg) => reporter.update(msg),\n });\n\n reporter.succeed(`Eval complete. ${result.summary}`);\n\n if (result.viewerPath && fs.existsSync(result.viewerPath)) {\n const html = fs.readFileSync(result.viewerPath, \"utf-8\");\n createWebviewPanel(\"primer.evalResults\", \"Eval Results\", html);\n }\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Eval failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n\nexport async function evalInitCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const config = vscode.workspace.getConfiguration(\"primer\");\n const model = config.get(\"model\");\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Scaffolding eval config\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n let analysis = getCachedAnalysis();\n if (!analysis) {\n reporter.update(\"Analyzing repository\u2026\");\n analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n }\n\n reporter.update(\"Generating eval cases\u2026\");\n const evalConfig = await generateEvalScaffold({\n repoPath: workspacePath,\n count: 5,\n model,\n areas: analysis.areas,\n onProgress: (msg) => reporter.update(msg),\n });\n\n const outputPath = path.join(workspacePath, \"primer.eval.json\");\n await safeWriteFile(outputPath, JSON.stringify(evalConfig, null, 2) + \"\\n\", false);\n\n reporter.succeed(\"Eval config scaffolded.\");\n const doc = await vscode.workspace.openTextDocument(outputPath);\n await vscode.window.showTextDocument(doc);\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Eval scaffold failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import * as vscode from \"vscode\";\nimport path from \"node:path\";\nimport { analyzeRepo, generateConfigs, generateCopilotInstructions } from \"../services.js\";\nimport { VscodeProgressReporter } from \"../progress.js\";\nimport { getWorkspacePath, setCachedAnalysis } from \"./analyze.js\";\n\nexport async function initCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const config = vscode.workspace.getConfiguration(\"primer\");\n const model = config.get(\"model\");\n\n await vscode.window.withProgress(\n {\n location: vscode.ProgressLocation.Notification,\n title: \"Primer: Initializing repository\u2026\",\n cancellable: false,\n },\n async (progress) => {\n try {\n const reporter = new VscodeProgressReporter(progress);\n\n reporter.update(\"Analyzing repository\u2026\");\n const analysis = await analyzeRepo(workspacePath);\n setCachedAnalysis(analysis);\n\n reporter.update(\"Generating Copilot instructions\u2026\");\n await generateCopilotInstructions({\n repoPath: workspacePath,\n model,\n onProgress: (msg) => reporter.update(msg),\n });\n\n reporter.update(\"Generating configs\u2026\");\n const result = await generateConfigs({\n repoPath: workspacePath,\n analysis,\n selections: [\"mcp\", \"vscode\"],\n force: false,\n });\n\n const wrote = result.files.filter((f) => f.action === \"wrote\");\n const skipped = result.files.filter((f) => f.action === \"skipped\");\n const parts: string[] = [];\n if (wrote.length) parts.push(`${wrote.length} files generated`);\n if (skipped.length) parts.push(`${skipped.length} skipped (already exist)`);\n\n reporter.succeed(\"Repository initialized.\");\n\n const instructionsPath = path.join(workspacePath, \".github\", \"copilot-instructions.md\");\n try {\n const doc = await vscode.workspace.openTextDocument(instructionsPath);\n await vscode.window.showTextDocument(doc);\n } catch {\n // File may not exist if generation was skipped\n }\n\n vscode.window.showInformationMessage(`Primer: ${parts.join(\", \") || \"Done.\"}`);\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: Initialization failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import * as vscode from \"vscode\";\nimport { createPullRequest } from \"../services.js\";\nimport { getGitHubToken } from \"../auth.js\";\nimport { getWorkspacePath } from \"./analyze.js\";\nimport simpleGit from \"simple-git\";\n\nexport async function prCommand(): Promise {\n const workspacePath = getWorkspacePath();\n if (!workspacePath) return;\n\n const git = simpleGit(workspacePath);\n\n // Detect remote owner/repo\n const remotes = await git.getRemotes(true);\n const origin = remotes.find((r) => r.name === \"origin\");\n if (!origin?.refs.push) {\n vscode.window.showErrorMessage(\"Primer: No origin remote found.\");\n return;\n }\n\n const match = origin.refs.push.match(/github\\.com[:/]([^/]+)\\/([^/.]+)/);\n if (!match) {\n vscode.window.showErrorMessage(\"Primer: Could not parse GitHub owner/repo from origin remote.\");\n return;\n }\n const [, owner, repo] = match;\n\n const branch = (await git.branch()).current;\n const defaultBranch = await git.raw([\"symbolic-ref\", \"refs/remotes/origin/HEAD\", \"--short\"]).catch(() => \"origin/main\");\n const base = defaultBranch.replace(\"origin/\", \"\").trim();\n\n if (branch === base) {\n vscode.window.showErrorMessage(\"Primer: Cannot create PR from the default branch. Check out a feature branch first.\");\n return;\n }\n\n const title = await vscode.window.showInputBox({\n prompt: \"Pull request title\",\n value: `Add Primer AI configs for ${repo}`,\n });\n if (!title) return;\n\n await vscode.window.withProgress(\n { location: vscode.ProgressLocation.Notification, title: \"Primer: Creating pull request\u2026\" },\n async () => {\n try {\n const token = await getGitHubToken();\n\n // Commit and push if there are changes\n const status = await git.status();\n if (status.files.length > 0) {\n const primerFiles = status.files\n .map((f) => f.path)\n .filter(\n (p) =>\n p.startsWith(\".github/\") ||\n p.startsWith(\".vscode/\") ||\n p.endsWith(\".instructions.md\") ||\n p === \"primer.eval.json\",\n );\n\n if (primerFiles.length === 0) {\n vscode.window.showWarningMessage(\"Primer: No Primer-generated files to commit.\");\n return;\n }\n\n await git.add(primerFiles);\n await git.commit(title);\n await git.push(\"origin\", branch);\n }\n\n const prUrl = await createPullRequest({\n token,\n owner: owner!,\n repo: repo!,\n title,\n body: \"Generated by Primer VS Code extension.\",\n head: branch,\n base,\n });\n\n const openAction = \"Open in Browser\";\n const action = await vscode.window.showInformationMessage(\n `Primer: Pull request created.`,\n openAction,\n );\n if (action === openAction && prUrl.startsWith(\"https://\")) {\n vscode.env.openExternal(vscode.Uri.parse(prUrl));\n }\n } catch (err) {\n vscode.window.showErrorMessage(`Primer: PR creation failed \u2014 ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n );\n}\n", "import * as vscode from \"vscode\";\n\n/**\n * Acquires a GitHub token via VS Code's built-in authentication provider.\n * Used by SDK-dependent services (instructions, eval) and Octokit (PR creation).\n */\nexport async function getGitHubToken(): Promise {\n const session = await vscode.authentication.getSession(\"github\", [\"repo\"], {\n createIfNone: true,\n });\n return session.accessToken;\n}\n", "const cache = new WeakMap();\n\nexport function pathspec(...paths: string[]) {\n const key = new String(paths);\n cache.set(key, paths);\n\n return key as string;\n}\n\nexport function isPathSpec(path: string | unknown): path is string {\n return path instanceof String && cache.has(path);\n}\n\nexport function toPaths(pathSpec: string): string[] {\n return cache.get(pathSpec) || [];\n}\n", "import type { SimpleGitTask } from '../types';\n\n/**\n * The `GitError` is thrown when the underlying `git` process throws a\n * fatal exception (eg an `ENOENT` exception when attempting to use a\n * non-writable directory as the root for your repo), and acts as the\n * base class for more specific errors thrown by the parsing of the\n * git response or errors in the configuration of the task about to\n * be run.\n *\n * When an exception is thrown, pending tasks in the same instance will\n * not be executed. The recommended way to run a series of tasks that\n * can independently fail without needing to prevent future tasks from\n * running is to catch them individually:\n *\n * ```typescript\n import { gitP, SimpleGit, GitError, PullResult } from 'simple-git';\n\n function catchTask (e: GitError) {\n return e.\n }\n\n const git = gitP(repoWorkingDir);\n const pulled: PullResult | GitError = await git.pull().catch(catchTask);\n const pushed: string | GitError = await git.pushTags().catch(catchTask);\n ```\n */\nexport class GitError extends Error {\n constructor(\n public task?: SimpleGitTask,\n message?: string\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n", "import { GitError } from './git-error';\n\n/**\n * The `GitResponseError` is the wrapper for a parsed response that is treated as\n * a fatal error, for example attempting a `merge` can leave the repo in a corrupted\n * state when there are conflicts so the task will reject rather than resolve.\n *\n * For example, catching the merge conflict exception:\n *\n * ```typescript\n import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git';\n\n const git = gitP(repoRoot);\n const mergeOptions: string[] = ['--no-ff', 'other-branch'];\n const mergeSummary: MergeSummary = await git.merge(mergeOptions)\n .catch((e: GitResponseError) => e.git);\n\n if (mergeSummary.failed) {\n // deal with the error\n }\n ```\n */\nexport class GitResponseError extends GitError {\n constructor(\n /**\n * `.git` access the parsed response that is treated as being an error\n */\n public readonly git: T,\n message?: string\n ) {\n super(undefined, message || String(git));\n }\n}\n", "import { GitError } from './git-error';\n\n/**\n * The `TaskConfigurationError` is thrown when a command was incorrectly\n * configured. An error of this kind means that no attempt was made to\n * run your command through the underlying `git` binary.\n *\n * Check the `.message` property for more detail on why your configuration\n * resulted in an error.\n */\nexport class TaskConfigurationError extends GitError {\n constructor(message?: string) {\n super(undefined, message);\n }\n}\n", "import { Buffer } from 'node:buffer';\nimport { exists, FOLDER } from '@kwsites/file-exists';\nimport type { Maybe } from '../types';\nimport { filterHasLength } from './argument-filters';\n\ntype Callable = (...args: unknown[]) => unknown;\n\nexport const NULL = '\\0';\n\nexport const NOOP: Callable = () => {};\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function asFunction(source: T | unknown): Callable {\n if (typeof source !== 'function') {\n return NOOP;\n }\n return source as Callable;\n}\n\n/**\n * Determines whether the supplied argument is both a function, and is not\n * the `NOOP` function.\n */\nexport function isUserFunction(source: T | unknown): source is T {\n return typeof source === 'function' && source !== NOOP;\n}\n\nexport function splitOn(input: string, char: string): [string, string] {\n const index = input.indexOf(char);\n if (index <= 0) {\n return [input, ''];\n }\n\n return [input.substr(0, index), input.substr(index + 1)];\n}\n\nexport function first(input: T, offset?: number): Maybe;\nexport function first(input: T, offset?: number): Maybe;\nexport function first(input: unknown[] | IArguments, offset = 0): Maybe {\n return isArrayLike(input) && input.length > offset ? input[offset] : undefined;\n}\n\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: T, offset?: number): Maybe;\nexport function last(input: unknown, offset = 0) {\n if (isArrayLike(input) && input.length > offset) {\n return input[input.length - 1 - offset];\n }\n}\n\ntype ArrayLike = T[] | IArguments | { [index: number]: T; length: number };\n\nfunction isArrayLike(input: unknown): input is ArrayLike {\n return filterHasLength(input);\n}\n\nexport function toLinesWithContent(input = '', trimmed = true, separator = '\\n'): string[] {\n return input.split(separator).reduce((output, line) => {\n const lineContent = trimmed ? line.trim() : line;\n if (lineContent) {\n output.push(lineContent);\n }\n return output;\n }, [] as string[]);\n}\n\ntype LineWithContentCallback = (line: string) => T;\n\nexport function forEachLineWithContent(\n input: string,\n callback: LineWithContentCallback\n): T[] {\n return toLinesWithContent(input, true).map((line) => callback(line));\n}\n\nexport function folderExists(path: string): boolean {\n return exists(path, FOLDER);\n}\n\n/**\n * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`.\n */\nexport function append(target: T[] | Set, item: T): typeof item {\n if (Array.isArray(target)) {\n if (!target.includes(item)) {\n target.push(item);\n }\n } else {\n target.add(item);\n }\n return item;\n}\n\n/**\n * Adds `item` into the `target` `Array` when it is not already present and returns the `target`.\n */\nexport function including(target: T[], item: T): typeof target {\n if (Array.isArray(target) && !target.includes(item)) {\n target.push(item);\n }\n\n return target;\n}\n\nexport function remove(target: Set | T[], item: T): T {\n if (Array.isArray(target)) {\n const index = target.indexOf(item);\n if (index >= 0) {\n target.splice(index, 1);\n }\n } else {\n target.delete(item);\n }\n return item;\n}\n\nexport const objectToString = Object.prototype.toString.call.bind(Object.prototype.toString) as (\n input: unknown\n) => string;\n\nexport function asArray(source: T | T[]): T[] {\n return Array.isArray(source) ? source : [source];\n}\n\nexport function asCamelCase(str: string) {\n return str.replace(/[\\s-]+(.)/g, (_all, chr) => {\n return chr.toUpperCase();\n });\n}\n\nexport function asStringArray(source: T | T[]): string[] {\n return asArray(source).map((item) => {\n return item instanceof String ? (item as string) : String(item);\n });\n}\n\nexport function asNumber(source: string | null | undefined, onNaN = 0) {\n if (source == null) {\n return onNaN;\n }\n\n const num = parseInt(source, 10);\n return Number.isNaN(num) ? onNaN : num;\n}\n\nexport function prefixedArray(input: T[], prefix: T): T[] {\n const output: T[] = [];\n for (let i = 0, max = input.length; i < max; i++) {\n output.push(prefix, input[i]);\n }\n return output;\n}\n\nexport function bufferToString(input: Buffer | Buffer[]): string {\n return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8');\n}\n\n/**\n * Get a new object from a source object with only the listed properties.\n */\nexport function pick(source: T, properties: readonly K[]) {\n const out: Partial> = {};\n\n properties.forEach((key) => {\n if (source[key] !== undefined) {\n out[key] = source[key];\n }\n });\n\n return out;\n}\n\nexport function delay(duration = 0): Promise {\n return new Promise((done) => setTimeout(done, duration));\n}\n\nexport function orVoid(input: T | false) {\n if (input === false) {\n return undefined;\n }\n return input;\n}\n", "import { isPathSpec } from '../args/pathspec';\nimport type { Maybe, Options, Primitives } from '../types';\nimport { objectToString } from './util';\n\nexport type ArgumentFilterPredicate = (input: T | unknown) => input is T;\n\nexport function filterType(\n input: K,\n filter: ArgumentFilterPredicate\n): K extends T ? T : undefined;\nexport function filterType(input: K, filter: ArgumentFilterPredicate, def: T): T;\nexport function filterType(input: K, filter: ArgumentFilterPredicate, def?: T): Maybe {\n if (filter(input)) {\n return input;\n }\n return arguments.length > 2 ? def : undefined;\n}\n\nexport const filterArray: ArgumentFilterPredicate> = (\n input\n): input is Array => {\n return Array.isArray(input);\n};\n\nexport function filterPrimitives(\n input: unknown,\n omit?: Array<'boolean' | 'string' | 'number'>\n): input is Primitives {\n const type = isPathSpec(input) ? 'string' : typeof input;\n\n return (\n /number|string|boolean/.test(type) &&\n (!omit || !omit.includes(type as 'boolean' | 'string' | 'number'))\n );\n}\n\nexport const filterNumber: ArgumentFilterPredicate = (input: unknown): input is number => {\n return typeof input === 'number';\n};\n\nexport const filterString: ArgumentFilterPredicate = (input: unknown): input is string => {\n return typeof input === 'string';\n};\n\nexport const filterStringOrStringArray: ArgumentFilterPredicate = (\n input\n): input is string | string[] => {\n return filterString(input) || (Array.isArray(input) && input.every(filterString));\n};\n\nexport function filterPlainObject(input: T | unknown): input is T;\nexport function filterPlainObject>(\n input: T | unknown\n): input is T {\n return !!input && objectToString(input) === '[object Object]';\n}\n\nexport function filterFunction(input: unknown): input is (...args: unknown[]) => unknown {\n return typeof input === 'function';\n}\n\nexport const filterHasLength: ArgumentFilterPredicate<{ length: number }> = (\n input\n): input is { length: number } => {\n if (input == null || 'number|boolean|function'.includes(typeof input)) {\n return false;\n }\n\n return typeof (input as { length?: number }).length === 'number';\n};\n", "/**\n * Known process exit codes used by the task parsers to determine whether an error\n * was one they can automatically handle\n */\nexport enum ExitCodes {\n SUCCESS,\n ERROR,\n NOT_FOUND = -2,\n UNCLEAN = 128,\n}\n", "import { TaskResponseFormat } from '../types';\n\nexport class GitOutputStreams {\n constructor(\n public readonly stdOut: T,\n public readonly stdErr: T\n ) {}\n\n asStrings(): GitOutputStreams {\n return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8'));\n }\n}\n", "function useMatchesDefault() {\n throw new Error(`LineParser:useMatches not implemented`);\n}\n\nexport class LineParser {\n protected matches: string[] = [];\n protected useMatches: (target: T, match: string[]) => boolean | void = useMatchesDefault;\n\n private _regExp: RegExp[];\n\n constructor(\n regExp: RegExp | RegExp[],\n useMatches?: (target: T, match: string[]) => boolean | void\n ) {\n this._regExp = Array.isArray(regExp) ? regExp : [regExp];\n if (useMatches) {\n this.useMatches = useMatches;\n }\n }\n\n parse = (line: (offset: number) => string | undefined, target: T): boolean => {\n this.resetMatches();\n\n if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) {\n return false;\n }\n\n return this.useMatches(target, this.prepareMatches()) !== false;\n };\n\n protected resetMatches() {\n this.matches.length = 0;\n }\n\n protected prepareMatches() {\n return this.matches;\n }\n\n protected addMatch(reg: RegExp, index: number, line?: string) {\n const matched = line && reg.exec(line);\n if (matched) {\n this.pushMatch(index, matched);\n }\n\n return !!matched;\n }\n\n protected pushMatch(_index: number, matched: string[]) {\n this.matches.push(...matched.slice(1));\n }\n}\n\nexport class RemoteLineParser extends LineParser {\n protected addMatch(reg: RegExp, index: number, line?: string): boolean {\n return /^remote:\\s/.test(String(line)) && super.addMatch(reg, index, line);\n }\n\n protected pushMatch(index: number, matched: string[]) {\n if (index > 0 || matched.length > 1) {\n super.pushMatch(index, matched);\n }\n }\n}\n", "import { SimpleGitOptions } from '../types';\n\nconst defaultOptions: Omit = {\n binary: 'git',\n maxConcurrentProcesses: 5,\n config: [],\n trimmed: false,\n};\n\nexport function createInstanceConfig(\n ...options: Array | undefined>\n): SimpleGitOptions {\n const baseDir = process.cwd();\n const config: SimpleGitOptions = Object.assign(\n { baseDir, ...defaultOptions },\n ...options.filter((o) => typeof o === 'object' && o)\n );\n\n config.baseDir = config.baseDir || baseDir;\n config.trimmed = config.trimmed === true;\n\n return config;\n}\n", "import {\n filterArray,\n filterFunction,\n filterPlainObject,\n filterPrimitives,\n filterType,\n} from './argument-filters';\nimport { asFunction, asStringArray, isUserFunction, last } from './util';\nimport { Maybe, Options } from '../types';\nimport { isPathSpec } from '../args/pathspec';\n\nexport function appendTaskOptions(\n options: Maybe,\n commands: string[] = []\n): string[] {\n if (!filterPlainObject(options)) {\n return commands;\n }\n\n return Object.keys(options).reduce((commands: string[], key: string) => {\n const value = options[key];\n\n if (isPathSpec(value)) {\n commands.push(value);\n } else if (filterPrimitives(value, ['boolean'])) {\n commands.push(key + '=' + value);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n if (!filterPrimitives(v, ['string', 'number'])) {\n commands.push(key + '=' + v);\n }\n }\n } else {\n commands.push(key);\n }\n\n return commands;\n }, commands);\n}\n\nexport function getTrailingOptions(\n args: IArguments,\n initialPrimitive = 0,\n objectOnly = false\n): string[] {\n const command: string[] = [];\n\n for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) {\n if ('string|number'.includes(typeof args[i])) {\n command.push(String(args[i]));\n }\n }\n\n appendTaskOptions(trailingOptionsArgument(args), command);\n if (!objectOnly) {\n command.push(...trailingArrayArgument(args));\n }\n\n return command;\n}\n\nfunction trailingArrayArgument(args: IArguments) {\n const hasTrailingCallback = typeof last(args) === 'function';\n return asStringArray(filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, []));\n}\n\n/**\n * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument\n * if there is one. When not found, the return value is null.\n */\nexport function trailingOptionsArgument(args: IArguments): Maybe {\n const hasTrailingCallback = filterFunction(last(args));\n return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject);\n}\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function trailingFunctionArgument(\n args: unknown[] | IArguments | unknown,\n includeNoop = true\n): Maybe<(...args: unknown[]) => unknown> {\n const callback = asFunction(last(args));\n return includeNoop || isUserFunction(callback) ? callback : undefined;\n}\n", "import type { MaybeArray, TaskParser, TaskResponseFormat } from '../types';\nimport { GitOutputStreams } from './git-output-streams';\nimport { LineParser } from './line-parser';\nimport { asArray, toLinesWithContent } from './util';\n\nexport function callTaskParser(\n parser: TaskParser,\n streams: GitOutputStreams\n) {\n return parser(streams.stdOut, streams.stdErr);\n}\n\nexport function parseStringResponse(\n result: T,\n parsers: LineParser[],\n texts: MaybeArray,\n trim = true\n): T {\n asArray(texts).forEach((text) => {\n for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) {\n const line = (offset = 0) => {\n if (i + offset >= max) {\n return;\n }\n return lines[i + offset];\n };\n\n parsers.some(({ parse }) => parse(line, result));\n }\n });\n\n return result;\n}\n", "export * from './argument-filters';\nexport * from './exit-codes';\nexport * from './git-output-streams';\nexport * from './line-parser';\nexport * from './simple-git-options';\nexport * from './task-options';\nexport * from './task-parser';\nexport * from './util';\n", "import { ExitCodes } from '../utils';\nimport { Maybe, StringTask } from '../types';\n\nexport enum CheckRepoActions {\n BARE = 'bare',\n IN_TREE = 'tree',\n IS_REPO_ROOT = 'root',\n}\n\nconst onError: StringTask['onError'] = ({ exitCode }, error, done, fail) => {\n if (exitCode === ExitCodes.UNCLEAN && isNotRepoMessage(error)) {\n return done(Buffer.from('false'));\n }\n\n fail(error);\n};\n\nconst parser: StringTask['parser'] = (text) => {\n return text.trim() === 'true';\n};\n\nexport function checkIsRepoTask(action: Maybe): StringTask {\n switch (action) {\n case CheckRepoActions.BARE:\n return checkIsBareRepoTask();\n case CheckRepoActions.IS_REPO_ROOT:\n return checkIsRepoRootTask();\n }\n\n const commands = ['rev-parse', '--is-inside-work-tree'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nexport function checkIsRepoRootTask(): StringTask {\n const commands = ['rev-parse', '--git-dir'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser(path) {\n return /^\\.(git)?$/.test(path.trim());\n },\n };\n}\n\nexport function checkIsBareRepoTask(): StringTask {\n const commands = ['rev-parse', '--is-bare-repository'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nfunction isNotRepoMessage(error: Error): boolean {\n return /(Not a git repository|Kein Git-Repository)/i.test(String(error));\n}\n", "import { CleanSummary } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\n\nexport class CleanResponse implements CleanSummary {\n public paths: string[] = [];\n public files: string[] = [];\n public folders: string[] = [];\n\n constructor(public readonly dryRun: boolean) {}\n}\n\nconst removalRegexp = /^[a-z]+\\s*/i;\nconst dryRunRemovalRegexp = /^[a-z]+\\s+[a-z]+\\s*/i;\nconst isFolderRegexp = /\\/$/;\n\nexport function cleanSummaryParser(dryRun: boolean, text: string): CleanSummary {\n const summary = new CleanResponse(dryRun);\n const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp;\n\n toLinesWithContent(text).forEach((line) => {\n const removed = line.replace(regexp, '');\n\n summary.paths.push(removed);\n (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed);\n });\n\n return summary;\n}\n", "import { TaskConfigurationError } from '../errors/task-configuration-error';\nimport type { BufferTask, EmptyTaskParser, SimpleGitTask, StringTask } from '../types';\n\nexport const EMPTY_COMMANDS: [] = [];\n\nexport type EmptyTask = {\n commands: typeof EMPTY_COMMANDS;\n format: 'empty';\n parser: EmptyTaskParser;\n onError?: undefined;\n};\n\nexport function adhocExecTask(parser: EmptyTaskParser): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser,\n };\n}\n\nexport function configurationErrorTask(error: Error | string): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser() {\n throw typeof error === 'string' ? new TaskConfigurationError(error) : error;\n },\n };\n}\n\nexport function straightThroughStringTask(commands: string[], trimmed = false): StringTask {\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return trimmed ? String(text).trim() : text;\n },\n };\n}\n\nexport function straightThroughBufferTask(commands: string[]): BufferTask {\n return {\n commands,\n format: 'buffer',\n parser(buffer) {\n return buffer;\n },\n };\n}\n\nexport function isBufferTask(task: SimpleGitTask): task is BufferTask {\n return task.format === 'buffer';\n}\n\nexport function isEmptyTask(task: SimpleGitTask): task is EmptyTask {\n return task.format === 'empty' || !task.commands.length;\n}\n", "import { CleanSummary } from '../../../typings';\nimport { cleanSummaryParser } from '../responses/CleanSummary';\nimport { Maybe, StringTask } from '../types';\nimport { asStringArray } from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport const CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported';\nexport const CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter (\"n\" or \"f\") is required';\nexport const CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: ';\n\n/**\n * All supported option switches available for use in a `git.clean` operation\n */\nexport enum CleanOptions {\n DRY_RUN = 'n',\n FORCE = 'f',\n IGNORED_INCLUDED = 'x',\n IGNORED_ONLY = 'X',\n EXCLUDING = 'e',\n QUIET = 'q',\n RECURSIVE = 'd',\n}\n\n/**\n * The two modes `git.clean` can run in - one of these must be supplied in order\n * for the command to not throw a `TaskConfigurationError`\n */\nexport type CleanMode = CleanOptions.FORCE | CleanOptions.DRY_RUN;\n\nconst CleanOptionValues: Set = new Set([\n 'i',\n ...asStringArray(Object.values(CleanOptions as any)),\n]);\n\nexport function cleanWithOptionsTask(mode: CleanMode | string, customArgs: string[]) {\n const { cleanMode, options, valid } = getCleanOptions(mode);\n\n if (!cleanMode) {\n return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED);\n }\n\n if (!valid.options) {\n return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode));\n }\n\n options.push(...customArgs);\n\n if (options.some(isInteractiveMode)) {\n return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE);\n }\n\n return cleanTask(cleanMode, options);\n}\n\nexport function cleanTask(mode: CleanMode, customArgs: string[]): StringTask {\n const commands: string[] = ['clean', `-${mode}`, ...customArgs];\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): CleanSummary {\n return cleanSummaryParser(mode === CleanOptions.DRY_RUN, text);\n },\n };\n}\n\nexport function isCleanOptionsArray(input: string[]): input is CleanOptions[] {\n return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test));\n}\n\nfunction getCleanOptions(input: string) {\n let cleanMode: Maybe;\n let options: string[] = [];\n let valid = { cleanMode: false, options: true };\n\n input\n .replace(/[^a-z]i/g, '')\n .split('')\n .forEach((char) => {\n if (isCleanMode(char)) {\n cleanMode = char;\n valid.cleanMode = true;\n } else {\n valid.options = valid.options && isKnownOption((options[options.length] = `-${char}`));\n }\n });\n\n return {\n cleanMode,\n options,\n valid,\n };\n}\n\nfunction isCleanMode(cleanMode?: string): cleanMode is CleanMode {\n return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN;\n}\n\nfunction isKnownOption(option: string): boolean {\n return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1));\n}\n\nfunction isInteractiveMode(option: string): boolean {\n if (/^-[^\\-]/.test(option)) {\n return option.indexOf('i') > 0;\n }\n\n return option === '--interactive';\n}\n", "import { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings';\nimport { last, splitOn } from '../utils';\n\nexport class ConfigList implements ConfigListSummary {\n public files: string[] = [];\n public values: { [fileName: string]: ConfigValues } = Object.create(null);\n\n private _all: ConfigValues | undefined;\n\n public get all(): ConfigValues {\n if (!this._all) {\n this._all = this.files.reduce((all: ConfigValues, file: string) => {\n return Object.assign(all, this.values[file]);\n }, {});\n }\n\n return this._all;\n }\n\n public addFile(file: string): ConfigValues {\n if (!(file in this.values)) {\n const latest = last(this.files);\n this.values[file] = latest ? Object.create(this.values[latest]) : {};\n\n this.files.push(file);\n }\n\n return this.values[file];\n }\n\n public addValue(file: string, key: string, value: string) {\n const values = this.addFile(file);\n\n if (!Object.hasOwn(values, key)) {\n values[key] = value;\n } else if (Array.isArray(values[key])) {\n (values[key] as string[]).push(value);\n } else {\n values[key] = [values[key] as string, value];\n }\n\n this._all = undefined;\n }\n}\n\nexport function configListParser(text: string): ConfigList {\n const config = new ConfigList();\n\n for (const item of configParser(text)) {\n config.addValue(item.file, String(item.key), item.value);\n }\n\n return config;\n}\n\nexport function configGetParser(text: string, key: string): ConfigGetResult {\n let value: string | null = null;\n const values: string[] = [];\n const scopes: Map = new Map();\n\n for (const item of configParser(text, key)) {\n if (item.key !== key) {\n continue;\n }\n\n values.push((value = item.value));\n\n if (!scopes.has(item.file)) {\n scopes.set(item.file, []);\n }\n\n scopes.get(item.file)!.push(value);\n }\n\n return {\n key,\n paths: Array.from(scopes.keys()),\n scopes,\n value,\n values,\n };\n}\n\nfunction configFilePath(filePath: string): string {\n return filePath.replace(/^(file):/, '');\n}\n\nfunction* configParser(text: string, requestedKey: string | null = null) {\n const lines = text.split('\\0');\n\n for (let i = 0, max = lines.length - 1; i < max; ) {\n const file = configFilePath(lines[i++]);\n\n let value = lines[i++];\n let key = requestedKey;\n\n if (value.includes('\\n')) {\n const line = splitOn(value, '\\n');\n key = line[0];\n value = line[1];\n }\n\n yield { file, key, value };\n }\n}\n", "import type { ConfigGetResult, ConfigListSummary, SimpleGit } from '../../../typings';\nimport { configGetParser, configListParser } from '../responses/ConfigList';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { trailingFunctionArgument } from '../utils';\n\nexport enum GitConfigScope {\n system = 'system',\n global = 'global',\n local = 'local',\n worktree = 'worktree',\n}\n\nfunction asConfigScope(\n scope: GitConfigScope | unknown,\n fallback: T\n): GitConfigScope | T {\n if (typeof scope === 'string' && Object.hasOwn(GitConfigScope, scope)) {\n return scope as GitConfigScope;\n }\n return fallback;\n}\n\nfunction addConfigTask(\n key: string,\n value: string,\n append: boolean,\n scope: GitConfigScope\n): StringTask {\n const commands: string[] = ['config', `--${scope}`];\n\n if (append) {\n commands.push('--add');\n }\n\n commands.push(key, value);\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): string {\n return text;\n },\n };\n}\n\nfunction getConfigTask(key: string, scope?: GitConfigScope): StringTask {\n const commands: string[] = ['config', '--null', '--show-origin', '--get-all', key];\n\n if (scope) {\n commands.splice(1, 0, `--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return configGetParser(text, key);\n },\n };\n}\n\nfunction listConfigTask(scope?: GitConfigScope): StringTask {\n const commands = ['config', '--list', '--show-origin', '--null'];\n\n if (scope) {\n commands.push(`--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string) {\n return configListParser(text);\n },\n };\n}\n\nexport default function (): Pick {\n return {\n addConfig(this: SimpleGitApi, key: string, value: string, ...rest: unknown[]) {\n return this._runTask(\n addConfigTask(\n key,\n value,\n rest[0] === true,\n asConfigScope(rest[1], GitConfigScope.local)\n ),\n trailingFunctionArgument(arguments)\n );\n },\n\n getConfig(this: SimpleGitApi, key: string, scope?: GitConfigScope) {\n return this._runTask(\n getConfigTask(key, asConfigScope(scope, undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n\n listConfig(this: SimpleGitApi, ...rest: unknown[]) {\n return this._runTask(\n listConfigTask(asConfigScope(rest[0], undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "export enum DiffNameStatus {\n ADDED = 'A',\n COPIED = 'C',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n CHANGED = 'T',\n UNMERGED = 'U',\n UNKNOWN = 'X',\n BROKEN = 'B',\n}\n\nconst diffNameStatus = new Set(Object.values(DiffNameStatus));\n\nexport function isDiffNameStatus(input: string): input is DiffNameStatus {\n return diffNameStatus.has(input as DiffNameStatus);\n}\n", "import { GrepResult, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport {\n asNumber,\n forEachLineWithContent,\n getTrailingOptions,\n NULL,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\n\nimport { configurationErrorTask } from './task';\n\nconst disallowedOptions = ['-h'];\n\nconst Query = Symbol('grepQuery');\n\nexport interface GitGrepQuery extends Iterable {\n /** Adds one or more terms to be grouped as an \"and\" to any other terms */\n and(...and: string[]): this;\n\n /** Adds one or more search terms - git.grep will \"or\" this to other terms */\n param(...param: string[]): this;\n}\n\nclass GrepQuery implements GitGrepQuery {\n private [Query]: string[] = [];\n\n *[Symbol.iterator]() {\n for (const query of this[Query]) {\n yield query;\n }\n }\n\n and(...and: string[]) {\n and.length && this[Query].push('--and', '(', ...prefixedArray(and, '-e'), ')');\n return this;\n }\n\n param(...param: string[]) {\n this[Query].push(...prefixedArray(param, '-e'));\n return this;\n }\n}\n\n/**\n * Creates a new builder for a `git.grep` query with optional params\n */\nexport function grepQueryBuilder(...params: string[]): GitGrepQuery {\n return new GrepQuery().param(...params);\n}\n\nfunction parseGrep(grep: string): GrepResult {\n const paths: GrepResult['paths'] = new Set();\n const results: GrepResult['results'] = {};\n\n forEachLineWithContent(grep, (input) => {\n const [path, line, preview] = input.split(NULL);\n paths.add(path);\n (results[path] = results[path] || []).push({\n line: asNumber(line),\n path,\n preview,\n });\n });\n\n return {\n paths,\n results,\n };\n}\n\nexport default function (): Pick {\n return {\n grep(this: SimpleGitApi, searchTerm: string | GitGrepQuery) {\n const then = trailingFunctionArgument(arguments);\n const options = getTrailingOptions(arguments);\n\n for (const option of disallowedOptions) {\n if (options.includes(option)) {\n return this._runTask(\n configurationErrorTask(`git.grep: use of \"${option}\" is not supported.`),\n then\n );\n }\n }\n\n if (typeof searchTerm === 'string') {\n searchTerm = grepQueryBuilder().param(searchTerm);\n }\n\n const commands = ['grep', '--null', '-n', '--full-name', ...options, ...searchTerm];\n\n return this._runTask(\n {\n commands,\n format: 'utf-8',\n parser(stdOut) {\n return parseGrep(stdOut);\n },\n },\n then\n );\n },\n };\n}\n", "import type { Maybe, OptionFlags, Options } from '../types';\nimport { asStringArray } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport enum ResetMode {\n MIXED = 'mixed',\n SOFT = 'soft',\n HARD = 'hard',\n MERGE = 'merge',\n KEEP = 'keep',\n}\n\nconst validResetModes = asStringArray(Object.values(ResetMode));\n\nexport type ResetOptions = Options &\n OptionFlags<'-q' | '--quiet' | '--no-quiet' | '--pathspec-from-nul'> &\n OptionFlags<'--pathspec-from-file', string>;\n\nexport function resetTask(mode: Maybe, customArgs: string[]) {\n const commands: string[] = ['reset'];\n if (isValidResetMode(mode)) {\n commands.push(`--${mode}`);\n }\n commands.push(...customArgs);\n\n return straightThroughStringTask(commands);\n}\n\nexport function getResetMode(mode: ResetMode | unknown): Maybe {\n if (isValidResetMode(mode)) {\n return mode;\n }\n\n switch (typeof mode) {\n case 'string':\n case 'undefined':\n return ResetMode.SOFT;\n }\n\n return;\n}\n\nfunction isValidResetMode(mode: ResetMode | unknown): mode is ResetMode {\n return typeof mode === 'string' && validResetModes.includes(mode);\n}\n", "import debug, { Debugger } from 'debug';\nimport {\n append,\n filterHasLength,\n filterString,\n filterType,\n NOOP,\n objectToString,\n remove,\n} from './utils';\nimport { Maybe } from './types';\n\ndebug.formatters.L = (value: any) => String(filterHasLength(value) ? value.length : '-');\ndebug.formatters.B = (value: Buffer) => {\n if (Buffer.isBuffer(value)) {\n return value.toString('utf8');\n }\n return objectToString(value);\n};\n\ntype OutputLoggingHandler = (message: string, ...args: any[]) => void;\n\nfunction createLog() {\n return debug('simple-git');\n}\n\nexport interface OutputLogger extends OutputLoggingHandler {\n readonly label: string;\n\n info: OutputLoggingHandler;\n step(nextStep?: string): OutputLogger;\n sibling(name: string): OutputLogger;\n}\n\nfunction prefixedLogger(\n to: Debugger,\n prefix: string,\n forward?: OutputLoggingHandler\n): OutputLoggingHandler {\n if (!prefix || !String(prefix).replace(/\\s*/, '')) {\n return !forward\n ? to\n : (message, ...args) => {\n to(message, ...args);\n forward(message, ...args);\n };\n }\n\n return (message, ...args) => {\n to(`%s ${message}`, prefix, ...args);\n if (forward) {\n forward(message, ...args);\n }\n };\n}\n\nfunction childLoggerName(\n name: Maybe,\n childDebugger: Maybe,\n { namespace: parentNamespace }: Debugger\n): string {\n if (typeof name === 'string') {\n return name;\n }\n const childNamespace = (childDebugger && childDebugger.namespace) || '';\n\n if (childNamespace.startsWith(parentNamespace)) {\n return childNamespace.substr(parentNamespace.length + 1);\n }\n\n return childNamespace || parentNamespace;\n}\n\nexport function createLogger(\n label: string,\n verbose?: string | Debugger,\n initialStep?: string,\n infoDebugger = createLog()\n): OutputLogger {\n const labelPrefix = (label && `[${label}]`) || '';\n\n const spawned: OutputLogger[] = [];\n const debugDebugger: Maybe =\n typeof verbose === 'string' ? infoDebugger.extend(verbose) : verbose;\n const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger);\n\n return step(initialStep);\n\n function sibling(name: string, initial?: string) {\n return append(\n spawned,\n createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)\n );\n }\n\n function step(phase?: string) {\n const stepPrefix = (phase && `[${phase}]`) || '';\n const debug = (debugDebugger && prefixedLogger(debugDebugger, stepPrefix)) || NOOP;\n const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug);\n\n return Object.assign(debugDebugger ? debug : info, {\n label,\n sibling,\n info,\n step,\n });\n }\n}\n\n/**\n * The `GitLogger` is used by the main `SimpleGit` runner to handle logging\n * any warnings or errors.\n */\nexport class GitLogger {\n public error: OutputLoggingHandler;\n\n public warn: OutputLoggingHandler;\n\n constructor(private _out: Debugger = createLog()) {\n this.error = prefixedLogger(_out, '[ERROR]');\n this.warn = prefixedLogger(_out, '[WARN]');\n }\n\n silent(silence = false) {\n if (silence !== this._out.enabled) {\n return;\n }\n\n const { namespace } = this._out;\n const env = (process.env.DEBUG || '').split(',').filter((s) => !!s);\n const hasOn = env.includes(namespace);\n const hasOff = env.includes(`-${namespace}`);\n\n // enabling the log\n if (!silence) {\n if (hasOff) {\n remove(env, `-${namespace}`);\n } else {\n env.push(namespace);\n }\n } else {\n if (hasOn) {\n remove(env, namespace);\n } else {\n env.push(`-${namespace}`);\n }\n }\n\n debug.enable(env.join(','));\n }\n}\n", "import { SimpleGitTask } from '../types';\nimport { GitError } from '../errors/git-error';\nimport { createLogger, OutputLogger } from '../git-logger';\n\ntype AnySimpleGitTask = SimpleGitTask;\n\ntype TaskInProgress = {\n name: string;\n logger: OutputLogger;\n task: AnySimpleGitTask;\n};\n\nexport class TasksPendingQueue {\n private _queue: Map = new Map();\n\n constructor(private logLabel = 'GitExecutor') {}\n\n private withProgress(task: AnySimpleGitTask) {\n return this._queue.get(task);\n }\n\n private createProgress(task: AnySimpleGitTask): TaskInProgress {\n const name = TasksPendingQueue.getName(task.commands[0]);\n const logger = createLogger(this.logLabel, name);\n\n return {\n task,\n logger,\n name,\n };\n }\n\n push(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.createProgress(task);\n progress.logger('Adding task to the queue, commands = %o', task.commands);\n\n this._queue.set(task, progress);\n\n return progress;\n }\n\n fatal(err: GitError) {\n for (const [task, { logger }] of Array.from(this._queue.entries())) {\n if (task === err.task) {\n logger.info(`Failed %o`, err);\n logger(\n `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`\n );\n } else {\n logger.info(\n `A fatal exception occurred in a previous task, the queue has been purged: %o`,\n err.message\n );\n }\n\n this.complete(task);\n }\n\n if (this._queue.size !== 0) {\n throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`);\n }\n }\n\n complete(task: AnySimpleGitTask) {\n const progress = this.withProgress(task);\n if (progress) {\n this._queue.delete(task);\n }\n }\n\n attempt(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.withProgress(task);\n if (!progress) {\n throw new GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task');\n }\n progress.logger('Starting task');\n\n return progress;\n }\n\n static getName(name = 'empty') {\n return `task:${name}:${++TasksPendingQueue.counter}`;\n }\n\n private static counter = 0;\n}\n", "import { spawn, SpawnOptions } from 'child_process';\nimport { GitError } from '../errors/git-error';\nimport { OutputLogger } from '../git-logger';\nimport { PluginStore } from '../plugins';\nimport { EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task';\nimport {\n GitExecutorResult,\n Maybe,\n outputHandler,\n RunnableTask,\n SimpleGitExecutor,\n SimpleGitTask,\n} from '../types';\nimport { callTaskParser, first, GitOutputStreams, objectToString } from '../utils';\nimport { Scheduler } from './scheduler';\nimport { TasksPendingQueue } from './tasks-pending-queue';\n\nexport class GitExecutorChain implements SimpleGitExecutor {\n private _chain: Promise = Promise.resolve();\n private _queue = new TasksPendingQueue();\n private _cwd: string | undefined;\n\n public get cwd() {\n return this._cwd || this._executor.cwd;\n }\n\n public set cwd(cwd: string) {\n this._cwd = cwd;\n }\n\n public get env() {\n return this._executor.env;\n }\n\n public get outputHandler() {\n return this._executor.outputHandler;\n }\n\n constructor(\n private _executor: SimpleGitExecutor,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n public chain() {\n return this;\n }\n\n public push(task: SimpleGitTask): Promise {\n this._queue.push(task);\n\n return (this._chain = this._chain.then(() => this.attemptTask(task)));\n }\n\n private async attemptTask(task: SimpleGitTask): Promise {\n const onScheduleComplete = await this._scheduler.next();\n const onQueueComplete = () => this._queue.complete(task);\n\n try {\n const { logger } = this._queue.attempt(task);\n return (await (isEmptyTask(task)\n ? this.attemptEmptyTask(task, logger)\n : this.attemptRemoteTask(task, logger))) as R;\n } catch (e) {\n throw this.onFatalException(task, e as Error);\n } finally {\n onQueueComplete();\n onScheduleComplete();\n }\n }\n\n private onFatalException(task: SimpleGitTask, e: Error) {\n const gitError =\n e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e));\n\n this._chain = Promise.resolve();\n this._queue.fatal(gitError);\n\n return gitError;\n }\n\n private async attemptRemoteTask(task: RunnableTask, logger: OutputLogger) {\n const binary = this._plugins.exec('spawn.binary', '', pluginContext(task, task.commands));\n const args = this._plugins.exec(\n 'spawn.args',\n [...task.commands],\n pluginContext(task, task.commands)\n );\n\n const raw = await this.gitResponse(\n task,\n binary,\n args,\n this.outputHandler,\n logger.step('SPAWN')\n );\n const outputStreams = await this.handleTaskData(task, args, raw, logger.step('HANDLE'));\n\n logger(`passing response to task's parser as a %s`, task.format);\n\n if (isBufferTask(task)) {\n return callTaskParser(task.parser, outputStreams);\n }\n\n return callTaskParser(task.parser, outputStreams.asStrings());\n }\n\n private async attemptEmptyTask(task: EmptyTask, logger: OutputLogger) {\n logger(`empty task bypassing child process to call to task's parser`);\n return task.parser(this);\n }\n\n private handleTaskData(\n task: SimpleGitTask,\n args: string[],\n result: GitExecutorResult,\n logger: OutputLogger\n ): Promise {\n const { exitCode, rejection, stdOut, stdErr } = result;\n\n return new Promise((done, fail) => {\n logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode);\n\n const { error } = this._plugins.exec(\n 'task.error',\n { error: rejection },\n {\n ...pluginContext(task, args),\n ...result,\n }\n );\n\n if (error && task.onError) {\n logger.info(`exitCode=%s handling with custom error handler`);\n\n return task.onError(\n result,\n error,\n (newStdOut) => {\n logger.info(`custom error handler treated as success`);\n logger(`custom error returned a %s`, objectToString(newStdOut));\n\n done(\n new GitOutputStreams(\n Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut,\n Buffer.concat(stdErr)\n )\n );\n },\n fail\n );\n }\n\n if (error) {\n logger.info(\n `handling as error: exitCode=%s stdErr=%s rejection=%o`,\n exitCode,\n stdErr.length,\n rejection\n );\n return fail(error);\n }\n\n logger.info(`retrieving task output complete`);\n done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr)));\n });\n }\n\n private async gitResponse(\n task: SimpleGitTask,\n command: string,\n args: string[],\n outputHandler: Maybe,\n logger: OutputLogger\n ): Promise {\n const outputLogger = logger.sibling('output');\n const spawnOptions: SpawnOptions = this._plugins.exec(\n 'spawn.options',\n {\n cwd: this.cwd,\n env: this.env,\n windowsHide: true,\n },\n pluginContext(task, task.commands)\n );\n\n return new Promise((done) => {\n const stdOut: Buffer[] = [];\n const stdErr: Buffer[] = [];\n\n logger.info(`%s %o`, command, args);\n logger('%O', spawnOptions);\n\n let rejection = this._beforeSpawn(task, args);\n if (rejection) {\n return done({\n stdOut,\n stdErr,\n exitCode: 9901,\n rejection,\n });\n }\n\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n const spawned = spawn(command, args, spawnOptions);\n\n spawned.stdout!.on(\n 'data',\n onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))\n );\n spawned.stderr!.on(\n 'data',\n onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))\n );\n\n spawned.on('error', onErrorReceived(stdErr, logger));\n\n if (outputHandler) {\n logger(`Passing child process stdOut/stdErr to custom outputHandler`);\n outputHandler(command, spawned.stdout!, spawned.stderr!, [...args]);\n }\n\n this._plugins.exec('spawn.after', undefined, {\n ...pluginContext(task, args),\n spawned,\n close(exitCode: number, reason?: Error) {\n done({\n stdOut,\n stdErr,\n exitCode,\n rejection: rejection || reason,\n });\n },\n kill(reason: Error) {\n if (spawned.killed) {\n return;\n }\n\n rejection = reason;\n spawned.kill('SIGINT');\n },\n });\n });\n }\n\n private _beforeSpawn(task: SimpleGitTask, args: string[]) {\n let rejection: Maybe;\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n return rejection;\n }\n}\n\nfunction pluginContext(task: SimpleGitTask, commands: string[]) {\n return {\n method: first(task.commands) || '',\n commands,\n };\n}\n\nfunction onErrorReceived(target: Buffer[], logger: OutputLogger) {\n return (err: Error) => {\n logger(`[ERROR] child process exception %o`, err);\n target.push(Buffer.from(String(err.stack), 'ascii'));\n };\n}\n\nfunction onDataReceived(\n target: Buffer[],\n name: string,\n logger: OutputLogger,\n output: OutputLogger\n) {\n return (buffer: Buffer) => {\n logger(`%s received %L bytes`, name, buffer);\n output(`%B`, buffer);\n target.push(buffer);\n };\n}\n", "import type { PluginStore } from '../plugins';\nimport type { GitExecutorEnv, outputHandler, SimpleGitExecutor, SimpleGitTask } from '../types';\n\nimport { GitExecutorChain } from './git-executor-chain';\nimport { Scheduler } from './scheduler';\n\nexport class GitExecutor implements SimpleGitExecutor {\n private _chain = new GitExecutorChain(this, this._scheduler, this._plugins);\n\n public env: GitExecutorEnv;\n public outputHandler?: outputHandler;\n\n constructor(\n public cwd: string,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n chain(): SimpleGitExecutor {\n return new GitExecutorChain(this, this._scheduler, this._plugins);\n }\n\n push(task: SimpleGitTask): Promise {\n return this._chain.push(task);\n }\n}\n", "import { GitError } from './errors/git-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport { NOOP } from './utils';\n\nexport function taskCallback(\n task: SimpleGitTask,\n response: Promise,\n callback: SimpleGitTaskCallback = NOOP\n) {\n const onSuccess = (data: R) => {\n callback(null, data);\n };\n\n const onError = (err: GitError | GitResponseError) => {\n if (err?.task === task) {\n callback(\n err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err,\n undefined as any\n );\n }\n };\n\n response.then(onSuccess, onError);\n}\n\nfunction addDeprecationNoticeToError(err: GitResponseError) {\n let log = (name: string) => {\n console.warn(\n `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`\n );\n log = NOOP;\n };\n\n return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {}));\n\n function descriptorReducer(all: PropertyDescriptorMap, name: string): typeof all {\n if (name in err) {\n return all;\n }\n\n all[name] = {\n enumerable: false,\n configurable: false,\n get() {\n log(name);\n return err.git[name];\n },\n };\n\n return all;\n }\n}\n", "import { folderExists } from '../utils';\nimport { SimpleGitExecutor } from '../types';\nimport { adhocExecTask } from './task';\n\nexport function changeWorkingDirectoryTask(directory: string, root?: SimpleGitExecutor) {\n return adhocExecTask((instance: SimpleGitExecutor) => {\n if (!folderExists(directory)) {\n throw new Error(`Git.cwd: cannot change to non-directory \"${directory}\"`);\n }\n\n return ((root || instance).cwd = directory);\n });\n}\n", "import type { SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, remove, trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nfunction checkoutTask(args: string[]) {\n const commands = ['checkout', ...args];\n if (commands[1] === '-b' && commands.includes('-B')) {\n commands[1] = remove(commands, '-B');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport default function (): Pick {\n return {\n checkout(this: SimpleGitApi) {\n return this._runTask(\n checkoutTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutBranch(this: SimpleGitApi, branchName, startPoint) {\n return this._runTask(\n checkoutTask(['-b', branchName, startPoint, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutLocalBranch(this: SimpleGitApi, branchName) {\n return this._runTask(\n checkoutTask(['-b', branchName, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asCamelCase, asNumber, LineParser, parseStringResponse } from '../utils';\n\nexport interface CountObjectsResult {\n count: number;\n size: number;\n inPack: number;\n packs: number;\n sizePack: number;\n prunePackable: number;\n garbage: number;\n sizeGarbage: number;\n}\n\nfunction countObjectsResponse(): CountObjectsResult {\n return {\n count: 0,\n garbage: 0,\n inPack: 0,\n packs: 0,\n prunePackable: 0,\n size: 0,\n sizeGarbage: 0,\n sizePack: 0,\n };\n}\n\nconst parser: LineParser = new LineParser(\n /([a-z-]+): (\\d+)$/,\n (result, [key, value]) => {\n const property = asCamelCase(key);\n if (Object.hasOwn(result, property)) {\n result[property as keyof typeof result] = asNumber(value);\n }\n }\n);\n\nexport default function (): Pick {\n return {\n countObjects(this: SimpleGitApi) {\n return this._runTask({\n commands: ['count-objects', '--verbose'],\n format: 'utf-8',\n parser(stdOut: string) {\n return parseStringResponse(countObjectsResponse(), [parser], stdOut);\n },\n });\n },\n };\n}\n", "import { CommitResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/^\\[([^\\s]+)( \\([^)]+\\))? ([^\\]]+)/, (result, [branch, root, commit]) => {\n result.branch = branch;\n result.commit = commit;\n result.root = !!root;\n }),\n new LineParser(/\\s*Author:\\s(.+)/i, (result, [author]) => {\n const parts = author.split('<');\n const email = parts.pop();\n\n if (!email || !email.includes('@')) {\n return;\n }\n\n result.author = {\n email: email.substr(0, email.length - 1),\n name: parts.join('<').trim(),\n };\n }),\n new LineParser(\n /(\\d+)[^,]*(?:,\\s*(\\d+)[^,]*)(?:,\\s*(\\d+))/g,\n (result, [changes, insertions, deletions]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n result.summary.insertions = parseInt(insertions, 10) || 0;\n result.summary.deletions = parseInt(deletions, 10) || 0;\n }\n ),\n new LineParser(\n /^(\\d+)[^,]*(?:,\\s*(\\d+)[^(]+\\(([+-]))?/,\n (result, [changes, lines, direction]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n const count = parseInt(lines, 10) || 0;\n if (direction === '-') {\n result.summary.deletions = count;\n } else if (direction === '+') {\n result.summary.insertions = count;\n }\n }\n ),\n];\n\nexport function parseCommitResult(stdOut: string): CommitResult {\n const result: CommitResult = {\n author: null,\n branch: '',\n commit: '',\n root: false,\n summary: {\n changes: 0,\n insertions: 0,\n deletions: 0,\n },\n };\n return parseStringResponse(result, parsers, stdOut);\n}\n", "import type { CommitResult, SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { parseCommitResult } from '../parsers/parse-commit';\nimport {\n asArray,\n asStringArray,\n filterArray,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport function commitTask(\n message: string[],\n files: string[],\n customArgs: string[]\n): StringTask {\n const commands: string[] = [\n '-c',\n 'core.abbrev=40',\n 'commit',\n ...prefixedArray(message, '-m'),\n ...files,\n ...customArgs,\n ];\n\n return {\n commands,\n format: 'utf-8',\n parser: parseCommitResult,\n };\n}\n\nexport default function (): Pick {\n return {\n commit(this: SimpleGitApi, message: string | string[], ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const task =\n rejectDeprecatedSignatures(message) ||\n commitTask(\n asArray(message),\n asArray(filterType(rest[0], filterStringOrStringArray, [])),\n [\n ...asStringArray(filterType(rest[1], filterArray, [])),\n ...getTrailingOptions(arguments, 0, true),\n ]\n );\n\n return this._runTask(task, next);\n },\n };\n\n function rejectDeprecatedSignatures(message?: unknown) {\n return (\n !filterStringOrStringArray(message) &&\n configurationErrorTask(\n `git.commit: requires the commit message to be supplied as a string/string[]`\n )\n );\n }\n}\n", "import { Response, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport default function (): Pick {\n return {\n firstCommit(this: SimpleGitApi): Response {\n return this._runTask(\n straightThroughStringTask(['rev-list', '--max-parents=0', 'HEAD'], true),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import { straightThroughStringTask } from './task';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.hashObject`\n */\nexport function hashObjectTask(filePath: string, write: boolean): StringTask {\n const commands = ['hash-object', filePath];\n if (write) {\n commands.push('-w');\n }\n\n return straightThroughStringTask(commands, true);\n}\n", "import { InitResult } from '../../../typings';\n\nexport class InitSummary implements InitResult {\n constructor(\n public readonly bare: boolean,\n public readonly path: string,\n public readonly existing: boolean,\n public readonly gitDir: string\n ) {}\n}\n\nconst initResponseRegex = /^Init.+ repository in (.+)$/;\nconst reInitResponseRegex = /^Rein.+ in (.+)$/;\n\nexport function parseInit(bare: boolean, path: string, text: string) {\n const response = String(text).trim();\n let result;\n\n if ((result = initResponseRegex.exec(response))) {\n return new InitSummary(bare, path, false, result[1]);\n }\n\n if ((result = reInitResponseRegex.exec(response))) {\n return new InitSummary(bare, path, true, result[1]);\n }\n\n let gitDir = '';\n const tokens = response.split(' ');\n while (tokens.length) {\n const token = tokens.shift();\n if (token === 'in') {\n gitDir = tokens.join(' ');\n break;\n }\n }\n\n return new InitSummary(bare, path, /^re/i.test(response), gitDir);\n}\n", "import { InitResult } from '../../../typings';\nimport { parseInit } from '../responses/InitSummary';\nimport { StringTask } from '../types';\n\nconst bareCommand = '--bare';\n\nfunction hasBareCommand(command: string[]) {\n return command.includes(bareCommand);\n}\n\nexport function initTask(bare = false, path: string, customArgs: string[]): StringTask {\n const commands = ['init', ...customArgs];\n if (bare && !hasBareCommand(commands)) {\n commands.splice(1, 0, bareCommand);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): InitResult {\n return parseInit(commands.includes('--bare'), path, text);\n },\n };\n}\n", "export enum LogFormat {\n NONE = '',\n STAT = '--stat',\n NUM_STAT = '--numstat',\n NAME_ONLY = '--name-only',\n NAME_STATUS = '--name-status',\n}\n\nconst logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/;\n\nexport function logFormatFromCommand(customArgs: string[]) {\n for (let i = 0; i < customArgs.length; i++) {\n const format = logFormatRegex.exec(customArgs[i]);\n if (format) {\n return `--${format[1]}` as LogFormat;\n }\n }\n\n return LogFormat.NONE;\n}\n\nexport function isLogFormat(customArg: string | unknown) {\n return logFormatRegex.test(customArg as string);\n}\n", "import { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings';\n\n/***\n * The DiffSummary is returned as a response to getting `git().status()`\n */\nexport class DiffSummary implements DiffResult {\n changed = 0;\n deletions = 0;\n insertions = 0;\n\n files: Array = [];\n}\n", "import { DiffResult } from '../../../typings';\nimport { LogFormat } from '../args/log-format';\nimport { DiffSummary } from '../responses/DiffSummary';\nimport { isDiffNameStatus } from '../tasks/diff-name-status';\nimport { asNumber, LineParser, orVoid, parseStringResponse } from '../utils';\n\nconst statParser = [\n new LineParser(\n /^(.+)\\s+\\|\\s+(\\d+)(\\s+[+\\-]+)?$/,\n (result, [file, changes, alterations = '']) => {\n result.files.push({\n file: file.trim(),\n changes: asNumber(changes),\n insertions: alterations.replace(/[^+]/g, '').length,\n deletions: alterations.replace(/[^-]/g, '').length,\n binary: false,\n });\n }\n ),\n new LineParser(\n /^(.+) \\|\\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/,\n (result, [file, before, after]) => {\n result.files.push({\n file: file.trim(),\n before: asNumber(before),\n after: asNumber(after),\n binary: true,\n });\n }\n ),\n new LineParser(\n /(\\d+) files? changed\\s*((?:, \\d+ [^,]+){0,2})/,\n (result, [changed, summary]) => {\n const inserted = /(\\d+) i/.exec(summary);\n const deleted = /(\\d+) d/.exec(summary);\n\n result.changed = asNumber(changed);\n result.insertions = asNumber(inserted?.[1]);\n result.deletions = asNumber(deleted?.[1]);\n }\n ),\n];\n\nconst numStatParser = [\n new LineParser(\n /(\\d+)\\t(\\d+)\\t(.+)$/,\n (result, [changesInsert, changesDelete, file]) => {\n const insertions = asNumber(changesInsert);\n const deletions = asNumber(changesDelete);\n\n result.changed++;\n result.insertions += insertions;\n result.deletions += deletions;\n\n result.files.push({\n file,\n changes: insertions + deletions,\n insertions,\n deletions,\n binary: false,\n });\n }\n ),\n new LineParser(/-\\t-\\t(.+)$/, (result, [file]) => {\n result.changed++;\n\n result.files.push({\n file,\n after: 0,\n before: 0,\n binary: true,\n });\n }),\n];\n\nconst nameOnlyParser = [\n new LineParser(/(.+)$/, (result, [file]) => {\n result.changed++;\n result.files.push({\n file,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n });\n }),\n];\n\nconst nameStatusParser = [\n new LineParser(\n /([ACDMRTUXB])([0-9]{0,3})\\t(.[^\\t]*)(\\t(.[^\\t]*))?$/,\n (result, [status, similarity, from, _to, to]) => {\n result.changed++;\n result.files.push({\n file: to ?? from,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n status: orVoid(isDiffNameStatus(status) && status),\n from: orVoid(!!to && from !== to && from),\n similarity: asNumber(similarity),\n });\n }\n ),\n];\n\nconst diffSummaryParsers: Record[]> = {\n [LogFormat.NONE]: statParser,\n [LogFormat.STAT]: statParser,\n [LogFormat.NUM_STAT]: numStatParser,\n [LogFormat.NAME_STATUS]: nameStatusParser,\n [LogFormat.NAME_ONLY]: nameOnlyParser,\n};\n\nexport function getDiffParser(format = LogFormat.NONE) {\n const parser = diffSummaryParsers[format];\n\n return (stdOut: string) => parseStringResponse(new DiffSummary(), parser, stdOut, false);\n}\n", "import { ListLogLine, LogResult } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\nimport { getDiffParser } from './parse-diff-summary';\nimport { LogFormat } from '../args/log-format';\n\nexport const START_BOUNDARY = '\u00F2\u00F2\u00F2\u00F2\u00F2\u00F2 ';\n\nexport const COMMIT_BOUNDARY = ' \u00F2\u00F2';\n\nexport const SPLITTER = ' \u00F2 ';\n\nconst defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email'];\n\nfunction lineBuilder(tokens: string[], fields: string[]): any {\n return fields.reduce(\n (line, field, index) => {\n line[field] = tokens[index] || '';\n return line;\n },\n Object.create({ diff: null }) as any\n );\n}\n\nexport function createListLogSummaryParser(\n splitter = SPLITTER,\n fields = defaultFieldNames,\n logFormat = LogFormat.NONE\n) {\n const parseDiffResult = getDiffParser(logFormat);\n\n return function (stdOut: string): LogResult {\n const all: ReadonlyArray = toLinesWithContent(\n stdOut.trim(),\n false,\n START_BOUNDARY\n ).map(function (item) {\n const lineDetail = item.split(COMMIT_BOUNDARY);\n const listLogLine: T & ListLogLine = lineBuilder(lineDetail[0].split(splitter), fields);\n\n if (lineDetail.length > 1 && !!lineDetail[1].trim()) {\n listLogLine.diff = parseDiffResult(lineDetail[1]);\n }\n\n return listLogLine;\n });\n\n return {\n all,\n latest: (all.length && all[0]) || null,\n total: all.length,\n };\n };\n}\n", "import { StringTask } from '../types';\nimport { DiffResult } from '../../../typings';\nimport { isLogFormat, LogFormat, logFormatFromCommand } from '../args/log-format';\nimport { getDiffParser } from '../parsers/parse-diff-summary';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function diffSummaryTask(customArgs: string[]): StringTask | EmptyTask {\n let logFormat = logFormatFromCommand(customArgs);\n\n const commands = ['diff'];\n\n if (logFormat === LogFormat.NONE) {\n logFormat = LogFormat.STAT;\n commands.push('--stat=4096');\n }\n\n commands.push(...customArgs);\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser: getDiffParser(logFormat),\n }\n );\n}\n\nexport function validateLogFormatConfig(customArgs: unknown[]): EmptyTask | void {\n const flags = customArgs.filter(isLogFormat);\n\n if (flags.length > 1) {\n return configurationErrorTask(\n `Summary flags are mutually exclusive - pick one of ${flags.join(',')}`\n );\n }\n\n if (flags.length && customArgs.includes('-z')) {\n return configurationErrorTask(\n `Summary flag ${flags} parsing is not compatible with null termination option '-z'`\n );\n }\n}\n", "import type { LogResult, Options, SimpleGit } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { pathspec } from '../args/pathspec';\nimport {\n COMMIT_BOUNDARY,\n createListLogSummaryParser,\n SPLITTER,\n START_BOUNDARY,\n} from '../parsers/parse-list-log-summary';\nimport {\n appendTaskOptions,\n asStringArray,\n filterArray,\n filterPlainObject,\n filterString,\n filterType,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} from '../utils';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { configurationErrorTask } from './task';\nimport { validateLogFormatConfig } from './diff';\nimport { StringTask } from '../types';\n\nenum excludeOptions {\n '--pretty',\n 'max-count',\n 'maxCount',\n 'n',\n 'file',\n 'format',\n 'from',\n 'to',\n 'splitter',\n 'symmetric',\n 'mailMap',\n 'multiLine',\n 'strictDate',\n}\n\nexport interface DefaultLogFields {\n hash: string;\n date: string;\n message: string;\n refs: string;\n body: string;\n author_name: string;\n author_email: string;\n}\n\nexport type LogOptions = {\n file?: string;\n format?: T;\n from?: string;\n mailMap?: boolean;\n maxCount?: number;\n multiLine?: boolean;\n splitter?: string;\n strictDate?: boolean;\n symmetric?: boolean;\n to?: string;\n};\n\ninterface ParsedLogOptions {\n fields: string[];\n splitter: string;\n commands: string[];\n}\n\nfunction prettyFormat(\n format: Record,\n splitter: string\n): [string[], string] {\n const fields: string[] = [];\n const formatStr: string[] = [];\n\n Object.keys(format).forEach((field) => {\n fields.push(field);\n formatStr.push(String(format[field]));\n });\n\n return [fields, formatStr.join(splitter)];\n}\n\nfunction userOptions(input: T): Options {\n return Object.keys(input).reduce((out, key) => {\n if (!(key in excludeOptions)) {\n out[key] = input[key];\n }\n return out;\n }, {} as Options);\n}\n\nexport function parseLogOptions(\n opt: Options | LogOptions = {},\n customArgs: string[] = []\n): ParsedLogOptions {\n const splitter = filterType(opt.splitter, filterString, SPLITTER);\n const format = filterPlainObject(opt.format)\n ? opt.format\n : {\n hash: '%H',\n date: opt.strictDate === false ? '%ai' : '%aI',\n message: '%s',\n refs: '%D',\n body: opt.multiLine ? '%B' : '%b',\n author_name: opt.mailMap !== false ? '%aN' : '%an',\n author_email: opt.mailMap !== false ? '%aE' : '%ae',\n };\n\n const [fields, formatStr] = prettyFormat(format, splitter);\n\n const suffix: string[] = [];\n const command: string[] = [\n `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`,\n ...customArgs,\n ];\n\n const maxCount: number | undefined = (opt as any).n || (opt as any)['max-count'] || opt.maxCount;\n if (maxCount) {\n command.push(`--max-count=${maxCount}`);\n }\n\n if (opt.from || opt.to) {\n const rangeOperator = opt.symmetric !== false ? '...' : '..';\n suffix.push(`${opt.from || ''}${rangeOperator}${opt.to || ''}`);\n }\n\n if (filterString(opt.file)) {\n command.push('--follow', pathspec(opt.file));\n }\n\n appendTaskOptions(userOptions(opt as Options), command);\n\n return {\n fields,\n splitter,\n commands: [...command, ...suffix],\n };\n}\n\nexport function logTask(\n splitter: string,\n fields: string[],\n customArgs: string[]\n): StringTask> {\n const parser = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs));\n\n return {\n commands: ['log', ...customArgs],\n format: 'utf-8',\n parser,\n };\n}\n\nexport default function (): Pick {\n return {\n log(this: SimpleGitApi, ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const options = parseLogOptions(\n trailingOptionsArgument(arguments),\n asStringArray(filterType(arguments[0], filterArray, []))\n );\n const task =\n rejectDeprecatedSignatures(...rest) ||\n validateLogFormatConfig(options.commands) ||\n createLogTask(options);\n\n return this._runTask(task, next);\n },\n };\n\n function createLogTask(options: ParsedLogOptions) {\n return logTask(options.splitter, options.fields, options.commands);\n }\n\n function rejectDeprecatedSignatures(from?: unknown, to?: unknown) {\n return (\n filterString(from) &&\n filterString(to) &&\n configurationErrorTask(\n `git.log(string, string) should be replaced with git.log({ from: string, to: string })`\n )\n );\n }\n}\n", "import {\n MergeConflict,\n MergeConflictDeletion,\n MergeDetail,\n MergeResultStatus,\n} from '../../../typings';\n\nexport class MergeSummaryConflict implements MergeConflict {\n constructor(\n public readonly reason: string,\n public readonly file: string | null = null,\n public readonly meta?: MergeConflictDeletion\n ) {}\n\n toString() {\n return `${this.file}:${this.reason}`;\n }\n}\n\nexport class MergeSummaryDetail implements MergeDetail {\n public conflicts: MergeConflict[] = [];\n public merges: string[] = [];\n public result: MergeResultStatus = 'success';\n\n get failed() {\n return this.conflicts.length > 0;\n }\n\n get reason() {\n return this.result;\n }\n\n toString() {\n if (this.conflicts.length) {\n return `CONFLICTS: ${this.conflicts.join(', ')}`;\n }\n\n return 'OK';\n }\n}\n", "import {\n PullDetailFileChanges,\n PullDetailSummary,\n PullFailedResult,\n PullResult,\n} from '../../../typings';\n\nexport class PullSummary implements PullResult {\n public remoteMessages = {\n all: [],\n };\n public created = [];\n public deleted: string[] = [];\n public files: string[] = [];\n public deletions: PullDetailFileChanges = {};\n public insertions: PullDetailFileChanges = {};\n public summary: PullDetailSummary = {\n changes: 0,\n deletions: 0,\n insertions: 0,\n };\n}\n\nexport class PullFailedSummary implements PullFailedResult {\n remote = '';\n hash = {\n local: '',\n remote: '',\n };\n branch = {\n local: '',\n remote: '',\n };\n message = '';\n\n toString() {\n return this.message;\n }\n}\n", "import {\n RemoteMessageResult,\n RemoteMessages,\n RemoteMessagesObjectEnumeration,\n} from '../../../typings';\nimport { asNumber, RemoteLineParser } from '../utils';\n\nfunction objectEnumerationResult(\n remoteMessages: T\n): RemoteMessagesObjectEnumeration {\n return (remoteMessages.objects = remoteMessages.objects || {\n compressing: 0,\n counting: 0,\n enumerating: 0,\n packReused: 0,\n reused: { count: 0, delta: 0 },\n total: { count: 0, delta: 0 },\n });\n}\n\nfunction asObjectCount(source: string) {\n const count = /^\\s*(\\d+)/.exec(source);\n const delta = /delta (\\d+)/i.exec(source);\n\n return {\n count: asNumber((count && count[1]) || '0'),\n delta: asNumber((delta && delta[1]) || '0'),\n };\n}\n\nexport const remoteMessagesObjectParsers: RemoteLineParser>[] =\n [\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: (\\d+),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: \\d+% \\(\\d+\\/(\\d+)\\),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /total ([^,]+), reused ([^,]+), pack-reused (\\d+)/i,\n (result, [total, reused, packReused]) => {\n const objects = objectEnumerationResult(result.remoteMessages);\n objects.total = asObjectCount(total);\n objects.reused = asObjectCount(reused);\n objects.packReused = asNumber(packReused);\n }\n ),\n ];\n", "import { PushResultRemoteMessages, RemoteMessageResult, RemoteMessages } from '../../../typings';\nimport { asNumber, parseStringResponse, RemoteLineParser } from '../utils';\nimport { remoteMessagesObjectParsers } from './parse-remote-objects';\n\nconst parsers: RemoteLineParser>[] =\n [\n new RemoteLineParser(/^remote:\\s*(.+)$/, (result, [text]) => {\n result.remoteMessages.all.push(text.trim());\n return false;\n }),\n ...remoteMessagesObjectParsers,\n new RemoteLineParser(\n [/create a (?:pull|merge) request/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [pullRequestUrl]) => {\n (result.remoteMessages as PushResultRemoteMessages).pullRequestUrl = pullRequestUrl;\n }\n ),\n new RemoteLineParser(\n [/found (\\d+) vulnerabilities.+\\(([^)]+)\\)/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [count, summary, url]) => {\n (result.remoteMessages as PushResultRemoteMessages).vulnerabilities = {\n count: asNumber(count),\n summary,\n url,\n };\n }\n ),\n ];\n\nexport function parseRemoteMessages(\n _stdOut: string,\n stdErr: string\n): RemoteMessageResult {\n return parseStringResponse({ remoteMessages: new RemoteMessageSummary() as T }, parsers, stdErr);\n}\n\nexport class RemoteMessageSummary implements RemoteMessages {\n public readonly all: string[] = [];\n}\n", "import { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings';\nimport { PullFailedSummary, PullSummary } from '../responses/PullSummary';\nimport { TaskParser } from '../types';\nimport { append, LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nconst FILE_UPDATE_REGEX = /^\\s*(.+?)\\s+\\|\\s+\\d+\\s*(\\+*)(-*)/;\nconst SUMMARY_REGEX = /(\\d+)\\D+((\\d+)\\D+\\(\\+\\))?(\\D+(\\d+)\\D+\\(-\\))?/;\nconst ACTION_REGEX = /^(create|delete) mode \\d+ (.+)/;\n\nconst parsers: LineParser[] = [\n new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => {\n result.files.push(file);\n\n if (insertions) {\n result.insertions[file] = insertions.length;\n }\n\n if (deletions) {\n result.deletions[file] = deletions.length;\n }\n }),\n new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => {\n if (insertions !== undefined || deletions !== undefined) {\n result.summary.changes = +changes || 0;\n result.summary.insertions = +insertions || 0;\n result.summary.deletions = +deletions || 0;\n return true;\n }\n return false;\n }),\n new LineParser(ACTION_REGEX, (result, [action, file]) => {\n append(result.files, file);\n append(action === 'create' ? result.created : result.deleted, file);\n }),\n];\n\nconst errorParsers: LineParser[] = [\n new LineParser(/^from\\s(.+)$/i, (result, [remote]) => void (result.remote = remote)),\n new LineParser(/^fatal:\\s(.+)$/, (result, [message]) => void (result.message = message)),\n new LineParser(\n /([a-z0-9]+)\\.\\.([a-z0-9]+)\\s+(\\S+)\\s+->\\s+(\\S+)$/,\n (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => {\n result.branch.local = branchLocal;\n result.hash.local = hashLocal;\n result.branch.remote = branchRemote;\n result.hash.remote = hashRemote;\n }\n ),\n];\n\nexport const parsePullDetail: TaskParser = (stdOut, stdErr) => {\n return parseStringResponse(new PullSummary(), parsers, [stdOut, stdErr]);\n};\n\nexport const parsePullResult: TaskParser = (stdOut, stdErr) => {\n return Object.assign(\n new PullSummary(),\n parsePullDetail(stdOut, stdErr),\n parseRemoteMessages(stdOut, stdErr)\n );\n};\n\nexport function parsePullErrorResult(stdOut: string, stdErr: string) {\n const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]);\n\n return pullError.message && pullError;\n}\n", "import { MergeDetail, MergeResult } from '../../../typings';\nimport { MergeSummaryConflict, MergeSummaryDetail } from '../responses/MergeSummary';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parsePullResult } from './parse-pull';\n\nconst parsers: LineParser[] = [\n new LineParser(/^Auto-merging\\s+(.+)$/, (summary, [autoMerge]) => {\n summary.merges.push(autoMerge);\n }),\n new LineParser(/^CONFLICT\\s+\\((.+)\\): Merge conflict in (.+)$/, (summary, [reason, file]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file));\n }),\n new LineParser(\n /^CONFLICT\\s+\\((.+\\/delete)\\): (.+) deleted in (.+) and/,\n (summary, [reason, file, deleteRef]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef }));\n }\n ),\n new LineParser(/^CONFLICT\\s+\\((.+)\\):/, (summary, [reason]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, null));\n }),\n new LineParser(/^Automatic merge failed;\\s+(.+)$/, (summary, [result]) => {\n summary.result = result;\n }),\n];\n\n/**\n * Parse the complete response from `git.merge`\n */\nexport const parseMergeResult: TaskParser = (stdOut, stdErr) => {\n return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr));\n};\n\n/**\n * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge`\n * @param stdOut\n */\nexport const parseMergeDetail: TaskParser = (stdOut) => {\n return parseStringResponse(new MergeSummaryDetail(), parsers, stdOut);\n};\n", "import { MergeResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parseMergeResult } from '../parsers/parse-merge';\nimport { StringTask } from '../types';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function mergeTask(customArgs: string[]): EmptyTask | StringTask {\n if (!customArgs.length) {\n return configurationErrorTask('Git.merge requires at least one option');\n }\n\n return {\n commands: ['merge', ...customArgs],\n format: 'utf-8',\n parser(stdOut, stdErr): MergeResult {\n const merge = parseMergeResult(stdOut, stdErr);\n if (merge.failed) {\n throw new GitResponseError(merge);\n }\n\n return merge;\n },\n };\n}\n", "import {\n PushDetail,\n PushResult,\n PushResultPushedItem,\n PushResultRemoteMessages,\n} from '../../../typings';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nfunction pushResultPushedItem(local: string, remote: string, status: string): PushResultPushedItem {\n const deleted = status.includes('deleted');\n const tag = status.includes('tag') || /^refs\\/tags/.test(local);\n const alreadyUpdated = !status.includes('new');\n\n return {\n deleted,\n tag,\n branch: !tag,\n new: !alreadyUpdated,\n alreadyUpdated,\n local,\n remote,\n };\n}\n\nconst parsers: LineParser[] = [\n new LineParser(/^Pushing to (.+)$/, (result, [repo]) => {\n result.repo = repo;\n }),\n new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => {\n result.ref = {\n ...(result.ref || {}),\n local,\n };\n }),\n new LineParser(/^[=*-]\\s+([^:]+):(\\S+)\\s+\\[(.+)]$/, (result, [local, remote, type]) => {\n result.pushed.push(pushResultPushedItem(local, remote, type));\n }),\n new LineParser(\n /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/,\n (result, [local, remote, remoteName]) => {\n result.branch = {\n ...(result.branch || {}),\n local,\n remote,\n remoteName,\n };\n }\n ),\n new LineParser(\n /^([^:]+):(\\S+)\\s+([a-z0-9]+)\\.\\.([a-z0-9]+)$/,\n (result, [local, remote, from, to]) => {\n result.update = {\n head: {\n local,\n remote,\n },\n hash: {\n from,\n to,\n },\n };\n }\n ),\n];\n\nexport const parsePushResult: TaskParser = (stdOut, stdErr) => {\n const pushDetail = parsePushDetail(stdOut, stdErr);\n const responseDetail = parseRemoteMessages(stdOut, stdErr);\n\n return {\n ...pushDetail,\n ...responseDetail,\n };\n};\n\nexport const parsePushDetail: TaskParser = (stdOut, stdErr) => {\n return parseStringResponse({ pushed: [] }, parsers, [stdOut, stdErr]);\n};\n", "import { PushResult } from '../../../typings';\nimport { parsePushResult as parser } from '../parsers/parse-push';\nimport { StringTask } from '../types';\nimport { append, remove } from '../utils';\n\ntype PushRef = { remote?: string; branch?: string };\n\nexport function pushTagsTask(ref: PushRef = {}, customArgs: string[]): StringTask {\n append(customArgs, '--tags');\n return pushTask(ref, customArgs);\n}\n\nexport function pushTask(ref: PushRef = {}, customArgs: string[]): StringTask {\n const commands = ['push', ...customArgs];\n if (ref.branch) {\n commands.splice(1, 0, ref.branch);\n }\n if (ref.remote) {\n commands.splice(1, 0, ref.remote);\n }\n\n remove(commands, '-v');\n append(commands, '--verbose');\n append(commands, '--porcelain');\n\n return {\n commands,\n format: 'utf-8',\n parser,\n };\n}\n", "import { SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, trailingFunctionArgument } from '../utils';\nimport { straightThroughBufferTask, straightThroughStringTask } from './task';\n\nexport default function (): Pick {\n return {\n showBuffer(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n if (!commands.includes('--binary')) {\n commands.splice(1, 0, '--binary');\n }\n\n return this._runTask(\n straightThroughBufferTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n\n show(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n return this._runTask(\n straightThroughStringTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n", "import { FileStatusResult } from '../../../typings';\n\nexport const fromPathRegex = /^(.+)\\0(.+)$/;\n\nexport class FileStatusSummary implements FileStatusResult {\n public readonly from: string | undefined;\n\n constructor(\n public path: string,\n public index: string,\n public working_dir: string\n ) {\n if (index === 'R' || working_dir === 'R') {\n const detail = fromPathRegex.exec(path) || [null, path, path];\n this.from = detail[2] || '';\n this.path = detail[1] || '';\n }\n }\n}\n", "import { StatusResult } from '../../../typings';\nimport { filterString, filterType, NULL } from '../utils';\nimport { FileStatusSummary } from './FileStatusSummary';\n\ntype StatusLineParser = (result: StatusResult, file: string) => void;\n\nexport class StatusSummary implements StatusResult {\n public not_added = [];\n public conflicted = [];\n public created = [];\n public deleted = [];\n public ignored = undefined;\n public modified = [];\n public renamed = [];\n public files = [];\n public staged = [];\n public ahead = 0;\n public behind = 0;\n public current = null;\n public tracking = null;\n public detached = false;\n\n public isClean = () => {\n return !this.files.length;\n };\n}\n\nenum PorcelainFileStatus {\n ADDED = 'A',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n COPIED = 'C',\n UNMERGED = 'U',\n UNTRACKED = '?',\n IGNORED = '!',\n NONE = ' ',\n}\n\nfunction renamedFile(line: string) {\n const [to, from] = line.split(NULL);\n\n return {\n from: from || to,\n to,\n };\n}\n\nfunction parser(\n indexX: PorcelainFileStatus,\n indexY: PorcelainFileStatus,\n handler: StatusLineParser\n): [string, StatusLineParser] {\n return [`${indexX}${indexY}`, handler];\n}\n\nfunction conflicts(indexX: PorcelainFileStatus, ...indexY: PorcelainFileStatus[]) {\n return indexY.map((y) => parser(indexX, y, (result, file) => result.conflicted.push(file)));\n}\n\nconst parsers: Map = new Map([\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) =>\n result.created.push(file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) =>\n result.deleted.push(file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) =>\n result.modified.push(file)\n ),\n\n parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.NONE, (result, file) => {\n result.created.push(file);\n result.staged.push(file);\n }),\n parser(PorcelainFileStatus.ADDED, PorcelainFileStatus.MODIFIED, (result, file) => {\n result.created.push(file);\n result.staged.push(file);\n result.modified.push(file);\n }),\n\n parser(PorcelainFileStatus.DELETED, PorcelainFileStatus.NONE, (result, file) => {\n result.deleted.push(file);\n result.staged.push(file);\n }),\n\n parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.NONE, (result, file) => {\n result.modified.push(file);\n result.staged.push(file);\n }),\n parser(PorcelainFileStatus.MODIFIED, PorcelainFileStatus.MODIFIED, (result, file) => {\n result.modified.push(file);\n result.staged.push(file);\n }),\n\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => {\n result.renamed.push(renamedFile(file));\n }),\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => {\n const renamed = renamedFile(file);\n result.renamed.push(renamed);\n result.modified.push(renamed.to);\n }),\n parser(PorcelainFileStatus.IGNORED, PorcelainFileStatus.IGNORED, (_result, _file) => {\n (_result.ignored = _result.ignored || []).push(_file);\n }),\n\n parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) =>\n result.not_added.push(file)\n ),\n\n ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED),\n ...conflicts(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n ...conflicts(\n PorcelainFileStatus.UNMERGED,\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n\n [\n '##',\n (result, line) => {\n const aheadReg = /ahead (\\d+)/;\n const behindReg = /behind (\\d+)/;\n const currentReg = /^(.+?(?=(?:\\.{3}|\\s|$)))/;\n const trackingReg = /\\.{3}(\\S*)/;\n const onEmptyBranchReg = /\\son\\s(\\S+?)(?=\\.{3}|$)/;\n\n let regexResult = aheadReg.exec(line);\n result.ahead = (regexResult && +regexResult[1]) || 0;\n\n regexResult = behindReg.exec(line);\n result.behind = (regexResult && +regexResult[1]) || 0;\n\n regexResult = currentReg.exec(line);\n result.current = filterType(regexResult?.[1], filterString, null);\n\n regexResult = trackingReg.exec(line);\n result.tracking = filterType(regexResult?.[1], filterString, null);\n\n regexResult = onEmptyBranchReg.exec(line);\n if (regexResult) {\n result.current = filterType(regexResult?.[1], filterString, result.current);\n }\n\n result.detached = /\\(no branch\\)/.test(line);\n },\n ],\n]);\n\nexport const parseStatusSummary = function (text: string): StatusResult {\n const lines = text.split(NULL);\n const status = new StatusSummary();\n\n for (let i = 0, l = lines.length; i < l; ) {\n let line = lines[i++].trim();\n\n if (!line) {\n continue;\n }\n\n if (line.charAt(0) === PorcelainFileStatus.RENAMED) {\n line += NULL + (lines[i++] || '');\n }\n\n splitLine(status, line);\n }\n\n return status;\n};\n\nfunction splitLine(result: StatusResult, lineStr: string) {\n const trimmed = lineStr.trim();\n switch (' ') {\n case trimmed.charAt(2):\n return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.slice(3));\n case trimmed.charAt(1):\n return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.slice(2));\n default:\n return;\n }\n\n function data(index: string, workingDir: string, path: string) {\n const raw = `${index}${workingDir}`;\n const handler = parsers.get(raw);\n\n if (handler) {\n handler(result, path);\n }\n\n if (raw !== '##' && raw !== '!!') {\n result.files.push(new FileStatusSummary(path, index, workingDir));\n }\n }\n}\n", "import { StatusResult } from '../../../typings';\nimport { parseStatusSummary } from '../responses/StatusSummary';\nimport { StringTask } from '../types';\n\nconst ignoredOptions = ['--null', '-z'];\n\nexport function statusTask(customArgs: string[]): StringTask {\n const commands = [\n 'status',\n '--porcelain',\n '-b',\n '-u',\n '--null',\n ...customArgs.filter((arg) => !ignoredOptions.includes(arg)),\n ];\n\n return {\n format: 'utf-8',\n commands,\n parser(text: string) {\n return parseStatusSummary(text);\n },\n };\n}\n", "import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asNumber, ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nexport interface VersionResult {\n major: number;\n minor: number;\n patch: number | string;\n agent: string;\n installed: boolean;\n}\n\nconst NOT_INSTALLED = 'installed=false';\n\nfunction versionResponse(\n major = 0,\n minor = 0,\n patch: string | number = 0,\n agent = '',\n installed = true\n): VersionResult {\n return Object.defineProperty(\n {\n major,\n minor,\n patch,\n agent,\n installed,\n },\n 'toString',\n {\n value() {\n return `${this.major}.${this.minor}.${this.patch}`;\n },\n configurable: false,\n enumerable: false,\n }\n );\n}\n\nfunction notInstalledResponse() {\n return versionResponse(0, 0, 0, '', false);\n}\n\nexport default function (): Pick {\n return {\n version(this: SimpleGitApi) {\n return this._runTask({\n commands: ['--version'],\n format: 'utf-8',\n parser: versionParser,\n onError(result, error, done, fail) {\n if (result.exitCode === ExitCodes.NOT_FOUND) {\n return done(Buffer.from(NOT_INSTALLED));\n }\n\n fail(error);\n },\n });\n },\n };\n}\n\nconst parsers: LineParser[] = [\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*\\((.+)\\))?/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(\n result,\n versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)\n );\n }\n ),\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\D+)(.+)?$/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent));\n }\n ),\n];\n\nfunction versionParser(stdOut: string) {\n if (stdOut === NOT_INSTALLED) {\n return notInstalledResponse();\n }\n\n return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers, stdOut);\n}\n", "import { SimpleGitBase } from '../../typings';\nimport { taskCallback } from './task-callback';\nimport { changeWorkingDirectoryTask } from './tasks/change-working-directory';\nimport checkout from './tasks/checkout';\nimport countObjects from './tasks/count-objects';\nimport commit from './tasks/commit';\nimport config from './tasks/config';\nimport firstCommit from './tasks/first-commit';\nimport grep from './tasks/grep';\nimport { hashObjectTask } from './tasks/hash-object';\nimport { initTask } from './tasks/init';\nimport log from './tasks/log';\nimport { mergeTask } from './tasks/merge';\nimport { pushTask } from './tasks/push';\nimport show from './tasks/show';\nimport { statusTask } from './tasks/status';\nimport { configurationErrorTask, straightThroughStringTask } from './tasks/task';\nimport version from './tasks/version';\nimport { outputHandler, SimpleGitExecutor, SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport {\n asArray,\n filterString,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n} from './utils';\n\nexport class SimpleGitApi implements SimpleGitBase {\n constructor(private _executor: SimpleGitExecutor) {}\n\n protected _runTask(task: SimpleGitTask, then?: SimpleGitTaskCallback) {\n const chain = this._executor.chain();\n const promise = chain.push(task);\n\n if (then) {\n taskCallback(task, promise, then);\n }\n\n return Object.create(this, {\n then: { value: promise.then.bind(promise) },\n catch: { value: promise.catch.bind(promise) },\n _executor: { value: chain },\n });\n }\n\n add(files: string | string[]) {\n return this._runTask(\n straightThroughStringTask(['add', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n cwd(directory: string | { path: string; root?: boolean }) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof directory === 'string') {\n return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next);\n }\n\n if (typeof directory?.path === 'string') {\n return this._runTask(\n changeWorkingDirectoryTask(\n directory.path,\n (directory.root && this._executor) || undefined\n ),\n next\n );\n }\n\n return this._runTask(\n configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string'),\n next\n );\n }\n\n hashObject(path: string, write: boolean | unknown) {\n return this._runTask(\n hashObjectTask(path, write === true),\n trailingFunctionArgument(arguments)\n );\n }\n\n init(bare?: boolean | unknown) {\n return this._runTask(\n initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n merge() {\n return this._runTask(\n mergeTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n mergeFromTo(remote: string, branch: string) {\n if (!(filterString(remote) && filterString(branch))) {\n return this._runTask(\n configurationErrorTask(\n `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`\n )\n );\n }\n\n return this._runTask(\n mergeTask([remote, branch, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments, false)\n );\n }\n\n outputHandler(handler: outputHandler) {\n this._executor.outputHandler = handler;\n return this;\n }\n\n push() {\n const task = pushTask(\n {\n remote: filterType(arguments[0], filterString),\n branch: filterType(arguments[1], filterString),\n },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n }\n\n stash() {\n return this._runTask(\n straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n status() {\n return this._runTask(\n statusTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n}\n\nObject.assign(\n SimpleGitApi.prototype,\n checkout(),\n commit(),\n config(),\n countObjects(),\n firstCommit(),\n grep(),\n log(),\n show(),\n version()\n);\n", "import { append, remove } from '../utils';\nimport { createDeferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { createLogger } from '../git-logger';\n\ntype ScheduleCompleteCallback = () => void;\ntype ScheduledTask = Pick, 'promise' | 'done'> & {\n id: number;\n};\n\nconst createScheduledTask: () => ScheduledTask = (() => {\n let id = 0;\n return () => {\n id++;\n const { promise, done } = createDeferred();\n\n return {\n promise,\n done,\n id,\n };\n };\n})();\n\nexport class Scheduler {\n private logger = createLogger('', 'scheduler');\n private pending: ScheduledTask[] = [];\n private running: ScheduledTask[] = [];\n\n constructor(private concurrency = 2) {\n this.logger(`Constructed, concurrency=%s`, concurrency);\n }\n\n private schedule() {\n if (!this.pending.length || this.running.length >= this.concurrency) {\n this.logger(\n `Schedule attempt ignored, pending=%s running=%s concurrency=%s`,\n this.pending.length,\n this.running.length,\n this.concurrency\n );\n return;\n }\n\n const task = append(this.running, this.pending.shift()!);\n this.logger(`Attempting id=%s`, task.id);\n task.done(() => {\n this.logger(`Completing id=`, task.id);\n remove(this.running, task);\n this.schedule();\n });\n }\n\n next(): Promise {\n const { promise, id } = append(this.pending, createScheduledTask());\n this.logger(`Scheduling id=%s`, id);\n\n this.schedule();\n\n return promise;\n }\n}\n", "import { straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\n\nexport type ApplyOptions = Options &\n OptionFlags<\n | '--stat'\n | '--numstat'\n | '--summary'\n | '--check'\n | '--index'\n | '--intent-to-add'\n | '--3way'\n | '--apply'\n | '--no-add'\n | '-R'\n | '--reverse'\n | '--allow-binary-replacement'\n | '--binary'\n | '--reject'\n | '-z'\n | '--inaccurate-eof'\n | '--recount'\n | '--cached'\n | '--ignore-space-change'\n | '--ignore-whitespace'\n | '--verbose'\n | '--unsafe-paths'\n > &\n OptionFlags<'--whitespace', 'nowarn' | 'warn' | 'fix' | 'error' | 'error-all'> &\n OptionFlags<'--build-fake-ancestor' | '--exclude' | '--include' | '--directory', string> &\n OptionFlags<'-p' | '-C', number>;\n\nexport function applyPatchTask(patches: string[], customArgs: string[]): StringTask {\n return straightThroughStringTask(['apply', ...customArgs, ...patches]);\n}\n", "import {\n BranchMultiDeleteResult,\n BranchSingleDeleteFailure,\n BranchSingleDeleteResult,\n BranchSingleDeleteSuccess,\n} from '../../../typings';\n\nexport class BranchDeletionBatch implements BranchMultiDeleteResult {\n all: BranchSingleDeleteResult[] = [];\n branches: { [branchName: string]: BranchSingleDeleteResult } = {};\n errors: BranchSingleDeleteResult[] = [];\n\n get success(): boolean {\n return !this.errors.length;\n }\n}\n\nexport function branchDeletionSuccess(branch: string, hash: string): BranchSingleDeleteSuccess {\n return {\n branch,\n hash,\n success: true,\n };\n}\n\nexport function branchDeletionFailure(branch: string): BranchSingleDeleteFailure {\n return {\n branch,\n hash: null,\n success: false,\n };\n}\n\nexport function isSingleBranchDeleteFailure(\n test: BranchSingleDeleteResult\n): test is BranchSingleDeleteSuccess {\n return test.success;\n}\n", "import { BranchMultiDeleteResult } from '../../../typings';\nimport {\n BranchDeletionBatch,\n branchDeletionFailure,\n branchDeletionSuccess,\n} from '../responses/BranchDeleteSummary';\nimport { TaskParser } from '../types';\nimport { ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nconst deleteSuccessRegex = /(\\S+)\\s+\\(\\S+\\s([^)]+)\\)/;\nconst deleteErrorRegex = /^error[^']+'([^']+)'/m;\n\nconst parsers: LineParser[] = [\n new LineParser(deleteSuccessRegex, (result, [branch, hash]) => {\n const deletion = branchDeletionSuccess(branch, hash);\n\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n new LineParser(deleteErrorRegex, (result, [branch]) => {\n const deletion = branchDeletionFailure(branch);\n\n result.errors.push(deletion);\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n];\n\nexport const parseBranchDeletions: TaskParser = (\n stdOut,\n stdErr\n) => {\n return parseStringResponse(new BranchDeletionBatch(), parsers, [stdOut, stdErr]);\n};\n\nexport function hasBranchDeletionError(data: string, processExitCode: ExitCodes): boolean {\n return processExitCode === ExitCodes.ERROR && deleteErrorRegex.test(data);\n}\n", "import type { BranchSummary, BranchSummaryBranch } from '../../../typings';\n\nexport enum BranchStatusIdentifier {\n CURRENT = '*',\n LINKED = '+',\n}\n\nexport class BranchSummaryResult implements BranchSummary {\n public all: string[] = [];\n public branches: { [p: string]: BranchSummaryBranch } = {};\n public current: string = '';\n public detached: boolean = false;\n\n push(\n status: BranchStatusIdentifier | unknown,\n detached: boolean,\n name: string,\n commit: string,\n label: string\n ) {\n if (status === BranchStatusIdentifier.CURRENT) {\n this.detached = detached;\n this.current = name;\n }\n\n this.all.push(name);\n this.branches[name] = {\n current: status === BranchStatusIdentifier.CURRENT,\n linkedWorkTree: status === BranchStatusIdentifier.LINKED,\n name,\n commit,\n label,\n };\n }\n}\n", "import type { BranchSummary } from '../../../typings';\nimport { BranchStatusIdentifier, BranchSummaryResult } from '../responses/BranchSummary';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(\n /^([*+]\\s)?\\((?:HEAD )?detached (?:from|at) (\\S+)\\)\\s+([a-z0-9]+)\\s(.*)$/,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), true, name, commit, label);\n }\n ),\n new LineParser(\n /^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$/s,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), false, name, commit, label);\n }\n ),\n];\n\nconst currentBranchParser = new LineParser(/^(\\S+)$/s, (result, [name]) => {\n result.push(BranchStatusIdentifier.CURRENT, false, name, '', '');\n});\n\nfunction branchStatus(input?: string) {\n return input ? input.charAt(0) : '';\n}\n\nexport function parseBranchSummary(stdOut: string, currentOnly = false): BranchSummary {\n return parseStringResponse(\n new BranchSummaryResult(),\n currentOnly ? [currentBranchParser] : parsers,\n stdOut\n );\n}\n", "import { BranchMultiDeleteResult, BranchSingleDeleteResult, BranchSummary } from '../../../typings';\nimport { StringTask } from '../types';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete';\nimport { parseBranchSummary } from '../parsers/parse-branch';\nimport { bufferToString } from '../utils';\n\nexport function containsDeleteBranchCommand(commands: string[]) {\n const deleteCommands = ['-d', '-D', '--delete'];\n return commands.some((command) => deleteCommands.includes(command));\n}\n\nexport function branchTask(\n customArgs: string[]\n): StringTask {\n const isDelete = containsDeleteBranchCommand(customArgs);\n const isCurrentOnly = customArgs.includes('--show-current');\n\n const commands = ['branch', ...customArgs];\n\n if (commands.length === 1) {\n commands.push('-a');\n }\n\n if (!commands.includes('-v')) {\n commands.splice(1, 0, '-v');\n }\n\n return {\n format: 'utf-8',\n commands,\n parser(stdOut, stdErr) {\n if (isDelete) {\n return parseBranchDeletions(stdOut, stdErr).all[0];\n }\n\n return parseBranchSummary(stdOut, isCurrentOnly);\n },\n };\n}\n\nexport function branchLocalTask(): StringTask {\n return {\n format: 'utf-8',\n commands: ['branch', '-v'],\n parser(stdOut) {\n return parseBranchSummary(stdOut);\n },\n };\n}\n\nexport function deleteBranchesTask(\n branches: string[],\n forceDelete = false\n): StringTask {\n return {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr);\n },\n onError({ exitCode, stdOut }, error, done, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n done(stdOut);\n },\n };\n}\n\nexport function deleteBranchTask(\n branch: string,\n forceDelete = false\n): StringTask {\n const task: StringTask = {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr).branches[branch]!;\n },\n onError({ exitCode, stdErr, stdOut }, error, _, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n throw new GitResponseError(\n task.parser(bufferToString(stdOut), bufferToString(stdErr)),\n String(error)\n );\n },\n };\n\n return task;\n}\n", "import { normalize } from 'node:path';\n\n/**\n * Parser for the `check-ignore` command - returns each file as a string array\n */\nexport const parseCheckIgnore = (text: string): string[] => {\n return text.split(/\\n/g).map(toPath).filter(Boolean);\n};\n\nfunction toPath(input: string) {\n const path = input.trim().replace(/^[\"']|[\"']$/g, '');\n return path && normalize(path);\n}\n", "import { StringTask } from '../types';\nimport { parseCheckIgnore } from '../responses/CheckIgnore';\n\nexport function checkIgnoreTask(paths: string[]): StringTask {\n return {\n commands: ['check-ignore', ...paths],\n format: 'utf-8',\n parser: parseCheckIgnore,\n };\n}\n", "import { configurationErrorTask, EmptyTask, straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\nimport { append, filterString } from '../utils';\n\nexport type CloneOptions = Options &\n OptionFlags<\n | '--bare'\n | '--dissociate'\n | '--mirror'\n | '--no-checkout'\n | '--no-remote-submodules'\n | '--no-shallow-submodules'\n | '--no-single-branch'\n | '--no-tags'\n | '--remote-submodules'\n | '--single-branch'\n | '--shallow-submodules'\n | '--verbose'\n > &\n OptionFlags<'--depth' | '-j' | '--jobs', number> &\n OptionFlags<\n | '--branch'\n | '--origin'\n | '--recurse-submodules'\n | '--separate-git-dir'\n | '--shallow-exclude'\n | '--shallow-since'\n | '--template',\n string\n >;\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function cloneTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n): StringTask | EmptyTask {\n const commands = ['clone', ...customArgs];\n\n filterString(repo) && commands.push(repo);\n filterString(directory) && commands.push(directory);\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function cloneMirrorTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n) {\n append(customArgs, '--mirror');\n\n return cloneTask(repo, directory, customArgs);\n}\n", "import { FetchResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/From (.+)$/, (result, [remote]) => {\n result.remote = remote;\n }),\n new LineParser(/\\* \\[new branch]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.branches.push({\n name,\n tracking,\n });\n }),\n new LineParser(/\\* \\[new tag]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.tags.push({\n name,\n tracking,\n });\n }),\n new LineParser(/- \\[deleted]\\s+\\S+\\s*-> (.+)$/, (result, [tracking]) => {\n result.deleted.push({\n tracking,\n });\n }),\n new LineParser(\n /\\s*([^.]+)\\.\\.(\\S+)\\s+(\\S+)\\s*-> (.+)$/,\n (result, [from, to, name, tracking]) => {\n result.updated.push({\n name,\n tracking,\n to,\n from,\n });\n }\n ),\n];\n\nexport function parseFetchResult(stdOut: string, stdErr: string): FetchResult {\n const result: FetchResult = {\n raw: stdOut,\n remote: null,\n branches: [],\n tags: [],\n updated: [],\n deleted: [],\n };\n return parseStringResponse(result, parsers, [stdOut, stdErr]);\n}\n", "import { FetchResult } from '../../../typings';\nimport { parseFetchResult } from '../parsers/parse-fetch';\nimport { StringTask } from '../types';\n\nimport { configurationErrorTask, EmptyTask } from './task';\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function fetchTask(\n remote: string,\n branch: string,\n customArgs: string[]\n): StringTask | EmptyTask {\n const commands = ['fetch', ...customArgs];\n if (remote && branch) {\n commands.push(remote, branch);\n }\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: parseFetchResult,\n };\n}\n", "import { MoveResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser[] = [\n new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => {\n result.moves.push({ from, to });\n }),\n];\n\nexport function parseMoveResult(stdOut: string): MoveResult {\n return parseStringResponse({ moves: [] }, parsers, stdOut);\n}\n", "import { MoveResult } from '../../../typings';\nimport { parseMoveResult } from '../parsers/parse-move';\nimport { StringTask } from '../types';\nimport { asArray } from '../utils';\n\nexport function moveTask(from: string | string[], to: string): StringTask {\n return {\n commands: ['mv', '-v', ...asArray(from), to],\n format: 'utf-8',\n parser: parseMoveResult,\n };\n}\n", "import { PullResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parsePullErrorResult, parsePullResult } from '../parsers/parse-pull';\nimport { Maybe, StringTask } from '../types';\nimport { bufferToString } from '../utils';\n\nexport function pullTask(\n remote: Maybe,\n branch: Maybe,\n customArgs: string[]\n): StringTask {\n const commands: string[] = ['pull', ...customArgs];\n if (remote && branch) {\n commands.splice(1, 0, remote, branch);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(stdOut, stdErr): PullResult {\n return parsePullResult(stdOut, stdErr);\n },\n onError(result, _error, _done, fail) {\n const pullError = parsePullErrorResult(\n bufferToString(result.stdOut),\n bufferToString(result.stdErr)\n );\n if (pullError) {\n return fail(new GitResponseError(pullError));\n }\n\n fail(_error);\n },\n };\n}\n", "import { forEachLineWithContent } from '../utils';\n\nexport interface RemoteWithoutRefs {\n name: string;\n}\n\nexport interface RemoteWithRefs extends RemoteWithoutRefs {\n refs: {\n fetch: string;\n push: string;\n };\n}\n\nexport function parseGetRemotes(text: string): RemoteWithoutRefs[] {\n const remotes: { [name: string]: RemoteWithoutRefs } = {};\n\n forEach(text, ([name]) => (remotes[name] = { name }));\n\n return Object.values(remotes);\n}\n\nexport function parseGetRemotesVerbose(text: string): RemoteWithRefs[] {\n const remotes: { [name: string]: RemoteWithRefs } = {};\n\n forEach(text, ([name, url, purpose]) => {\n if (!Object.hasOwn(remotes, name)) {\n remotes[name] = {\n name: name,\n refs: { fetch: '', push: '' },\n };\n }\n\n if (purpose && url) {\n remotes[name].refs[purpose.replace(/[^a-z]/g, '') as keyof RemoteWithRefs['refs']] = url;\n }\n });\n\n return Object.values(remotes);\n}\n\nfunction forEach(text: string, handler: (line: string[]) => void) {\n forEachLineWithContent(text, (line) => handler(line.split(/\\s+/)));\n}\n", "import {\n parseGetRemotes,\n parseGetRemotesVerbose,\n type RemoteWithoutRefs,\n type RemoteWithRefs,\n} from '../responses/GetRemoteSummary';\nimport type { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addRemoteTask(\n remoteName: string,\n remoteRepo: string,\n customArgs: string[]\n): StringTask {\n return straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]);\n}\n\nexport function getRemotesTask(verbose: true): StringTask;\nexport function getRemotesTask(verbose: false): StringTask;\nexport function getRemotesTask(\n verbose: boolean\n): StringTask {\n const commands = ['remote'];\n if (verbose) {\n commands.push('-v');\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: verbose ? parseGetRemotesVerbose : parseGetRemotes,\n };\n}\n\nexport function listRemotesTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'ls-remote') {\n commands.unshift('ls-remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function remoteTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'remote') {\n commands.unshift('remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function removeRemoteTask(remoteName: string) {\n return straightThroughStringTask(['remote', 'remove', remoteName]);\n}\n", "import { LogOptions, LogResult } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { createListLogSummaryParser } from '../parsers/parse-list-log-summary';\nimport type { StringTask } from '../types';\nimport { validateLogFormatConfig } from './diff';\nimport { parseLogOptions } from './log';\nimport type { EmptyTask } from './task';\n\nexport function stashListTask(\n opt: LogOptions = {},\n customArgs: string[]\n): EmptyTask | StringTask {\n const options = parseLogOptions(opt);\n const commands = ['stash', 'list', ...options.commands, ...customArgs];\n const parser = createListLogSummaryParser(\n options.splitter,\n options.fields,\n logFormatFromCommand(commands)\n );\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser,\n }\n );\n}\n", "import { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addSubModuleTask(repo: string, path: string): StringTask {\n return subModuleTask(['add', repo, path]);\n}\n\nexport function initSubModuleTask(customArgs: string[]): StringTask {\n return subModuleTask(['init', ...customArgs]);\n}\n\nexport function subModuleTask(customArgs: string[]): StringTask {\n const commands = [...customArgs];\n if (commands[0] !== 'submodule') {\n commands.unshift('submodule');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function updateSubModuleTask(customArgs: string[]): StringTask {\n return subModuleTask(['update', ...customArgs]);\n}\n", "import { TagResult } from '../../../typings';\n\nexport class TagList implements TagResult {\n constructor(\n public readonly all: string[],\n public readonly latest: string | undefined\n ) {}\n}\n\nexport const parseTagList = function (data: string, customSort = false) {\n const tags = data.split('\\n').map(trimmed).filter(Boolean);\n\n if (!customSort) {\n tags.sort(function (tagA, tagB) {\n const partsA = tagA.split('.');\n const partsB = tagB.split('.');\n\n if (partsA.length === 1 || partsB.length === 1) {\n return singleSorted(toNumber(partsA[0]), toNumber(partsB[0]));\n }\n\n for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) {\n const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i]));\n\n if (diff) {\n return diff;\n }\n }\n\n return 0;\n });\n }\n\n const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0);\n\n return new TagList(tags, latest);\n};\n\nfunction singleSorted(a: number, b: number): number {\n const aIsNum = Number.isNaN(a);\n const bIsNum = Number.isNaN(b);\n\n if (aIsNum !== bIsNum) {\n return aIsNum ? 1 : -1;\n }\n\n return aIsNum ? sorted(a, b) : 0;\n}\n\nfunction sorted(a: number, b: number) {\n return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction trimmed(input: string) {\n return input.trim();\n}\n\nfunction toNumber(input: string | undefined) {\n if (typeof input === 'string') {\n return parseInt(input.replace(/^\\D+/g, ''), 10) || 0;\n }\n\n return 0;\n}\n", "import { TagResult } from '../../../typings';\nimport { parseTagList } from '../responses/TagList';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.tags`\n */\nexport function tagListTask(customArgs: string[] = []): StringTask {\n const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option));\n\n return {\n format: 'utf-8',\n commands: ['tag', '-l', ...customArgs],\n parser(text: string) {\n return parseTagList(text, hasCustomSort);\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addTagTask(name: string): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', name],\n parser() {\n return { name };\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addAnnotatedTagTask(\n name: string,\n tagMessage: string\n): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', '-a', '-m', tagMessage, name],\n parser() {\n return { name };\n },\n };\n}\n", "const { GitExecutor } = require('./lib/runners/git-executor');\nconst { SimpleGitApi } = require('./lib/simple-git-api');\n\nconst { Scheduler } = require('./lib/runners/scheduler');\nconst { configurationErrorTask } = require('./lib/tasks/task');\nconst {\n asArray,\n filterArray,\n filterPrimitives,\n filterString,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} = require('./lib/utils');\nconst { applyPatchTask } = require('./lib/tasks/apply-patch');\nconst {\n branchTask,\n branchLocalTask,\n deleteBranchesTask,\n deleteBranchTask,\n} = require('./lib/tasks/branch');\nconst { checkIgnoreTask } = require('./lib/tasks/check-ignore');\nconst { checkIsRepoTask } = require('./lib/tasks/check-is-repo');\nconst { cloneTask, cloneMirrorTask } = require('./lib/tasks/clone');\nconst { cleanWithOptionsTask, isCleanOptionsArray } = require('./lib/tasks/clean');\nconst { diffSummaryTask } = require('./lib/tasks/diff');\nconst { fetchTask } = require('./lib/tasks/fetch');\nconst { moveTask } = require('./lib/tasks/move');\nconst { pullTask } = require('./lib/tasks/pull');\nconst { pushTagsTask } = require('./lib/tasks/push');\nconst {\n addRemoteTask,\n getRemotesTask,\n listRemotesTask,\n remoteTask,\n removeRemoteTask,\n} = require('./lib/tasks/remote');\nconst { getResetMode, resetTask } = require('./lib/tasks/reset');\nconst { stashListTask } = require('./lib/tasks/stash-list');\nconst {\n addSubModuleTask,\n initSubModuleTask,\n subModuleTask,\n updateSubModuleTask,\n} = require('./lib/tasks/sub-module');\nconst { addAnnotatedTagTask, addTagTask, tagListTask } = require('./lib/tasks/tag');\nconst { straightThroughBufferTask, straightThroughStringTask } = require('./lib/tasks/task');\n\nfunction Git(options, plugins) {\n this._plugins = plugins;\n this._executor = new GitExecutor(\n options.baseDir,\n new Scheduler(options.maxConcurrentProcesses),\n plugins\n );\n\n this._trimmed = options.trimmed;\n}\n\n(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git;\n\n/**\n * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on\n * the system path, or a fully qualified path to the executable.\n */\nGit.prototype.customBinary = function (command) {\n this._plugins.reconfigure('binary', command);\n return this;\n};\n\n/**\n * Sets an environment variable for the spawned child process, either supply both a name and value as strings or\n * a single object to entirely replace the current environment variables.\n *\n * @param {string|Object} name\n * @param {string} [value]\n * @returns {Git}\n */\nGit.prototype.env = function (name, value) {\n if (arguments.length === 1 && typeof name === 'object') {\n this._executor.env = name;\n } else {\n (this._executor.env = this._executor.env || {})[name] = value;\n }\n\n return this;\n};\n\n/**\n * List the stash(s) of the local repo\n */\nGit.prototype.stashList = function (options) {\n return this._runTask(\n stashListTask(\n trailingOptionsArgument(arguments) || {},\n (filterArray(options) && options) || []\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\nfunction createCloneTask(api, task, repoPath, localPath) {\n if (typeof repoPath !== 'string') {\n return configurationErrorTask(`git.${api}() requires a string 'repoPath'`);\n }\n\n return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments));\n}\n\n/**\n * Clone a git repo\n */\nGit.prototype.clone = function () {\n return this._runTask(\n createCloneTask('clone', cloneTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Mirror a git repo\n */\nGit.prototype.mirror = function () {\n return this._runTask(\n createCloneTask('mirror', cloneMirrorTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Moves one or more files to a new destination.\n *\n * @see https://git-scm.com/docs/git-mv\n *\n * @param {string|string[]} from\n * @param {string} to\n */\nGit.prototype.mv = function (from, to) {\n return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments));\n};\n\n/**\n * Internally uses pull and tags to get the list of tags then checks out the latest tag.\n *\n * @param {Function} [then]\n */\nGit.prototype.checkoutLatestTag = function (then) {\n var git = this;\n return this.pull(function () {\n git.tags(function (err, tags) {\n git.checkout(tags.latest, then);\n });\n });\n};\n\n/**\n * Pull the updated contents of the current repo\n */\nGit.prototype.pull = function (remote, branch, options, then) {\n return this._runTask(\n pullTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Fetch the updated contents of the current repo.\n *\n * @example\n * .fetch('upstream', 'master') // fetches from master on remote named upstream\n * .fetch(function () {}) // runs fetch against default remote and branch and calls function\n *\n * @param {string} [remote]\n * @param {string} [branch]\n */\nGit.prototype.fetch = function (remote, branch) {\n return this._runTask(\n fetchTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in\n * a production environment.\n *\n * @param {boolean} silence\n * @returns {Git}\n */\nGit.prototype.silent = function (silence) {\n console.warn(\n 'simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'\n );\n return this;\n};\n\n/**\n * List all tags. When using git 2.7.0 or above, include an options object with `\"--sort\": \"property-name\"` to\n * sort the tags by that property instead of using the default semantic versioning sort.\n *\n * Note, supplying this option when it is not supported by your Git version will cause the operation to fail.\n *\n * @param {Object} [options]\n * @param {Function} [then]\n */\nGit.prototype.tags = function (options, then) {\n return this._runTask(\n tagListTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Rebases the current working copy. Options can be supplied either as an array of string parameters\n * to be sent to the `git rebase` command, or a standard options object.\n */\nGit.prototype.rebase = function () {\n return this._runTask(\n straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Reset a repo\n */\nGit.prototype.reset = function (mode) {\n return this._runTask(\n resetTask(getResetMode(mode), getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Revert one or more commits in the local working copy\n */\nGit.prototype.revert = function (commit) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof commit !== 'string') {\n return this._runTask(configurationErrorTask('Commit must be a string'), next);\n }\n\n return this._runTask(\n straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]),\n next\n );\n};\n\n/**\n * Add a lightweight tag to the head of the current branch\n */\nGit.prototype.addTag = function (name) {\n const task =\n typeof name === 'string'\n ? addTagTask(name)\n : configurationErrorTask('Git.addTag requires a tag name');\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Add an annotated tag to the head of the current branch\n */\nGit.prototype.addAnnotatedTag = function (tagName, tagMessage) {\n return this._runTask(\n addAnnotatedTagTask(tagName, tagMessage),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete a local branch\n */\nGit.prototype.deleteLocalBranch = function (branchName, forceDelete, then) {\n return this._runTask(\n deleteBranchTask(branchName, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete one or more local branches\n */\nGit.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) {\n return this._runTask(\n deleteBranchesTask(branchNames, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * List all branches\n *\n * @param {Object | string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.branch = function (options, then) {\n return this._runTask(\n branchTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Return list of local branches\n *\n * @param {Function} [then]\n */\nGit.prototype.branchLocal = function (then) {\n return this._runTask(branchLocalTask(), trailingFunctionArgument(arguments));\n};\n\n/**\n * Executes any command against the git binary.\n */\nGit.prototype.raw = function (commands) {\n const createRestCommands = !Array.isArray(commands);\n const command = [].slice.call(createRestCommands ? arguments : commands, 0);\n\n for (let i = 0; i < command.length && createRestCommands; i++) {\n if (!filterPrimitives(command[i])) {\n command.splice(i, command.length - i);\n break;\n }\n }\n\n command.push(...getTrailingOptions(arguments, 0, true));\n\n var next = trailingFunctionArgument(arguments);\n\n if (!command.length) {\n return this._runTask(\n configurationErrorTask('Raw: must supply one or more command to execute'),\n next\n );\n }\n\n return this._runTask(straightThroughStringTask(command, this._trimmed), next);\n};\n\nGit.prototype.submoduleAdd = function (repo, path, then) {\n return this._runTask(addSubModuleTask(repo, path), trailingFunctionArgument(arguments));\n};\n\nGit.prototype.submoduleUpdate = function (args, then) {\n return this._runTask(\n updateSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.submoduleInit = function (args, then) {\n return this._runTask(\n initSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.subModule = function (options, then) {\n return this._runTask(\n subModuleTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.listRemote = function () {\n return this._runTask(\n listRemotesTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Adds a remote to the list of remotes.\n */\nGit.prototype.addRemote = function (remoteName, remoteRepo, then) {\n return this._runTask(\n addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes an entry by name from the list of remotes.\n */\nGit.prototype.removeRemote = function (remoteName, then) {\n return this._runTask(removeRemoteTask(remoteName), trailingFunctionArgument(arguments));\n};\n\n/**\n * Gets the currently available remotes, setting the optional verbose argument to true includes additional\n * detail on the remotes themselves.\n */\nGit.prototype.getRemotes = function (verbose, then) {\n return this._runTask(getRemotesTask(verbose === true), trailingFunctionArgument(arguments));\n};\n\n/**\n * Call any `git remote` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.remote = function (options, then) {\n return this._runTask(\n remoteTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Call any `git tag` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.tag = function (options, then) {\n const command = getTrailingOptions(arguments);\n\n if (command[0] !== 'tag') {\n command.unshift('tag');\n }\n\n return this._runTask(straightThroughStringTask(command), trailingFunctionArgument(arguments));\n};\n\n/**\n * Updates repository server info\n *\n * @param {Function} [then]\n */\nGit.prototype.updateServerInfo = function (then) {\n return this._runTask(\n straightThroughStringTask(['update-server-info']),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the\n * default configured remote spec.\n *\n * @param {string} [remote]\n * @param {Function} [then]\n */\nGit.prototype.pushTags = function (remote, then) {\n const task = pushTagsTask(\n { remote: filterType(remote, filterString) },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Removes the named files from source control.\n */\nGit.prototype.rm = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '-f', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To\n * completely remove the files, use `rm`.\n *\n * @param {string|string[]} files\n */\nGit.prototype.rmKeepLocal = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '--cached', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content,\n * size, and type.\n *\n * Passing \"-p\" will instruct cat-file to determine the object type, and display its formatted contents.\n *\n * @param {string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.catFile = function (options, then) {\n return this._catFile('utf-8', arguments);\n};\n\nGit.prototype.binaryCatFile = function () {\n return this._catFile('buffer', arguments);\n};\n\nGit.prototype._catFile = function (format, args) {\n var handler = trailingFunctionArgument(args);\n var command = ['cat-file'];\n var options = args[0];\n\n if (typeof options === 'string') {\n return this._runTask(\n configurationErrorTask('Git.catFile: options must be supplied as an array of strings'),\n handler\n );\n }\n\n if (Array.isArray(options)) {\n command.push.apply(command, options);\n }\n\n const task =\n format === 'buffer' ? straightThroughBufferTask(command) : straightThroughStringTask(command);\n\n return this._runTask(task, handler);\n};\n\nGit.prototype.diff = function (options, then) {\n const task = filterString(options)\n ? configurationErrorTask(\n 'git.diff: supplying options as a single string is no longer supported, switch to an array of strings'\n )\n : straightThroughStringTask(['diff', ...getTrailingOptions(arguments)]);\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.diffSummary = function () {\n return this._runTask(\n diffSummaryTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.applyPatch = function (patches) {\n const task = !filterStringOrStringArray(patches)\n ? configurationErrorTask(\n `git.applyPatch requires one or more string patches as the first argument`\n )\n : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1)));\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.revparse = function () {\n const commands = ['rev-parse', ...getTrailingOptions(arguments, true)];\n return this._runTask(\n straightThroughStringTask(commands, true),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n */\nGit.prototype.clean = function (mode, options, then) {\n const usingCleanOptionsArray = isCleanOptionsArray(mode);\n const cleanMode =\n (usingCleanOptionsArray && mode.join('')) || filterType(mode, filterString) || '';\n const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0));\n\n return this._runTask(\n cleanWithOptionsTask(cleanMode, customArgs),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.exec = function (then) {\n const task = {\n commands: [],\n format: 'utf-8',\n parser() {\n if (typeof then === 'function') {\n then();\n }\n },\n };\n\n return this._runTask(task);\n};\n\n/**\n * Clears the queue of pending commands and returns the wrapper instance for chaining.\n *\n * @returns {Git}\n */\nGit.prototype.clearQueue = function () {\n // TODO:\n // this._executor.clear();\n return this;\n};\n\n/**\n * Check if a pathname or pathnames are excluded by .gitignore\n *\n * @param {string|string[]} pathnames\n * @param {Function} [then]\n */\nGit.prototype.checkIgnore = function (pathnames, then) {\n return this._runTask(\n checkIgnoreTask(asArray(filterType(pathnames, filterStringOrStringArray, []))),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.checkIsRepo = function (checkType, then) {\n return this._runTask(\n checkIsRepoTask(filterType(checkType, filterString)),\n trailingFunctionArgument(arguments)\n );\n};\n\nmodule.exports = Git;\n", "import { pathspec } from './args/pathspec';\nimport { GitConstructError } from './errors/git-construct-error';\nimport { GitError } from './errors/git-error';\nimport { GitPluginError } from './errors/git-plugin-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { TaskConfigurationError } from './errors/task-configuration-error';\nimport { CheckRepoActions } from './tasks/check-is-repo';\nimport { CleanOptions } from './tasks/clean';\nimport { GitConfigScope } from './tasks/config';\nimport { DiffNameStatus } from './tasks/diff-name-status';\nimport { grepQueryBuilder } from './tasks/grep';\nimport { ResetMode } from './tasks/reset';\n\nexport {\n CheckRepoActions,\n CleanOptions,\n DiffNameStatus,\n GitConfigScope,\n GitConstructError,\n GitError,\n GitPluginError,\n GitResponseError,\n ResetMode,\n TaskConfigurationError,\n grepQueryBuilder,\n pathspec,\n};\n", "import { GitError } from './git-error';\nimport { SimpleGitOptions } from '../types';\n\n/**\n * The `GitConstructError` is thrown when an error occurs in the constructor\n * of the `simple-git` instance itself. Most commonly as a result of using\n * a `baseDir` option that points to a folder that either does not exist,\n * or cannot be read by the user the node script is running as.\n *\n * Check the `.message` property for more detail including the properties\n * passed to the constructor.\n */\nexport class GitConstructError extends GitError {\n constructor(\n public readonly config: SimpleGitOptions,\n message: string\n ) {\n super(undefined, message);\n }\n}\n", "import { SimpleGitOptions, SimpleGitTask } from '../types';\nimport { GitError } from './git-error';\n\nexport class GitPluginError extends GitError {\n constructor(\n public task?: SimpleGitTask,\n public readonly plugin?: keyof SimpleGitOptions,\n message?: string\n ) {\n super(task, message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n", "import { SimpleGitOptions } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function abortPlugin(signal: SimpleGitOptions['abort']) {\n if (!signal) {\n return;\n }\n\n const onSpawnAfter: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n function kill() {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort signal received'));\n }\n\n signal.addEventListener('abort', kill);\n\n context.spawned.on('close', () => signal.removeEventListener('abort', kill));\n },\n };\n\n const onSpawnBefore: SimpleGitPlugin<'spawn.before'> = {\n type: 'spawn.before',\n action(_data, context) {\n if (signal.aborted) {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort already signaled'));\n }\n },\n };\n\n return [onSpawnBefore, onSpawnAfter];\n}\n", "import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport type { SimpleGitPluginConfig } from '../types';\n\nfunction isConfigSwitch(arg: string | unknown) {\n return typeof arg === 'string' && arg.trim().toLowerCase() === '-c';\n}\n\nfunction preventProtocolOverride(arg: string, next: string) {\n if (!isConfigSwitch(arg)) {\n return;\n }\n\n if (!/^\\s*protocol(.[a-z]+)?.allow/.test(next)) {\n return;\n }\n\n throw new GitPluginError(\n undefined,\n 'unsafe',\n 'Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol'\n );\n}\n\nfunction preventUploadPack(arg: string, method: string) {\n if (/^\\s*--(upload|receive)-pack/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'clone' && /^\\s*-u\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of clone with option -u is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'push' && /^\\s*--exec\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of push with option --exec is not permitted without enabling allowUnsafePack`\n );\n }\n}\n\nexport function blockUnsafeOperationsPlugin({\n allowUnsafeProtocolOverride = false,\n allowUnsafePack = false,\n}: SimpleGitPluginConfig['unsafe'] = {}): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(args, context) {\n args.forEach((current, index) => {\n const next = index < args.length ? args[index + 1] : '';\n\n allowUnsafeProtocolOverride || preventProtocolOverride(current, next);\n allowUnsafePack || preventUploadPack(current, context.method);\n });\n\n return args;\n },\n };\n}\n", "import { prefixedArray } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function commandConfigPrefixingPlugin(\n configuration: string[]\n): SimpleGitPlugin<'spawn.args'> {\n const prefix = prefixedArray(configuration, '-c');\n\n return {\n type: 'spawn.args',\n action(data) {\n return [...prefix, ...data];\n },\n };\n}\n", "import { deferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { SimpleGitPluginConfig } from '../types';\nimport { delay } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nconst never = deferred().promise;\n\nexport function completionDetectionPlugin({\n onClose = true,\n onExit = 50,\n}: SimpleGitPluginConfig['completion'] = {}): SimpleGitPlugin<'spawn.after'> {\n function createEvents() {\n let exitCode = -1;\n const events = {\n close: deferred(),\n closeTimeout: deferred(),\n exit: deferred(),\n exitTimeout: deferred(),\n };\n\n const result = Promise.race([\n onClose === false ? never : events.closeTimeout.promise,\n onExit === false ? never : events.exitTimeout.promise,\n ]);\n\n configureTimeout(onClose, events.close, events.closeTimeout);\n configureTimeout(onExit, events.exit, events.exitTimeout);\n\n return {\n close(code: number) {\n exitCode = code;\n events.close.done();\n },\n exit(code: number) {\n exitCode = code;\n events.exit.done();\n },\n get exitCode() {\n return exitCode;\n },\n result,\n };\n }\n\n function configureTimeout(\n flag: boolean | number,\n event: DeferredPromise,\n timeout: DeferredPromise\n ) {\n if (flag === false) {\n return;\n }\n\n (flag === true ? event.promise : event.promise.then(() => delay(flag))).then(timeout.done);\n }\n\n return {\n type: 'spawn.after',\n async action(_data, { spawned, close }) {\n const events = createEvents();\n\n let deferClose = true;\n let quickClose = () => void (deferClose = false);\n\n spawned.stdout?.on('data', quickClose);\n spawned.stderr?.on('data', quickClose);\n spawned.on('error', quickClose);\n\n spawned.on('close', (code: number) => events.close(code));\n spawned.on('exit', (code: number) => events.exit(code));\n\n try {\n await events.result;\n if (deferClose) {\n await delay(50);\n }\n close(events.exitCode);\n } catch (err) {\n close(events.exitCode, err as Error);\n }\n },\n };\n}\n", "import type { SimpleGitOptions } from '../types';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport { asArray } from '../utils';\nimport { PluginStore } from './plugin-store';\n\nconst WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`;\nconst WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`;\n\nfunction isBadArgument(arg: string) {\n return !arg || !/^([a-z]:)?([a-z0-9/.\\\\_~-]+)$/i.test(arg);\n}\n\nfunction toBinaryConfig(\n input: string[],\n allowUnsafe: boolean\n): { binary: string; prefix?: string } {\n if (input.length < 1 || input.length > 2) {\n throw new GitPluginError(undefined, 'binary', WRONG_NUMBER_ERR);\n }\n\n const isBad = input.some(isBadArgument);\n if (isBad) {\n if (allowUnsafe) {\n console.warn(WRONG_CHARS_ERR);\n } else {\n throw new GitPluginError(undefined, 'binary', WRONG_CHARS_ERR);\n }\n }\n\n const [binary, prefix] = input;\n return {\n binary,\n prefix,\n };\n}\n\nexport function customBinaryPlugin(\n plugins: PluginStore,\n input: SimpleGitOptions['binary'] = ['git'],\n allowUnsafe = false\n) {\n let config = toBinaryConfig(asArray(input), allowUnsafe);\n\n plugins.on('binary', (input) => {\n config = toBinaryConfig(asArray(input), allowUnsafe);\n });\n\n plugins.append('spawn.binary', () => {\n return config.binary;\n });\n\n plugins.append('spawn.args', (data) => {\n return config.prefix ? [config.prefix, ...data] : data;\n });\n}\n", "import { GitError } from '../errors/git-error';\nimport { GitExecutorResult, SimpleGitPluginConfig } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\ntype TaskResult = Omit;\n\nfunction isTaskError(result: TaskResult) {\n return !!(result.exitCode && result.stdErr.length);\n}\n\nfunction getErrorMessage(result: TaskResult) {\n return Buffer.concat([...result.stdOut, ...result.stdErr]);\n}\n\nexport function errorDetectionHandler(\n overwrite = false,\n isError = isTaskError,\n errorMessage: (result: TaskResult) => Buffer | Error = getErrorMessage\n) {\n return (error: Buffer | Error | undefined, result: TaskResult) => {\n if ((!overwrite && error) || !isError(result)) {\n return error;\n }\n\n return errorMessage(result);\n };\n}\n\nexport function errorDetectionPlugin(\n config: SimpleGitPluginConfig['errors']\n): SimpleGitPlugin<'task.error'> {\n return {\n type: 'task.error',\n action(data, context) {\n const error = config(data.error, {\n stdErr: context.stdErr,\n stdOut: context.stdOut,\n exitCode: context.exitCode,\n });\n\n if (Buffer.isBuffer(error)) {\n return { error: new GitError(undefined, error.toString('utf-8')) };\n }\n\n return {\n error,\n };\n },\n };\n}\n", "import { EventEmitter } from 'node:events';\n\nimport type {\n SimpleGitPlugin,\n SimpleGitPluginType,\n SimpleGitPluginTypes,\n} from './simple-git-plugin';\nimport { append, asArray } from '../utils';\nimport type { SimpleGitPluginConfig } from '../types';\n\nexport class PluginStore {\n private plugins: Set> = new Set();\n private events = new EventEmitter();\n\n on(\n type: K,\n listener: (data: SimpleGitPluginConfig[K]) => void\n ) {\n this.events.on(type, listener);\n }\n\n reconfigure(type: K, data: SimpleGitPluginConfig[K]) {\n this.events.emit(type, data);\n }\n\n public append(type: T, action: SimpleGitPlugin['action']) {\n const plugin = append(this.plugins, { type, action });\n\n return () => this.plugins.delete(plugin);\n }\n\n public add(\n plugin: void | SimpleGitPlugin | SimpleGitPlugin[]\n ) {\n const plugins: SimpleGitPlugin[] = [];\n\n asArray(plugin).forEach((plugin) => plugin && this.plugins.add(append(plugins, plugin)));\n\n return () => {\n plugins.forEach((plugin) => this.plugins.delete(plugin));\n };\n }\n\n public exec(\n type: T,\n data: SimpleGitPluginTypes[T]['data'],\n context: SimpleGitPluginTypes[T]['context']\n ): typeof data {\n let output = data;\n const contextual = Object.freeze(Object.create(context));\n\n for (const plugin of this.plugins) {\n if (plugin.type === type) {\n output = plugin.action(output, contextual);\n }\n }\n\n return output;\n }\n}\n", "import { SimpleGitOptions } from '../types';\nimport { asNumber, including } from '../utils';\n\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function progressMonitorPlugin(progress: Exclude) {\n const progressCommand = '--progress';\n const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push'];\n\n const onProgress: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n if (!context.commands.includes(progressCommand)) {\n return;\n }\n\n context.spawned.stderr?.on('data', (chunk: Buffer) => {\n const message = /^([\\s\\S]+?):\\s*(\\d+)% \\((\\d+)\\/(\\d+)\\)/.exec(chunk.toString('utf8'));\n if (!message) {\n return;\n }\n\n progress({\n method: context.method,\n stage: progressEventStage(message[1]),\n progress: asNumber(message[2]),\n processed: asNumber(message[3]),\n total: asNumber(message[4]),\n });\n });\n },\n };\n\n const onArgs: SimpleGitPlugin<'spawn.args'> = {\n type: 'spawn.args',\n action(args, context) {\n if (!progressMethods.includes(context.method)) {\n return args;\n }\n\n return including(args, progressCommand);\n },\n };\n\n return [onArgs, onProgress];\n}\n\nfunction progressEventStage(input: string) {\n return String(input.toLowerCase().split(' ', 1)) || 'unknown';\n}\n", "import { SpawnOptions } from 'child_process';\nimport { pick } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function spawnOptionsPlugin(\n spawnOptions: Partial\n): SimpleGitPlugin<'spawn.options'> {\n const options = pick(spawnOptions, ['uid', 'gid']);\n\n return {\n type: 'spawn.options',\n action(data) {\n return { ...options, ...data };\n },\n };\n}\n", "import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport type { SimpleGitOptions } from '../types';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function timeoutPlugin({\n block,\n stdErr = true,\n stdOut = true,\n}: Exclude): SimpleGitPlugin<'spawn.after'> | void {\n if (block > 0) {\n return {\n type: 'spawn.after',\n action(_data, context) {\n let timeout: NodeJS.Timeout;\n\n function wait() {\n timeout && clearTimeout(timeout);\n timeout = setTimeout(kill, block);\n }\n\n function stop() {\n context.spawned.stdout?.off('data', wait);\n context.spawned.stderr?.off('data', wait);\n context.spawned.off('exit', stop);\n context.spawned.off('close', stop);\n timeout && clearTimeout(timeout);\n }\n\n function kill() {\n stop();\n context.kill(new GitPluginError(undefined, 'timeout', `block timeout reached`));\n }\n\n stdOut && context.spawned.stdout?.on('data', wait);\n stdErr && context.spawned.stderr?.on('data', wait);\n context.spawned.on('exit', stop);\n context.spawned.on('close', stop);\n\n wait();\n },\n };\n }\n}\n", "import { SimpleGitPlugin } from './simple-git-plugin';\nimport { isPathSpec, toPaths } from '../args/pathspec';\n\nexport function suffixPathsPlugin(): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(data) {\n const prefix: string[] = [];\n let suffix: undefined | string[];\n function append(args: string[]) {\n (suffix = suffix || []).push(...args);\n }\n\n for (let i = 0; i < data.length; i++) {\n const param = data[i];\n\n if (isPathSpec(param)) {\n append(toPaths(param));\n continue;\n }\n\n if (param === '--') {\n append(\n data.slice(i + 1).flatMap((item) => (isPathSpec(item) && toPaths(item)) || item)\n );\n break;\n }\n\n prefix.push(param);\n }\n\n return !suffix ? prefix : [...prefix, '--', ...suffix.map(String)];\n },\n };\n}\n", "import { SimpleGitFactory } from '../../typings';\n\nimport * as api from './api';\nimport {\n abortPlugin,\n blockUnsafeOperationsPlugin,\n commandConfigPrefixingPlugin,\n completionDetectionPlugin,\n customBinaryPlugin,\n errorDetectionHandler,\n errorDetectionPlugin,\n PluginStore,\n progressMonitorPlugin,\n spawnOptionsPlugin,\n timeoutPlugin,\n} from './plugins';\nimport { suffixPathsPlugin } from './plugins/suffix-paths.plugin';\nimport { createInstanceConfig, folderExists } from './utils';\nimport { SimpleGitOptions } from './types';\n\nconst Git = require('../git');\n\n/**\n * Adds the necessary properties to the supplied object to enable it for use as\n * the default export of a module.\n *\n * Eg: `module.exports = esModuleFactory({ something () {} })`\n */\nexport function esModuleFactory(defaultExport: T) {\n return Object.defineProperties(defaultExport, {\n __esModule: { value: true },\n default: { value: defaultExport },\n }) as T & { __esModule: true; default: T };\n}\n\nexport function gitExportFactory(factory: SimpleGitFactory) {\n return Object.assign(factory.bind(null), api);\n}\n\nexport function gitInstanceFactory(\n baseDir?: string | Partial,\n options?: Partial\n) {\n const plugins = new PluginStore();\n const config = createInstanceConfig(\n (baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir)) || {},\n options\n );\n\n if (!folderExists(config.baseDir)) {\n throw new api.GitConstructError(\n config,\n `Cannot use simple-git on a directory that does not exist`\n );\n }\n\n if (Array.isArray(config.config)) {\n plugins.add(commandConfigPrefixingPlugin(config.config));\n }\n\n plugins.add(blockUnsafeOperationsPlugin(config.unsafe));\n plugins.add(suffixPathsPlugin());\n plugins.add(completionDetectionPlugin(config.completion));\n config.abort && plugins.add(abortPlugin(config.abort));\n config.progress && plugins.add(progressMonitorPlugin(config.progress));\n config.timeout && plugins.add(timeoutPlugin(config.timeout));\n config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions));\n\n plugins.add(errorDetectionPlugin(errorDetectionHandler(true)));\n config.errors && plugins.add(errorDetectionPlugin(config.errors));\n\n customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary);\n\n return new Git(config, plugins);\n}\n", "import { SimpleGit, SimpleGitOptions } from '../../../typings';\n\nimport { GitResponseError } from '../errors/git-response-error';\nimport { gitInstanceFactory } from '../git-factory';\nimport { SimpleGitTaskCallback } from '../types';\n\nconst functionNamesBuilderApi = ['customBinary', 'env', 'outputHandler', 'silent'];\n\nconst functionNamesPromiseApi = [\n 'add',\n 'addAnnotatedTag',\n 'addConfig',\n 'addRemote',\n 'addTag',\n 'applyPatch',\n 'binaryCatFile',\n 'branch',\n 'branchLocal',\n 'catFile',\n 'checkIgnore',\n 'checkIsRepo',\n 'checkout',\n 'checkoutBranch',\n 'checkoutLatestTag',\n 'checkoutLocalBranch',\n 'clean',\n 'clone',\n 'commit',\n 'cwd',\n 'deleteLocalBranch',\n 'deleteLocalBranches',\n 'diff',\n 'diffSummary',\n 'exec',\n 'fetch',\n 'getRemotes',\n 'init',\n 'listConfig',\n 'listRemote',\n 'log',\n 'merge',\n 'mergeFromTo',\n 'mirror',\n 'mv',\n 'pull',\n 'push',\n 'pushTags',\n 'raw',\n 'rebase',\n 'remote',\n 'removeRemote',\n 'reset',\n 'revert',\n 'revparse',\n 'rm',\n 'rmKeepLocal',\n 'show',\n 'stash',\n 'stashList',\n 'status',\n 'subModule',\n 'submoduleAdd',\n 'submoduleInit',\n 'submoduleUpdate',\n 'tag',\n 'tags',\n 'updateServerInfo',\n];\n\nexport function gitP(\n ...args: [] | [string] | [Partial] | [string, Partial]\n): SimpleGit {\n let git: any;\n\n let chain = Promise.resolve();\n\n try {\n git = gitInstanceFactory(...args);\n } catch (e) {\n chain = Promise.reject(e);\n }\n\n function builderReturn() {\n return promiseApi;\n }\n\n function chainReturn() {\n return chain;\n }\n\n const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce(\n (api: any, name: string) => {\n const isAsync = functionNamesPromiseApi.includes(name);\n\n const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api);\n const alternative = isAsync ? chainReturn : builderReturn;\n\n Object.defineProperty(api, name, {\n enumerable: false,\n configurable: false,\n value: git ? valid : alternative,\n });\n\n return api;\n },\n {}\n );\n\n return promiseApi as SimpleGit;\n\n function asyncWrapper(fn: string, git: any): (...args: any[]) => Promise {\n return function (...args: any[]) {\n if (typeof args[args.length] === 'function') {\n throw new TypeError(\n 'Promise interface requires that handlers are not supplied inline, ' +\n 'trailing function not allowed in call to ' +\n fn\n );\n }\n\n return chain.then(function () {\n return new Promise(function (resolve, reject) {\n const callback: SimpleGitTaskCallback = (err: Error | null, result?: any) => {\n if (err) {\n return reject(toError(err));\n }\n\n resolve(result);\n };\n args.push(callback);\n\n git[fn].apply(git, args);\n });\n });\n };\n }\n\n function syncWrapper(fn: string, git: any, api: SimpleGit) {\n return (...args: any[]) => {\n git[fn](...args);\n\n return api;\n };\n }\n}\n\nfunction toError(error: Error | string | any): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n return new GitResponseError(error);\n}\n", "import { gitInstanceFactory } from './lib/git-factory';\n\nexport { gitP } from './lib/runners/promise-wrapped';\nexport * from './lib/api';\n\nexport const simpleGit = gitInstanceFactory;\n\nexport default gitInstanceFactory;\n"], - "mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAiIM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAAA;AAAA;AAAA,WAME,WAAW,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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B;IACF;IACA,iBAAiB,CAAC,kDAAkD;IACpE,mBAAmB,CAAC,6CAA6C;IACjE,kBAAkB;MAChB;IACF;IACA,oBAAoB;MAClB;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,gCAAgC;MAC9B;IACF;IACA,mBAAmB,CAAC,oDAAoD;IACxE,uBAAuB;MACrB;IACF;IACA,oDAAoD;MAClD;IACF;IACA,iBAAiB;MACf;IACF;IACA,kBAAkB;MAChB;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,gCAAgC;MAC9B;IACF;IACA,yBAAyB;MACvB;IACF;IACA,mDAAmD;MACjD;IACF;IACA,gBAAgB;MACd;IACF;IACA,wBAAwB;MACtB;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,gCAAgC;MAC9B;IACF;IACA,qBAAqB,CAAC,0CAA0C;IAChE,sBAAsB,CAAC,+CAA+C;IACtE,kCAAkC;MAChC;IACF;IACA,4BAA4B,CAAC,qCAAqC;IAClE,+BAA+B;MAC7B;IACF;IACA,6BAA6B;MAC3B;IACF;IACA,aAAa,CAAC,2DAA2D;IACzE,sBAAsB;MACpB;IACF;IACA,6BAA6B;MAC3B;IACF;IACA,8BAA8B;MAC5B;IACF;IACA,yBAAyB;MACvB;IACF;IACA,sBAAsB;MACpB;IACF;IACA,wBAAwB;MACtB;IACF;IACA,wDAAwD;MACtD;IACF;IACA,sDAAsD;MACpD;IACF;IACA,yCAAyC;MACvC;IACF;IACA,uCAAuC;MACrC;IACF;IACA,uBAAuB;MACrB;IACF;IACA,yCAAyC;MACvC;IACF;IACA,8BAA8B;MAC5B;IACF;IACA,oCAAoC;MAClC;IACF;IACA,qCAAqC;MACnC;IACF;IACA,iCAAiC;MAC/B;IACF;IACA,sBAAsB,CAAC,iDAAiD;IACxE,iBAAiB,CAAC,4CAA4C;IAC9D,cAAc,CAAC,+CAA+C;IAC9D,gBAAgB,CAAC,0CAA0C;IAC3D,6BAA6B;MAC3B;IACF;IACA,oBAAoB;MAClB;MACA,CAAC;MACD,EAAE,SAAS,CAAC,WAAW,uCAAuC,EAAE;IAClE;IACA,kBAAkB,CAAC,sDAAsD;I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CF;IACA,qBAAqB;MACnB;IACF;IACA,kCAAkC;MAChC;IACF;IACA,qBAAqB;MACnB;IACF;IACA,kBAAkB;MAChB;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,gCAAgC;MAC9B;IACF;IACA,yBAAyB,CAAC,8CAA8C;IACxE,0BAA0B;MACxB;IACF;IACA,uCAAuC;MACrC;IACF;IACA,iCAAiC;MAC/B;IACF;IACA,2CAA2C;MACzC;IACF;IACA,qCAAqC;MACnC;IACF;IACA,2BAA2B;MACzB;IACF;IACA,wCAAwC;MACtC;IACF;IACA,qBAAqB;MACnB;IACF;IACA,+BAA+B;MAC7B;IACF;EACF;EACA,gBAAgB;IACd,sBAAsB,CAAC,uBAAuB;IAC9C,gBAAgB,CAAC,6BAA6B;EAChD;EACA,YAAY;IACV,4CAA4C;MAC1C;IACF;IACA,4BAA4B;MAC1B;IACF;IACA,iCAAiC;MAC/B;IACF;IACA,uCAAuC;MACrC;IACF;IACA,4BAA4B,CAAC,uBAAuB;IACpD,yBAAyB;MACvB;IACF;IACA,0BAA0B;MACxB;IACF;IACA,0CAA0C;MACxC;IACF;IACA,kCAAkC;MAChC;IACF;IACA,oCAAoC;MAClC;IACF;IACA,4BAA4B,CAAC,0CAA0C;IACvE,wBAAwB;MACtB;IACF;IACA,iBAAiB,CAAC,qDAAqD;IACvE,kBAAkB;MAChB;IACF;IACA,kCAAkC;MAChC;IACF;IACA,4BAA4B;MAC1B;IACF;IACA,2BAA2B;MACzB;IACF;IACA,sCAAsC;MACpC;IACF;IACA,yBAAyB,CAAC,uCAAuC;IACjE,iBAAiB,CAAC,+CAA+C;IACjE,cAAc,CAAC,kDAAkD;IACjE,kCAAkC;MAChC;IACF;IACA,kBAAkB;MAChB;IACF;IACA,eAAe;MACb;IACF;IACA,+BAA+B;MAC7B;IACF;IACA,mDAAmD;MACjD;IACF;IACA,0BAA0B,CAAC,sBAAsB;IACjD,oBAAoB;MAClB;MACA,CAAC;MACD,EAAE,mBAAmB,EAAE,QAAQ,MAAM,EAAE;IACzC;IACA,sCAAsC;MACpC;IACF;IACA,gBAAgB,CAAC,oCAA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", - "names": ["exports", "exports", "exports", "exports", "path", "exports", "module", "exports", "module", "exports", "module", "exports", "node", "exports", "module", "exports", "module", "exports", "module", "max", "exports", "module", "toNumber", "exports", "module", "exports", "module", "append", "expand", "exports", "module", "exports", "module", "parse", "index", "exports", "module", "expand", "parse", "require_constants", "exports", "module", "path", "require_utils", "exports", "path", "append", "exports", "module", "require_parse", "exports", "module", "parse", "opts", "value", "append", "first", "rest", "source", "exports", "module", "path", "parse", "state", "append", "require_picomatch", "exports", "module", "exports", "module", "omit", "exports", "path", "pattern", "exports", "module", "exports", "merge", "exports", "require_utils", "exports", "fs", "path", "exports", "exports", "path", "exports", "path", "require_fs", "exports", "fs", "exports", "fs", "exports", "path", "exports", "module", "exports", "module", "queueMicrotask", "require_constants", "exports", "require_fs", "exports", "require_utils", "exports", "fs", "exports", "require_async", "exports", "path", "require_sync", "exports", "require_fs", "exports", "fs", "require_settings", "exports", "path", "fs", "require_out", "exports", "path", "exports", "module", "exports", "module", "cache", "noop", "errorHandler", "context", "handler", "require_common", "exports", "exports", "require_async", "exports", "require_async", "exports", "require_stream", "exports", "require_sync", "exports", "require_sync", "exports", "require_settings", "exports", "path", "require_out", "exports", "require_reader", "exports", "path", "require_stream", "exports", "require_async", "exports", "exports", "exports", "exports", "exports", "exports", "require_entry", "exports", "exports", "path", "require_async", "exports", "require_stream", "exports", "require_sync", "exports", "require_sync", "exports", "require_settings", "exports", "fs", "require_out", "exports", "module", "FastGlob", "posix", "escapePath", "convertPathToPattern", "win32", "exports", "module", "parse", "require_common", "exports", "module", "env", "debug", "exports", "module", "exports", "module", "exports", "module", "env", "exports", "module", "useColors", "debug", "exports", "module", "path", "exists", "exports", "__export", "deferred", "exports", "exports", "module", "NullObject", "parse", "safeParse", "require_ms", "exports", "module", "parse", "require_common", "exports", "module", "env", "debug", "require_browser", "exports", "module", "require_node", "exports", "module", "useColors", "debug", "require_src", "exports", "module", "path", "exists", "exports", "__export", "deferred", "exports", "vscode", "import_promises", "import_path", "fs", "path", "fs", "import_promises", "import_path", "import_promise_deferred", "path", "trimmed", "path", "Buffer", "omit", "ExitCodes", "commands", "parser", "parsers", "parse", "__export", "CheckRepoActions", "CleanOptions", "append", "GitConfigScope", "DiffNameStatus", "ResetMode", "debug", "onError", "excludeOptions", "merge", "handler", "disallowedCommand", "__commonJS", "exports", "module", "GitExecutor", "__toCommonJS", "SimpleGitApi", "Scheduler", "configurationErrorTask", "asArray", "filterArray", "filterPrimitives", "filterString", "filterStringOrStringArray", "filterType", "getTrailingOptions", "trailingFunctionArgument", "trailingOptionsArgument", "applyPatchTask", "branchTask", "branchLocalTask", "deleteBranchesTask", "deleteBranchTask", "checkIgnoreTask", "checkIsRepoTask", "cloneTask", "cloneMirrorTask", "cleanWithOptionsTask", "isCleanOptionsArray", "diffSummaryTask", "fetchTask", "moveTask", "pullTask", "pushTagsTask", "addRemoteTask", "getRemotesTask", "listRemotesTask", "remoteTask", "removeRemoteTask", "getResetMode", "resetTask", "stashListTask", "addSubModuleTask", "initSubModuleTask", "subModuleTask", "updateSubModuleTask", "addAnnotatedTagTask", "addTagTask", "tagListTask", "straightThroughBufferTask", "straightThroughStringTask", "Git", "fs", "path", "path", "workspace", "fs", "fg", "trimmed", "import_path", "path", "import_promises", "import_path", "import_fast_glob", "path", "fs", "fg", "import_promises", "import_path", "path", "fs", "import_promises", "import_path", "import_promises", "import_path", "path", "fs", "path", "areas", "fs", "import_node_child_process", "import_node_util", "name", "method", "hook", "hook", "VERSION", "isPlainObject", "withDefaults", "VERSION", "withDefaults", "request", "endpoint", "VERSION", "noop", "createLogger", "VERSION", "hook", "auth", "VERSION", "request", "path", "VERSION", "VERSION", "VERSION", "VERSION", "endpoint", "cache", "options", "VERSION", "VERSION", "Octokit", "VERSION", "execFileAsync", "Octokit", "vscode", "vscode", "vscode", "vscode", "vscode", "vscode", "vscode", "import_node_path", "path", "fs", "vscode", "import_node_path", "path", "vscode", "vscode", "import_node_buffer", "import_file_exists", "import_debug", "import_child_process", "import_promise_deferred", "import_node_path", "pathspec", "cache", "isPathSpec", "path", "init_pathspec", "__esm", "GitError", "init_git_error", "GitResponseError", "init_git_response_error", "TaskConfigurationError", "init_task_configuration_error", "asFunction", "NOOP", "isUserFunction", "splitOn", "first", "isArrayLike", "last", "filterHasLength", "toLinesWithContent", "trimmed", "forEachLineWithContent", "folderExists", "append", "including", "remove", "asArray", "asCamelCase", "asStringArray", "asNumber", "prefixedArray", "bufferToString", "Buffer", "pick", "delay", "orVoid", "NULL", "objectToString", "init_util", "init_argument_filters", "filterType", "filterPrimitives", "omit", "filterPlainObject", "filterFunction", "filterArray", "filterNumber", "filterString", "filterStringOrStringArray", "ExitCodes", "init_exit_codes", "GitOutputStreams", "init_git_output_streams", "useMatchesDefault", "LineParser", "RemoteLineParser", "init_line_parser", "createInstanceConfig", "defaultOptions", "init_simple_git_options", "appendTaskOptions", "commands", "getTrailingOptions", "trailingOptionsArgument", "trailingArrayArgument", "trailingFunctionArgument", "init_task_options", "callTaskParser", "parser", "parseStringResponse", "parsers", "parse", "init_task_parser", "utils_exports", "__export", "init_utils", "check_is_repo_exports", "CheckRepoActions", "checkIsBareRepoTask", "checkIsRepoRootTask", "checkIsRepoTask", "onError", "isNotRepoMessage", "init_check_is_repo", "cleanSummaryParser", "CleanResponse", "dryRunRemovalRegexp", "removalRegexp", "isFolderRegexp", "init_CleanSummary", "task_exports", "EMPTY_COMMANDS", "adhocExecTask", "configurationErrorTask", "isBufferTask", "isEmptyTask", "straightThroughBufferTask", "straightThroughStringTask", "init_task", "clean_exports", "CONFIG_ERROR_INTERACTIVE_MODE", "CONFIG_ERROR_MODE_REQUIRED", "CONFIG_ERROR_UNKNOWN_OPTION", "CleanOptions", "cleanTask", "cleanWithOptionsTask", "isCleanOptionsArray", "getCleanOptions", "isInteractiveMode", "CleanOptionValues", "isCleanMode", "isKnownOption", "init_clean", "configListParser", "ConfigList", "configParser", "configGetParser", "configFilePath", "init_ConfigList", "asConfigScope", "GitConfigScope", "addConfigTask", "getConfigTask", "listConfigTask", "config_default", "init_config", "isDiffNameStatus", "diffNameStatus", "DiffNameStatus", "init_diff_name_status", "grepQueryBuilder", "GrepQuery", "parseGrep", "grep_default", "disallowedOptions", "Query", "_a", "init_grep", "reset_exports", "ResetMode", "getResetMode", "resetTask", "isValidResetMode", "validResetModes", "init_reset", "createLog", "debug", "prefixedLogger", "childLoggerName", "createLogger", "init_git_logger", "TasksPendingQueue", "init_tasks_pending_queue", "pluginContext", "onErrorReceived", "onDataReceived", "GitExecutorChain", "init_git_executor_chain", "git_executor_exports", "GitExecutor", "init_git_executor", "taskCallback", "addDeprecationNoticeToError", "init_task_callback", "changeWorkingDirectoryTask", "init_change_working_directory", "checkoutTask", "checkout_default", "init_checkout", "countObjectsResponse", "count_objects_default", "init_count_objects", "parseCommitResult", "init_parse_commit", "commitTask", "commit_default", "init_commit", "first_commit_default", "init_first_commit", "hashObjectTask", "init_hash_object", "parseInit", "initResponseRegex", "InitSummary", "reInitResponseRegex", "init_InitSummary", "hasBareCommand", "bareCommand", "initTask", "init_init", "logFormatFromCommand", "logFormatRegex", "isLogFormat", "init_log_format", "DiffSummary", "init_DiffSummary", "getDiffParser", "diffSummaryParsers", "statParser", "numStatParser", "nameOnlyParser", "nameStatusParser", "init_parse_diff_summary", "lineBuilder", "createListLogSummaryParser", "SPLITTER", "defaultFieldNames", "START_BOUNDARY", "COMMIT_BOUNDARY", "init_parse_list_log_summary", "diff_exports", "diffSummaryTask", "validateLogFormatConfig", "init_diff", "prettyFormat", "userOptions", "excludeOptions", "parseLogOptions", "logTask", "log_default", "init_log", "MergeSummaryConflict", "MergeSummaryDetail", "init_MergeSummary", "PullSummary", "PullFailedSummary", "init_PullSummary", "objectEnumerationResult", "asObjectCount", "remoteMessagesObjectParsers", "init_parse_remote_objects", "parseRemoteMessages", "RemoteMessageSummary", "init_parse_remote_messages", "parsePullErrorResult", "errorParsers", "FILE_UPDATE_REGEX", "SUMMARY_REGEX", "ACTION_REGEX", "parsePullDetail", "parsePullResult", "init_parse_pull", "parseMergeResult", "parseMergeDetail", "init_parse_merge", "mergeTask", "merge", "init_merge", "pushResultPushedItem", "parsePushResult", "parsePushDetail", "init_parse_push", "push_exports", "pushTagsTask", "pushTask", "init_push", "show_default", "init_show", "fromPathRegex", "FileStatusSummary", "init_FileStatusSummary", "renamedFile", "handler", "conflicts", "splitLine", "StatusSummary", "parseStatusSummary", "init_StatusSummary", "statusTask", "ignoredOptions", "init_status", "versionResponse", "notInstalledResponse", "version_default", "versionParser", "NOT_INSTALLED", "init_version", "simple_git_api_exports", "SimpleGitApi", "init_simple_git_api", "scheduler_exports", "Scheduler", "createScheduledTask", "init_scheduler", "apply_patch_exports", "applyPatchTask", "init_apply_patch", "branchDeletionSuccess", "branchDeletionFailure", "BranchDeletionBatch", "init_BranchDeleteSummary", "hasBranchDeletionError", "deleteErrorRegex", "deleteSuccessRegex", "parseBranchDeletions", "init_parse_branch_delete", "BranchSummaryResult", "init_BranchSummary", "branchStatus", "parseBranchSummary", "currentBranchParser", "init_parse_branch", "branch_exports", "branchLocalTask", "branchTask", "containsDeleteBranchCommand", "deleteBranchTask", "deleteBranchesTask", "init_branch", "toPath", "parseCheckIgnore", "init_CheckIgnore", "check_ignore_exports", "checkIgnoreTask", "init_check_ignore", "clone_exports", "cloneMirrorTask", "cloneTask", "disallowedCommand", "init_clone", "parseFetchResult", "init_parse_fetch", "fetch_exports", "fetchTask", "init_fetch", "parseMoveResult", "init_parse_move", "move_exports", "moveTask", "init_move", "pull_exports", "pullTask", "init_pull", "parseGetRemotes", "forEach", "parseGetRemotesVerbose", "init_GetRemoteSummary", "remote_exports", "addRemoteTask", "getRemotesTask", "listRemotesTask", "remoteTask", "removeRemoteTask", "init_remote", "stash_list_exports", "stashListTask", "init_stash_list", "sub_module_exports", "addSubModuleTask", "initSubModuleTask", "subModuleTask", "updateSubModuleTask", "init_sub_module", "singleSorted", "sorted", "toNumber", "TagList", "parseTagList", "init_TagList", "tag_exports", "addAnnotatedTagTask", "addTagTask", "tagListTask", "init_tag", "require_git", "__commonJS", "exports", "module", "__toCommonJS", "Git", "never", "input", "plugin", "esm_default", "esm_default"] -} From 9b2e8f3d160bfe104e070dd6a71df96aa35cac61 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 22:11:40 -0800 Subject: [PATCH 53/84] fix: add missing output directory --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index bdc551a..f6d10ec 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ node_modules/ # Build output dist/ +out/ coverage/ # IDE From b6d5cc2157254b4f0e20b4e6bb90b9c1b9f994b3 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 15 Feb 2026 22:23:05 -0800 Subject: [PATCH 54/84] feat(analyzer): add Bazel/Nx/Pants/Turborepo detection, smart fallback heuristics, and symlink-safe scanning --- src/services/__tests__/analyzer.test.ts | 256 ++++++++++++++++++ src/services/analyzer.ts | 335 ++++++++++++++++++++++-- 2 files changed, 568 insertions(+), 23 deletions(-) diff --git a/src/services/__tests__/analyzer.test.ts b/src/services/__tests__/analyzer.test.ts index 435b3f4..39b0021 100644 --- a/src/services/__tests__/analyzer.test.ts +++ b/src/services/__tests__/analyzer.test.ts @@ -485,6 +485,262 @@ describe("analyzeRepo", () => { expect(apiArea?.scripts?.build).toBe("tsc"); expect(apiArea?.hasTsConfig).toBe(true); }); + + it("detects C++ language from CMakeLists.txt", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile( + path.join(repoPath, "CMakeLists.txt"), + "cmake_minimum_required(VERSION 3.20)" + ); + const result = await analyzeRepo(repoPath); + expect(result.languages).toContain("C++"); + }); + + it("detects C++ language from moz.build", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "moz.build"), "DIRS += ['dom']"); + const result = await analyzeRepo(repoPath); + expect(result.languages).toContain("C++"); + }); + + it("detects Turborepo overlay on npm workspaces", async () => { + const repoPath = await makeTmpDir(); + const packageJson = { name: "root", workspaces: ["packages/*"] }; + await fs.writeFile(path.join(repoPath, "package.json"), JSON.stringify(packageJson)); + await fs.writeFile(path.join(repoPath, "turbo.json"), JSON.stringify({ pipeline: {} })); + await fs.mkdir(path.join(repoPath, "packages", "web"), { recursive: true }); + await fs.writeFile( + path.join(repoPath, "packages", "web", "package.json"), + JSON.stringify({ name: "web" }) + ); + await fs.mkdir(path.join(repoPath, "packages", "api"), { recursive: true }); + await fs.writeFile( + path.join(repoPath, "packages", "api", "package.json"), + JSON.stringify({ name: "api" }) + ); + + const result = await analyzeRepo(repoPath); + expect(result.workspaceType).toBe("turborepo"); + expect(result.isMonorepo).toBe(true); + expect(result.apps?.length).toBe(2); + }); + + it("detects Bazel workspace with MODULE.bazel", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "MODULE.bazel"), 'module(name = "myproject")'); + + await fs.mkdir(path.join(repoPath, "server"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "server", "BUILD"), 'java_binary(name = "server")'); + await fs.mkdir(path.join(repoPath, "client"), { recursive: true }); + await fs.writeFile( + path.join(repoPath, "client", "BUILD.bazel"), + 'java_binary(name = "client")' + ); + // Dir without BUILD file should be skipped + await fs.mkdir(path.join(repoPath, "docs"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "docs", "README.md"), "# docs"); + + const result = await analyzeRepo(repoPath); + expect(result.isMonorepo).toBe(true); + expect(result.workspaceType).toBe("bazel"); + expect(result.apps?.length).toBe(2); + expect(result.apps?.map((a) => a.name).sort()).toEqual(["client", "server"]); + const clientApp = result.apps?.find((a) => a.name === "client"); + expect(clientApp?.manifestPath).toBe(path.join(repoPath, "client", "BUILD.bazel")); + expect(clientApp?.ecosystem).toBeUndefined(); + const serverApp = result.apps?.find((a) => a.name === "server"); + expect(serverApp?.manifestPath).toBe(path.join(repoPath, "server", "BUILD")); + }); + + it("detects Bazel workspace with WORKSPACE.bazel file", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "WORKSPACE.bazel"), 'workspace(name = "myproject")'); + + await fs.mkdir(path.join(repoPath, "lib"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "lib", "BUILD"), 'cc_library(name = "lib")'); + await fs.mkdir(path.join(repoPath, "bin"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "bin", "BUILD"), 'cc_binary(name = "bin")'); + + const result = await analyzeRepo(repoPath); + expect(result.isMonorepo).toBe(true); + expect(result.workspaceType).toBe("bazel"); + expect(result.packageManager).toBe("bazel"); + }); + + it("prioritizes Nx workspaceType for JS workspaces when nx.json exists", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "nx.json"), JSON.stringify({ npmScope: "myorg" })); + await fs.writeFile( + path.join(repoPath, "package.json"), + JSON.stringify({ name: "root", workspaces: ["packages/*"] }) + ); + await fs.mkdir(path.join(repoPath, "packages", "app"), { recursive: true }); + await fs.writeFile( + path.join(repoPath, "packages", "app", "package.json"), + JSON.stringify({ name: "app" }) + ); + await fs.mkdir(path.join(repoPath, "packages", "lib"), { recursive: true }); + await fs.writeFile( + path.join(repoPath, "packages", "lib", "package.json"), + JSON.stringify({ name: "lib" }) + ); + + const result = await analyzeRepo(repoPath); + expect(result.isMonorepo).toBe(true); + expect(result.workspaceType).toBe("nx"); + expect(result.apps?.map((a) => a.name).sort()).toEqual(["app", "lib"]); + }); + + it("detects Nx workspace with project.json files", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "nx.json"), JSON.stringify({ npmScope: "myorg" })); + await fs.writeFile(path.join(repoPath, "package.json"), JSON.stringify({ name: "root" })); + + await fs.mkdir(path.join(repoPath, "apps", "web"), { recursive: true }); + await fs.writeFile( + path.join(repoPath, "apps", "web", "project.json"), + JSON.stringify({ name: "web", projectType: "application" }) + ); + await fs.writeFile( + path.join(repoPath, "apps", "web", "package.json"), + JSON.stringify({ name: "web" }) + ); + await fs.writeFile(path.join(repoPath, "apps", "web", "tsconfig.json"), "{}"); + + await fs.mkdir(path.join(repoPath, "libs", "shared"), { recursive: true }); + await fs.writeFile( + path.join(repoPath, "libs", "shared", "project.json"), + JSON.stringify({ name: "shared", projectType: "library" }) + ); + + const result = await analyzeRepo(repoPath); + expect(result.isMonorepo).toBe(true); + expect(result.workspaceType).toBe("nx"); + expect(result.apps?.length).toBe(2); + expect(result.apps?.map((a) => a.name).sort()).toEqual(["shared", "web"]); + const webApp = result.apps?.find((a) => a.name === "web"); + expect(webApp?.ecosystem).toBe("node"); + expect(webApp?.hasTsConfig).toBe(true); + }); + + it("detects Pants workspace with pants.toml and BUILD files", async () => { + const repoPath = await makeTmpDir(); + await fs.writeFile(path.join(repoPath, "pants.toml"), '[GLOBAL]\npants_version = "2.18.0"'); + + await fs.mkdir(path.join(repoPath, "src"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "src", "BUILD"), "python_sources()"); + await fs.writeFile(path.join(repoPath, "src", "pyproject.toml"), "[project]"); + + await fs.mkdir(path.join(repoPath, "tests"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "tests", "BUILD.pants"), "python_tests()"); + + const result = await analyzeRepo(repoPath); + expect(result.isMonorepo).toBe(true); + expect(result.workspaceType).toBe("pants"); + expect(result.apps?.length).toBe(2); + expect(result.packageManager).toBe("pants"); + const srcApp = result.apps?.find((a) => a.name === "src"); + expect(srcApp?.ecosystem).toBe("python"); + expect(srcApp?.manifestPath).toBe(path.join(repoPath, "src", "BUILD")); + const testsApp = result.apps?.find((a) => a.name === "tests"); + expect(testsApp?.manifestPath).toBe(path.join(repoPath, "tests", "BUILD.pants")); + expect(testsApp?.ecosystem).toBeUndefined(); + }); + + it("smart fallback detects areas in large repos", async () => { + const repoPath = await makeTmpDir(); + + // Create 12+ top-level dirs to trigger fallback (threshold: >10 dirs, <3 areas) + // Use names NOT in AREA_HEURISTIC_DIRS so heuristics won't find them + const dirs = [ + "gfx", + "netwerk", + "ipc", + "intl", + "caps", + "chrome", + "widget", + "accessible", + "parser", + "image", + "hal", + "uriloader" + ]; + for (const dir of dirs) { + await fs.mkdir(path.join(repoPath, dir), { recursive: true }); + // Add enough children (>= 3) and code files/manifests + await fs.writeFile(path.join(repoPath, dir, "moz.build"), "DIRS += []"); + await fs.writeFile(path.join(repoPath, dir, "README.md"), `# ${dir}`); + await fs.writeFile(path.join(repoPath, dir, "main.cpp"), "int main() {}"); + } + + const result = await analyzeRepo(repoPath); + const areaNames = (result.areas ?? []).map((a) => a.name); + // Fallback should detect these non-standard dirs + expect(areaNames).toContain("gfx"); + expect(areaNames).toContain("netwerk"); + expect(areaNames).toContain("ipc"); + expect(areaNames).toContain("intl"); + expect(areaNames).toContain("caps"); + // Verify we got a good number of areas + expect(result.areas?.length).toBeGreaterThanOrEqual(10); + }); + + it("smart fallback skips hidden dirs and known skip dirs", async () => { + const repoPath = await makeTmpDir(); + + // Create enough dirs to trigger fallback + const contentDirs = [ + "aaa", + "bbb", + "ccc", + "ddd", + "eee", + "fff", + "ggg", + "hhh", + "iii", + "jjj", + "kkk" + ]; + for (const dir of contentDirs) { + await fs.mkdir(path.join(repoPath, dir), { recursive: true }); + await fs.writeFile(path.join(repoPath, dir, "index.ts"), "export {};"); + await fs.writeFile(path.join(repoPath, dir, "util.ts"), "export {};"); + await fs.writeFile(path.join(repoPath, dir, "types.ts"), "export {};"); + } + + // These should be skipped + await fs.mkdir(path.join(repoPath, ".hidden"), { recursive: true }); + await fs.writeFile(path.join(repoPath, ".hidden", "file.ts"), "export {};"); + await fs.mkdir(path.join(repoPath, "node_modules"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "node_modules", "pkg.js"), ""); + await fs.mkdir(path.join(repoPath, "third_party"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "third_party", "lib.c"), ""); + + const result = await analyzeRepo(repoPath); + const areaNames = (result.areas ?? []).map((a) => a.name); + expect(areaNames).not.toContain(".hidden"); + expect(areaNames).not.toContain("node_modules"); + expect(areaNames).not.toContain("third_party"); + }); + + it("fallback does not trigger for small repos", async () => { + const repoPath = await makeTmpDir(); + + // Only 3 top-level dirs — should NOT trigger fallback + await fs.mkdir(path.join(repoPath, "custom1"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "custom1", "main.py"), "print('hi')"); + await fs.mkdir(path.join(repoPath, "custom2"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "custom2", "main.py"), "print('hi')"); + await fs.mkdir(path.join(repoPath, "custom3"), { recursive: true }); + await fs.writeFile(path.join(repoPath, "custom3", "main.py"), "print('hi')"); + + const result = await analyzeRepo(repoPath); + const areaNames = (result.areas ?? []).map((a) => a.name); + // custom1, custom2, custom3 are not in heuristic list and repo is small + expect(areaNames).not.toContain("custom1"); + }); }); describe("loadPrimerConfig", () => { diff --git a/src/services/analyzer.ts b/src/services/analyzer.ts index c17c242..f4dc214 100644 --- a/src/services/analyzer.ts +++ b/src/services/analyzer.ts @@ -35,7 +35,19 @@ export type RepoAnalysis = { frameworks: string[]; packageManager?: string; isMonorepo?: boolean; - workspaceType?: "npm" | "pnpm" | "yarn" | "cargo" | "go" | "dotnet" | "gradle" | "maven"; + workspaceType?: + | "npm" + | "pnpm" + | "yarn" + | "cargo" + | "go" + | "dotnet" + | "gradle" + | "maven" + | "bazel" + | "nx" + | "pants" + | "turborepo"; workspacePatterns?: string[]; apps?: RepoApp[]; areas?: Area[]; @@ -68,6 +80,11 @@ export async function analyzeRepo(repoPath: string): Promise { const hasBuildGradle = files.includes("build.gradle") || files.includes("build.gradle.kts"); const hasGemfile = files.includes("Gemfile"); const hasComposerJson = files.includes("composer.json"); + const hasCMakeLists = files.includes("CMakeLists.txt"); + const hasMakefile = files.includes("Makefile") || files.includes("GNUmakefile"); + const hasMesonBuild = files.includes("meson.build"); + const hasConfigure = files.includes("configure") || files.includes("configure.ac"); + const hasMozBuild = files.includes("moz.build"); if (hasPackageJson) analysis.languages.push("JavaScript"); if (hasTsConfig) analysis.languages.push("TypeScript"); @@ -78,6 +95,8 @@ export async function analyzeRepo(repoPath: string): Promise { if (hasPomXml || hasBuildGradle) analysis.languages.push("Java"); if (hasGemfile) analysis.languages.push("Ruby"); if (hasComposerJson) analysis.languages.push("PHP"); + if (hasCMakeLists || hasMesonBuild || hasConfigure || hasMozBuild) analysis.languages.push("C++"); + if (hasMakefile && !analysis.languages.length) analysis.languages.push("C"); analysis.packageManager = await detectPackageManager(repoPath, files); @@ -110,6 +129,14 @@ export async function analyzeRepo(repoPath: string): Promise { } } + if (workspace && files.includes("turbo.json") && apps.length > 1) { + analysis.workspaceType = "turborepo"; + } + + if (files.includes("nx.json") && apps.length > 1 && analysis.workspaceType !== "turborepo") { + analysis.workspaceType = "nx"; + } + analysis.apps = apps; analysis.isMonorepo = apps.length > 1; @@ -136,6 +163,14 @@ async function detectPackageManager( if (files.includes("build.gradle") || files.includes("build.gradle.kts")) return "gradle"; if (files.includes("Gemfile")) return "bundler"; if (files.includes("composer.json")) return "composer"; + if ( + files.includes("MODULE.bazel") || + files.includes("WORKSPACE") || + files.includes("WORKSPACE.bazel") + ) + return "bazel"; + if (files.includes("pants.toml")) return "pants"; + if (files.includes("nx.json")) return "nx"; return undefined; } @@ -164,6 +199,24 @@ async function safeReadFile(filePath: string): Promise { } } +async function isScannableDirectory(repoPath: string, candidatePath: string): Promise { + try { + const stat = await fs.lstat(candidatePath); + if (stat.isSymbolicLink() || !stat.isDirectory()) return false; + + const resolvedRoot = await fs.realpath(repoPath).catch(() => path.resolve(repoPath)); + const resolvedCandidate = await fs + .realpath(candidatePath) + .catch(() => path.resolve(candidatePath)); + + return ( + resolvedCandidate === resolvedRoot || resolvedCandidate.startsWith(resolvedRoot + path.sep) + ); + } catch { + return false; + } +} + type WorkspaceConfig = { type: "npm" | "pnpm" | "yarn"; patterns: string[]; @@ -289,7 +342,7 @@ async function buildRepoApp( function buildNonJsApp( name: string, appPath: string, - ecosystem: NonNullable, + ecosystem: RepoApp["ecosystem"], manifestPath: string ): RepoApp { return { @@ -306,7 +359,7 @@ function buildNonJsApp( // ─── Non-JS monorepo detection ─── type NonJsMonorepoResult = { - type?: "cargo" | "go" | "dotnet" | "gradle" | "maven"; + type?: RepoAnalysis["workspaceType"]; patterns?: string[]; apps: RepoApp[]; }; @@ -330,6 +383,15 @@ async function detectNonJsMonorepo( const mavenApps = await detectMavenMultiModule(repoPath); if (mavenApps.length > 1) return { type: "maven", apps: mavenApps }; + const bazelApps = await detectBazelWorkspace(repoPath, files); + if (bazelApps.length > 1) return { type: "bazel", apps: bazelApps }; + + const nxApps = await detectNxWorkspace(repoPath, files); + if (nxApps.length > 1) return { type: "nx", apps: nxApps }; + + const pantsApps = await detectPantsWorkspace(repoPath, files); + if (pantsApps.length > 1) return { type: "pants", apps: pantsApps }; + return { apps: [] }; } @@ -481,6 +543,113 @@ async function detectMavenMultiModule(repoPath: string): Promise { return apps; } +async function detectBazelWorkspace(repoPath: string, files: string[]): Promise { + const hasBazel = + files.includes("MODULE.bazel") || + files.includes("WORKSPACE") || + files.includes("WORKSPACE.bazel"); + if (!hasBazel) return []; + + // Scan first-level directories for BUILD / BUILD.bazel files + const entries = await safeReadDir(repoPath); + const apps: RepoApp[] = []; + + for (const entry of entries) { + if (entry.startsWith(".")) continue; + const fullPath = path.join(repoPath, entry); + if (!(await isScannableDirectory(repoPath, fullPath))) continue; + const children = await safeReadDir(fullPath); + const buildFile = children.includes("BUILD") + ? "BUILD" + : children.includes("BUILD.bazel") + ? "BUILD.bazel" + : undefined; + if (!buildFile) continue; + + apps.push(buildNonJsApp(entry, fullPath, undefined, path.join(fullPath, buildFile))); + } + + return apps; +} + +async function detectNxWorkspace(repoPath: string, files: string[]): Promise { + if (!files.includes("nx.json")) return []; + + // Find project.json files (depth-limited via glob pattern) + const projectJsonPaths = ( + await fg(["*/project.json", "*/*/project.json", "*/*/*/project.json"], { + cwd: repoPath, + absolute: true, + onlyFiles: true, + dot: false, + followSymbolicLinks: false, + ignore: ["**/.git/**", "**/node_modules/**", "**/dist/**", "**/build/**", "**/out/**"] + }) + ).map((p) => path.normalize(p)); + + const apps: RepoApp[] = []; + for (const projPath of projectJsonPaths) { + const projDir = path.dirname(projPath); + const projJson = await readJson(projPath); + const name = typeof projJson?.name === "string" ? projJson.name : path.basename(projDir); + // Detect ecosystem from sibling files + const children = await safeReadDir(projDir); + const ecosystem: RepoApp["ecosystem"] = children.includes("package.json") + ? "node" + : children.includes("Cargo.toml") + ? "rust" + : children.includes("go.mod") + ? "go" + : children.includes("pyproject.toml") + ? "python" + : undefined; + apps.push({ + name, + path: projDir, + ecosystem, + manifestPath: projPath, + packageJsonPath: children.includes("package.json") ? path.join(projDir, "package.json") : "", + scripts: {}, + hasTsConfig: children.includes("tsconfig.json") + }); + } + + return apps; +} + +async function detectPantsWorkspace(repoPath: string, files: string[]): Promise { + if (!files.includes("pants.toml")) return []; + + // Scan first-level directories for BUILD files + const entries = await safeReadDir(repoPath); + const apps: RepoApp[] = []; + + for (const entry of entries) { + if (entry.startsWith(".")) continue; + const fullPath = path.join(repoPath, entry); + if (!(await isScannableDirectory(repoPath, fullPath))) continue; + const children = await safeReadDir(fullPath); + const buildFile = children.includes("BUILD") + ? "BUILD" + : children.includes("BUILD.pants") + ? "BUILD.pants" + : undefined; + if (!buildFile) continue; + + // Infer ecosystem from sibling files + const ecosystem: RepoApp["ecosystem"] = children.includes("pyproject.toml") + ? "python" + : children.includes("go.mod") + ? "go" + : children.includes("Cargo.toml") + ? "rust" + : undefined; + apps.push(buildNonJsApp(entry, fullPath, ecosystem, path.join(fullPath, buildFile))); + } + + return apps; +} + function unique(items: T[]): T[] { return Array.from(new Set(items)); } @@ -514,9 +683,56 @@ const AREA_HEURISTIC_DIRS = [ "portal", "dashboard", "worker", - "functions" + "functions", + // Browser / engine components + "browser", + "devtools", + "toolkit", + "dom", + "layout", + "media", + "security", + "testing", + "extensions", + "modules", + "editor", + "remote", + "storage" ]; +// Directories to skip in fallback area detection +const FALLBACK_SKIP_DIRS = new Set([ + "node_modules", + ".git", + ".hg", + ".svn", + "target", + "build", + "dist", + "out", + "output", + ".output", + ".next", + "vendor", + "third_party", + "other-licenses", + "coverage", + "__pycache__", + ".cache", + ".vscode", + ".idea", + ".github", + ".gitlab", + ".circleci", + "supply-chain", + "gradle", + ".cargo" +]); + +const MIN_FALLBACK_CHILDREN = 3; +const MIN_AREAS_FOR_FALLBACK = 3; +const MIN_TOPLEVEL_DIRS_FOR_FALLBACK = 10; + const MANIFEST_FILES = [ "package.json", "pyproject.toml", @@ -529,7 +745,32 @@ const MANIFEST_FILES = [ "Gemfile", "composer.json", "setup.py", - "setup.cfg" + "setup.cfg", + "CMakeLists.txt", + "meson.build", + "BUILD", + "BUILD.bazel", + "moz.build" +]; + +const CODE_EXTENSIONS = [ + ".ts", + ".js", + ".py", + ".go", + ".rs", + ".java", + ".cs", + ".rb", + ".php", + ".c", + ".cc", + ".cpp", + ".h", + ".hpp", + ".swift", + ".kt", + ".scala" ]; function areasFromApps(repoPath: string, apps: RepoApp[]): Area[] { @@ -556,28 +797,12 @@ async function areasFromHeuristics(repoPath: string): Promise { if (!AREA_HEURISTIC_DIRS.includes(lower)) continue; const fullPath = path.join(repoPath, entry); - try { - const stat = await fs.stat(fullPath); - if (!stat.isDirectory()) continue; - } catch { - continue; - } + if (!(await isScannableDirectory(repoPath, fullPath))) continue; // Check if the directory has meaningful content (manifest or code files) const children = await safeReadDir(fullPath); const hasManifest = children.some((c) => MANIFEST_FILES.includes(c)); - const hasCode = children.some( - (c) => - c.endsWith(".ts") || - c.endsWith(".js") || - c.endsWith(".py") || - c.endsWith(".go") || - c.endsWith(".rs") || - c.endsWith(".java") || - c.endsWith(".cs") || - c.endsWith(".rb") || - c.endsWith(".php") - ); + const hasCode = children.some((c) => CODE_EXTENSIONS.some((ext) => c.endsWith(ext))); const hasSrcDir = children.includes("src"); if (!hasManifest && !hasCode && !hasSrcDir) continue; @@ -607,6 +832,45 @@ async function areasFromHeuristics(repoPath: string): Promise { return areas; } +/** + * Fallback area detection for large repos (e.g., Firefox, Chromium) where + * neither workspace managers nor the heuristic directory list provide good coverage. + * Scans first-level directories that contain code or manifests and meet a + * small minimum-size threshold to reduce noise. + */ +async function areasFromFallback(repoPath: string, existingAreas: Area[]): Promise { + const existingNames = new Set(existingAreas.map((a) => a.name.toLowerCase())); + const entries = await safeReadDir(repoPath); + const areas: Area[] = []; + + for (const entry of entries) { + if (entry.startsWith(".")) continue; + if (FALLBACK_SKIP_DIRS.has(entry.toLowerCase())) continue; + if (existingNames.has(entry.toLowerCase())) continue; + + const fullPath = path.join(repoPath, entry); + if (!(await isScannableDirectory(repoPath, fullPath))) continue; + + const children = await safeReadDir(fullPath); + if (children.length < MIN_FALLBACK_CHILDREN) continue; + + const hasManifest = children.some((c) => MANIFEST_FILES.includes(c)); + const hasCode = children.some((c) => CODE_EXTENSIONS.some((ext) => c.endsWith(ext))); + const hasSrcDir = children.includes("src"); + + if (!hasManifest && !hasCode && !hasSrcDir) continue; + + areas.push({ + name: entry, + applyTo: `${entry}/**`, + path: fullPath, + source: "auto" + }); + } + + return areas; +} + async function detectAreas(repoPath: string, analysis: RepoAnalysis): Promise { let autoAreas: Area[]; @@ -624,6 +888,31 @@ async function detectAreas(repoPath: string, analysis: RepoAnalysis): Promise !e.startsWith(".")) + .map(async (e) => isScannableDirectory(repoPath, path.join(repoPath, e))) + ) + ).filter(Boolean).length; + + if ( + autoAreas.length < MIN_AREAS_FOR_FALLBACK && + topLevelDirCount > MIN_TOPLEVEL_DIRS_FOR_FALLBACK + ) { + const fallbackAreas = await areasFromFallback(repoPath, autoAreas); + const byName = new Map(autoAreas.map((a) => [a.name.toLowerCase(), a])); + for (const a of fallbackAreas) { + if (!byName.has(a.name.toLowerCase())) { + byName.set(a.name.toLowerCase(), a); + } + } + autoAreas = Array.from(byName.values()); + } + // Merge with config areas const config = await loadPrimerConfig(repoPath); if (!config?.areas?.length) return autoAreas; From 73598e30b7853c199c4c58fdd4e74aa17a2d86fe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 06:38:38 +0000 Subject: [PATCH 55/84] Initial plan From 551689a3a161dd16201e165ac0545210f89dfcb9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 06:40:12 +0000 Subject: [PATCH 56/84] Initial plan for Primer CLI safety and UX fixes Co-authored-by: digitarald <8599+digitarald@users.noreply.github.com> --- package-lock.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/package-lock.json b/package-lock.json index 7b39573..883e562 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1370,6 +1370,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", @@ -1919,6 +1920,7 @@ "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -1929,6 +1931,7 @@ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -2017,6 +2020,7 @@ "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.55.0", "@typescript-eslint/types": "8.55.0", @@ -2314,6 +2318,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3244,6 +3249,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -3298,6 +3304,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5736,6 +5743,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -5849,6 +5857,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6719,6 +6728,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -6896,6 +6906,7 @@ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -7022,6 +7033,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7085,6 +7097,7 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -7178,6 +7191,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7191,6 +7205,7 @@ "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", From b7c5d27cc0fcaa1c98bf6239eaf01b1fac7ae212 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 06:46:20 +0000 Subject: [PATCH 57/84] Fix safeWriteFile bypasses and unify PR command across providers Phase 1 Safety Fixes: - Fix generate.ts: Use safeWriteFile for instructions/agents generation - Fix instructions.ts command: Use safeWriteFile for root instructions - Fix writeAreaInstruction: Replace fileExists+writeFile with safeWriteFile - Unify pr.ts: Both GitHub and Azure now generate instructions+mcp+vscode - Add unified branch name: primer/add-ai-config - Add buildFullPrBody helper for comprehensive PR descriptions - Add tests for symlink rejection and WriteAreaResult status Co-authored-by: digitarald <8599+digitarald@users.noreply.github.com> --- src/commands/generate.ts | 17 +- src/commands/instructions.ts | 54 ++++-- src/commands/pr.ts | 43 ++++- src/services/__tests__/fs.test.ts | 27 +++ src/services/__tests__/instructions.test.ts | 192 ++++++++++++++++++++ src/services/__tests__/pr.test.ts | 78 ++++++++ src/services/instructions.ts | 18 +- src/utils/pr.ts | 41 +++++ 8 files changed, 438 insertions(+), 32 deletions(-) create mode 100644 src/services/__tests__/instructions.test.ts create mode 100644 src/services/__tests__/pr.test.ts diff --git a/src/commands/generate.ts b/src/commands/generate.ts index eecafff..c6a70e1 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -1,11 +1,10 @@ -import fs from "fs/promises"; import path from "path"; import { analyzeRepo } from "../services/analyzer"; import type { FileAction } from "../services/generator"; import { generateConfigs } from "../services/generator"; import { generateCopilotInstructions } from "../services/instructions"; -import { ensureDir } from "../utils/fs"; +import { ensureDir, safeWriteFile } from "../utils/fs"; import type { CommandResult } from "../utils/output"; import { outputResult, @@ -86,8 +85,20 @@ export async function generateCommand( continue; } await ensureDir(path.dirname(target.savePath)); - await fs.writeFile(target.savePath, content, "utf8"); const rel = path.relative(process.cwd(), target.savePath); + const { wrote, reason } = await safeWriteFile( + target.savePath, + content, + Boolean(options.force) + ); + if (!wrote) { + const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; + if (shouldLog(options)) { + process.stderr.write(` Skipped ${rel}: ${why}\n`); + } + allFiles.push({ path: rel, action: "skipped" }); + continue; + } allFiles.push({ path: rel, action: "wrote" }); if (shouldLog(options)) { process.stderr.write(` ✓ ${rel}\n`); diff --git a/src/commands/instructions.ts b/src/commands/instructions.ts index c54c3a7..fff17f1 100644 --- a/src/commands/instructions.ts +++ b/src/commands/instructions.ts @@ -1,4 +1,3 @@ -import fs from "fs/promises"; import path from "path"; import { @@ -7,7 +6,7 @@ import { writeAreaInstruction } from "../services/instructions"; import { analyzeRepo } from "../services/analyzer"; -import { ensureDir } from "../utils/fs"; +import { ensureDir, safeWriteFile } from "../utils/fs"; import type { CommandResult } from "../utils/output"; import { outputResult, outputError, createProgressReporter, shouldLog } from "../utils/output"; @@ -56,19 +55,38 @@ export async function instructionsCommand(options: InstructionsOptions): Promise if (content) { await ensureDir(path.dirname(outputPath)); - await fs.writeFile(outputPath, content, "utf8"); - - const byteCount = Buffer.byteLength(content, "utf8"); - - if (options.json) { - const result: CommandResult<{ outputPath: string; model: string; byteCount: number }> = { - ok: true, - status: "success", - data: { outputPath, model: options.model ?? "default", byteCount } - }; - outputResult(result, true); - } else if (shouldLog(options)) { - progress.succeed(`Updated ${path.relative(process.cwd(), outputPath)}`); + const { wrote, reason } = await safeWriteFile( + outputPath, + content, + Boolean(options.force) + ); + + if (!wrote) { + const relPath = path.relative(process.cwd(), outputPath); + const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; + if (options.json) { + const result: CommandResult<{ outputPath: string; skipped: true; reason: string }> = { + ok: true, + status: "noop", + data: { outputPath, skipped: true, reason: why } + }; + outputResult(result, true); + } else if (shouldLog(options)) { + progress.update(`Skipped ${relPath}: ${why}`); + } + } else { + const byteCount = Buffer.byteLength(content, "utf8"); + + if (options.json) { + const result: CommandResult<{ outputPath: string; model: string; byteCount: number }> = { + ok: true, + status: "success", + data: { outputPath, model: options.model ?? "default", byteCount } + }; + outputResult(result, true); + } else if (shouldLog(options)) { + progress.succeed(`Updated ${path.relative(process.cwd(), outputPath)}`); + } } } } @@ -139,6 +157,12 @@ export async function instructionsCommand(options: InstructionsOptions): Promise } continue; } + if (result.status === "symlink") { + if (shouldLog(options)) { + progress.update(`Skipped "${area.name}" — path is a symlink.`); + } + continue; + } if (shouldLog(options)) { progress.succeed(`Wrote ${path.relative(process.cwd(), result.filePath)}`); } diff --git a/src/commands/pr.ts b/src/commands/pr.ts index ac48961..632b16c 100644 --- a/src/commands/pr.ts +++ b/src/commands/pr.ts @@ -22,9 +22,11 @@ import { generateCopilotInstructions } from "../services/instructions"; import { ensureDir, safeWriteFile, validateCachePath } from "../utils/fs"; import type { CommandResult } from "../utils/output"; import { outputResult, outputError, createProgressReporter, shouldLog } from "../utils/output"; -import { buildConfigsPrBody, buildInstructionsPrBody } from "../utils/pr"; +import { buildFullPrBody } from "../utils/pr"; import { GITHUB_REPO_RE, AZURE_REPO_RE } from "../utils/repo"; +const DEFAULT_PR_BRANCH = "primer/add-ai-config"; + type PrOptions = { branch?: string; provider?: string; @@ -81,7 +83,7 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P await setRemoteUrl(repoPath, repoInfo.cloneUrl); } - const branch = options.branch ?? "primer/add-instructions"; + const branch = options.branch ?? DEFAULT_PR_BRANCH; progress.update("Creating branch..."); await checkoutBranch(repoPath, branch); @@ -89,13 +91,25 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P const instructions = await generateCopilotInstructions({ repoPath, model: options.model }); const instructionsPath = path.join(repoPath, ".github", "copilot-instructions.md"); await ensureDir(path.dirname(instructionsPath)); - const { wrote } = await safeWriteFile(instructionsPath, instructions, true); + const { wrote, reason } = await safeWriteFile(instructionsPath, instructions, true); if (!wrote) { - throw new Error("Refused to write instructions (path is a symlink)"); + throw new Error( + `Refused to write instructions (${reason === "symlink" ? "path is a symlink" : "file exists"})` + ); } + progress.update("Analyzing..."); + const analysis = await analyzeRepo(repoPath); + progress.update("Generating configs..."); + await generateConfigs({ + repoPath, + analysis, + selections: ["mcp", "vscode"], + force: true + }); + progress.update("Committing..."); - await commitAll(repoPath, "chore: add copilot instructions via Primer"); + await commitAll(repoPath, "chore: add AI configurations via Primer"); progress.update("Pushing..."); await pushBranch(repoPath, branch, token, "azure"); @@ -106,8 +120,8 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P project, repoId: repoInfo.id, repoName: repoInfo.name, - title: "🤖 Add Copilot instructions via Primer", - body: buildInstructionsPrBody(), + title: "🤖 Prime this repo for AI", + body: buildFullPrBody(), sourceBranch: branch, targetBranch: repoInfo.defaultBranch }); @@ -160,10 +174,21 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P await cloneRepo(repoInfo.cloneUrl, repoPath); } - const branch = options.branch ?? "primer/add-configs"; + const branch = options.branch ?? DEFAULT_PR_BRANCH; progress.update("Creating branch..."); await checkoutBranch(repoPath, branch); + progress.update("Generating instructions..."); + const instructions = await generateCopilotInstructions({ repoPath, model: options.model }); + const instructionsPath = path.join(repoPath, ".github", "copilot-instructions.md"); + await ensureDir(path.dirname(instructionsPath)); + const { wrote, reason } = await safeWriteFile(instructionsPath, instructions, true); + if (!wrote) { + throw new Error( + `Refused to write instructions (${reason === "symlink" ? "path is a symlink" : "file exists"})` + ); + } + progress.update("Analyzing..."); const analysis = await analyzeRepo(repoPath); progress.update("Generating configs..."); @@ -185,7 +210,7 @@ export async function prCommand(repo: string | undefined, options: PrOptions): P owner, repo: name, title: "🤖 Prime this repo for AI", - body: buildConfigsPrBody(), + body: buildFullPrBody(), head: `${owner}:${branch}`, base: repoInfo.defaultBranch }); diff --git a/src/services/__tests__/fs.test.ts b/src/services/__tests__/fs.test.ts index 001f5fe..071f3a4 100644 --- a/src/services/__tests__/fs.test.ts +++ b/src/services/__tests__/fs.test.ts @@ -74,4 +74,31 @@ describe("safeWriteFile", () => { expect(result.wrote).toBe(true); expect(result.reason).toBeUndefined(); }); + + it("rejects symlink even with force", async () => { + const realFile = path.join(tmpDir, "real.txt"); + const symlink = path.join(tmpDir, "symlink.txt"); + await fs.writeFile(realFile, "original"); + await fs.symlink(realFile, symlink); + + const result = await safeWriteFile(symlink, "malicious content", true); + + expect(result.wrote).toBe(false); + expect(result.reason).toBe("symlink"); + // Verify the original file was NOT modified + const content = await fs.readFile(realFile, "utf8"); + expect(content).toBe("original"); + }); + + it("rejects symlink without force", async () => { + const realFile = path.join(tmpDir, "real.txt"); + const symlink = path.join(tmpDir, "symlink.txt"); + await fs.writeFile(realFile, "original"); + await fs.symlink(realFile, symlink); + + const result = await safeWriteFile(symlink, "malicious content", false); + + expect(result.wrote).toBe(false); + expect(result.reason).toBe("symlink"); + }); }); diff --git a/src/services/__tests__/instructions.test.ts b/src/services/__tests__/instructions.test.ts new file mode 100644 index 0000000..b5833bc --- /dev/null +++ b/src/services/__tests__/instructions.test.ts @@ -0,0 +1,192 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; + +import { afterEach, beforeEach, describe, expect, it } from "vitest"; + +import type { Area } from "../analyzer"; +import { + writeAreaInstruction, + buildAreaFrontmatter, + buildAreaInstructionContent, + areaInstructionPath +} from "../instructions"; + +describe("writeAreaInstruction", () => { + let tmpDir: string; + + beforeEach(async () => { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "primer-inst-")); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + const makeArea = (name: string, applyTo: string | string[] = "src/**/*.ts"): Area => ({ + name, + applyTo, + description: `Test area for ${name}`, + source: "config" + }); + + it("writes new area instruction file", async () => { + const area = makeArea("frontend"); + const body = "# Frontend Guidelines\n\nUse React conventions."; + + const result = await writeAreaInstruction(tmpDir, area, body, false); + + expect(result.status).toBe("written"); + expect(result.filePath).toBe(areaInstructionPath(tmpDir, area)); + + const content = await fs.readFile(result.filePath, "utf8"); + expect(content).toContain("# Frontend Guidelines"); + expect(content).toContain("applyTo:"); + }); + + it("returns empty status for empty body", async () => { + const area = makeArea("empty-area"); + const result = await writeAreaInstruction(tmpDir, area, " ", false); + + expect(result.status).toBe("empty"); + }); + + it("skips existing file without force", async () => { + const area = makeArea("backend"); + const filePath = areaInstructionPath(tmpDir, area); + + // Create the file first + await fs.mkdir(path.dirname(filePath), { recursive: true }); + await fs.writeFile(filePath, "original content", "utf8"); + + const result = await writeAreaInstruction(tmpDir, area, "new content", false); + + expect(result.status).toBe("skipped"); + const content = await fs.readFile(filePath, "utf8"); + expect(content).toBe("original content"); + }); + + it("overwrites existing file with force", async () => { + const area = makeArea("backend"); + const filePath = areaInstructionPath(tmpDir, area); + + await fs.mkdir(path.dirname(filePath), { recursive: true }); + await fs.writeFile(filePath, "original content", "utf8"); + + const result = await writeAreaInstruction(tmpDir, area, "new content", true); + + expect(result.status).toBe("written"); + const content = await fs.readFile(filePath, "utf8"); + expect(content).toContain("new content"); + }); + + it("rejects symlink even with force", async () => { + const area = makeArea("malicious"); + const filePath = areaInstructionPath(tmpDir, area); + const realFile = path.join(tmpDir, "real.md"); + + await fs.mkdir(path.dirname(filePath), { recursive: true }); + await fs.writeFile(realFile, "original secure content", "utf8"); + await fs.symlink(realFile, filePath); + + const result = await writeAreaInstruction(tmpDir, area, "malicious content", true); + + expect(result.status).toBe("symlink"); + // Verify original file was NOT modified + const content = await fs.readFile(realFile, "utf8"); + expect(content).toBe("original secure content"); + }); +}); + +describe("buildAreaFrontmatter", () => { + it("builds frontmatter with single applyTo pattern", () => { + const area: Area = { + name: "tests", + applyTo: "**/*.test.ts", + description: "Testing area", + source: "config" + }; + + const frontmatter = buildAreaFrontmatter(area); + + expect(frontmatter).toContain('applyTo: "**/*.test.ts"'); + expect(frontmatter).toContain("description:"); + expect(frontmatter).toContain("tests"); + }); + + it("builds frontmatter with multiple applyTo patterns", () => { + const area: Area = { + name: "frontend", + applyTo: ["src/**/*.tsx", "src/**/*.css"], + description: "Frontend components", + source: "config" + }; + + const frontmatter = buildAreaFrontmatter(area); + + expect(frontmatter).toContain('["src/**/*.tsx", "src/**/*.css"]'); + }); + + it("escapes special characters in strings", () => { + const area: Area = { + name: "special", + applyTo: 'src/"test"/*.ts', + description: 'Area with "quotes"', + source: "config" + }; + + const frontmatter = buildAreaFrontmatter(area); + + // Should have escaped quotes + expect(frontmatter).toContain('\\"'); + // Should be valid YAML format + expect(frontmatter).toMatch(/^---\n/); + expect(frontmatter).toMatch(/\n---$/); + }); +}); + +describe("buildAreaInstructionContent", () => { + it("combines frontmatter and body with proper spacing", () => { + const area: Area = { + name: "api", + applyTo: "src/api/**/*.ts", + source: "config" + }; + const body = "# API Guidelines\n\nFollow REST conventions."; + + const content = buildAreaInstructionContent(area, body); + + expect(content).toMatch(/^---\n/); + expect(content).toMatch(/---\n\n# API Guidelines/); + expect(content).toContain("Follow REST conventions."); + expect(content).toMatch(/\n$/); + }); +}); + +describe("areaInstructionPath", () => { + it("generates correct path for area", () => { + const area: Area = { + name: "Frontend Components", + applyTo: "src/**/*.tsx", + source: "config" + }; + + const result = areaInstructionPath("/repo", area); + + expect(result).toBe( + path.join("/repo", ".github", "instructions", "frontend-components.instructions.md") + ); + }); + + it("sanitizes area name with special characters", () => { + const area: Area = { + name: "API/Backend (Core)", + applyTo: "src/api/**/*.ts", + source: "config" + }; + + const result = areaInstructionPath("/repo", area); + + expect(result).toMatch(/api-backend-core\.instructions\.md$/); + }); +}); diff --git a/src/services/__tests__/pr.test.ts b/src/services/__tests__/pr.test.ts new file mode 100644 index 0000000..a67d6c1 --- /dev/null +++ b/src/services/__tests__/pr.test.ts @@ -0,0 +1,78 @@ +import { describe, expect, it } from "vitest"; + +import { buildConfigsPrBody, buildInstructionsPrBody, buildFullPrBody } from "../../utils/pr"; + +describe("buildConfigsPrBody", () => { + it("includes VS Code config files", () => { + const body = buildConfigsPrBody(); + + expect(body).toContain(".vscode/settings.json"); + expect(body).toContain(".vscode/mcp.json"); + }); + + it("does not include instructions file", () => { + const body = buildConfigsPrBody(); + + expect(body).not.toContain("copilot-instructions.md"); + }); + + it("includes markdown headers", () => { + const body = buildConfigsPrBody(); + + expect(body).toContain("## "); + expect(body).toContain("### "); + }); +}); + +describe("buildInstructionsPrBody", () => { + it("includes instructions file", () => { + const body = buildInstructionsPrBody(); + + expect(body).toContain("copilot-instructions.md"); + }); + + it("does not include VS Code config files", () => { + const body = buildInstructionsPrBody(); + + expect(body).not.toContain(".vscode/settings.json"); + expect(body).not.toContain(".vscode/mcp.json"); + }); + + it("includes project link", () => { + const body = buildInstructionsPrBody(); + + expect(body).toContain("Primer"); + expect(body).toContain("github.com"); + }); +}); + +describe("buildFullPrBody", () => { + it("includes all three config files", () => { + const body = buildFullPrBody(); + + expect(body).toContain("copilot-instructions.md"); + expect(body).toContain(".vscode/settings.json"); + expect(body).toContain(".vscode/mcp.json"); + }); + + it("includes benefits section", () => { + const body = buildFullPrBody(); + + expect(body).toContain("Benefits"); + expect(body).toContain("MCP"); + }); + + it("includes how to use section", () => { + const body = buildFullPrBody(); + + expect(body).toContain("How to Use"); + expect(body).toContain("VS Code"); + }); + + it("includes markdown table", () => { + const body = buildFullPrBody(); + + expect(body).toContain("| File | Purpose |"); + expect(body).toContain("|------|---------|"); + }); +}); diff --git a/src/services/instructions.ts b/src/services/instructions.ts index 7f80bd2..9ec288b 100644 --- a/src/services/instructions.ts +++ b/src/services/instructions.ts @@ -1,8 +1,7 @@ -import fs from "fs/promises"; import path from "path"; import { DEFAULT_MODEL } from "../config"; -import { ensureDir, fileExists } from "../utils/fs"; +import { ensureDir, safeWriteFile } from "../utils/fs"; import type { Area } from "./analyzer"; import { sanitizeAreaName } from "./analyzer"; @@ -225,7 +224,10 @@ export function areaInstructionPath(repoPath: string, area: Area): string { ); } -export type WriteAreaResult = { status: "written" | "skipped" | "empty"; filePath: string }; +export type WriteAreaResult = { + status: "written" | "skipped" | "symlink" | "empty"; + filePath: string; +}; export async function writeAreaInstruction( repoPath: string, @@ -235,9 +237,15 @@ export async function writeAreaInstruction( ): Promise { const filePath = areaInstructionPath(repoPath, area); if (!body.trim()) return { status: "empty", filePath }; - if (!force && (await fileExists(filePath))) return { status: "skipped", filePath }; await ensureDir(path.dirname(filePath)); - await fs.writeFile(filePath, buildAreaInstructionContent(area, body), "utf8"); + const { wrote, reason } = await safeWriteFile( + filePath, + buildAreaInstructionContent(area, body), + Boolean(force) + ); + if (!wrote) { + return { status: reason === "symlink" ? "symlink" : "skipped", filePath }; + } return { status: "written", filePath }; } diff --git a/src/utils/pr.ts b/src/utils/pr.ts index b147d1e..53f96e9 100644 --- a/src/utils/pr.ts +++ b/src/utils/pr.ts @@ -47,3 +47,44 @@ export function buildInstructionsPrBody(): string { "*Generated by [Primer](https://github.com/pierceboggan/primer) - Prime your repos for AI*" ].join("\n"); } + +export function buildFullPrBody(): string { + return [ + "## 🤖 Primed for AI", + "", + "This PR adds configurations to prime this repository for AI coding assistants.", + "", + "### Added Files", + "", + "| File | Purpose |", + "|------|---------|", + "| `.github/copilot-instructions.md` | Custom instructions for GitHub Copilot |", + "| `.vscode/settings.json` | VS Code settings for optimal AI assistance |", + "| `.vscode/mcp.json` | Model Context Protocol server configuration |", + "", + "### What's Included", + "", + "The instructions file contains:", + "- Project overview and architecture", + "- Tech stack and conventions", + "- Build/test commands", + "- Key directories and files", + "", + "### Benefits", + "", + "With these configurations, Copilot will:", + "- Generate more contextually-aware code suggestions", + "- Follow project-specific patterns and conventions", + "- Understand the codebase structure", + "- Have access to MCP tools for enhanced capabilities", + "", + "### How to Use", + "", + "1. Merge this PR", + "2. Open the project in VS Code", + "3. Start chatting with Copilot — it now understands your project!", + "", + "---", + "*Generated by [Primer](https://github.com/pierceboggan/primer) - Prime your repos for AI*" + ].join("\n"); +} From bd3ac54336ce567d978a2842bcc6282cfc3523b8 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 11:07:47 -0800 Subject: [PATCH 58/84] chore: update dependencies across root and vscode-extension --- package-lock.json | 289 +++++++++++++-------------- package.json | 26 +-- vscode-extension/package-lock.json | 302 ++++++++++++++--------------- vscode-extension/package.json | 10 +- 4 files changed, 306 insertions(+), 321 deletions(-) diff --git a/package-lock.json b/package-lock.json index 883e562..f34a6a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,34 +9,34 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@github/copilot-sdk": "^0.1.19", - "@inquirer/prompts": "^8.2.0", + "@github/copilot-sdk": "^0.1.24", + "@inquirer/prompts": "^8.2.1", "@octokit/rest": "^22.0.1", "chalk": "^5.6.2", - "commander": "^14.0.2", + "commander": "^14.0.3", "fast-glob": "^3.3.3", - "ink": "^6.6.0", + "ink": "^6.7.0", "react": "^19.2.4", - "simple-git": "^3.30.0" + "simple-git": "^3.31.1" }, "bin": { "primer": "dist/index.js" }, "devDependencies": { - "@types/node": "^25.1.0", - "@types/react": "^19.2.10", - "@typescript-eslint/eslint-plugin": "^8.5.0", - "@typescript-eslint/parser": "^8.5.0", + "@types/node": "^25.2.3", + "@types/react": "^19.2.14", + "@typescript-eslint/eslint-plugin": "^8.56.0", + "@typescript-eslint/parser": "^8.56.0", "@vitest/coverage-v8": "^4.0.18", "eslint": "^9.39.2", "eslint-config-prettier": "^9.1.2", - "eslint-plugin-import": "^2.30.0", - "eslint-plugin-n": "^17.10.2", - "eslint-plugin-promise": "^7.1.0", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-promise": "^7.2.1", "globals": "^17.3.0", "husky": "^9.1.7", "lint-staged": "^16.2.7", - "prettier": "^3.3.3", + "prettier": "^3.8.1", "tsup": "^8.5.1", "tsx": "^4.21.0", "typescript": "^5.9.3", @@ -761,26 +761,26 @@ } }, "node_modules/@github/copilot": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.403.tgz", - "integrity": "sha512-v5jUdtGJReLmE1rmff/LZf+50nzmYQYAaSRNtVNr9g0j0GkCd/noQExe31i1+PudvWU0ZJjltR0B8pUfDRdA9Q==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.409.tgz", + "integrity": "sha512-rkYWOKjTSuGg99KsgmA0QAP4X2cpJzAYk6lZDlVxKPhuLP03wC5E+jLctrSLjpxhX32p9n13rm1+7Jun80a1hw==", "license": "SEE LICENSE IN LICENSE.md", "bin": { "copilot": "npm-loader.js" }, "optionalDependencies": { - "@github/copilot-darwin-arm64": "0.0.403", - "@github/copilot-darwin-x64": "0.0.403", - "@github/copilot-linux-arm64": "0.0.403", - "@github/copilot-linux-x64": "0.0.403", - "@github/copilot-win32-arm64": "0.0.403", - "@github/copilot-win32-x64": "0.0.403" + "@github/copilot-darwin-arm64": "0.0.409", + "@github/copilot-darwin-x64": "0.0.409", + "@github/copilot-linux-arm64": "0.0.409", + "@github/copilot-linux-x64": "0.0.409", + "@github/copilot-win32-arm64": "0.0.409", + "@github/copilot-win32-x64": "0.0.409" } }, "node_modules/@github/copilot-darwin-arm64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.403.tgz", - "integrity": "sha512-dOw8IleA0d1soHnbr/6wc6vZiYWNTKMgfTe/NET1nCfMzyKDt/0F0I7PT5y+DLujJknTla/ZeEmmBUmliTW4Cg==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.409.tgz", + "integrity": "sha512-yjrrp++UNNvRoWsZ1+UioBqb3DEVxL5M5ePnMO5/Sf1sngxh0y5P9P6ePFZU4PVlM5BgC38DtrcauZaKf/oArQ==", "cpu": [ "arm64" ], @@ -794,9 +794,9 @@ } }, "node_modules/@github/copilot-darwin-x64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.403.tgz", - "integrity": "sha512-aK2jSNWgY8eiZ+TmrvGhssMCPDTKArc0ip6Ul5OaslpytKks8hyXoRbxGD0N9sKioSUSbvKUf+1AqavbDpJO+w==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.409.tgz", + "integrity": "sha512-EhLfY5DGU/BZmwjVcfnwKuJA7BxS9zdNCGeynUq7z/SI93ziastFqOddUX4D+ySz6yMrrXieN8cUKgzAlRCOJg==", "cpu": [ "x64" ], @@ -810,9 +810,9 @@ } }, "node_modules/@github/copilot-linux-arm64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.403.tgz", - "integrity": "sha512-KhoR2iR70O6vCkzf0h8/K+p82qAgOvMTgAPm9bVEHvbdGFR7Py9qL5v03bMbPxsA45oNaZAkzDhfTAqWhIAZsQ==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.409.tgz", + "integrity": "sha512-O7b/9LmBO8ljPqNngonx+v5d3cOs6HKvj2E9f5/Flb9Uw2lut7g6KGerfDYCMZUpvFCMDfbZSBJD3SDuJj1uPg==", "cpu": [ "arm64" ], @@ -826,9 +826,9 @@ } }, "node_modules/@github/copilot-linux-x64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.403.tgz", - "integrity": "sha512-eoswUc9vo4TB+/9PgFJLVtzI4dPjkpJXdCsAioVuoqPdNxHxlIHFe9HaVcqMRZxUNY1YHEBZozy+IpUEGjgdfQ==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.409.tgz", + "integrity": "sha512-zSfFqyPxNaBE5/ClrSjsKxhhTpJaVOqSJY0q87iV9fw6xwdzcJ1/FlZGKjE7W8YVb4tdJx+OBMjQCU8WYewF1A==", "cpu": [ "x64" ], @@ -842,23 +842,23 @@ } }, "node_modules/@github/copilot-sdk": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.22.tgz", - "integrity": "sha512-ZGOEBmYOfu/vLXKjjoiw4lO3Cb8QBUuAWXcW/qzmPPsM9+Qe00qVr2AuDTU/Gft9Dm/yZcPK2QuTZc7LVeom9w==", + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.24.tgz", + "integrity": "sha512-BkP4OCrB8zFYS77JhzbAfB9xCzpUN6h2XTUsWQJaTR2xSvyBdXulrpXaeF2P2tOE5R4/sozDpjRtPgwz0v8V5Q==", "license": "MIT", "dependencies": { - "@github/copilot": "^0.0.403", + "@github/copilot": "^0.0.409", "vscode-jsonrpc": "^8.2.1", "zod": "^4.3.6" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@github/copilot-win32-arm64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.403.tgz", - "integrity": "sha512-djWjzCsp2xPNafMyOZ/ivU328/WvWhdroGie/DugiJBTgQL2SP0quWW1fhTlDwE81a3g9CxfJonaRgOpFTJTcg==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.409.tgz", + "integrity": "sha512-VizZsdK7L3ym/OR4wahiFx+6hFtaOYN9qvsHmNSo8pb65AZ6ORdRnCPE7w9ZejMpdNEa6x6WqHfxDKJlF85zyA==", "cpu": [ "arm64" ], @@ -872,9 +872,9 @@ } }, "node_modules/@github/copilot-win32-x64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.403.tgz", - "integrity": "sha512-lju8cHy2E6Ux7R7tWyLZeksYC2MVZu9i9ocjiBX/qfG2/pNJs7S5OlkwKJ0BSXSbZEHQYq7iHfEWp201bVfk9A==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.409.tgz", + "integrity": "sha512-c6dP3XRFk550PmH1Vxe7n/bStNSLnVGH5B+ErUKXk/SPqmZ59pyoa7H2USNdoC6Nav5tkwYYR1vwNZRy+iKvrA==", "cpu": [ "x64" ], @@ -1370,7 +1370,6 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "license": "MIT", - "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", @@ -1920,7 +1919,6 @@ "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -1931,23 +1929,22 @@ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz", - "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", + "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.55.0", - "@typescript-eslint/type-utils": "8.55.0", - "@typescript-eslint/utils": "8.55.0", - "@typescript-eslint/visitor-keys": "8.55.0", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/type-utils": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -1960,23 +1957,23 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.55.0", - "eslint": "^8.57.0 || ^9.0.0", + "@typescript-eslint/parser": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz", - "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==", + "node_modules/@typescript-eslint/parser": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", + "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/typescript-estree": "8.55.0", - "@typescript-eslint/utils": "8.55.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1986,21 +1983,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz", - "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", + "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.55.0", - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/typescript-estree": "8.55.0" + "@typescript-eslint/tsconfig-utils": "^8.56.0", + "@typescript-eslint/types": "^8.56.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2010,23 +2006,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz", - "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", + "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.55.0", - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/typescript-estree": "8.55.0", - "@typescript-eslint/visitor-keys": "8.55.0", - "debug": "^4.4.3" + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2034,23 +2025,14 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz", - "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", + "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.55.0", - "@typescript-eslint/types": "^8.55.0", - "debug": "^4.4.3" - }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2062,45 +2044,35 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz", - "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", + "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/visitor-keys": "8.55.0" + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz", - "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz", - "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -2112,16 +2084,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz", - "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", + "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.55.0", - "@typescript-eslint/tsconfig-utils": "8.55.0", - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/visitor-keys": "8.55.0", + "@typescript-eslint/project-service": "8.56.0", + "@typescript-eslint/tsconfig-utils": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", @@ -2139,15 +2111,39 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", + "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz", - "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", + "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.55.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.56.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2158,13 +2154,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2318,7 +2314,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3249,7 +3244,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -3304,7 +3298,6 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3539,9 +3532,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "17.23.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.2.tgz", - "integrity": "sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==", + "version": "17.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz", + "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==", "dev": true, "license": "MIT", "dependencies": { @@ -5743,7 +5736,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -5857,7 +5849,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6728,7 +6719,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -6906,7 +6896,6 @@ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -7033,7 +7022,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7097,7 +7085,6 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -7191,7 +7178,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7205,7 +7191,6 @@ "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", diff --git a/package.json b/package.json index e2aa336..3fad5ed 100644 --- a/package.json +++ b/package.json @@ -26,34 +26,34 @@ "author": "", "license": "ISC", "dependencies": { - "@github/copilot-sdk": "^0.1.19", - "@inquirer/prompts": "^8.2.0", + "@github/copilot-sdk": "^0.1.24", + "@inquirer/prompts": "^8.2.1", "@octokit/rest": "^22.0.1", "chalk": "^5.6.2", - "commander": "^14.0.2", + "commander": "^14.0.3", "fast-glob": "^3.3.3", - "ink": "^6.6.0", + "ink": "^6.7.0", "react": "^19.2.4", - "simple-git": "^3.30.0" + "simple-git": "^3.31.1" }, "lint-staged": { "*.{ts,tsx,js,json,md}": "prettier --write" }, "devDependencies": { - "@types/node": "^25.1.0", - "@types/react": "^19.2.10", - "@typescript-eslint/eslint-plugin": "^8.5.0", - "@typescript-eslint/parser": "^8.5.0", + "@types/node": "^25.2.3", + "@types/react": "^19.2.14", + "@typescript-eslint/eslint-plugin": "^8.56.0", + "@typescript-eslint/parser": "^8.56.0", "@vitest/coverage-v8": "^4.0.18", "eslint": "^9.39.2", "eslint-config-prettier": "^9.1.2", - "eslint-plugin-import": "^2.30.0", - "eslint-plugin-n": "^17.10.2", - "eslint-plugin-promise": "^7.1.0", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-promise": "^7.2.1", "globals": "^17.3.0", "husky": "^9.1.7", "lint-staged": "^16.2.7", - "prettier": "^3.3.3", + "prettier": "^3.8.1", "tsup": "^8.5.1", "tsx": "^4.21.0", "typescript": "^5.9.3", diff --git a/vscode-extension/package-lock.json b/vscode-extension/package-lock.json index 6be638c..06ad375 100644 --- a/vscode-extension/package-lock.json +++ b/vscode-extension/package-lock.json @@ -9,14 +9,14 @@ "version": "0.0.1", "license": "ISC", "dependencies": { - "@github/copilot-sdk": "^0.1.19", - "simple-git": "^3.30.0" + "@github/copilot-sdk": "^0.1.24", + "simple-git": "^3.31.1" }, "devDependencies": { "@octokit/rest": "^22.0.1", - "@types/node": "^22.0.0", - "@types/vscode": "^1.100.0", - "esbuild": "^0.25.0", + "@types/node": "^25.2.3", + "@types/vscode": "^1.109.0", + "esbuild": "^0.27.3", "typescript": "^5.9.3" }, "engines": { @@ -24,9 +24,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", "cpu": [ "ppc64" ], @@ -41,9 +41,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ "arm" ], @@ -58,9 +58,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", "cpu": [ "arm64" ], @@ -75,9 +75,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", "cpu": [ "x64" ], @@ -92,9 +92,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -109,9 +109,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", "cpu": [ "x64" ], @@ -126,9 +126,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], @@ -143,9 +143,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], @@ -160,9 +160,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], @@ -177,9 +177,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], @@ -194,9 +194,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], @@ -211,9 +211,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], @@ -228,9 +228,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], @@ -245,9 +245,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], @@ -262,9 +262,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -279,9 +279,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -296,9 +296,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], @@ -313,9 +313,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", "cpu": [ "arm64" ], @@ -330,9 +330,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], @@ -347,9 +347,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", "cpu": [ "arm64" ], @@ -364,9 +364,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], @@ -381,9 +381,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", "cpu": [ "arm64" ], @@ -398,9 +398,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], @@ -415,9 +415,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], @@ -432,9 +432,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], @@ -449,9 +449,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], @@ -466,26 +466,26 @@ } }, "node_modules/@github/copilot": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.403.tgz", - "integrity": "sha512-v5jUdtGJReLmE1rmff/LZf+50nzmYQYAaSRNtVNr9g0j0GkCd/noQExe31i1+PudvWU0ZJjltR0B8pUfDRdA9Q==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.409.tgz", + "integrity": "sha512-rkYWOKjTSuGg99KsgmA0QAP4X2cpJzAYk6lZDlVxKPhuLP03wC5E+jLctrSLjpxhX32p9n13rm1+7Jun80a1hw==", "license": "SEE LICENSE IN LICENSE.md", "bin": { "copilot": "npm-loader.js" }, "optionalDependencies": { - "@github/copilot-darwin-arm64": "0.0.403", - "@github/copilot-darwin-x64": "0.0.403", - "@github/copilot-linux-arm64": "0.0.403", - "@github/copilot-linux-x64": "0.0.403", - "@github/copilot-win32-arm64": "0.0.403", - "@github/copilot-win32-x64": "0.0.403" + "@github/copilot-darwin-arm64": "0.0.409", + "@github/copilot-darwin-x64": "0.0.409", + "@github/copilot-linux-arm64": "0.0.409", + "@github/copilot-linux-x64": "0.0.409", + "@github/copilot-win32-arm64": "0.0.409", + "@github/copilot-win32-x64": "0.0.409" } }, "node_modules/@github/copilot-darwin-arm64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.403.tgz", - "integrity": "sha512-dOw8IleA0d1soHnbr/6wc6vZiYWNTKMgfTe/NET1nCfMzyKDt/0F0I7PT5y+DLujJknTla/ZeEmmBUmliTW4Cg==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.409.tgz", + "integrity": "sha512-yjrrp++UNNvRoWsZ1+UioBqb3DEVxL5M5ePnMO5/Sf1sngxh0y5P9P6ePFZU4PVlM5BgC38DtrcauZaKf/oArQ==", "cpu": [ "arm64" ], @@ -499,9 +499,9 @@ } }, "node_modules/@github/copilot-darwin-x64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.403.tgz", - "integrity": "sha512-aK2jSNWgY8eiZ+TmrvGhssMCPDTKArc0ip6Ul5OaslpytKks8hyXoRbxGD0N9sKioSUSbvKUf+1AqavbDpJO+w==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.409.tgz", + "integrity": "sha512-EhLfY5DGU/BZmwjVcfnwKuJA7BxS9zdNCGeynUq7z/SI93ziastFqOddUX4D+ySz6yMrrXieN8cUKgzAlRCOJg==", "cpu": [ "x64" ], @@ -515,9 +515,9 @@ } }, "node_modules/@github/copilot-linux-arm64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.403.tgz", - "integrity": "sha512-KhoR2iR70O6vCkzf0h8/K+p82qAgOvMTgAPm9bVEHvbdGFR7Py9qL5v03bMbPxsA45oNaZAkzDhfTAqWhIAZsQ==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.409.tgz", + "integrity": "sha512-O7b/9LmBO8ljPqNngonx+v5d3cOs6HKvj2E9f5/Flb9Uw2lut7g6KGerfDYCMZUpvFCMDfbZSBJD3SDuJj1uPg==", "cpu": [ "arm64" ], @@ -531,9 +531,9 @@ } }, "node_modules/@github/copilot-linux-x64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.403.tgz", - "integrity": "sha512-eoswUc9vo4TB+/9PgFJLVtzI4dPjkpJXdCsAioVuoqPdNxHxlIHFe9HaVcqMRZxUNY1YHEBZozy+IpUEGjgdfQ==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.409.tgz", + "integrity": "sha512-zSfFqyPxNaBE5/ClrSjsKxhhTpJaVOqSJY0q87iV9fw6xwdzcJ1/FlZGKjE7W8YVb4tdJx+OBMjQCU8WYewF1A==", "cpu": [ "x64" ], @@ -547,23 +547,23 @@ } }, "node_modules/@github/copilot-sdk": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.22.tgz", - "integrity": "sha512-ZGOEBmYOfu/vLXKjjoiw4lO3Cb8QBUuAWXcW/qzmPPsM9+Qe00qVr2AuDTU/Gft9Dm/yZcPK2QuTZc7LVeom9w==", + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.24.tgz", + "integrity": "sha512-BkP4OCrB8zFYS77JhzbAfB9xCzpUN6h2XTUsWQJaTR2xSvyBdXulrpXaeF2P2tOE5R4/sozDpjRtPgwz0v8V5Q==", "license": "MIT", "dependencies": { - "@github/copilot": "^0.0.403", + "@github/copilot": "^0.0.409", "vscode-jsonrpc": "^8.2.1", "zod": "^4.3.6" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@github/copilot-win32-arm64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.403.tgz", - "integrity": "sha512-djWjzCsp2xPNafMyOZ/ivU328/WvWhdroGie/DugiJBTgQL2SP0quWW1fhTlDwE81a3g9CxfJonaRgOpFTJTcg==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.409.tgz", + "integrity": "sha512-VizZsdK7L3ym/OR4wahiFx+6hFtaOYN9qvsHmNSo8pb65AZ6ORdRnCPE7w9ZejMpdNEa6x6WqHfxDKJlF85zyA==", "cpu": [ "arm64" ], @@ -577,9 +577,9 @@ } }, "node_modules/@github/copilot-win32-x64": { - "version": "0.0.403", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.403.tgz", - "integrity": "sha512-lju8cHy2E6Ux7R7tWyLZeksYC2MVZu9i9ocjiBX/qfG2/pNJs7S5OlkwKJ0BSXSbZEHQYq7iHfEWp201bVfk9A==", + "version": "0.0.409", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.409.tgz", + "integrity": "sha512-c6dP3XRFk550PmH1Vxe7n/bStNSLnVGH5B+ErUKXk/SPqmZ59pyoa7H2USNdoC6Nav5tkwYYR1vwNZRy+iKvrA==", "cpu": [ "x64" ], @@ -774,13 +774,13 @@ } }, "node_modules/@types/node": { - "version": "22.19.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.11.tgz", - "integrity": "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/vscode": { @@ -815,9 +815,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -828,32 +828,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" } }, "node_modules/fast-content-type-parse": { @@ -909,9 +909,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, diff --git a/vscode-extension/package.json b/vscode-extension/package.json index 9eceacb..2a4ee74 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -206,14 +206,14 @@ "package": "vsce package" }, "dependencies": { - "@github/copilot-sdk": "^0.1.19", - "simple-git": "^3.30.0" + "@github/copilot-sdk": "^0.1.24", + "simple-git": "^3.31.1" }, "devDependencies": { "@octokit/rest": "^22.0.1", - "@types/node": "^22.0.0", - "@types/vscode": "^1.100.0", - "esbuild": "^0.25.0", + "@types/node": "^25.2.3", + "@types/vscode": "^1.109.0", + "esbuild": "^0.27.3", "typescript": "^5.9.3" } } From c99f0dfad9c547c31191cecedbf20099a215f91b Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 11:12:06 -0800 Subject: [PATCH 59/84] style: fix prettier formatting --- src/commands/instructions.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/commands/instructions.ts b/src/commands/instructions.ts index fff17f1..50daf63 100644 --- a/src/commands/instructions.ts +++ b/src/commands/instructions.ts @@ -55,11 +55,7 @@ export async function instructionsCommand(options: InstructionsOptions): Promise if (content) { await ensureDir(path.dirname(outputPath)); - const { wrote, reason } = await safeWriteFile( - outputPath, - content, - Boolean(options.force) - ); + const { wrote, reason } = await safeWriteFile(outputPath, content, Boolean(options.force)); if (!wrote) { const relPath = path.relative(process.cwd(), outputPath); @@ -78,11 +74,12 @@ export async function instructionsCommand(options: InstructionsOptions): Promise const byteCount = Buffer.byteLength(content, "utf8"); if (options.json) { - const result: CommandResult<{ outputPath: string; model: string; byteCount: number }> = { - ok: true, - status: "success", - data: { outputPath, model: options.model ?? "default", byteCount } - }; + const result: CommandResult<{ outputPath: string; model: string; byteCount: number }> = + { + ok: true, + status: "success", + data: { outputPath, model: options.model ?? "default", byteCount } + }; outputResult(result, true); } else if (shouldLog(options)) { progress.succeed(`Updated ${path.relative(process.cwd(), outputPath)}`); From 7fde6bc8e1fa55e4c0675dd51044472a14409c33 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 14:30:45 -0800 Subject: [PATCH 60/84] readme/changelog refresh --- CHANGELOG.md | 45 +++++++++++++++++++++++++++++++++++---------- README.md | 41 +++++++++++++++++++++++++++++++++-------- 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6433ab..e09f2fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,40 +12,65 @@ Primer vNext is a complete rewrite as a TypeScript CLI tool (ESM, strict, ES2022 - **`primer readiness`** — AI readiness report scoring repos across 9 pillars (style, build, testing, docs, dev-env, code-quality, observability, security, AI tooling) with a 5-level maturity model (Functional → Autonomous). - **`primer readiness --visual`** — GitHub-themed HTML report with light/dark toggle, expandable pillar details, and maturity model descriptions. -- **`primer batch-readiness`** — Consolidated visual readiness report across multiple repositories. +- **`primer readiness --per-area`** — Per-area readiness scoring for monorepos with area-scoped criteria and aggregate thresholds. +- **`primer readiness --policy`** — Customizable readiness policies (disable/override criteria, tune thresholds) via JSON, JS/TS, or npm packages; chainable with last-wins semantics. +- **`primer batch-readiness`** — Consolidated visual readiness report across multiple repositories, with `--policy` support. - **`primer generate instructions`** — Generate `copilot-instructions.md` via Copilot SDK, with `--per-app` support for monorepos. - **`primer generate agents`** — Generate `AGENTS.md` guidance files. -- **`primer eval --init`** — AI-powered eval scaffold generation that analyzes codebases and produces cross-cutting eval cases. +- **`primer instructions --areas`** — Generate file-based `.instructions.md` files scoped to detected areas with `applyTo` glob patterns. +- **`primer eval --init`** — AI-powered eval scaffold generation that analyzes codebases and produces cross-cutting, area-aware eval cases. - **`primer eval --list-models`** — List available Copilot CLI models. +- **`primer analyze`** — Standalone repo analysis command with structured `--json` output. + +### VS Code Extension + +- 8 command palette commands: Analyze, Generate Configs, Generate Instructions, AI Readiness Report, Run Eval, Scaffold Eval, Initialize Repository, Create PR. +- Sidebar tree views: Analysis (languages, frameworks, monorepo areas) and Readiness (9-pillar scores with color-coded criteria). +- Webview panels for readiness HTML reports and eval results. +- Dynamic status bar showing detected languages after analysis. +- PR creation with default-branch guard, selective file staging, and GitHub auth via VS Code API. +- esbuild-bundled CJS output; CI typecheck and release-time VSIX packaging. ### New Features - **Azure DevOps integration** — Full support for batch processing, PR creation, and repo cloning via Azure DevOps PAT authentication. -- **Monorepo detection** — Detect and analyze Cargo workspaces, Go workspaces (`go.work`), .NET solutions (`.sln`), Gradle multi-project, Maven multi-module, in addition to npm/pnpm/yarn workspaces. +- **Headless automation** — Global `--json` and `--quiet` flags on all commands; `CommandResult` envelope with `ok`/`status`/`data`/`errors`. Headless batch mode via positional args or stdin piping. +- **Policy system** — Layered policy chain for readiness reports: disable/override criteria, add extras, tune pass-rate thresholds. Config-sourced policies restricted to JSON-only for security. +- **Per-area readiness** — 4 area-scoped criteria (`area-readme`, `area-build-script`, `area-test-script`, `area-instructions`) with 80% aggregate pass threshold. +- **File-based area instructions** — `.instructions.md` files with YAML frontmatter (`description`, `applyTo`) for VS Code Copilot area scoping. +- **Expanded monorepo detection** — Bazel (`MODULE.bazel`/`WORKSPACE`), Nx (`project.json`), Pants (`pants.toml`), Turborepo overlay, in addition to Cargo, Go, .NET, Gradle, Maven, npm/pnpm/yarn workspaces. +- **Smart area fallback** — Large repos with 10+ top-level dirs automatically discover areas via heuristic scanning with symlink-safe directory traversal. - **Eval trajectory viewer** — Interactive HTML viewer comparing responses with/without instructions, including token usage, tool call metrics, and duration tracking. +- **Windows Copilot CLI support** — `.cmd`/`.bat` wrapper handling via `cmd /c`, npm-loader.js detection, and `CopilotCliConfig` type replacing bare string paths. - **Copilot CLI discovery** — Cross-platform discovery with TTL caching and glob-based fallback for VS Code extension paths. - **Centralized model defaults** — Default model set to `claude-sonnet-4.5` via `src/config.ts`. ### Improvements -- Replaced `process.chdir()` with safe `withCwd` utility for directory switching during Copilot SDK calls. -- Path traversal protection via `validateCachePath` for cloned repo paths. +- All file write paths now use `safeWriteFile()` — instructions, agents, and area files all reject symlinks and respect `--force`. +- Unified `primer pr` command: both GitHub and Azure DevOps generate all three artifacts (instructions + MCP + VS Code configs) with consistent branch naming. +- `CommandResult` output envelope with structured JSON to stdout; human-readable output to stderr. +- `ProgressReporter` interface for silent or human-readable progress across CLI and headless modes. +- Symlink-safe directory scanning via `isScannableDirectory()` with `lstat` + `realpath` containment checks. +- Path traversal protection via `validateCachePath` for cloned repo paths and double-layer defense for area `applyTo` patterns. - Credential sanitization in git push error messages to prevent token leaks. - `buildAuthedUrl` utility supporting both GitHub (`x-access-token`) and Azure DevOps (`pat`) auth. -- `safeWriteFile` utility for safe config file writes (skip existing unless `--force`). - `checkRepoHasInstructions` now re-throws non-404 errors instead of silently returning false. - `init --yes` now generates instructions, MCP, and VS Code configs (previously only instructions). +- CSP meta tags added to eval and readiness HTML report generators. ### Removed -- Removed stub commands: `analyze`, `templates`, `update`, `config`. +- Removed stub commands: `templates`, `update`, `config`. +- Removed `src/utils/cwd.ts` — replaced by Copilot SDK `workingDirectory` session config. ### Testing & Tooling -- Vitest test framework with 51+ tests covering analyzer, generator, git, readiness, visual report, fs utilities, and cache path validation. +- Vitest test framework with 267 tests across 13 test files covering analyzer, generator, git, readiness, visual report, fs utilities, cache path validation, policies, boundaries, CLI, output utilities, and PR helpers. - ESLint flat config with TypeScript, import ordering, and Prettier integration. -- CI workflow with lint, typecheck, tests (Node 20/22, Ubuntu/macOS/Windows), and build verification. -- Release automation via release-please. +- CI workflow with lint, typecheck, tests (Node 20/22, Ubuntu/macOS/Windows), build verification, and extension typecheck. +- CI dogfooding: runs `primer analyze --json` and `primer readiness --json` on the repo itself. +- Release automation via release-please with VSIX packaging for the VS Code extension. - Code coverage via `@vitest/coverage-v8`. ### Project Setup diff --git a/README.md b/README.md index 8527760..44b6827 100644 --- a/README.md +++ b/README.md @@ -2,25 +2,29 @@ > Prime your repositories for AI-assisted development. -[![CI](https://github.com/pierceboggan/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/pierceboggan/primer/actions/workflows/ci.yml) +[![CI](https://github.com/digitarald/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/digitarald/primer/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) -Primer is a CLI tool that helps teams prepare repositories for AI-assisted development. It generates custom instructions, assesses AI readiness with a maturity model, and supports batch processing across organizations — with an interactive TUI and beautiful visual reports. +Primer is a CLI and VS Code extension that helps teams prepare repositories for AI-assisted development. It generates custom instructions, assesses AI readiness with a maturity model, and supports batch processing across organizations — with an interactive TUI, visual reports, and a policy system for org-wide standards. ```bash -npx github:pierceboggan/primer readiness --visual +npx github:digitarald/primer readiness --visual ``` ## Features - **AI Readiness Reports** — Score repos across 9 pillars with a maturity model (Functional → Autonomous), including an AI tooling pillar that checks for MCP, custom agents, Copilot skills, and custom instructions. Supports per-area breakdowns for monorepos and multi-domain projects - **Visual Reports** — GitHub-themed HTML reports with light/dark toggle, expandable pillar details, and maturity model descriptions +- **Readiness Policies** — Customize which criteria are evaluated, override metadata, and tune pass-rate thresholds with chainable JSON policies - **Instruction Generation** — Generate `copilot-instructions.md` or `AGENTS.md` using the Copilot SDK, with per-app support for monorepos. Generate file-based `.instructions.md` files for detected areas (frontend, backend, infra, etc.) +- **VS Code Extension** — All CLI workflows accessible from command palette, sidebar tree views, and webview panels - **Batch Processing** — Process multiple repos across GitHub or Azure DevOps organizations - **Evaluation Framework** — Measure how instructions improve AI responses with a judge model +- **Monorepo Detection** — Supports npm/pnpm/yarn, Cargo, Go, .NET, Gradle, Maven, Bazel, Nx, Pants, and Turborepo workspaces - **Interactive TUI** — Ink-based terminal UI with submenus, model picker, activity log, and animated banner - **Config Generation** — Generate MCP and VS Code configurations -- **GitHub Integration** — Clone repos, create branches, and open PRs automatically +- **GitHub & Azure DevOps** — Clone repos, create branches, and open PRs across both platforms +- **Cross-Platform** — Works on macOS, Linux, and Windows (including `.cmd`/`.bat` Copilot CLI wrappers) ## Prerequisites @@ -35,7 +39,7 @@ npx github:pierceboggan/primer readiness --visual ## Installation ```bash -git clone https://github.com/pierceboggan/primer.git +git clone https://github.com/digitarald/primer.git cd primer npm install npm run build @@ -260,7 +264,7 @@ primer tui --repo /path/to/repo --no-animation ```bash npm run typecheck # type check npm run lint # ESLint (flat config + Prettier) -npm run test # 51+ Vitest tests +npm run test # 267 Vitest tests npm run test:coverage # with coverage via @vitest/coverage-v8 npm run build # production build via tsup @@ -268,6 +272,17 @@ npm run build # production build via tsup npx tsx src/index.ts --help ``` +### VS Code Extension + +```bash +cd vscode-extension +npm install +npm run build # esbuild bundle +npm run watch # watch mode +npm run typecheck # TypeScript check +# Press F5 to launch Extension Development Host +``` + See [CONTRIBUTING.md](CONTRIBUTING.md) for workflow and code style guidelines. ## Project Structure @@ -287,12 +302,22 @@ src/ │ ├── evaluator.ts # Eval runner + trajectory viewer │ ├── evalScaffold.ts # AI-powered eval config generation │ ├── generator.ts # MCP/VS Code config generation +│ ├── policy.ts # Readiness policy loading and chain resolution │ ├── git.ts # Git operations (clone, branch, push) │ ├── github.ts # GitHub API (Octokit) │ ├── azureDevops.ts # Azure DevOps API -│ └── __tests__/ # Test suite +│ └── __tests__/ # Test suite (267 tests) ├── ui/ # Ink/React terminal UI -└── utils/ # Shared utilities (fs, logger, cwd, output) +└── utils/ # Shared utilities (fs, logger, output, repo, pr) + +vscode-extension/ +├── src/ +│ ├── extension.ts # Extension entry point +│ ├── commands/ # VS Code command handlers +│ ├── views/ # Tree view providers (Analysis, Readiness) +│ ├── services.ts # Bridge to CLI services +│ └── webview.ts # Webview panel management +└── package.json # Extension manifest ``` ## Troubleshooting From 3e877207ea022a239e257c8e89d07ff6d0f13e00 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 16:41:38 -0800 Subject: [PATCH 61/84] refactor: consolidate instruction generation into unified instructions command --- src/cli.ts | 16 +- src/commands/generate.ts | 98 +------- src/commands/instructions.ts | 263 ++++++++++++---------- src/services/__tests__/boundaries.test.ts | 25 ++ 4 files changed, 191 insertions(+), 211 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index efddc7a..8f90da9 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,4 +1,4 @@ -import { Command } from "commander"; +import { Command, Option } from "commander"; import { analyzeCommand } from "./commands/analyze"; import { batchCommand } from "./commands/batch"; @@ -57,11 +57,9 @@ export function runCli(argv: string[]): void { program .command("generate") - .argument("", "instructions|agents|mcp|vscode") + .argument("", "mcp|vscode") .argument("[path]", "Path to a local repository") .option("--force", "Overwrite existing files") - .option("--per-app", "Generate per-app in monorepos") - .option("--model ", "Model for instructions generation", DEFAULT_MODEL) .action(withGlobalOpts(generateCommand)); program @@ -94,9 +92,15 @@ export function runCli(argv: string[]): void { program .command("instructions") .option("--repo ", "Repository path", process.cwd()) - .option("--output ", "Output path for copilot instructions") + .option("--output ", "Output path for instructions") + .addOption( + new Option("--format ", "Output format: copilot-instructions or agents-md") + .choices(["copilot-instructions", "agents-md"]) + .default("copilot-instructions") + ) + .option("--per-app", "Generate per-app instructions in monorepos") .option("--model ", "Model for instructions generation", DEFAULT_MODEL) - .option("--force", "Overwrite existing area instruction files") + .option("--force", "Overwrite existing files") .option("--areas", "Also generate file-based instructions for detected areas") .option("--areas-only", "Generate only file-based area instructions (skip root)") .option("--area ", "Generate file-based instructions for a specific area") diff --git a/src/commands/generate.ts b/src/commands/generate.ts index c6a70e1..85cd188 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -3,21 +3,11 @@ import path from "path"; import { analyzeRepo } from "../services/analyzer"; import type { FileAction } from "../services/generator"; import { generateConfigs } from "../services/generator"; -import { generateCopilotInstructions } from "../services/instructions"; -import { ensureDir, safeWriteFile } from "../utils/fs"; import type { CommandResult } from "../utils/output"; -import { - outputResult, - outputError, - deriveFileStatus, - createProgressReporter, - shouldLog -} from "../utils/output"; +import { outputResult, outputError, deriveFileStatus, shouldLog } from "../utils/output"; type GenerateOptions = { force?: boolean; - perApp?: boolean; - model?: string; json?: boolean; quiet?: boolean; }; @@ -27,9 +17,12 @@ export async function generateCommand( repoPathArg: string | undefined, options: GenerateOptions ): Promise { - const allowed = new Set(["mcp", "vscode", "instructions", "agents"]); + const allowed = new Set(["mcp", "vscode"]); if (!allowed.has(type)) { - outputError("Invalid type. Use: instructions, agents, mcp, vscode.", Boolean(options.json)); + outputError( + "Invalid type. Use: mcp, vscode. For instructions, use the 'instructions' command.", + Boolean(options.json) + ); return; } @@ -44,85 +37,6 @@ export async function generateCommand( ); return; } - const allFiles: FileAction[] = []; - - if (type === "instructions" || type === "agents") { - const apps = analysis.apps ?? []; - const targets: Array<{ repoPath: string; savePath: string; label: string }> = []; - - if (options.perApp && analysis.isMonorepo && apps.length > 1) { - for (const app of apps) { - const savePath = - type === "instructions" - ? path.join(app.path, ".github", "copilot-instructions.md") - : path.join(app.path, "AGENTS.md"); - targets.push({ repoPath: app.path, savePath, label: app.name }); - } - } else { - const savePath = - type === "instructions" - ? path.join(repoPath, ".github", "copilot-instructions.md") - : path.join(repoPath, "AGENTS.md"); - targets.push({ repoPath, savePath, label: path.basename(repoPath) }); - } - - for (const target of targets) { - if (shouldLog(options)) { - process.stderr.write(`Generating ${type} for ${target.label}...\n`); - } - try { - const progress = createProgressReporter(!shouldLog(options)); - const content = await generateCopilotInstructions({ - repoPath: target.repoPath, - model: options.model, - onProgress: (msg) => progress.update(msg) - }); - if (!content.trim()) { - if (shouldLog(options)) { - process.stderr.write(` No content generated for ${target.label}.\n`); - } - allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); - continue; - } - await ensureDir(path.dirname(target.savePath)); - const rel = path.relative(process.cwd(), target.savePath); - const { wrote, reason } = await safeWriteFile( - target.savePath, - content, - Boolean(options.force) - ); - if (!wrote) { - const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; - if (shouldLog(options)) { - process.stderr.write(` Skipped ${rel}: ${why}\n`); - } - allFiles.push({ path: rel, action: "skipped" }); - continue; - } - allFiles.push({ path: rel, action: "wrote" }); - if (shouldLog(options)) { - process.stderr.write(` ✓ ${rel}\n`); - } - } catch (error) { - if (shouldLog(options)) { - process.stderr.write(` ✗ ${error instanceof Error ? error.message : String(error)}\n`); - } - allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); - } - } - - if (options.json) { - const { ok, status } = deriveFileStatus(allFiles); - const result: CommandResult<{ type: string; files: FileAction[] }> = { - ok, - status, - data: { type, files: allFiles } - }; - outputResult(result, true); - if (!ok) process.exitCode = 1; - } - return; - } const selections = [type]; let genResult; diff --git a/src/commands/instructions.ts b/src/commands/instructions.ts index 50daf63..d920269 100644 --- a/src/commands/instructions.ts +++ b/src/commands/instructions.ts @@ -3,17 +3,30 @@ import path from "path"; import { generateCopilotInstructions, generateAreaInstructions, - writeAreaInstruction + writeAreaInstruction, + areaInstructionPath } from "../services/instructions"; import { analyzeRepo } from "../services/analyzer"; +import type { Area } from "../services/analyzer"; import { ensureDir, safeWriteFile } from "../utils/fs"; +import type { FileAction } from "../services/generator"; import type { CommandResult } from "../utils/output"; -import { outputResult, outputError, createProgressReporter, shouldLog } from "../utils/output"; +import { + outputResult, + outputError, + deriveFileStatus, + createProgressReporter, + shouldLog +} from "../utils/output"; + +type InstructionsFormat = "copilot-instructions" | "agents-md"; type InstructionsOptions = { repo?: string; output?: string; model?: string; + format?: InstructionsFormat; + perApp?: boolean; json?: boolean; quiet?: boolean; force?: boolean; @@ -22,75 +35,37 @@ type InstructionsOptions = { area?: string; }; +export function resolveOutputPath( + basePath: string, + format: InstructionsFormat, + customOutput?: string +): string { + if (customOutput) return path.resolve(customOutput); + return format === "agents-md" + ? path.join(basePath, "AGENTS.md") + : path.join(basePath, ".github", "copilot-instructions.md"); +} + export async function instructionsCommand(options: InstructionsOptions): Promise { const repoPath = path.resolve(options.repo ?? process.cwd()); - const outputPath = path.resolve( - options.output ?? path.join(repoPath, ".github", "copilot-instructions.md") - ); + const format: InstructionsFormat = options.format ?? "copilot-instructions"; const progress = createProgressReporter(!shouldLog(options)); const wantAreas = options.areas || options.areasOnly || options.area; + const allFiles: FileAction[] = []; try { - // Generate root instructions unless --areas-only - if (!options.areasOnly && !options.area) { - let content = ""; - try { - progress.update("Generating instructions..."); - content = await generateCopilotInstructions({ - repoPath, - model: options.model - }); - } catch (error) { - const msg = - "Failed to generate instructions with Copilot SDK. " + - "Ensure the Copilot CLI is installed (copilot --version) and logged in. " + - (error instanceof Error ? error.message : String(error)); - outputError(msg, Boolean(options.json)); - if (!wantAreas) return; - } - if (!content && !wantAreas) { - outputError("No instructions were generated.", Boolean(options.json)); - return; - } - - if (content) { - await ensureDir(path.dirname(outputPath)); - const { wrote, reason } = await safeWriteFile(outputPath, content, Boolean(options.force)); - - if (!wrote) { - const relPath = path.relative(process.cwd(), outputPath); - const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; - if (options.json) { - const result: CommandResult<{ outputPath: string; skipped: true; reason: string }> = { - ok: true, - status: "noop", - data: { outputPath, skipped: true, reason: why } - }; - outputResult(result, true); - } else if (shouldLog(options)) { - progress.update(`Skipped ${relPath}: ${why}`); - } - } else { - const byteCount = Buffer.byteLength(content, "utf8"); - - if (options.json) { - const result: CommandResult<{ outputPath: string; model: string; byteCount: number }> = - { - ok: true, - status: "success", - data: { outputPath, model: options.model ?? "default", byteCount } - }; - outputResult(result, true); - } else if (shouldLog(options)) { - progress.succeed(`Updated ${path.relative(process.cwd(), outputPath)}`); - } - } - } + // Validate option conflicts + if (options.perApp && options.output) { + outputError( + "--output cannot be combined with --per-app (each app gets its own file)", + Boolean(options.json) + ); + return; } - // Generate area-based instructions - if (wantAreas) { - let analysis; + // Analyze repo for --per-app or --areas + let analysis; + if (options.perApp || wantAreas) { try { analysis = await analyzeRepo(repoPath); } catch (error) { @@ -100,80 +75,142 @@ export async function instructionsCommand(options: InstructionsOptions): Promise ); return; } - const areas = analysis.areas ?? []; + } - if (areas.length === 0) { - if (shouldLog(options)) { - progress.update("No areas detected. Use primer.config.json to define custom areas."); + // Validate --area early (before generating root instructions) + let targetAreas: Area[] = []; + if (wantAreas) { + const areas = analysis!.areas ?? []; + if (options.area) { + const areaFilter = options.area.toLowerCase(); + targetAreas = areas.filter((a) => a.name.toLowerCase() === areaFilter); + if (targetAreas.length === 0) { + outputError( + `Area "${options.area}" not found. Available: ${areas.map((a) => a.name).join(", ")}`, + Boolean(options.json) + ); + return; } - return; + } else { + targetAreas = areas; } + } - const areaFilter = options.area?.toLowerCase(); - const targetAreas = areaFilter - ? areas.filter((a) => a.name.toLowerCase() === areaFilter) - : areas; + // Build generation targets + const targets: Array<{ repoPath: string; savePath: string; label: string }> = []; + const apps = analysis?.apps ?? []; - if (options.area && targetAreas.length === 0) { - outputError( - `Area "${options.area}" not found. Available: ${areas.map((a) => a.name).join(", ")}`, - Boolean(options.json) + if (options.perApp && analysis?.isMonorepo && apps.length > 1) { + for (const app of apps) { + const savePath = resolveOutputPath(app.path, format); + targets.push({ repoPath: app.path, savePath, label: app.name }); + } + } else if (!options.areasOnly && !options.area) { + const outputPath = resolveOutputPath(repoPath, format, options.output); + targets.push({ repoPath, savePath: outputPath, label: path.basename(repoPath) }); + } + + // Generate root instructions for each target + for (const target of targets) { + progress.update(`Generating ${format} for ${target.label}...`); + try { + const content = await generateCopilotInstructions({ + repoPath: target.repoPath, + model: options.model, + onProgress: (msg) => progress.update(msg) + }); + if (!content.trim()) { + progress.update(`No content generated for ${target.label}.`); + allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); + continue; + } + await ensureDir(path.dirname(target.savePath)); + const rel = path.relative(process.cwd(), target.savePath); + const { wrote, reason } = await safeWriteFile( + target.savePath, + content, + Boolean(options.force) ); - return; + if (!wrote) { + const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; + progress.update(`Skipped ${rel}: ${why}`); + allFiles.push({ path: rel, action: "skipped" }); + } else { + allFiles.push({ path: rel, action: "wrote" }); + progress.succeed(`Wrote ${rel}`); + } + } catch (error) { + const msg = + "Failed to generate instructions with Copilot SDK. " + + "Ensure the Copilot CLI is installed (copilot --version) and logged in. " + + (error instanceof Error ? error.message : String(error)); + progress.fail(msg); + allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); + if (!wantAreas) { + break; + } } + } - if (shouldLog(options)) { + // Generate area-based instructions + if (wantAreas) { + if (targetAreas.length === 0) { + progress.update("No areas detected. Use primer.config.json to define custom areas."); + } else { progress.update(`Generating file-based instructions for ${targetAreas.length} area(s)...`); - } - for (const area of targetAreas) { - try { - if (shouldLog(options)) { + for (const area of targetAreas) { + const areaRel = path.relative(process.cwd(), areaInstructionPath(repoPath, area)); + try { progress.update( `Generating for "${area.name}" (${Array.isArray(area.applyTo) ? area.applyTo.join(", ") : area.applyTo})...` ); - } - const body = await generateAreaInstructions({ - repoPath, - area, - model: options.model, - onProgress: shouldLog(options) ? (msg) => progress.update(msg) : undefined - }); - - if (!body.trim()) { - if (shouldLog(options)) { + const body = await generateAreaInstructions({ + repoPath, + area, + model: options.model, + onProgress: (msg) => progress.update(msg) + }); + + if (!body.trim()) { progress.update(`Skipped "${area.name}" — no content generated.`); + allFiles.push({ path: areaRel, action: "skipped" }); + continue; } - continue; - } - const result = await writeAreaInstruction(repoPath, area, body, options.force); - if (result.status === "skipped") { - if (shouldLog(options)) { - progress.update(`Skipped "${area.name}" — file exists (use --force to overwrite).`); - } - continue; - } - if (result.status === "symlink") { - if (shouldLog(options)) { - progress.update(`Skipped "${area.name}" — path is a symlink.`); + const result = await writeAreaInstruction(repoPath, area, body, options.force); + if (result.status === "written") { + allFiles.push({ path: areaRel, action: "wrote" }); + progress.succeed(`Wrote ${areaRel}`); + } else { + const why = + result.status === "symlink" + ? "path is a symlink" + : "file exists (use --force to overwrite)"; + progress.update(`Skipped "${area.name}" — ${why}.`); + allFiles.push({ path: areaRel, action: "skipped" }); } - continue; - } - if (shouldLog(options)) { - progress.succeed(`Wrote ${path.relative(process.cwd(), result.filePath)}`); - } - } catch (error) { - if (shouldLog(options)) { - progress.update( + } catch (error) { + progress.fail( `Failed for "${area.name}": ${error instanceof Error ? error.message : String(error)}` ); + allFiles.push({ path: areaRel, action: "skipped" }); } } } } - if (!wantAreas && shouldLog(options) && !options.json) { + // Output JSON result + if (options.json) { + const { ok, status } = deriveFileStatus(allFiles); + const result: CommandResult<{ format: string; files: FileAction[] }> = { + ok, + status, + data: { format, files: allFiles } + }; + outputResult(result, true); + if (!ok) process.exitCode = 1; + } else if (!wantAreas && shouldLog(options)) { process.stderr.write( "Please review and share feedback on any unclear or incomplete sections.\n" ); diff --git a/src/services/__tests__/boundaries.test.ts b/src/services/__tests__/boundaries.test.ts index 5233c69..9490548 100644 --- a/src/services/__tests__/boundaries.test.ts +++ b/src/services/__tests__/boundaries.test.ts @@ -8,6 +8,7 @@ import { sanitizeError } from "../batch"; import { safeWriteFile } from "../../utils/fs"; import { deriveFileStatus, shouldLog } from "../../utils/output"; import { GITHUB_REPO_RE, AZURE_REPO_RE } from "../../utils/repo"; +import { resolveOutputPath } from "../../commands/instructions"; // ── sanitizeError ── @@ -198,3 +199,27 @@ describe("safeWriteFile symlink", () => { expect(await fs.readFile(realFile, "utf8")).toBe("original"); }); }); + +// ── resolveOutputPath ── + +describe("resolveOutputPath", () => { + it("returns .github/copilot-instructions.md for copilot-instructions format", () => { + const result = resolveOutputPath("/repo", "copilot-instructions"); + expect(result).toBe(path.join("/repo", ".github", "copilot-instructions.md")); + }); + + it("returns AGENTS.md for agents-md format", () => { + const result = resolveOutputPath("/repo", "agents-md"); + expect(result).toBe(path.join("/repo", "AGENTS.md")); + }); + + it("uses customOutput when provided, ignoring format", () => { + const result = resolveOutputPath("/repo", "agents-md", "/custom/output.md"); + expect(result).toBe(path.resolve("/custom/output.md")); + }); + + it("resolves customOutput relative paths", () => { + const result = resolveOutputPath("/repo", "copilot-instructions", "relative/path.md"); + expect(result).toBe(path.resolve("relative/path.md")); + }); +}); From 959ffff96f7f17c4df4155b164bf56a5f9d0e11e Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 17:08:21 -0800 Subject: [PATCH 62/84] group readiness pillars into Repo Health/AI Setup and restructure README around user journey --- README.md | 284 +++++++++++------------------------ src/commands/readiness.ts | 16 +- src/services/readiness.ts | 30 ++++ src/services/visualReport.ts | 56 ++++--- 4 files changed, 166 insertions(+), 220 deletions(-) diff --git a/README.md b/README.md index 44b6827..c0b4308 100644 --- a/README.md +++ b/README.md @@ -5,102 +5,56 @@ [![CI](https://github.com/digitarald/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/digitarald/primer/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) -Primer is a CLI and VS Code extension that helps teams prepare repositories for AI-assisted development. It generates custom instructions, assesses AI readiness with a maturity model, and supports batch processing across organizations — with an interactive TUI, visual reports, and a policy system for org-wide standards. +Primer is a CLI and VS Code extension that helps teams prepare repositories for AI-assisted development. It generates custom instructions, assesses AI readiness across a maturity model, and supports batch processing across organizations. -```bash -npx github:digitarald/primer readiness --visual -``` - -## Features - -- **AI Readiness Reports** — Score repos across 9 pillars with a maturity model (Functional → Autonomous), including an AI tooling pillar that checks for MCP, custom agents, Copilot skills, and custom instructions. Supports per-area breakdowns for monorepos and multi-domain projects -- **Visual Reports** — GitHub-themed HTML reports with light/dark toggle, expandable pillar details, and maturity model descriptions -- **Readiness Policies** — Customize which criteria are evaluated, override metadata, and tune pass-rate thresholds with chainable JSON policies -- **Instruction Generation** — Generate `copilot-instructions.md` or `AGENTS.md` using the Copilot SDK, with per-app support for monorepos. Generate file-based `.instructions.md` files for detected areas (frontend, backend, infra, etc.) -- **VS Code Extension** — All CLI workflows accessible from command palette, sidebar tree views, and webview panels -- **Batch Processing** — Process multiple repos across GitHub or Azure DevOps organizations -- **Evaluation Framework** — Measure how instructions improve AI responses with a judge model -- **Monorepo Detection** — Supports npm/pnpm/yarn, Cargo, Go, .NET, Gradle, Maven, Bazel, Nx, Pants, and Turborepo workspaces -- **Interactive TUI** — Ink-based terminal UI with submenus, model picker, activity log, and animated banner -- **Config Generation** — Generate MCP and VS Code configurations -- **GitHub & Azure DevOps** — Clone repos, create branches, and open PRs across both platforms -- **Cross-Platform** — Works on macOS, Linux, and Windows (including `.cmd`/`.bat` Copilot CLI wrappers) - -## Prerequisites - -| Requirement | Notes | -| --------------------------------- | ------------------------------------------------------------------------ | -| **Node.js 20+** | Runtime | -| **GitHub Copilot CLI** | Bundled with the VS Code Copilot Chat extension | -| **Copilot authentication** | Run `copilot` → `/login` | -| **GitHub CLI** _(optional)_ | For batch processing and PR creation: `brew install gh && gh auth login` | -| **Azure DevOps PAT** _(optional)_ | Set `AZURE_DEVOPS_PAT` for Azure DevOps workflows | - -## Installation +## Quick Start ```bash +# Clone and install git clone https://github.com/digitarald/primer.git -cd primer -npm install -npm run build -npm link -``` +cd primer && npm install && npm run build && npm link -Verify: +# 1. Check how AI-ready your repo is +primer readiness -```bash -primer --help -``` +# 2. Generate AI instructions +primer instructions -## Quick Start +# 3. Generate MCP and VS Code configs +primer generate mcp +primer generate vscode -```bash -# Interactive setup — generates instructions, MCP, and VS Code configs +# Or do everything interactively primer init - -# Non-interactive with defaults -primer init --yes ``` -## Global Options - -All commands support these flags: - -| Flag | Description | -| --------- | --------------------------------------------------- | -| `--json` | Output structured JSON to stdout (machine-readable) | -| `--quiet` | Suppress all non-essential output | - -When `--json` is set, commands emit a `CommandResult` envelope: - -```json -{ - "ok": true, - "status": "success", - "data": { ... } -} -``` +## Prerequisites -Status is one of `"success"`, `"partial"`, `"noop"`, or `"error"`. Errors include an `errors` array. +| Requirement | Notes | +| --------------------------------- | ---------------------------------------------------------------- | +| **Node.js 20+** | Runtime | +| **GitHub Copilot CLI** | Bundled with the VS Code Copilot Chat extension | +| **Copilot authentication** | Run `copilot` → `/login` | +| **GitHub CLI** _(optional)_ | For batch processing and PRs: `brew install gh && gh auth login` | +| **Azure DevOps PAT** _(optional)_ | Set `AZURE_DEVOPS_PAT` for Azure DevOps workflows | -## Commands +## Core Workflows -### `primer readiness` +### Assess AI Readiness -Score a repo's AI readiness across 9 pillars: +Score a repo across 9 pillars grouped into **Repo Health** (style, build, testing, docs, dev environment, code quality, observability, security) and **AI Setup** (instructions, MCP, agents, skills): ```bash primer readiness # terminal summary primer readiness --visual # GitHub-themed HTML report -primer readiness --json # machine-readable JSON primer readiness --per-area # include per-area breakdown primer readiness --policy ./strict.json # apply a custom policy -primer readiness /path/to/repo --output report.html +primer readiness --json # machine-readable JSON ``` **Maturity levels:** -| Level | Name | Description | +| Level | Name | What it means | | ----- | ------------ | --------------------------------------------------- | | 1 | Functional | Builds, tests, basic tooling in place | | 2 | Documented | README, CONTRIBUTING, custom AI instructions exist | @@ -108,147 +62,102 @@ primer readiness /path/to/repo --output report.html | 4 | Optimized | MCP servers, custom agents, AI skills configured | | 5 | Autonomous | Full AI-native development with minimal oversight | -**AI Tooling checks** include `copilot-instructions.md`, `CLAUDE.md`, `AGENTS.md`, `.cursorrules`, MCP configs, custom agents, and Copilot/Claude skills. - -#### Policies +### Generate Instructions -Policies let you customize which readiness criteria are evaluated, override their metadata, and tune pass-rate thresholds. Multiple policies chain together (last wins). +Generate `copilot-instructions.md` or `AGENTS.md` using the Copilot SDK: ```bash -# Apply a local JSON policy -primer readiness --policy ./my-policy.json - -# Chain multiple policies (comma-separated) -primer readiness --policy ./base.json,./strict.json - -# Also works with batch-readiness -primer batch-readiness --policy ./org-policy.json -``` - -A policy file looks like: - -```json -{ - "name": "my-org-policy", - "criteria": { - "disable": ["lint-config"], - "override": { "readme": { "impact": "high", "level": 2 } } - }, - "extras": { - "disable": ["pre-commit"] - }, - "thresholds": { - "passRate": 0.9 - } -} -``` - -Policies can also be set in `primer.config.json` so they apply automatically: - -```json -{ - "policies": ["./my-policy.json"] -} +primer instructions # copilot-instructions.md (default) +primer instructions --format agents-md # AGENTS.md +primer instructions --per-app # per-app in monorepos +primer instructions --areas # root + all detected areas +primer instructions --areas-only # area files only (skip root) +primer instructions --area frontend # single area +primer instructions --output /path/to/file.md # custom output path +primer instructions --model claude-sonnet-4.5 # pick model ``` -> **Security:** Config-sourced policies are restricted to JSON files only — JS/TS module and npm package policies must be passed via `--policy` to prevent untrusted code execution. - -### `primer batch-readiness` +### Evaluate Instructions -Consolidated visual readiness report across multiple repositories: +Measure how instructions improve AI responses with a judge model: ```bash -primer batch-readiness -primer batch-readiness --output team-readiness.html +primer eval --init # scaffold eval config from codebase +primer eval primer.eval.json # run evaluation +primer eval --model gpt-4.1 --judge-model claude-sonnet-4.5 +primer eval --list-models # list available models ``` -### `primer generate` +### Generate Configs -Generate AI configuration files using the Copilot SDK: +Generate MCP and VS Code configuration files: ```bash -primer generate instructions # copilot-instructions.md -primer generate agents # AGENTS.md -primer generate instructions --per-app # per-app in monorepos primer generate mcp # .vscode/mcp.json primer generate vscode --force # .vscode/settings.json (overwrite) ``` -Standalone shortcut for instructions: - -```bash -primer instructions --repo /path/to/repo --model claude-sonnet-4.5 -``` - -#### File-based area instructions +### Batch Processing -Generate `.instructions.md` files scoped to detected areas (e.g., frontend, backend, infra). These use `applyTo` glob patterns so Copilot applies the right context per file: +Process multiple repos across an organization: ```bash -primer instructions --areas # root + all detected areas -primer instructions --areas-only # area files only (skip root) -primer instructions --area frontend # single area -primer instructions --areas --force # overwrite existing area files +primer batch # interactive TUI (GitHub) +primer batch --provider azure # Azure DevOps +primer batch owner/repo1 owner/repo2 --json # headless +primer batch-readiness --output team.html # consolidated readiness report ``` -### `primer eval` +### Create PRs -Measure how instructions improve AI responses: +Clone a repo, generate configs, and open a PR: ```bash -primer eval --init # scaffold eval config from codebase analysis -primer eval primer.eval.json --repo . # run evaluation (default model: claude-sonnet-4.5) -primer eval --model gpt-4.1 --judge-model claude-sonnet-4.5 -primer eval --list-models # list available Copilot CLI models +primer pr owner/repo-name +primer pr my-org/my-project/my-repo --provider azure ``` -Results include an interactive HTML trajectory viewer comparing responses with/without instructions, with token usage, tool-call counts, and duration. - -### `primer batch` +## Readiness Policies -Batch-process repos across an organization: +Policies customize which criteria are evaluated, override metadata, and tune pass-rate thresholds: ```bash -primer batch # GitHub repos (interactive TUI) -primer batch --provider azure # Azure DevOps repos (interactive TUI) +primer readiness --policy ./my-policy.json +primer readiness --policy ./base.json,./strict.json # chain multiple ``` -**Headless mode** — pass repos as arguments or via stdin for CI/automation: - -```bash -# GitHub repos -primer batch owner/repo1 owner/repo2 --json -echo "owner/repo1\nowner/repo2" | primer batch --json - -# Azure DevOps repos -primer batch org/project/repo1 org/project/repo2 --provider azure --json +```json +{ + "name": "my-org-policy", + "criteria": { + "disable": ["lint-config"], + "override": { "readme": { "impact": "high", "level": 2 } } + }, + "extras": { "disable": ["pre-commit"] }, + "thresholds": { "passRate": 0.9 } +} ``` -### `primer analyze` +Policies can also be set in `primer.config.json` to apply automatically: -Analyze a repository's tech stack: - -```bash -primer analyze # human-readable summary -primer analyze /path/to/repo --json # structured JSON output +```json +{ "policies": ["./my-policy.json"] } ``` -### `primer pr` +> **Security:** Config-sourced policies are restricted to JSON files only — JS/TS module policies must be passed via `--policy`. -Clone a repo, generate configs, and open a PR: +## Global Options -```bash -primer pr owner/repo-name -primer pr my-org/my-project/my-repo --provider azure -``` +All commands support `--json` (structured JSON to stdout) and `--quiet` (suppress stderr progress). JSON output uses a `CommandResult` envelope: -### `primer tui` +```json +{ "ok": true, "status": "success", "data": { ... } } +``` -Interactive terminal UI: +## Interactive TUI ```bash primer tui -primer tui --repo /path/to/repo --no-animation ``` | Key | Action | @@ -264,22 +173,17 @@ primer tui --repo /path/to/repo --no-animation ```bash npm run typecheck # type check npm run lint # ESLint (flat config + Prettier) -npm run test # 267 Vitest tests -npm run test:coverage # with coverage via @vitest/coverage-v8 +npm run test # Vitest tests +npm run test:coverage # with coverage npm run build # production build via tsup - -# Run from source (no build needed) -npx tsx src/index.ts --help +npx tsx src/index.ts --help # run from source ``` ### VS Code Extension ```bash cd vscode-extension -npm install -npm run build # esbuild bundle -npm run watch # watch mode -npm run typecheck # TypeScript check +npm install && npm run build # Press F5 to launch Extension Development Host ``` @@ -289,35 +193,23 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for workflow and code style guidelines. ``` src/ -├── index.ts # Entry point ├── cli.ts # Commander CLI wiring -├── config.ts # Default models (claude-sonnet-4.5) -├── commands/ # CLI subcommands +├── commands/ # CLI subcommands (thin orchestrators) ├── services/ # Core logic -│ ├── analyzer.ts # Repo scanning (languages, frameworks, monorepos) -│ ├── batch.ts # Shared batch processing (GitHub + Azure DevOps) -│ ├── readiness.ts # 9-pillar scoring engine (with per-area support) +│ ├── readiness.ts # 9-pillar scoring engine with pillar groups │ ├── visualReport.ts # HTML report generator │ ├── instructions.ts # Copilot SDK integration +│ ├── analyzer.ts # Repo scanning (languages, frameworks, monorepos) │ ├── evaluator.ts # Eval runner + trajectory viewer -│ ├── evalScaffold.ts # AI-powered eval config generation │ ├── generator.ts # MCP/VS Code config generation │ ├── policy.ts # Readiness policy loading and chain resolution │ ├── git.ts # Git operations (clone, branch, push) │ ├── github.ts # GitHub API (Octokit) -│ ├── azureDevops.ts # Azure DevOps API -│ └── __tests__/ # Test suite (267 tests) +│ └── azureDevops.ts # Azure DevOps API ├── ui/ # Ink/React terminal UI -└── utils/ # Shared utilities (fs, logger, output, repo, pr) - -vscode-extension/ -├── src/ -│ ├── extension.ts # Extension entry point -│ ├── commands/ # VS Code command handlers -│ ├── views/ # Tree view providers (Analysis, Readiness) -│ ├── services.ts # Bridge to CLI services -│ └── webview.ts # Webview panel management -└── package.json # Extension manifest +└── utils/ # Shared utilities (fs, logger, output) + +vscode-extension/ # VS Code extension (commands, tree views, webview) ``` ## Troubleshooting diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts index b1afd9d..12d9d94 100644 --- a/src/commands/readiness.ts +++ b/src/commands/readiness.ts @@ -8,7 +8,7 @@ import type { ReadinessCriterionResult, AreaReadinessReport } from "../services/readiness"; -import { runReadinessReport } from "../services/readiness"; +import { runReadinessReport, groupPillars } from "../services/readiness"; import { parsePolicySources } from "../services/policy"; import { generateVisualReport } from "../services/visualReport"; import type { CommandResult } from "../utils/output"; @@ -95,11 +95,15 @@ function printReadinessChecklist(report: ReadinessReport): void { ); log(`- Level: ${report.achievedLevel || 1} (${levelName(report.achievedLevel || 1)})`); - log(chalk.bold("\nPillars")); - for (const pillar of report.pillars) { - const rate = formatPercent(pillar.passRate); - const icon = pillar.passRate >= 0.8 ? chalk.green("●") : chalk.yellow("●"); - log(`${icon} ${pillar.name}: ${pillar.passed}/${pillar.total} (${rate})`); + const groups = groupPillars(report.pillars); + for (const { label, pillars } of groups) { + if (pillars.length === 0) continue; + log(chalk.bold(`\n${label}`)); + for (const pillar of pillars) { + const rate = formatPercent(pillar.passRate); + const icon = pillar.passRate >= 0.8 ? chalk.green("●") : chalk.yellow("●"); + log(`${icon} ${pillar.name}: ${pillar.passed}/${pillar.total} (${rate})`); + } } log(chalk.bold("\nFix first")); diff --git a/src/services/readiness.ts b/src/services/readiness.ts index ff788ec..d069988 100644 --- a/src/services/readiness.ts +++ b/src/services/readiness.ts @@ -19,6 +19,36 @@ export type ReadinessPillar = | "security-governance" | "ai-tooling"; +export type PillarGroup = "repo-health" | "ai-setup"; + +export const PILLAR_GROUPS: Record = { + "style-validation": "repo-health", + "build-system": "repo-health", + testing: "repo-health", + documentation: "repo-health", + "dev-environment": "repo-health", + "code-quality": "repo-health", + observability: "repo-health", + "security-governance": "repo-health", + "ai-tooling": "ai-setup" +}; + +export const PILLAR_GROUP_NAMES: Record = { + "repo-health": "Repo Health", + "ai-setup": "AI Setup" +}; + +export function groupPillars( + pillars: ReadinessPillarSummary[] +): Array<{ group: PillarGroup; label: string; pillars: ReadinessPillarSummary[] }> { + const groups: PillarGroup[] = ["repo-health", "ai-setup"]; + return groups.map((group) => ({ + group, + label: PILLAR_GROUP_NAMES[group], + pillars: pillars.filter((p) => PILLAR_GROUPS[p.id] === group) + })); +} + export type ReadinessScope = "repo" | "app" | "area"; export type ReadinessStatus = "pass" | "fail" | "skip"; diff --git a/src/services/visualReport.ts b/src/services/visualReport.ts index 7f8c6dc..0b758b2 100644 --- a/src/services/visualReport.ts +++ b/src/services/visualReport.ts @@ -1,4 +1,6 @@ -import type { ReadinessReport, AreaReadinessReport } from "./readiness"; +import type { ReadinessReport, AreaReadinessReport, ReadinessPillarSummary } from "./readiness"; +import { PILLAR_GROUPS, PILLAR_GROUP_NAMES } from "./readiness"; +import type { PillarGroup } from "./readiness"; type VisualReportOptions = { reports: Array<{ repo: string; report: ReadinessReport; error?: string }>; @@ -413,23 +415,7 @@ export function generateVisualReport(options: VisualReportOptions): string {

    Pillar Performance

    -
    - ${pillarStats - .map( - (pillar) => ` -
    -
    ${escapeHtml(pillar.name)}
    -
    -
    -
    -
    - ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%) -
    -
    - ` - ) - .join("")} -
    + ${buildGroupedPillarsHtml(pillarStats)}
    @@ -850,6 +836,40 @@ function buildAiToolingHeroHtml( `; } +function buildGroupedPillarsHtml( + pillarStats: Array<{ id: string; name: string; passed: number; total: number; passRate: number }> +): string { + const groups: PillarGroup[] = ["repo-health", "ai-setup"]; + return groups + .map((group) => { + const pillars = pillarStats.filter( + (p) => PILLAR_GROUPS[p.id as keyof typeof PILLAR_GROUPS] === group + ); + if (pillars.length === 0) return ""; + return ` +

    ${escapeHtml(PILLAR_GROUP_NAMES[group])}

    +
    + ${pillars + .map( + (pillar) => ` +
    +
    ${escapeHtml(pillar.name)}
    +
    +
    +
    +
    + ${pillar.passed}/${pillar.total} (${Math.round(pillar.passRate * 100)}%) +
    +
    + ` + ) + .join("")} +
    + `; + }) + .join(""); +} + function escapeHtml(text: string): string { const map: Record = { "&": "&", From be85ba745d5fcc32eeaeb82619ba355a12a0220c Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 17:17:42 -0800 Subject: [PATCH 63/84] update README and enhance instructions --- vscode-extension/README.md | 112 +++++++++++------- vscode-extension/package.json | 81 ++++++++++++- .../resources/walkthrough/analyze.md | 18 +++ .../resources/walkthrough/configs.md | 15 +++ .../resources/walkthrough/eval.md | 16 +++ .../resources/walkthrough/instructions.md | 18 +++ .../resources/walkthrough/readiness.md | 30 +++++ vscode-extension/src/commands/instructions.ts | 35 +++++- .../src/views/ReadinessTreeProvider.ts | 31 ++++- 9 files changed, 308 insertions(+), 48 deletions(-) create mode 100644 vscode-extension/resources/walkthrough/analyze.md create mode 100644 vscode-extension/resources/walkthrough/configs.md create mode 100644 vscode-extension/resources/walkthrough/eval.md create mode 100644 vscode-extension/resources/walkthrough/instructions.md create mode 100644 vscode-extension/resources/walkthrough/readiness.md diff --git a/vscode-extension/README.md b/vscode-extension/README.md index 838b108..cd77c2d 100644 --- a/vscode-extension/README.md +++ b/vscode-extension/README.md @@ -1,61 +1,93 @@ -# Primer — VS Code Extension +# Primer — AI Repository Setup -Prime repositories for AI-assisted development directly from VS Code. +Prime your repositories for AI-assisted development, right from VS Code. + +## Getting Started + +Open the Command Palette (`Cmd+Shift+P` / `Ctrl+Shift+P`) and search for **Primer** — or click the **Primer** icon in the Activity Bar to start from the sidebar. + +First time? Run **Primer: Get Started** (or open the walkthrough from the Welcome tab) for a guided 5-step setup. ## Features -### Command Palette +### Analyze Repository + +Detect languages, frameworks, package managers, and monorepo structure. Results populate the **Analysis** tree view in the sidebar. + +`Primer: Analyze Repository` + +### AI Readiness Assessment + +Score your repo across **9 pillars** grouped into **Repo Health** and **AI Setup**, with maturity levels from Functional (1) to Autonomous (5). + +- Interactive HTML report with dark/light theme +- Drill-down into criteria in the **Readiness** tree view +- Pass/fail icons with evidence for each criterion + +`Primer: AI Readiness Report` + +### Generate Instructions + +Create AI instruction files using the Copilot SDK. Choose your format: -All commands are available via the Command Palette (`Cmd+Shift+P` / `Ctrl+Shift+P`): +- **copilot-instructions.md** — GitHub Copilot's native format +- **AGENTS.md** — Broader agent format at repo root -| Command | Description | -| ----------------------------------------- | ---------------------------------------------------- | -| **Primer: Analyze Repository** | Detect languages, frameworks, monorepo structure | -| **Primer: Generate Configs** | Generate MCP or VS Code settings | -| **Primer: Generate Copilot Instructions** | Generate `.github/copilot-instructions.md` | -| **Primer: AI Readiness Report** | Run 9-pillar readiness assessment with visual report | -| **Primer: Run Eval** | Compare AI responses with/without instructions | -| **Primer: Scaffold Eval Config** | Auto-generate `primer.eval.json` test cases | -| **Primer: Initialize Repository** | Full setup: analyze + instructions + configs | -| **Primer: Create Pull Request** | Commit and push changes, create PR on GitHub | +For monorepos, pick specific areas to generate per-area instruction files with `applyTo` scoping. -### Sidebar +`Primer: Generate Copilot Instructions` -The **Primer** activity bar provides two tree views: +### Generate Configs -- **Analysis** — Languages, frameworks, monorepo areas detected in the workspace -- **Readiness** — 9-pillar AI readiness scores with drill-down into criteria +Set up MCP servers (`.vscode/mcp.json`) and VS Code settings (`.vscode/settings.json`) tuned to your project. -### Webview Reports +`Primer: Generate Configs` -- **Readiness Report** — Full HTML dashboard with dark/light theme -- **Eval Results** — Interactive viewer for eval comparisons +### Evaluate Instructions -### Status Bar +Measure how much your instructions improve AI responses by comparing with/without using a judge model. Results display in an interactive viewer inside VS Code. -A **Primer** status bar item provides quick access to repository analysis. +`Primer: Run Eval` · `Primer: Scaffold Eval Config` + +### Initialize Repository + +One command to analyze, generate instructions, and create configs: + +`Primer: Initialize Repository` + +### Create Pull Request + +Commit Primer-generated files and open a PR directly from VS Code: + +`Primer: Create Pull Request` + +## Sidebar Views + +The **Primer** Activity Bar icon opens two tree views: + +| View | Contents | +| ------------- | ------------------------------------------------------------------------------------------------- | +| **Analysis** | Languages, frameworks, monorepo areas — with action buttons for instructions and configs | +| **Readiness** | Maturity level, pillar groups (Repo Health / AI Setup), criteria pass/fail with evidence tooltips | + +Both views show welcome screens with action buttons when no data is loaded yet. ## Settings -| Setting | Default | Description | -| -------------------- | ------------------- | ----------------------------------------- | -| `primer.model` | `claude-sonnet-4.5` | Default Copilot model for generation | -| `primer.autoAnalyze` | `false` | Auto-analyze repository on workspace open | +| Setting | Default | Description | +| -------------------- | ------------------- | -------------------------------------------------- | +| `primer.model` | `claude-sonnet-4.5` | Default Copilot model for generation | +| `primer.autoAnalyze` | `false` | Automatically analyze repository on workspace open | ## Requirements -- VS Code 1.100.0+ -- GitHub authentication (for Copilot instructions, eval, and PR creation) -- [Copilot CLI](https://docs.github.com/en/copilot) installed and authenticated (for SDK-dependent features) - -## Development +- **VS Code 1.100.0+** +- **GitHub Copilot Chat extension** (provides the Copilot CLI) +- **Copilot authentication** — run `copilot` → `/login` in your terminal +- **GitHub CLI** _(optional)_ — for PR creation: `brew install gh && gh auth login` -```sh -cd vscode-extension -npm install -npm run build # Build with esbuild -npm run watch # Watch mode -npm run typecheck # TypeScript check -``` +## Links -Press **F5** to launch the Extension Development Host for testing. +- [Primer CLI on GitHub](https://github.com/digitarald/primer) +- [Contributing Guide](https://github.com/digitarald/primer/blob/main/CONTRIBUTING.md) +- [License (MIT)](https://github.com/digitarald/primer/blob/main/LICENSE) diff --git a/vscode-extension/package.json b/vscode-extension/package.json index 2a4ee74..add0ee5 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -9,8 +9,17 @@ "vscode": "^1.100.0" }, "categories": [ + "Machine Learning", "Other" ], + "keywords": [ + "copilot", + "ai", + "instructions", + "mcp", + "readiness", + "agents" + ], "activationEvents": [], "main": "./out/extension.js", "contributes": { @@ -90,25 +99,89 @@ "viewsWelcome": [ { "view": "primer.analysis", - "contents": "Analyze this repository to discover languages, frameworks, and project structure.\n[$(search) Analyze Repository](command:primer.analyze)", + "contents": "Discover languages, frameworks, and project structure in your repository.\n[$(search) Analyze Repository](command:primer.analyze)\nNew to Primer? [Get Started](command:workbench.action.openWalkthrough?%5B%22digitarald.primer-vscode%23primer.gettingStarted%22%5D)", "when": "workspaceFolderCount > 0" }, { "view": "primer.analysis", - "contents": "[$(folder-opened) Open Folder](command:vscode.openFolder)", + "contents": "Open a folder to get started.\n[$(folder-opened) Open Folder](command:vscode.openFolder)", "when": "workspaceFolderCount == 0" }, { "view": "primer.readiness", - "contents": "Evaluate how ready this repository is for AI-assisted development.\n[$(shield) Run Assessment](command:primer.readiness)", + "contents": "Score your repo across 9 AI-readiness pillars — from build systems to custom instructions.\n[$(shield) Run Assessment](command:primer.readiness)", "when": "workspaceFolderCount > 0" }, { "view": "primer.readiness", - "contents": "[$(folder-opened) Open Folder](command:vscode.openFolder)", + "contents": "Open a folder to get started.\n[$(folder-opened) Open Folder](command:vscode.openFolder)", "when": "workspaceFolderCount == 0" } ], + "walkthroughs": [ + { + "id": "primer.gettingStarted", + "title": "Get Started with Primer", + "description": "Prime your repository for AI-assisted development in 5 steps.", + "steps": [ + { + "id": "analyze", + "title": "Analyze Your Repository", + "description": "Discover languages, frameworks, and project structure.\n[$(search) Analyze Repository](command:primer.analyze)", + "media": { + "markdown": "resources/walkthrough/analyze.md" + }, + "completionEvents": [ + "onCommand:primer.analyze" + ] + }, + { + "id": "readiness", + "title": "Check AI Readiness", + "description": "Score your repo across 9 pillars with a visual maturity report.\n[$(shield) Run Assessment](command:primer.readiness)", + "media": { + "markdown": "resources/walkthrough/readiness.md" + }, + "completionEvents": [ + "onCommand:primer.readiness" + ] + }, + { + "id": "instructions", + "title": "Generate AI Instructions", + "description": "Create custom instructions that teach AI about your codebase.\n[$(edit) Generate Instructions](command:primer.instructions)", + "media": { + "markdown": "resources/walkthrough/instructions.md" + }, + "completionEvents": [ + "onCommand:primer.instructions" + ] + }, + { + "id": "configs", + "title": "Generate Configs", + "description": "Set up MCP servers and VS Code settings for AI workflows.\n[$(file-code) Generate Configs](command:primer.generate)", + "media": { + "markdown": "resources/walkthrough/configs.md" + }, + "completionEvents": [ + "onCommand:primer.generate" + ] + }, + { + "id": "eval", + "title": "Evaluate Effectiveness", + "description": "Measure how much your instructions improve AI responses.\n[$(new-file) Scaffold Eval Config](command:primer.evalInit)\n[$(beaker) Run Eval](command:primer.eval)", + "media": { + "markdown": "resources/walkthrough/eval.md" + }, + "completionEvents": [ + "onCommand:primer.evalInit" + ] + } + ] + } + ], "configuration": { "title": "Primer", "properties": { diff --git a/vscode-extension/resources/walkthrough/analyze.md b/vscode-extension/resources/walkthrough/analyze.md new file mode 100644 index 0000000..9084700 --- /dev/null +++ b/vscode-extension/resources/walkthrough/analyze.md @@ -0,0 +1,18 @@ +## Discover Your Repository + +Primer scans your codebase to detect **languages**, **frameworks**, **package managers**, and **monorepo structure**. + +This analysis powers everything else — instructions are tailored to your stack, readiness checks know what to look for, and configs match your tooling. + +### What gets detected + +- Programming languages and their relative usage +- Frameworks (React, Express, Django, Spring, etc.) +- Monorepo workspaces (npm, pnpm, Cargo, Go, .NET, and more) +- Logical areas like frontend, backend, and infrastructure + +### Try it + +Click the button below, or use `Primer: Analyze Repository` from the Command Palette. + +The results appear in the **Primer** sidebar — expand each category to explore. diff --git a/vscode-extension/resources/walkthrough/configs.md b/vscode-extension/resources/walkthrough/configs.md new file mode 100644 index 0000000..eb7c31d --- /dev/null +++ b/vscode-extension/resources/walkthrough/configs.md @@ -0,0 +1,15 @@ +## Configure Your AI Tools + +Generate configuration files that connect AI assistants to your development environment. + +### MCP Config (`.vscode/mcp.json`) + +[Model Context Protocol](https://modelcontextprotocol.io) servers give AI tools access to external data sources — databases, APIs, documentation, and more. Primer detects what's relevant to your stack and generates a starter config. + +### VS Code Settings (`.vscode/settings.json`) + +Recommended editor settings for AI-assisted development, tuned to your project's languages and frameworks. + +### Safe by default + +Primer won't overwrite existing files. If a config already exists, you'll be asked whether to overwrite it. diff --git a/vscode-extension/resources/walkthrough/eval.md b/vscode-extension/resources/walkthrough/eval.md new file mode 100644 index 0000000..d2449df --- /dev/null +++ b/vscode-extension/resources/walkthrough/eval.md @@ -0,0 +1,16 @@ +## Measure the Impact + +How much do your instructions actually help? Primer's **eval framework** answers that question by comparing AI responses with and without your custom instructions. + +### How it works + +1. **Scaffold** — Primer analyzes your codebase and generates test cases (`primer.eval.json`) with questions an AI might answer about your code +2. **Run** — Each test case gets two AI responses: one with instructions, one without +3. **Judge** — A judge model scores which response better follows your codebase conventions +4. **Review** — An interactive HTML viewer shows the comparisons side-by-side with scores + +### Get started + +If you don't have a `primer.eval.json` yet, use **Scaffold Eval Config** to auto-generate test cases from your codebase analysis. + +Then run the eval — results open in an interactive viewer right inside VS Code. diff --git a/vscode-extension/resources/walkthrough/instructions.md b/vscode-extension/resources/walkthrough/instructions.md new file mode 100644 index 0000000..226ab86 --- /dev/null +++ b/vscode-extension/resources/walkthrough/instructions.md @@ -0,0 +1,18 @@ +## Teach AI About Your Code + +Generate custom instruction files that help Copilot (and other AI tools) understand your codebase conventions, architecture, and preferences. + +### Choose your format + +- **copilot-instructions.md** — GitHub Copilot's native format, placed in `.github/` +- **AGENTS.md** — Broader agent instructions at the repo root + +### Monorepo support + +For monorepos, Primer can generate **per-area** instruction files scoped with `applyTo` glob patterns. Each area (frontend, backend, infra) gets its own tailored instructions. + +### How it works + +Primer uses the **Copilot SDK** to analyze your code and generate context-aware instructions. It reads your project structure, conventions, dependencies, and existing documentation to produce instructions that capture what makes your codebase unique. + +Pick your format and areas when prompted — your instructions file opens automatically when done. diff --git a/vscode-extension/resources/walkthrough/readiness.md b/vscode-extension/resources/walkthrough/readiness.md new file mode 100644 index 0000000..80113cb --- /dev/null +++ b/vscode-extension/resources/walkthrough/readiness.md @@ -0,0 +1,30 @@ +## How AI-Ready Is Your Repo? + +Primer evaluates your repository across **9 pillars** organized into two groups: + +### Repo Health + +- **Style & Validation** — linters, formatters, editor configs +- **Build System** — build scripts, CI/CD pipelines +- **Testing** — test frameworks, coverage, test scripts +- **Documentation** — README, CONTRIBUTING, architecture docs +- **Dev Environment** — devcontainers, setup scripts +- **Code Quality** — type checking, static analysis +- **Observability** — logging, monitoring, error tracking +- **Security & Governance** — CODEOWNERS, security policies + +### AI Setup + +- **AI Tooling** — custom instructions, MCP servers, agents, skills + +### Maturity levels + +| Level | Name | Meaning | +| ----- | ------------ | ------------------------------ | +| 1 | Functional | Basic tooling in place | +| 2 | Documented | README and instructions exist | +| 3 | Standardized | CI/CD, policies, CODEOWNERS | +| 4 | Optimized | MCP, agents, skills configured | +| 5 | Autonomous | Full AI-native development | + +Results appear as a **visual HTML report** and in the **Readiness** sidebar with drill-down into each criterion. diff --git a/vscode-extension/src/commands/instructions.ts b/vscode-extension/src/commands/instructions.ts index f364cc1..3205be9 100644 --- a/vscode-extension/src/commands/instructions.ts +++ b/vscode-extension/src/commands/instructions.ts @@ -1,14 +1,36 @@ import * as vscode from "vscode"; +import path from "node:path"; import { generateCopilotInstructions, generateAreaInstructions, analyzeRepo } from "../services.js"; import { VscodeProgressReporter } from "../progress.js"; import { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from "./analyze.js"; +const FORMAT_OPTIONS = [ + { + label: "$(file) copilot-instructions.md", + description: ".github/copilot-instructions.md", + value: "copilot-instructions" as const, + relativePath: path.join(".github", "copilot-instructions.md") + }, + { + label: "$(robot) AGENTS.md", + description: "AGENTS.md at repo root", + value: "agents-md" as const, + relativePath: "AGENTS.md" + } +]; + export async function instructionsCommand(): Promise { const workspacePath = getWorkspacePath(); if (!workspacePath) return; const model = vscode.workspace.getConfiguration("primer").get("model"); + // Pick format + const formatPick = await vscode.window.showQuickPick(FORMAT_OPTIONS, { + placeHolder: "Choose instruction format" + }); + if (!formatPick) return; + // Ensure analysis is available before starting progress let analysis = getCachedAnalysis(); if (!analysis) { @@ -34,10 +56,12 @@ export async function instructionsCommand(): Promise { } } + const instructionFile = path.join(workspacePath, formatPick.relativePath); + await vscode.window.withProgress( { location: vscode.ProgressLocation.Notification, - title: "Primer: Generating Copilot instructions…", + title: `Primer: Generating ${formatPick.relativePath}…`, cancellable: false }, async (progress) => { @@ -47,6 +71,7 @@ export async function instructionsCommand(): Promise { reporter.update("Generating root instructions…"); await generateCopilotInstructions({ repoPath: workspacePath, + instructionFile, model, onProgress: (msg) => reporter.update(msg) }); @@ -64,6 +89,14 @@ export async function instructionsCommand(): Promise { } reporter.succeed("Instructions generated."); + + // Open the generated file + try { + const doc = await vscode.workspace.openTextDocument(instructionFile); + await vscode.window.showTextDocument(doc); + } catch { + // File may not exist if generation produced no content + } } catch (err) { vscode.window.showErrorMessage( `Primer: Instruction generation failed — ${err instanceof Error ? err.message : String(err)}` diff --git a/vscode-extension/src/views/ReadinessTreeProvider.ts b/vscode-extension/src/views/ReadinessTreeProvider.ts index 804c81a..88617c1 100644 --- a/vscode-extension/src/views/ReadinessTreeProvider.ts +++ b/vscode-extension/src/views/ReadinessTreeProvider.ts @@ -4,6 +4,7 @@ import type { ReadinessPillarSummary, ReadinessCriterionResult } from "../types.js"; +import { groupPillars } from "primer/services/readiness.js"; export class ReadinessTreeProvider implements vscode.TreeDataProvider { private _onDidChangeTreeData = new vscode.EventEmitter(); @@ -52,9 +53,33 @@ export class ReadinessTreeProvider implements vscode.TreeDataProvider c.pillar === pillar.id); - items.push(this.createPillarItem(pillar, criteria)); + const groups = groupPillars(report.pillars); + for (const { label, pillars } of groups) { + const groupChildren = pillars.map((pillar) => { + const criteria = report.criteria.filter((c) => c.pillar === pillar.id); + return this.createPillarItem(pillar, criteria); + }); + + const groupPassed = pillars.reduce((sum, p) => sum + p.passed, 0); + const groupTotal = pillars.reduce((sum, p) => sum + p.total, 0); + const groupPct = groupTotal > 0 ? Math.round((groupPassed / groupTotal) * 100) : 0; + + const groupItem = new ReadinessItem( + label, + vscode.TreeItemCollapsibleState.Expanded, + groupChildren + ); + groupItem.iconPath = new vscode.ThemeIcon( + groupPct === 100 ? "pass" : groupPct >= 50 ? "warning" : "error", + groupPct === 100 + ? new vscode.ThemeColor("testing.iconPassed") + : groupPct >= 50 + ? new vscode.ThemeColor("problemsWarningIcon.foreground") + : new vscode.ThemeColor("testing.iconFailed") + ); + groupItem.description = `${groupPassed}/${groupTotal} (${groupPct}%)`; + groupItem.contextValue = "pillarGroup"; + items.push(groupItem); } return items; From 8164536dad69129ff717497decb153077e7ab94a Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 18:50:35 -0800 Subject: [PATCH 64/84] Dogfood improvements: CLI UX, extension polish, safeWriteFile, docs split --- .github/workflows/eval.yml | 2 +- PLAN.md | 86 ++++++++------ README.md | 111 ++++++++---------- docs/product.md | 56 +++++++++ src/cli.ts | 23 +++- src/commands/batch.tsx | 8 +- src/commands/eval.ts | 25 ++-- src/commands/generate.ts | 109 +++-------------- src/commands/init.ts | 6 + src/commands/instructions.ts | 9 +- src/commands/readiness.ts | 43 ++++++- src/services/__tests__/pr.test.ts | 24 +--- src/services/evaluator.ts | 6 +- src/services/git.ts | 6 - src/services/instructions.ts | 4 - src/ui/BatchReadinessTui.tsx | 5 +- src/ui/BatchTui.tsx | 9 +- src/ui/BatchTuiAzure.tsx | 5 +- src/ui/index.ts | 3 - src/ui/tui.tsx | 7 +- src/utils/logger.ts | 8 ++ src/utils/pr.ts | 24 ---- vscode-extension/package.json | 22 ++-- vscode-extension/src/commands/eval.ts | 10 +- vscode-extension/src/commands/generate.ts | 19 +-- vscode-extension/src/commands/init.ts | 25 +++- vscode-extension/src/commands/instructions.ts | 22 +++- vscode-extension/src/commands/pr.ts | 6 +- vscode-extension/src/extension.ts | 7 +- vscode-extension/src/services.ts | 6 +- vscode-extension/src/types.ts | 2 +- .../src/views/AnalysisTreeProvider.ts | 4 +- .../src/views/ReadinessTreeProvider.ts | 2 +- 33 files changed, 373 insertions(+), 331 deletions(-) create mode 100644 docs/product.md delete mode 100644 src/ui/index.ts diff --git a/.github/workflows/eval.yml b/.github/workflows/eval.yml index 7b2b48f..df043b3 100644 --- a/.github/workflows/eval.yml +++ b/.github/workflows/eval.yml @@ -77,7 +77,7 @@ jobs: fi THRESHOLD="${{ inputs.fail-threshold || '50' }}" - ARGS="$ARGS --fail-threshold $THRESHOLD" + ARGS="$ARGS --fail-level $THRESHOLD" node dist/index.js eval $ARGS 2>&1 | tee .primer/evals/eval.log env: diff --git a/PLAN.md b/PLAN.md index 8259911..6d92bfe 100644 --- a/PLAN.md +++ b/PLAN.md @@ -96,32 +96,30 @@ primer init --github owner/repo primer generate mcp primer generate vscode +# Generate instructions +primer instructions + # Create PR with all generated configs primer pr owner/repo # Readiness report primer readiness - -# Update existing configurations -primer update - -# List available templates -primer templates - -# Configure CLI settings -primer config - -# Generate instructions -primer instructions +primer readiness --fail-level 3 # CI gate # Run evaluations primer eval primer.eval.json +primer eval --init # Scaffold config +primer eval --fail-level 80 # CI gate (pass rate %) + +# Analyze repository +primer analyze # Run TUI primer tui # Batch processing primer batch +primer batch-readiness ``` --- @@ -394,34 +392,52 @@ primer/ ├── src/ │ ├── index.ts # Entry point │ ├── cli.ts # Commander setup +│ ├── config.ts # Shared constants (DEFAULT_MODEL, etc.) │ ├── commands/ +│ │ ├── analyze.ts │ │ ├── batch.tsx -│ │ ├── config.ts +│ │ ├── batchReadiness.tsx │ │ ├── eval.ts │ │ ├── generate.ts │ │ ├── init.ts -│ │ ├── instructions.tsx +│ │ ├── instructions.ts │ │ ├── pr.ts │ │ ├── readiness.ts -│ │ ├── templates.ts -│ │ ├── tui.tsx -│ │ └── update.ts +│ │ └── tui.tsx │ ├── services/ │ │ ├── analyzer.ts # Repo analysis logic │ │ ├── azureDevops.ts # Azure DevOps integration +│ │ ├── batch.ts # Batch processing logic +│ │ ├── copilot.ts # Copilot CLI integration +│ │ ├── evalScaffold.ts # Eval config scaffolding │ │ ├── evaluator.ts # Eval runner │ │ ├── generator.ts # Config generation │ │ ├── git.ts # Local git operations │ │ ├── github.ts # GitHub API interactions -│ │ └── instructions.ts # Copilot SDK integration +│ │ ├── instructions.ts # Copilot SDK integration +│ │ ├── policy.ts # Policy-driven readiness +│ │ ├── readiness.ts # Readiness assessment +│ │ └── visualReport.ts # HTML report generation │ ├── ui/ │ │ ├── AnimatedBanner.tsx +│ │ ├── BatchReadinessTui.tsx │ │ ├── BatchTui.tsx │ │ ├── BatchTuiAzure.tsx │ │ └── tui.tsx │ └── utils/ -│ ├── fs.ts # File system helpers -│ └── logger.ts # Styled console output +│ ├── fs.ts # File system helpers (safeWriteFile) +│ ├── logger.ts # Styled console output +│ ├── output.ts # CommandResult, ProgressReporter +│ ├── pr.ts # PR body templates +│ └── repo.ts # Repo URL parsing +├── vscode-extension/ # VS Code extension +│ ├── src/ +│ │ ├── extension.ts +│ │ ├── services.ts # Re-exports CLI services +│ │ ├── types.ts +│ │ ├── commands/ +│ │ └── views/ +│ └── package.json ├── package.json ├── tsconfig.json └── README.md @@ -487,32 +503,32 @@ Create example repos for each major stack: ### Phase 1: MVP (2-3 weeks) - [x] Project setup (TypeScript, Commander, tsup) -- [ ] Basic CLI with `init` and `generate` commands -- [ ] Local repo analysis -- [ ] Custom instructions generation via Copilot SDK -- [ ] Generate VS Code settings and MCP configuration -- [ ] Basic interactive prompts +- [x] Basic CLI with `init` and `generate` commands +- [x] Local repo analysis +- [x] Custom instructions generation via Copilot SDK +- [x] Generate VS Code settings and MCP configuration +- [x] Basic interactive prompts ### Phase 2: GitHub Integration (1-2 weeks) -- [ ] GitHub authentication -- [ ] Remote repo access -- [ ] PR creation -- [ ] Fork workflow +- [x] GitHub authentication +- [x] Remote repo access +- [x] PR creation +- [x] Fork workflow ### Phase 3: Polish (1 week) -- [ ] Beautiful TUI with previews -- [ ] More language/framework support -- [ ] MCP configurations -- [ ] Documentation and examples +- [x] Beautiful TUI with previews +- [x] More language/framework support +- [x] MCP configurations +- [x] Documentation and examples ### Phase 4: Distribution (1 week) -- [ ] npm publish +- [x] npm publish - [ ] Standalone binaries - [ ] Homebrew formula -- [ ] CI/CD setup +- [x] CI/CD setup --- diff --git a/README.md b/README.md index c0b4308..39aaeb6 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,13 @@ Primer is a CLI and VS Code extension that helps teams prepare repositories for ## Quick Start ```bash -# Clone and install +# Run directly (no install needed) +npx github:digitarald/primer readiness +``` + +Or install locally: + +```bash git clone https://github.com/digitarald/primer.git cd primer && npm install && npm run build && npm link @@ -38,11 +44,11 @@ primer init | **GitHub CLI** _(optional)_ | For batch processing and PRs: `brew install gh && gh auth login` | | **Azure DevOps PAT** _(optional)_ | Set `AZURE_DEVOPS_PAT` for Azure DevOps workflows | -## Core Workflows +## Commands -### Assess AI Readiness +### `primer readiness` — Assess AI Readiness -Score a repo across 9 pillars grouped into **Repo Health** (style, build, testing, docs, dev environment, code quality, observability, security) and **AI Setup** (instructions, MCP, agents, skills): +Score a repo across 9 pillars grouped into **Repo Health** and **AI Setup**: ```bash primer readiness # terminal summary @@ -50,6 +56,7 @@ primer readiness --visual # GitHub-themed HTML report primer readiness --per-area # include per-area breakdown primer readiness --policy ./strict.json # apply a custom policy primer readiness --json # machine-readable JSON +primer readiness --fail-level 3 # CI gate: exit 1 if below level 3 ``` **Maturity levels:** @@ -62,67 +69,71 @@ primer readiness --json # machine-readable JSON | 4 | Optimized | MCP servers, custom agents, AI skills configured | | 5 | Autonomous | Full AI-native development with minimal oversight | -### Generate Instructions +### `primer instructions` — Generate Instructions Generate `copilot-instructions.md` or `AGENTS.md` using the Copilot SDK: ```bash -primer instructions # copilot-instructions.md (default) -primer instructions --format agents-md # AGENTS.md -primer instructions --per-app # per-app in monorepos -primer instructions --areas # root + all detected areas -primer instructions --areas-only # area files only (skip root) -primer instructions --area frontend # single area -primer instructions --output /path/to/file.md # custom output path -primer instructions --model claude-sonnet-4.5 # pick model +primer instructions # copilot-instructions.md (default) +primer instructions --format agents-md # AGENTS.md +primer instructions --per-app # per-app in monorepos +primer instructions --areas # root + all detected areas +primer instructions --area frontend # single area +primer instructions --model claude-sonnet-4.5 ``` -### Evaluate Instructions +### `primer eval` — Evaluate Instructions Measure how instructions improve AI responses with a judge model: ```bash -primer eval --init # scaffold eval config from codebase -primer eval primer.eval.json # run evaluation +primer eval --init # scaffold eval config from codebase +primer eval primer.eval.json # run evaluation primer eval --model gpt-4.1 --judge-model claude-sonnet-4.5 -primer eval --list-models # list available models +primer eval --fail-level 80 # CI gate: exit 1 if pass rate < 80% ``` -### Generate Configs - -Generate MCP and VS Code configuration files: +### `primer generate` — Generate Configs ```bash -primer generate mcp # .vscode/mcp.json -primer generate vscode --force # .vscode/settings.json (overwrite) +primer generate mcp # .vscode/mcp.json +primer generate vscode --force # .vscode/settings.json (overwrite) ``` -### Batch Processing +### `primer batch` / `primer pr` — Batch & PRs + +```bash +primer batch # interactive TUI (GitHub) +primer batch --provider azure # Azure DevOps +primer batch owner/repo1 owner/repo2 --json +primer batch-readiness --output team.html +primer pr owner/repo-name # clone → generate → open PR +``` -Process multiple repos across an organization: +### `primer tui` — Interactive Mode ```bash -primer batch # interactive TUI (GitHub) -primer batch --provider azure # Azure DevOps -primer batch owner/repo1 owner/repo2 --json # headless -primer batch-readiness --output team.html # consolidated readiness report +primer tui ``` -### Create PRs +### `primer init` — Guided Setup -Clone a repo, generate configs, and open a PR: +Interactive or headless repo onboarding — detects your stack and walks through readiness, instructions, and config generation. -```bash -primer pr owner/repo-name -primer pr my-org/my-project/my-repo --provider azure +### Global Options + +All commands support `--json` (structured JSON to stdout) and `--quiet` (suppress stderr). JSON output uses a `CommandResult` envelope: + +```json +{ "ok": true, "status": "success", "data": { ... } } ``` -## Readiness Policies +### Readiness Policies -Policies customize which criteria are evaluated, override metadata, and tune pass-rate thresholds: +Policies customize scoring criteria, override metadata, and tune thresholds: ```bash -primer readiness --policy ./my-policy.json +primer readiness --policy ./strict.json primer readiness --policy ./base.json,./strict.json # chain multiple ``` @@ -138,36 +149,10 @@ primer readiness --policy ./base.json,./strict.json # chain multiple } ``` -Policies can also be set in `primer.config.json` to apply automatically: - -```json -{ "policies": ["./my-policy.json"] } -``` +Policies can also be set in `primer.config.json` (`{ "policies": ["./my-policy.json"] }`). > **Security:** Config-sourced policies are restricted to JSON files only — JS/TS module policies must be passed via `--policy`. -## Global Options - -All commands support `--json` (structured JSON to stdout) and `--quiet` (suppress stderr progress). JSON output uses a `CommandResult` envelope: - -```json -{ "ok": true, "status": "success", "data": { ... } } -``` - -## Interactive TUI - -```bash -primer tui -``` - -| Key | Action | -| --------- | ---------------------------------- | -| `G` | Generate instructions or AGENTS.md | -| `E` | Run evals or init eval config | -| `B` | Batch — GitHub or Azure DevOps | -| `M` / `J` | Pick eval / judge model | -| `Q` | Quit | - ## Development ```bash diff --git a/docs/product.md b/docs/product.md new file mode 100644 index 0000000..f433975 --- /dev/null +++ b/docs/product.md @@ -0,0 +1,56 @@ +# Primer — Product Brief + +## The Problem + +AI coding agents are only as effective as the context they receive. Most repositories lack the structured metadata — custom instructions, MCP configs, readiness baselines — that agents need to produce accurate, idiomatic code. Teams adopting Copilot and similar tools hit a cold-start problem: agents generate plausible but wrong code because they don't understand the repo's conventions, architecture, or tooling. + +This gap widens at scale. An organization with hundreds of repos can't manually author instructions for each one, and there's no standard way to measure whether a repo is "AI-ready" or track improvement over time. + +## Who It's For + +- **Platform engineering teams** rolling out AI coding tools across an org — need to assess readiness, set baselines, and track adoption at scale. +- **Individual developers** who want their AI agent to understand their repo's stack, conventions, and architecture from day one. +- **Engineering leadership** evaluating AI readiness across portfolios, with quantifiable maturity levels and policy-driven compliance. + +## What Primer Does + +Primer automates the preparation work that makes AI coding agents effective: + +1. **Assess** — Score any repo against a 9-pillar readiness model spanning repo health (style, build, testing, docs, dev environment, code quality, observability, security) and AI setup (instructions, MCP, agents, skills). Get a maturity level from 1–5. + +2. **Generate** — Use the Copilot SDK to analyze a repo and produce tailored `copilot-instructions.md` or `AGENTS.md` files. Monorepo-aware: generates per-area instructions scoped with `applyTo` globs. + +3. **Evaluate** — Measure the impact of instructions by comparing AI responses with and without them, scored by a judge model. Use as a CI gate to prevent regressions. + +4. **Configure** — Generate `.vscode/mcp.json` and `.vscode/settings.json` so the dev environment is wired for AI from the start. + +5. **Scale** — Batch-process repos across GitHub orgs or Azure DevOps projects. Clone, generate, and open PRs automatically. Produce consolidated readiness reports for leadership. + +## Maturity Model + +Primer's readiness assessment maps repos to a 5-level maturity model: + +| Level | Name | What it means | +| ----- | ------------ | --------------------------------------------------- | +| 1 | Functional | Builds, tests, basic tooling in place | +| 2 | Documented | README, CONTRIBUTING, custom AI instructions exist | +| 3 | Standardized | CI/CD, security policies, CODEOWNERS, observability | +| 4 | Optimized | MCP servers, custom agents, AI skills configured | +| 5 | Autonomous | Full AI-native development with minimal oversight | + +Organizations can define **readiness policies** to customize which criteria are evaluated, override scoring metadata, and set pass-rate thresholds — enforced locally or in CI. + +## How It's Built + +- **TypeScript CLI** (Commander.js) with an interactive TUI (Ink/React) +- **VS Code extension** with tree views, walkthrough, and webview for readiness reports +- **Copilot SDK** for instruction generation using the same models developers already use +- Supports **GitHub** (Octokit) and **Azure DevOps** (REST API) for batch operations and PR creation + +## Key Design Decisions + +- **Instructions are generated, not templated.** Primer uses the Copilot SDK to analyze actual repo content — no generic boilerplate. +- **Readiness is measurable.** The 9-pillar model produces a numeric score and maturity level, making it possible to set org-wide baselines and CI gates. +- **Evaluation closes the loop.** Teams can prove that instructions actually improve AI output, with configurable pass-rate thresholds. +- **Policy-driven compliance.** Policies are composable JSON files that can be checked into repos or distributed org-wide. +- **Batch-first.** Every workflow that works on one repo also works on hundreds — same CLI, same output format. diff --git a/src/cli.ts b/src/cli.ts index efddc7a..4072b80 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,4 +1,4 @@ -import { Command } from "commander"; +import { Argument, Command } from "commander"; import { analyzeCommand } from "./commands/analyze"; import { batchCommand } from "./commands/batch"; @@ -42,6 +42,7 @@ export function runCli(argv: string[]): void { program .command("init") + .description("Interactive repo setup — analyze, generate instructions and configs") .argument("[path]", "Path to a local repository") .option("--github", "Use a GitHub repository") .option("--provider ", "Repo provider (github|azure)") @@ -52,12 +53,21 @@ export function runCli(argv: string[]): void { program .command("analyze") + .description("Detect languages, frameworks, monorepo structure, and areas") .argument("[path]", "Path to a local repository") .action(withGlobalOpts(analyzeCommand)); program .command("generate") - .argument("", "instructions|agents|mcp|vscode") + .description("Generate instructions, agents, MCP, or VS Code configs") + .addArgument( + new Argument("", "Config type to generate").choices([ + "instructions", + "agents", + "mcp", + "vscode" + ]) + ) .argument("[path]", "Path to a local repository") .option("--force", "Overwrite existing files") .option("--per-app", "Generate per-app in monorepos") @@ -66,6 +76,7 @@ export function runCli(argv: string[]): void { program .command("pr") + .description("Create a PR with generated configs on GitHub or Azure DevOps") .argument("[repo]", "Repo identifier (github: owner/name, azure: org/project/repo)") .option("--branch ", "Branch name") .option("--provider ", "Repo provider (github|azure)") @@ -74,6 +85,7 @@ export function runCli(argv: string[]): void { program .command("eval") + .description("Compare AI responses with and without instructions") .argument("[path]", "Path to eval config JSON") .option("--repo ", "Repository path", process.cwd()) .option("--model ", "Model for responses", DEFAULT_MODEL) @@ -82,17 +94,19 @@ export function runCli(argv: string[]): void { .option("--output ", "Write results JSON to file") .option("--init", "Create a starter primer.eval.json file") .option("--count ", "Number of eval cases to generate (with --init)") - .option("--fail-threshold ", "Exit with error if pass rate (%) falls below threshold") + .option("--fail-level ", "Exit with error if pass rate (%) falls below threshold") .action(withGlobalOpts(evalCommand)); program .command("tui") + .description("Interactive terminal UI for generation, evaluation, and batch workflows") .option("--repo ", "Repository path", process.cwd()) .option("--no-animation", "Skip the animated banner intro") .action(withGlobalOpts(tuiCommand)); program .command("instructions") + .description("Generate root and per-area .instructions.md files") .option("--repo ", "Repository path", process.cwd()) .option("--output ", "Output path for copilot instructions") .option("--model ", "Model for instructions generation", DEFAULT_MODEL) @@ -104,11 +118,14 @@ export function runCli(argv: string[]): void { program .command("readiness") + .description("AI readiness assessment across 9 maturity pillars") .argument("[path]", "Path to a local repository") .option("--output ", "Write report to file (.json or .html)") + .option("--force", "Overwrite existing output file") .option("--visual", "Generate visual HTML report") .option("--per-area", "Show per-area readiness breakdown") .option("--policy ", "Policy sources (comma-separated: paths, npm packages)") + .option("--fail-level ", "Exit with error if readiness level is below threshold (1–5)") .action(withGlobalOpts(readinessCommand)); program diff --git a/src/commands/batch.tsx b/src/commands/batch.tsx index a8fe593..d9947a2 100644 --- a/src/commands/batch.tsx +++ b/src/commands/batch.tsx @@ -1,4 +1,3 @@ -import fs from "fs/promises"; import readline from "readline"; import { render } from "ink"; @@ -10,10 +9,11 @@ import { runBatchHeadlessGitHub, runBatchHeadlessAzure, sanitizeError } from ".. import type { ProcessResult } from "../services/batch"; import type { GitHubRepo } from "../services/github"; import { getGitHubToken, getRepo as getGitHubRepo } from "../services/github"; -import type { CommandResult } from "../utils/output"; -import { outputResult, outputError, createProgressReporter, shouldLog } from "../utils/output"; import { BatchTui } from "../ui/BatchTui"; import { BatchTuiAzure } from "../ui/BatchTuiAzure"; +import { safeWriteFile } from "../utils/fs"; +import type { CommandResult } from "../utils/output"; +import { outputResult, outputError, createProgressReporter, shouldLog } from "../utils/output"; import { GITHUB_REPO_RE, AZURE_REPO_RE } from "../utils/repo"; type BatchOptions = { @@ -194,7 +194,7 @@ async function emitResults(results: ProcessResult[], options: BatchOptions): Pro const failed = results.length - succeeded; if (options.output) { - await fs.writeFile(options.output, JSON.stringify(results, null, 2), "utf8"); + await safeWriteFile(options.output, JSON.stringify(results, null, 2), true); } if (options.json) { diff --git a/src/commands/eval.ts b/src/commands/eval.ts index 44a411f..ad56f3b 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -1,10 +1,10 @@ -import fs from "fs/promises"; import path from "path"; import { DEFAULT_MODEL, DEFAULT_JUDGE_MODEL } from "../config"; import { listCopilotModels } from "../services/copilot"; import { generateEvalScaffold } from "../services/evalScaffold"; import { runEval } from "../services/evaluator"; +import { safeWriteFile } from "../utils/fs"; import type { CommandResult } from "../utils/output"; import { outputResult, outputError, createProgressReporter, shouldLog } from "../utils/output"; @@ -16,7 +16,7 @@ type EvalOptions = { init?: boolean; count?: string; listModels?: boolean; - failThreshold?: string; + failLevel?: string; json?: boolean; quiet?: boolean; }; @@ -66,13 +66,6 @@ export async function evalCommand( if (options.init) { const outputPath = path.join(repoPath, "primer.eval.json"); const desiredCount = Math.max(1, Number.parseInt(options.count ?? "5", 10) || 5); - try { - await fs.access(outputPath); - outputError(`primer.eval.json already exists at ${outputPath}`, Boolean(options.json)); - return; - } catch { - // File doesn't exist, create it - } try { const progress = createProgressReporter(!shouldLog(options)); const scaffold = await generateEvalScaffold({ @@ -81,7 +74,16 @@ export async function evalCommand( model: options.model, onProgress: (msg) => progress.update(msg) }); - await fs.writeFile(outputPath, JSON.stringify(scaffold, null, 2), "utf8"); + const { wrote, reason } = await safeWriteFile( + outputPath, + JSON.stringify(scaffold, null, 2), + false + ); + if (!wrote) { + const why = reason === "symlink" ? "path is a symlink" : "file exists"; + outputError(`Skipped ${outputPath}: ${why}`, Boolean(options.json)); + return; + } if (options.json) { const result: CommandResult<{ outputPath: string }> = { @@ -132,7 +134,7 @@ export async function evalCommand( } } - const threshold = Number.parseInt(options.failThreshold ?? "", 10); + const threshold = Number.parseInt(options.failLevel ?? "", 10); if (Number.isFinite(threshold)) { const total = results.length; const passed = results.filter((r) => r.verdict === "pass").length; @@ -142,6 +144,7 @@ export async function evalCommand( `Pass rate ${passRate}% (${passed}/${total}) is below threshold ${threshold}%`, Boolean(options.json) ); + process.exitCode = 1; } } } catch (error) { diff --git a/src/commands/generate.ts b/src/commands/generate.ts index c6a70e1..468e0ec 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -3,16 +3,10 @@ import path from "path"; import { analyzeRepo } from "../services/analyzer"; import type { FileAction } from "../services/generator"; import { generateConfigs } from "../services/generator"; -import { generateCopilotInstructions } from "../services/instructions"; -import { ensureDir, safeWriteFile } from "../utils/fs"; import type { CommandResult } from "../utils/output"; -import { - outputResult, - outputError, - deriveFileStatus, - createProgressReporter, - shouldLog -} from "../utils/output"; +import { outputResult, outputError, deriveFileStatus, shouldLog } from "../utils/output"; + +import { instructionsCommand } from "./instructions"; type GenerateOptions = { force?: boolean; @@ -27,13 +21,23 @@ export async function generateCommand( repoPathArg: string | undefined, options: GenerateOptions ): Promise { - const allowed = new Set(["mcp", "vscode", "instructions", "agents"]); - if (!allowed.has(type)) { - outputError("Invalid type. Use: instructions, agents, mcp, vscode.", Boolean(options.json)); + const repoPath = path.resolve(repoPathArg ?? process.cwd()); + + if (type === "instructions" || type === "agents") { + // Delegate to the canonical instructions command + const output = type === "agents" ? path.join(repoPath, "AGENTS.md") : undefined; + await instructionsCommand({ + repo: repoPath, + output, + force: options.force, + model: options.model, + json: options.json, + quiet: options.quiet, + areas: options.perApp + }); return; } - const repoPath = path.resolve(repoPathArg ?? process.cwd()); let analysis; try { analysis = await analyzeRepo(repoPath); @@ -44,85 +48,6 @@ export async function generateCommand( ); return; } - const allFiles: FileAction[] = []; - - if (type === "instructions" || type === "agents") { - const apps = analysis.apps ?? []; - const targets: Array<{ repoPath: string; savePath: string; label: string }> = []; - - if (options.perApp && analysis.isMonorepo && apps.length > 1) { - for (const app of apps) { - const savePath = - type === "instructions" - ? path.join(app.path, ".github", "copilot-instructions.md") - : path.join(app.path, "AGENTS.md"); - targets.push({ repoPath: app.path, savePath, label: app.name }); - } - } else { - const savePath = - type === "instructions" - ? path.join(repoPath, ".github", "copilot-instructions.md") - : path.join(repoPath, "AGENTS.md"); - targets.push({ repoPath, savePath, label: path.basename(repoPath) }); - } - - for (const target of targets) { - if (shouldLog(options)) { - process.stderr.write(`Generating ${type} for ${target.label}...\n`); - } - try { - const progress = createProgressReporter(!shouldLog(options)); - const content = await generateCopilotInstructions({ - repoPath: target.repoPath, - model: options.model, - onProgress: (msg) => progress.update(msg) - }); - if (!content.trim()) { - if (shouldLog(options)) { - process.stderr.write(` No content generated for ${target.label}.\n`); - } - allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); - continue; - } - await ensureDir(path.dirname(target.savePath)); - const rel = path.relative(process.cwd(), target.savePath); - const { wrote, reason } = await safeWriteFile( - target.savePath, - content, - Boolean(options.force) - ); - if (!wrote) { - const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; - if (shouldLog(options)) { - process.stderr.write(` Skipped ${rel}: ${why}\n`); - } - allFiles.push({ path: rel, action: "skipped" }); - continue; - } - allFiles.push({ path: rel, action: "wrote" }); - if (shouldLog(options)) { - process.stderr.write(` ✓ ${rel}\n`); - } - } catch (error) { - if (shouldLog(options)) { - process.stderr.write(` ✗ ${error instanceof Error ? error.message : String(error)}\n`); - } - allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); - } - } - - if (options.json) { - const { ok, status } = deriveFileStatus(allFiles); - const result: CommandResult<{ type: string; files: FileAction[] }> = { - ok, - status, - data: { type, files: allFiles } - }; - outputResult(result, true); - if (!ok) process.exitCode = 1; - } - return; - } const selections = [type]; let genResult; diff --git a/src/commands/init.ts b/src/commands/init.ts index 45e1234..2861ba0 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -242,5 +242,11 @@ export async function initCommand( for (const file of genResult.files) { process.stderr.write(`${file.action === "wrote" ? "Wrote" : "Skipped"} ${file.path}\n`); } + process.stderr.write("\nNext steps:\n"); + process.stderr.write(" primer readiness Check AI readiness across 9 pillars\n"); + if (analysis.areas && analysis.areas.length > 0) { + process.stderr.write(" primer instructions --areas Generate per-area instructions\n"); + } + process.stderr.write(" primer eval --init Scaffold evaluation test cases\n"); } } diff --git a/src/commands/instructions.ts b/src/commands/instructions.ts index 50daf63..75b6572 100644 --- a/src/commands/instructions.ts +++ b/src/commands/instructions.ts @@ -1,11 +1,11 @@ import path from "path"; +import { analyzeRepo } from "../services/analyzer"; import { generateCopilotInstructions, generateAreaInstructions, writeAreaInstruction } from "../services/instructions"; -import { analyzeRepo } from "../services/analyzer"; import { ensureDir, safeWriteFile } from "../utils/fs"; import type { CommandResult } from "../utils/output"; import { outputResult, outputError, createProgressReporter, shouldLog } from "../utils/output"; @@ -174,9 +174,10 @@ export async function instructionsCommand(options: InstructionsOptions): Promise } if (!wantAreas && shouldLog(options) && !options.json) { - process.stderr.write( - "Please review and share feedback on any unclear or incomplete sections.\n" - ); + process.stderr.write("\nNext steps:\n"); + process.stderr.write(" primer eval --init Scaffold evaluation test cases\n"); + process.stderr.write(" primer generate mcp Generate MCP configuration\n"); + process.stderr.write(" primer generate vscode Generate VS Code settings\n"); } } catch (error) { outputError( diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts index 12d9d94..cae2f2f 100644 --- a/src/commands/readiness.ts +++ b/src/commands/readiness.ts @@ -1,16 +1,16 @@ -import fs from "fs/promises"; import path from "path"; import chalk from "chalk"; +import { parsePolicySources } from "../services/policy"; import type { ReadinessReport, ReadinessCriterionResult, AreaReadinessReport } from "../services/readiness"; import { runReadinessReport, groupPillars } from "../services/readiness"; -import { parsePolicySources } from "../services/policy"; import { generateVisualReport } from "../services/visualReport"; +import { safeWriteFile } from "../utils/fs"; import type { CommandResult } from "../utils/output"; import { outputResult, outputError, shouldLog } from "../utils/output"; @@ -18,9 +18,11 @@ type ReadinessOptions = { json?: boolean; quiet?: boolean; output?: string; + force?: boolean; visual?: boolean; perArea?: boolean; policy?: string; + failLevel?: string; }; export async function readinessCommand( @@ -42,6 +44,23 @@ export async function readinessCommand( return; } + // Check --fail-level threshold early so it applies regardless of output format + const failLevel = Number.parseInt(options.failLevel ?? "", 10); + if (Number.isFinite(failLevel)) { + const clamped = Math.max(1, Math.min(5, failLevel)); + if (clamped !== failLevel && shouldLog(options)) { + process.stderr.write(`Warning: --fail-level clamped to ${clamped} (valid range: 1–5)\n`); + } + if ((report.achievedLevel ?? 0) < clamped) { + if (shouldLog(options)) { + process.stderr.write( + `Error: Readiness level ${report.achievedLevel ?? 0} is below threshold ${clamped}\n` + ); + } + process.exitCode = 1; + } + } + // Generate visual HTML report if (options.visual || (options.output && options.output.endsWith(".html"))) { const html = generateVisualReport({ @@ -54,7 +73,12 @@ export async function readinessCommand( ? path.resolve(options.output) : path.join(repoPath, "readiness-report.html"); - await fs.writeFile(outputPath, html, "utf8"); + const { wrote, reason } = await safeWriteFile(outputPath, html, Boolean(options.force)); + if (!wrote) { + const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; + outputError(`Skipped ${outputPath}: ${why}`, Boolean(options.json)); + return; + } if (shouldLog(options)) { process.stderr.write(chalk.green(`✓ Visual report generated: ${outputPath}`) + "\n"); } @@ -64,7 +88,16 @@ export async function readinessCommand( // Output to JSON file if (options.output && options.output.endsWith(".json")) { const outputPath = path.resolve(options.output); - await fs.writeFile(outputPath, JSON.stringify(report, null, 2), "utf8"); + const { wrote, reason } = await safeWriteFile( + outputPath, + JSON.stringify(report, null, 2), + Boolean(options.force) + ); + if (!wrote) { + const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; + outputError(`Skipped ${outputPath}: ${why}`, Boolean(options.json)); + return; + } if (shouldLog(options)) { process.stderr.write(chalk.green(`✓ JSON report saved: ${outputPath}`) + "\n"); } @@ -93,7 +126,7 @@ function printReadinessChecklist(report: ReadinessReport): void { log( `- Monorepo: ${report.isMonorepo ? "yes" : "no"}${report.apps.length ? ` (${report.apps.length} apps)` : ""}` ); - log(`- Level: ${report.achievedLevel || 1} (${levelName(report.achievedLevel || 1)})`); + log(`- Level: ${report.achievedLevel ?? 1} (${levelName(report.achievedLevel ?? 1)})`); const groups = groupPillars(report.pillars); for (const { label, pillars } of groups) { diff --git a/src/services/__tests__/pr.test.ts b/src/services/__tests__/pr.test.ts index a67d6c1..a82b6d1 100644 --- a/src/services/__tests__/pr.test.ts +++ b/src/services/__tests__/pr.test.ts @@ -1,28 +1,6 @@ import { describe, expect, it } from "vitest"; -import { buildConfigsPrBody, buildInstructionsPrBody, buildFullPrBody } from "../../utils/pr"; - -describe("buildConfigsPrBody", () => { - it("includes VS Code config files", () => { - const body = buildConfigsPrBody(); - - expect(body).toContain(".vscode/settings.json"); - expect(body).toContain(".vscode/mcp.json"); - }); - - it("does not include instructions file", () => { - const body = buildConfigsPrBody(); - - expect(body).not.toContain("copilot-instructions.md"); - }); - - it("includes markdown headers", () => { - const body = buildConfigsPrBody(); - - expect(body).toContain("## "); - expect(body).toContain("### "); - }); -}); +import { buildInstructionsPrBody, buildFullPrBody } from "../../utils/pr"; describe("buildInstructionsPrBody", () => { it("includes instructions file", () => { diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index 85647ec..b7827c2 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -1,7 +1,7 @@ import fs from "fs/promises"; import path from "path"; -import { buildTimestampedName } from "../utils/fs"; +import { buildTimestampedName, safeWriteFile } from "../utils/fs"; import { assertCopilotCliReady } from "./copilot"; import type { EvalConfig } from "./evalScaffold"; @@ -180,9 +180,9 @@ export async function runEval( let viewerPath: string | undefined; if (outputPath) { await fs.mkdir(path.dirname(outputPath), { recursive: true }); - await fs.writeFile(outputPath, JSON.stringify(output, null, 2), "utf8"); + await safeWriteFile(outputPath, JSON.stringify(output, null, 2), true); viewerPath = buildViewerPath(outputPath); - await fs.writeFile(viewerPath, buildTrajectoryViewerHtml(output), "utf8"); + await safeWriteFile(viewerPath, buildTrajectoryViewerHtml(output), true); } const summary = formatSummary(results, runFinishedAt - runStartedAt); diff --git a/src/services/git.ts b/src/services/git.ts index 6333143..56809bd 100644 --- a/src/services/git.ts +++ b/src/services/git.ts @@ -13,12 +13,6 @@ export async function isGitRepo(repoPath: string): Promise { } } -export async function getRepoRoot(repoPath: string): Promise { - const git = simpleGit(repoPath); - const root = await git.revparse(["--show-toplevel"]); - return root.trim(); -} - export type CloneOptions = { shallow?: boolean; timeoutMs?: number; diff --git a/src/services/instructions.ts b/src/services/instructions.ts index 9ec288b..68ede47 100644 --- a/src/services/instructions.ts +++ b/src/services/instructions.ts @@ -9,7 +9,6 @@ import { assertCopilotCliReady } from "./copilot"; type GenerateInstructionsOptions = { repoPath: string; - instructionFile?: string; model?: string; onProgress?: (message: string) => void; }; @@ -248,6 +247,3 @@ export async function writeAreaInstruction( } return { status: "written", filePath }; } - -// Re-export for backward compatibility -export { sanitizeAreaName } from "./analyzer"; diff --git a/src/ui/BatchReadinessTui.tsx b/src/ui/BatchReadinessTui.tsx index 3a6e5e9..7818590 100644 --- a/src/ui/BatchReadinessTui.tsx +++ b/src/ui/BatchReadinessTui.tsx @@ -12,7 +12,7 @@ import { listUserOrgs, listOrgRepos, listAccessibleRepos } from "../services/git import type { ReadinessReport } from "../services/readiness"; import { runReadinessReport } from "../services/readiness"; import { generateVisualReport } from "../services/visualReport"; -import { ensureDir, validateCachePath } from "../utils/fs"; +import { safeWriteFile, ensureDir, validateCachePath } from "../utils/fs"; import { StaticBanner } from "./AnimatedBanner"; @@ -179,7 +179,8 @@ export function BatchReadinessTui({ token, outputPath, policies }: Props): React }); const finalOutputPath = outputPath ?? path.join(process.cwd(), "batch-readiness-report.html"); - await fs.writeFile(finalOutputPath, html, "utf8"); + const { wrote, reason } = await safeWriteFile(finalOutputPath, html, true); + if (!wrote) throw new Error(reason === "symlink" ? "Path is a symlink" : "Write failed"); setStatus("complete"); setMessage(`Report generated: ${finalOutputPath}`); diff --git a/src/ui/BatchTui.tsx b/src/ui/BatchTui.tsx index fc14b49..f67e4a5 100644 --- a/src/ui/BatchTui.tsx +++ b/src/ui/BatchTui.tsx @@ -1,8 +1,8 @@ -import fs from "fs/promises"; - import { Box, Text, useApp, useInput } from "ink"; import React, { useEffect, useState } from "react"; +import { processGitHubRepo } from "../services/batch"; +import type { ProcessResult } from "../services/batch"; import type { GitHubOrg, GitHubRepo } from "../services/github"; import { listUserOrgs, @@ -10,8 +10,7 @@ import { listAccessibleRepos, checkReposForInstructions } from "../services/github"; -import { processGitHubRepo } from "../services/batch"; -import type { ProcessResult } from "../services/batch"; +import { safeWriteFile } from "../utils/fs"; import { StaticBanner } from "./AnimatedBanner"; @@ -164,7 +163,7 @@ export function BatchTui({ token, outputPath }: Props): React.JSX.Element { // Write results if output path specified if (outputPath) { - await fs.writeFile(outputPath, JSON.stringify(localResults, null, 2), "utf8"); + await safeWriteFile(outputPath, JSON.stringify(localResults, null, 2), true); } setStatus("complete"); diff --git a/src/ui/BatchTuiAzure.tsx b/src/ui/BatchTuiAzure.tsx index e82e1bb..356c846 100644 --- a/src/ui/BatchTuiAzure.tsx +++ b/src/ui/BatchTuiAzure.tsx @@ -1,5 +1,3 @@ -import fs from "fs/promises"; - import { Box, Text, useApp, useInput } from "ink"; import React, { useEffect, useState } from "react"; @@ -12,6 +10,7 @@ import { } from "../services/azureDevops"; import { processAzureRepo } from "../services/batch"; import type { ProcessResult } from "../services/batch"; +import { safeWriteFile } from "../utils/fs"; import { StaticBanner } from "./AnimatedBanner"; @@ -173,7 +172,7 @@ export function BatchTuiAzure({ token, outputPath }: Props): React.JSX.Element { } if (outputPath) { - await fs.writeFile(outputPath, JSON.stringify(localResults, null, 2), "utf8"); + await safeWriteFile(outputPath, JSON.stringify(localResults, null, 2), true); } setStatus("complete"); diff --git a/src/ui/index.ts b/src/ui/index.ts deleted file mode 100644 index c3505a6..0000000 --- a/src/ui/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./tui"; -export * from "./AnimatedBanner"; -export * from "./BatchTui"; diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 904fbb6..517562d 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -373,7 +373,9 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX const outputPath = generateSavePath || path.join(repoPath, ".github", "copilot-instructions.md"); await fs.mkdir(path.dirname(outputPath), { recursive: true }); - await fs.writeFile(outputPath, generatedContent, "utf8"); + const { wrote, reason } = await safeWriteFile(outputPath, generatedContent, true); + if (!wrote) + throw new Error(reason === "symlink" ? "Path is a symlink" : "Write failed"); setStatus("done"); const relPath = path.relative(repoPath, outputPath); const msg = `Saved to ${relPath}`; @@ -525,7 +527,8 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX }); if (content.trim()) { await fs.mkdir(path.dirname(savePath), { recursive: true }); - await fs.writeFile(savePath, content, "utf8"); + const { wrote: saved } = await safeWriteFile(savePath, content, true); + if (!saved) continue; count++; addLog(`${app.name}: saved ${path.basename(savePath)}`, "success"); } diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 3bc7357..35e3bfe 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -10,4 +10,12 @@ export function prettyPrintSummary(analysis: RepoAnalysis): void { log(`- Languages: ${analysis.languages.join(", ") || "unknown"}`); log(`- Frameworks: ${analysis.frameworks.join(", ") || "none"}`); log(`- Package manager: ${analysis.packageManager ?? "unknown"}`); + if (analysis.isMonorepo) { + log( + `- Monorepo: yes (${analysis.workspaceType ?? "unknown"}, ${analysis.apps?.length ?? 0} apps)` + ); + } + if (analysis.areas && analysis.areas.length > 0) { + log(`- Areas: ${analysis.areas.map((a) => a.name).join(", ")}`); + } } diff --git a/src/utils/pr.ts b/src/utils/pr.ts index 53f96e9..0716544 100644 --- a/src/utils/pr.ts +++ b/src/utils/pr.ts @@ -1,27 +1,3 @@ -export function buildConfigsPrBody(): string { - return [ - "## 🤖 Primed for AI", - "", - "This PR adds configurations to prime this repository for AI coding assistants.", - "", - "### Added Files", - "", - "| File | Purpose |", - "|------|---------|", - "| `.vscode/settings.json` | VS Code settings for optimal AI assistance |", - "| `.vscode/mcp.json` | Model Context Protocol server configuration |", - "", - "### How to Use", - "", - "1. Merge this PR", - "2. Open the project in VS Code", - "3. Start chatting with Copilot — it now understands your project!", - "", - "---", - "*Generated by Primer*" - ].join("\n"); -} - export function buildInstructionsPrBody(): string { return [ "## 🤖 Copilot Instructions Added", diff --git a/vscode-extension/package.json b/vscode-extension/package.json index add0ee5..70e5d18 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -135,17 +135,6 @@ "onCommand:primer.analyze" ] }, - { - "id": "readiness", - "title": "Check AI Readiness", - "description": "Score your repo across 9 pillars with a visual maturity report.\n[$(shield) Run Assessment](command:primer.readiness)", - "media": { - "markdown": "resources/walkthrough/readiness.md" - }, - "completionEvents": [ - "onCommand:primer.readiness" - ] - }, { "id": "instructions", "title": "Generate AI Instructions", @@ -168,6 +157,17 @@ "onCommand:primer.generate" ] }, + { + "id": "readiness", + "title": "Check AI Readiness", + "description": "Score your repo across 9 pillars with a visual maturity report.\n[$(shield) Run Assessment](command:primer.readiness)", + "media": { + "markdown": "resources/walkthrough/readiness.md" + }, + "completionEvents": [ + "onCommand:primer.readiness" + ] + }, { "id": "eval", "title": "Evaluate Effectiveness", diff --git a/vscode-extension/src/commands/eval.ts b/vscode-extension/src/commands/eval.ts index 7fd0626..096793f 100644 --- a/vscode-extension/src/commands/eval.ts +++ b/vscode-extension/src/commands/eval.ts @@ -1,6 +1,12 @@ import * as vscode from "vscode"; import path from "node:path"; -import { runEval, generateEvalScaffold, analyzeRepo, safeWriteFile } from "../services.js"; +import { + runEval, + generateEvalScaffold, + analyzeRepo, + safeWriteFile, + DEFAULT_MODEL +} from "../services.js"; import { VscodeProgressReporter } from "../progress.js"; import { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from "./analyze.js"; import { createWebviewPanel } from "../webview.js"; @@ -24,7 +30,7 @@ export async function evalCommand(): Promise { } const config = vscode.workspace.getConfiguration("primer"); - const model = config.get("model") ?? "claude-sonnet-4.5"; + const model = config.get("model") ?? DEFAULT_MODEL; await vscode.window.withProgress( { diff --git a/vscode-extension/src/commands/generate.ts b/vscode-extension/src/commands/generate.ts index 04f1154..a8bd7ce 100644 --- a/vscode-extension/src/commands/generate.ts +++ b/vscode-extension/src/commands/generate.ts @@ -12,17 +12,22 @@ export async function generateCommand(): Promise { if (!workspacePath) return; const picked = await vscode.window.showQuickPick( - GENERATE_OPTIONS.map((o) => ({ label: o.label, description: o.description, value: o.value })), - { placeHolder: "Select config type to generate" } + GENERATE_OPTIONS.map((o) => ({ + label: o.label, + description: o.description, + value: o.value, + picked: false + })), + { placeHolder: "Select config type(s) to generate", canPickMany: true } ); - if (!picked) return; + if (!picked || picked.length === 0) return; let analysis = getCachedAnalysis(); const result = await vscode.window.withProgress( { location: vscode.ProgressLocation.Notification, - title: `Primer: Generating ${picked.label}…` + title: `Primer: Generating ${picked.map((p) => p.label).join(", ")}…` }, async () => { try { @@ -34,7 +39,7 @@ export async function generateCommand(): Promise { return await generateConfigs({ repoPath: workspacePath, analysis, - selections: [picked.value], + selections: picked.map((p) => p.value), force: false }); } catch (err) { @@ -69,13 +74,13 @@ export async function generateCommand(): Promise { await vscode.window.withProgress( { location: vscode.ProgressLocation.Notification, - title: `Primer: Overwriting ${picked.label}…` + title: `Primer: Overwriting configs…` }, async () => { const forceResult = await generateConfigs({ repoPath: workspacePath, analysis: analysis!, - selections: [picked.value], + selections: picked.map((p) => p.value), force: true }); const forceWrote = forceResult.files.filter((f) => f.action === "wrote"); diff --git a/vscode-extension/src/commands/init.ts b/vscode-extension/src/commands/init.ts index 7f97b92..a48ca3d 100644 --- a/vscode-extension/src/commands/init.ts +++ b/vscode-extension/src/commands/init.ts @@ -1,6 +1,11 @@ import * as vscode from "vscode"; import path from "node:path"; -import { analyzeRepo, generateConfigs, generateCopilotInstructions } from "../services.js"; +import { + analyzeRepo, + generateConfigs, + generateCopilotInstructions, + safeWriteFile +} from "../services.js"; import { VscodeProgressReporter } from "../progress.js"; import { getWorkspacePath, setCachedAnalysis } from "./analyze.js"; @@ -26,12 +31,24 @@ export async function initCommand(): Promise { setCachedAnalysis(analysis); reporter.update("Generating Copilot instructions…"); - await generateCopilotInstructions({ + const instructionsContent = await generateCopilotInstructions({ repoPath: workspacePath, model, onProgress: (msg) => reporter.update(msg) }); + let skippedInstructions = false; + + if (instructionsContent.trim()) { + const instructionsPath = path.join(workspacePath, ".github", "copilot-instructions.md"); + const dir = path.dirname(instructionsPath); + await vscode.workspace.fs.createDirectory(vscode.Uri.file(dir)); + const { wrote } = await safeWriteFile(instructionsPath, instructionsContent, false); + if (!wrote) { + skippedInstructions = true; + } + } + reporter.update("Generating configs…"); const result = await generateConfigs({ repoPath: workspacePath, @@ -42,6 +59,10 @@ export async function initCommand(): Promise { const wrote = result.files.filter((f) => f.action === "wrote"); const skipped = result.files.filter((f) => f.action === "skipped"); + if (skippedInstructions) + skipped.push({ path: ".github/copilot-instructions.md", action: "skipped" }); + else if (instructionsContent.trim()) + wrote.push({ path: ".github/copilot-instructions.md", action: "wrote" }); const parts: string[] = []; if (wrote.length) parts.push(`${wrote.length} files generated`); if (skipped.length) parts.push(`${skipped.length} skipped (already exist)`); diff --git a/vscode-extension/src/commands/instructions.ts b/vscode-extension/src/commands/instructions.ts index 3205be9..331956d 100644 --- a/vscode-extension/src/commands/instructions.ts +++ b/vscode-extension/src/commands/instructions.ts @@ -1,6 +1,12 @@ import * as vscode from "vscode"; import path from "node:path"; -import { generateCopilotInstructions, generateAreaInstructions, analyzeRepo } from "../services.js"; +import { + generateCopilotInstructions, + generateAreaInstructions, + writeAreaInstruction, + safeWriteFile, + analyzeRepo +} from "../services.js"; import { VscodeProgressReporter } from "../progress.js"; import { getWorkspacePath, getCachedAnalysis, setCachedAnalysis } from "./analyze.js"; @@ -69,22 +75,30 @@ export async function instructionsCommand(): Promise { const reporter = new VscodeProgressReporter(progress); reporter.update("Generating root instructions…"); - await generateCopilotInstructions({ + const content = await generateCopilotInstructions({ repoPath: workspacePath, - instructionFile, model, onProgress: (msg) => reporter.update(msg) }); + if (content.trim()) { + const dir = path.dirname(instructionFile); + await vscode.workspace.fs.createDirectory(vscode.Uri.file(dir)); + await safeWriteFile(instructionFile, content, true); + } + if (selectedAreas) { for (const area of selectedAreas) { reporter.update(`Generating instructions for ${area.name}…`); - await generateAreaInstructions({ + const body = await generateAreaInstructions({ repoPath: workspacePath, area, model, onProgress: (msg) => reporter.update(msg) }); + if (body.trim()) { + await writeAreaInstruction(workspacePath, area, body, true); + } } } diff --git a/vscode-extension/src/commands/pr.ts b/vscode-extension/src/commands/pr.ts index e052254..e091c8d 100644 --- a/vscode-extension/src/commands/pr.ts +++ b/vscode-extension/src/commands/pr.ts @@ -57,8 +57,10 @@ export async function prCommand(): Promise { .map((f) => f.path) .filter( (p) => - p.startsWith(".github/") || - p.startsWith(".vscode/") || + p === ".github/copilot-instructions.md" || + p === ".vscode/mcp.json" || + p === ".vscode/settings.json" || + p === "AGENTS.md" || p.endsWith(".instructions.md") || p === "primer.eval.json" ); diff --git a/vscode-extension/src/extension.ts b/vscode-extension/src/extension.ts index 2a8138d..5ecf8e3 100644 --- a/vscode-extension/src/extension.ts +++ b/vscode-extension/src/extension.ts @@ -9,12 +9,11 @@ import { prCommand } from "./commands/pr.js"; import { analysisTreeProvider, readinessTreeProvider } from "./views/providers.js"; export function activate(context: vscode.ExtensionContext): void { - // Status bar + // Status bar — only show after analysis const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0); statusBar.text = "$(beaker) Primer"; statusBar.tooltip = "Primer — click to analyze repository"; statusBar.command = "primer.analyze"; - statusBar.show(); context.subscriptions.push(statusBar); // Tree views (createTreeView for description/badge support) @@ -51,9 +50,9 @@ export function activate(context: vscode.ExtensionContext): void { const parts = analysis.languages.slice(0, 2); statusBar.text = `$(beaker) ${parts.join(", ") || "Primer"}`; statusBar.tooltip = `Primer — ${analysis.languages.join(", ")}${analysis.isMonorepo ? " | monorepo" : ""}`; + statusBar.show(); } else { - statusBar.text = "$(beaker) Primer"; - statusBar.tooltip = "Primer — click to analyze repository"; + statusBar.hide(); } } diff --git a/vscode-extension/src/services.ts b/vscode-extension/src/services.ts index 8ff55df..89d1ebf 100644 --- a/vscode-extension/src/services.ts +++ b/vscode-extension/src/services.ts @@ -2,11 +2,13 @@ export { analyzeRepo } from "primer/services/analyzer.js"; export { generateConfigs } from "primer/services/generator.js"; export { generateCopilotInstructions, - generateAreaInstructions + generateAreaInstructions, + writeAreaInstruction } from "primer/services/instructions.js"; export { runEval } from "primer/services/evaluator.js"; export { generateEvalScaffold } from "primer/services/evalScaffold.js"; -export { runReadinessReport } from "primer/services/readiness.js"; +export { runReadinessReport, groupPillars } from "primer/services/readiness.js"; export { generateVisualReport } from "primer/services/visualReport.js"; export { createPullRequest } from "primer/services/github.js"; export { safeWriteFile } from "primer/utils/fs.js"; +export { DEFAULT_MODEL } from "primer/config.js"; diff --git a/vscode-extension/src/types.ts b/vscode-extension/src/types.ts index ce4ecf5..79e3f35 100644 --- a/vscode-extension/src/types.ts +++ b/vscode-extension/src/types.ts @@ -1,7 +1,7 @@ /** * Re-export Primer CLI types for use in the extension. */ -export type { RepoAnalysis, Area } from "primer/services/analyzer.js"; +export type { RepoAnalysis } from "primer/services/analyzer.js"; export type { ReadinessReport, diff --git a/vscode-extension/src/views/AnalysisTreeProvider.ts b/vscode-extension/src/views/AnalysisTreeProvider.ts index 337c7f0..1477c7a 100644 --- a/vscode-extension/src/views/AnalysisTreeProvider.ts +++ b/vscode-extension/src/views/AnalysisTreeProvider.ts @@ -56,9 +56,9 @@ export class AnalysisTreeProvider implements vscode.TreeDataProvider 0) { const areas = new AnalysisItem( - "Monorepo", + analysis.isMonorepo ? "Monorepo" : "Areas", vscode.TreeItemCollapsibleState.Expanded, analysis.areas.map((a) => { const item = new AnalysisItem(a.name, vscode.TreeItemCollapsibleState.None); diff --git a/vscode-extension/src/views/ReadinessTreeProvider.ts b/vscode-extension/src/views/ReadinessTreeProvider.ts index 88617c1..56b764d 100644 --- a/vscode-extension/src/views/ReadinessTreeProvider.ts +++ b/vscode-extension/src/views/ReadinessTreeProvider.ts @@ -4,7 +4,7 @@ import type { ReadinessPillarSummary, ReadinessCriterionResult } from "../types.js"; -import { groupPillars } from "primer/services/readiness.js"; +import { groupPillars } from "../services.js"; export class ReadinessTreeProvider implements vscode.TreeDataProvider { private _onDidChangeTreeData = new vscode.EventEmitter(); From e385dad0aa1d6343637688824156d287398afff7 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 18:57:45 -0800 Subject: [PATCH 65/84] Revert "Merge pull request #17 from digitarald/consolidate-instructions-command" This reverts commit 8db6aede14d64e80dff9fe68ba13191783046d1a, reversing changes made to 0384387b7e7b79b4f66fb78ffeb16caa0813be4d. --- src/cli.ts | 16 +- src/commands/generate.ts | 98 +++++++- src/commands/instructions.ts | 263 ++++++++++------------ src/services/__tests__/boundaries.test.ts | 25 -- 4 files changed, 211 insertions(+), 191 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index 8f90da9..efddc7a 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,4 +1,4 @@ -import { Command, Option } from "commander"; +import { Command } from "commander"; import { analyzeCommand } from "./commands/analyze"; import { batchCommand } from "./commands/batch"; @@ -57,9 +57,11 @@ export function runCli(argv: string[]): void { program .command("generate") - .argument("", "mcp|vscode") + .argument("", "instructions|agents|mcp|vscode") .argument("[path]", "Path to a local repository") .option("--force", "Overwrite existing files") + .option("--per-app", "Generate per-app in monorepos") + .option("--model ", "Model for instructions generation", DEFAULT_MODEL) .action(withGlobalOpts(generateCommand)); program @@ -92,15 +94,9 @@ export function runCli(argv: string[]): void { program .command("instructions") .option("--repo ", "Repository path", process.cwd()) - .option("--output ", "Output path for instructions") - .addOption( - new Option("--format ", "Output format: copilot-instructions or agents-md") - .choices(["copilot-instructions", "agents-md"]) - .default("copilot-instructions") - ) - .option("--per-app", "Generate per-app instructions in monorepos") + .option("--output ", "Output path for copilot instructions") .option("--model ", "Model for instructions generation", DEFAULT_MODEL) - .option("--force", "Overwrite existing files") + .option("--force", "Overwrite existing area instruction files") .option("--areas", "Also generate file-based instructions for detected areas") .option("--areas-only", "Generate only file-based area instructions (skip root)") .option("--area ", "Generate file-based instructions for a specific area") diff --git a/src/commands/generate.ts b/src/commands/generate.ts index 85cd188..c6a70e1 100644 --- a/src/commands/generate.ts +++ b/src/commands/generate.ts @@ -3,11 +3,21 @@ import path from "path"; import { analyzeRepo } from "../services/analyzer"; import type { FileAction } from "../services/generator"; import { generateConfigs } from "../services/generator"; +import { generateCopilotInstructions } from "../services/instructions"; +import { ensureDir, safeWriteFile } from "../utils/fs"; import type { CommandResult } from "../utils/output"; -import { outputResult, outputError, deriveFileStatus, shouldLog } from "../utils/output"; +import { + outputResult, + outputError, + deriveFileStatus, + createProgressReporter, + shouldLog +} from "../utils/output"; type GenerateOptions = { force?: boolean; + perApp?: boolean; + model?: string; json?: boolean; quiet?: boolean; }; @@ -17,12 +27,9 @@ export async function generateCommand( repoPathArg: string | undefined, options: GenerateOptions ): Promise { - const allowed = new Set(["mcp", "vscode"]); + const allowed = new Set(["mcp", "vscode", "instructions", "agents"]); if (!allowed.has(type)) { - outputError( - "Invalid type. Use: mcp, vscode. For instructions, use the 'instructions' command.", - Boolean(options.json) - ); + outputError("Invalid type. Use: instructions, agents, mcp, vscode.", Boolean(options.json)); return; } @@ -37,6 +44,85 @@ export async function generateCommand( ); return; } + const allFiles: FileAction[] = []; + + if (type === "instructions" || type === "agents") { + const apps = analysis.apps ?? []; + const targets: Array<{ repoPath: string; savePath: string; label: string }> = []; + + if (options.perApp && analysis.isMonorepo && apps.length > 1) { + for (const app of apps) { + const savePath = + type === "instructions" + ? path.join(app.path, ".github", "copilot-instructions.md") + : path.join(app.path, "AGENTS.md"); + targets.push({ repoPath: app.path, savePath, label: app.name }); + } + } else { + const savePath = + type === "instructions" + ? path.join(repoPath, ".github", "copilot-instructions.md") + : path.join(repoPath, "AGENTS.md"); + targets.push({ repoPath, savePath, label: path.basename(repoPath) }); + } + + for (const target of targets) { + if (shouldLog(options)) { + process.stderr.write(`Generating ${type} for ${target.label}...\n`); + } + try { + const progress = createProgressReporter(!shouldLog(options)); + const content = await generateCopilotInstructions({ + repoPath: target.repoPath, + model: options.model, + onProgress: (msg) => progress.update(msg) + }); + if (!content.trim()) { + if (shouldLog(options)) { + process.stderr.write(` No content generated for ${target.label}.\n`); + } + allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); + continue; + } + await ensureDir(path.dirname(target.savePath)); + const rel = path.relative(process.cwd(), target.savePath); + const { wrote, reason } = await safeWriteFile( + target.savePath, + content, + Boolean(options.force) + ); + if (!wrote) { + const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; + if (shouldLog(options)) { + process.stderr.write(` Skipped ${rel}: ${why}\n`); + } + allFiles.push({ path: rel, action: "skipped" }); + continue; + } + allFiles.push({ path: rel, action: "wrote" }); + if (shouldLog(options)) { + process.stderr.write(` ✓ ${rel}\n`); + } + } catch (error) { + if (shouldLog(options)) { + process.stderr.write(` ✗ ${error instanceof Error ? error.message : String(error)}\n`); + } + allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); + } + } + + if (options.json) { + const { ok, status } = deriveFileStatus(allFiles); + const result: CommandResult<{ type: string; files: FileAction[] }> = { + ok, + status, + data: { type, files: allFiles } + }; + outputResult(result, true); + if (!ok) process.exitCode = 1; + } + return; + } const selections = [type]; let genResult; diff --git a/src/commands/instructions.ts b/src/commands/instructions.ts index d920269..50daf63 100644 --- a/src/commands/instructions.ts +++ b/src/commands/instructions.ts @@ -3,30 +3,17 @@ import path from "path"; import { generateCopilotInstructions, generateAreaInstructions, - writeAreaInstruction, - areaInstructionPath + writeAreaInstruction } from "../services/instructions"; import { analyzeRepo } from "../services/analyzer"; -import type { Area } from "../services/analyzer"; import { ensureDir, safeWriteFile } from "../utils/fs"; -import type { FileAction } from "../services/generator"; import type { CommandResult } from "../utils/output"; -import { - outputResult, - outputError, - deriveFileStatus, - createProgressReporter, - shouldLog -} from "../utils/output"; - -type InstructionsFormat = "copilot-instructions" | "agents-md"; +import { outputResult, outputError, createProgressReporter, shouldLog } from "../utils/output"; type InstructionsOptions = { repo?: string; output?: string; model?: string; - format?: InstructionsFormat; - perApp?: boolean; json?: boolean; quiet?: boolean; force?: boolean; @@ -35,37 +22,75 @@ type InstructionsOptions = { area?: string; }; -export function resolveOutputPath( - basePath: string, - format: InstructionsFormat, - customOutput?: string -): string { - if (customOutput) return path.resolve(customOutput); - return format === "agents-md" - ? path.join(basePath, "AGENTS.md") - : path.join(basePath, ".github", "copilot-instructions.md"); -} - export async function instructionsCommand(options: InstructionsOptions): Promise { const repoPath = path.resolve(options.repo ?? process.cwd()); - const format: InstructionsFormat = options.format ?? "copilot-instructions"; + const outputPath = path.resolve( + options.output ?? path.join(repoPath, ".github", "copilot-instructions.md") + ); const progress = createProgressReporter(!shouldLog(options)); const wantAreas = options.areas || options.areasOnly || options.area; - const allFiles: FileAction[] = []; try { - // Validate option conflicts - if (options.perApp && options.output) { - outputError( - "--output cannot be combined with --per-app (each app gets its own file)", - Boolean(options.json) - ); - return; + // Generate root instructions unless --areas-only + if (!options.areasOnly && !options.area) { + let content = ""; + try { + progress.update("Generating instructions..."); + content = await generateCopilotInstructions({ + repoPath, + model: options.model + }); + } catch (error) { + const msg = + "Failed to generate instructions with Copilot SDK. " + + "Ensure the Copilot CLI is installed (copilot --version) and logged in. " + + (error instanceof Error ? error.message : String(error)); + outputError(msg, Boolean(options.json)); + if (!wantAreas) return; + } + if (!content && !wantAreas) { + outputError("No instructions were generated.", Boolean(options.json)); + return; + } + + if (content) { + await ensureDir(path.dirname(outputPath)); + const { wrote, reason } = await safeWriteFile(outputPath, content, Boolean(options.force)); + + if (!wrote) { + const relPath = path.relative(process.cwd(), outputPath); + const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; + if (options.json) { + const result: CommandResult<{ outputPath: string; skipped: true; reason: string }> = { + ok: true, + status: "noop", + data: { outputPath, skipped: true, reason: why } + }; + outputResult(result, true); + } else if (shouldLog(options)) { + progress.update(`Skipped ${relPath}: ${why}`); + } + } else { + const byteCount = Buffer.byteLength(content, "utf8"); + + if (options.json) { + const result: CommandResult<{ outputPath: string; model: string; byteCount: number }> = + { + ok: true, + status: "success", + data: { outputPath, model: options.model ?? "default", byteCount } + }; + outputResult(result, true); + } else if (shouldLog(options)) { + progress.succeed(`Updated ${path.relative(process.cwd(), outputPath)}`); + } + } + } } - // Analyze repo for --per-app or --areas - let analysis; - if (options.perApp || wantAreas) { + // Generate area-based instructions + if (wantAreas) { + let analysis; try { analysis = await analyzeRepo(repoPath); } catch (error) { @@ -75,142 +100,80 @@ export async function instructionsCommand(options: InstructionsOptions): Promise ); return; } - } + const areas = analysis.areas ?? []; - // Validate --area early (before generating root instructions) - let targetAreas: Area[] = []; - if (wantAreas) { - const areas = analysis!.areas ?? []; - if (options.area) { - const areaFilter = options.area.toLowerCase(); - targetAreas = areas.filter((a) => a.name.toLowerCase() === areaFilter); - if (targetAreas.length === 0) { - outputError( - `Area "${options.area}" not found. Available: ${areas.map((a) => a.name).join(", ")}`, - Boolean(options.json) - ); - return; + if (areas.length === 0) { + if (shouldLog(options)) { + progress.update("No areas detected. Use primer.config.json to define custom areas."); } - } else { - targetAreas = areas; + return; } - } - // Build generation targets - const targets: Array<{ repoPath: string; savePath: string; label: string }> = []; - const apps = analysis?.apps ?? []; + const areaFilter = options.area?.toLowerCase(); + const targetAreas = areaFilter + ? areas.filter((a) => a.name.toLowerCase() === areaFilter) + : areas; - if (options.perApp && analysis?.isMonorepo && apps.length > 1) { - for (const app of apps) { - const savePath = resolveOutputPath(app.path, format); - targets.push({ repoPath: app.path, savePath, label: app.name }); - } - } else if (!options.areasOnly && !options.area) { - const outputPath = resolveOutputPath(repoPath, format, options.output); - targets.push({ repoPath, savePath: outputPath, label: path.basename(repoPath) }); - } - - // Generate root instructions for each target - for (const target of targets) { - progress.update(`Generating ${format} for ${target.label}...`); - try { - const content = await generateCopilotInstructions({ - repoPath: target.repoPath, - model: options.model, - onProgress: (msg) => progress.update(msg) - }); - if (!content.trim()) { - progress.update(`No content generated for ${target.label}.`); - allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); - continue; - } - await ensureDir(path.dirname(target.savePath)); - const rel = path.relative(process.cwd(), target.savePath); - const { wrote, reason } = await safeWriteFile( - target.savePath, - content, - Boolean(options.force) + if (options.area && targetAreas.length === 0) { + outputError( + `Area "${options.area}" not found. Available: ${areas.map((a) => a.name).join(", ")}`, + Boolean(options.json) ); - if (!wrote) { - const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; - progress.update(`Skipped ${rel}: ${why}`); - allFiles.push({ path: rel, action: "skipped" }); - } else { - allFiles.push({ path: rel, action: "wrote" }); - progress.succeed(`Wrote ${rel}`); - } - } catch (error) { - const msg = - "Failed to generate instructions with Copilot SDK. " + - "Ensure the Copilot CLI is installed (copilot --version) and logged in. " + - (error instanceof Error ? error.message : String(error)); - progress.fail(msg); - allFiles.push({ path: path.relative(process.cwd(), target.savePath), action: "skipped" }); - if (!wantAreas) { - break; - } + return; } - } - // Generate area-based instructions - if (wantAreas) { - if (targetAreas.length === 0) { - progress.update("No areas detected. Use primer.config.json to define custom areas."); - } else { + if (shouldLog(options)) { progress.update(`Generating file-based instructions for ${targetAreas.length} area(s)...`); + } - for (const area of targetAreas) { - const areaRel = path.relative(process.cwd(), areaInstructionPath(repoPath, area)); - try { + for (const area of targetAreas) { + try { + if (shouldLog(options)) { progress.update( `Generating for "${area.name}" (${Array.isArray(area.applyTo) ? area.applyTo.join(", ") : area.applyTo})...` ); - const body = await generateAreaInstructions({ - repoPath, - area, - model: options.model, - onProgress: (msg) => progress.update(msg) - }); - - if (!body.trim()) { + } + const body = await generateAreaInstructions({ + repoPath, + area, + model: options.model, + onProgress: shouldLog(options) ? (msg) => progress.update(msg) : undefined + }); + + if (!body.trim()) { + if (shouldLog(options)) { progress.update(`Skipped "${area.name}" — no content generated.`); - allFiles.push({ path: areaRel, action: "skipped" }); - continue; } + continue; + } - const result = await writeAreaInstruction(repoPath, area, body, options.force); - if (result.status === "written") { - allFiles.push({ path: areaRel, action: "wrote" }); - progress.succeed(`Wrote ${areaRel}`); - } else { - const why = - result.status === "symlink" - ? "path is a symlink" - : "file exists (use --force to overwrite)"; - progress.update(`Skipped "${area.name}" — ${why}.`); - allFiles.push({ path: areaRel, action: "skipped" }); + const result = await writeAreaInstruction(repoPath, area, body, options.force); + if (result.status === "skipped") { + if (shouldLog(options)) { + progress.update(`Skipped "${area.name}" — file exists (use --force to overwrite).`); + } + continue; + } + if (result.status === "symlink") { + if (shouldLog(options)) { + progress.update(`Skipped "${area.name}" — path is a symlink.`); } - } catch (error) { - progress.fail( + continue; + } + if (shouldLog(options)) { + progress.succeed(`Wrote ${path.relative(process.cwd(), result.filePath)}`); + } + } catch (error) { + if (shouldLog(options)) { + progress.update( `Failed for "${area.name}": ${error instanceof Error ? error.message : String(error)}` ); - allFiles.push({ path: areaRel, action: "skipped" }); } } } } - // Output JSON result - if (options.json) { - const { ok, status } = deriveFileStatus(allFiles); - const result: CommandResult<{ format: string; files: FileAction[] }> = { - ok, - status, - data: { format, files: allFiles } - }; - outputResult(result, true); - if (!ok) process.exitCode = 1; - } else if (!wantAreas && shouldLog(options)) { + if (!wantAreas && shouldLog(options) && !options.json) { process.stderr.write( "Please review and share feedback on any unclear or incomplete sections.\n" ); diff --git a/src/services/__tests__/boundaries.test.ts b/src/services/__tests__/boundaries.test.ts index 9490548..5233c69 100644 --- a/src/services/__tests__/boundaries.test.ts +++ b/src/services/__tests__/boundaries.test.ts @@ -8,7 +8,6 @@ import { sanitizeError } from "../batch"; import { safeWriteFile } from "../../utils/fs"; import { deriveFileStatus, shouldLog } from "../../utils/output"; import { GITHUB_REPO_RE, AZURE_REPO_RE } from "../../utils/repo"; -import { resolveOutputPath } from "../../commands/instructions"; // ── sanitizeError ── @@ -199,27 +198,3 @@ describe("safeWriteFile symlink", () => { expect(await fs.readFile(realFile, "utf8")).toBe("original"); }); }); - -// ── resolveOutputPath ── - -describe("resolveOutputPath", () => { - it("returns .github/copilot-instructions.md for copilot-instructions format", () => { - const result = resolveOutputPath("/repo", "copilot-instructions"); - expect(result).toBe(path.join("/repo", ".github", "copilot-instructions.md")); - }); - - it("returns AGENTS.md for agents-md format", () => { - const result = resolveOutputPath("/repo", "agents-md"); - expect(result).toBe(path.join("/repo", "AGENTS.md")); - }); - - it("uses customOutput when provided, ignoring format", () => { - const result = resolveOutputPath("/repo", "agents-md", "/custom/output.md"); - expect(result).toBe(path.resolve("/custom/output.md")); - }); - - it("resolves customOutput relative paths", () => { - const result = resolveOutputPath("/repo", "copilot-instructions", "relative/path.md"); - expect(result).toBe(path.resolve("relative/path.md")); - }); -}); From 9e55d36d1da3ded956af32035f32459b9a2510f6 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 20:37:34 -0800 Subject: [PATCH 66/84] fix(vscode): harden extension commands with overwrite flows, shared PR service, and UX polish --- src/services/__tests__/localPr.test.ts | 47 ++++++++++ src/services/localPr.ts | 78 ++++++++++++++++ vscode-extension/package.json | 4 + vscode-extension/src/commands/eval.ts | 3 +- vscode-extension/src/commands/generate.ts | 28 +++--- vscode-extension/src/commands/init.ts | 48 ++++++++++ vscode-extension/src/commands/instructions.ts | 48 +++++++++- vscode-extension/src/commands/pr.ts | 88 +++++++++---------- vscode-extension/src/extension.ts | 2 +- vscode-extension/src/progress.ts | 4 +- vscode-extension/src/services.ts | 6 ++ 11 files changed, 290 insertions(+), 66 deletions(-) create mode 100644 src/services/__tests__/localPr.test.ts create mode 100644 src/services/localPr.ts diff --git a/src/services/__tests__/localPr.test.ts b/src/services/__tests__/localPr.test.ts new file mode 100644 index 0000000..6206edb --- /dev/null +++ b/src/services/__tests__/localPr.test.ts @@ -0,0 +1,47 @@ +import { describe, expect, it } from "vitest"; + +import { isPrimerFile, PRIMER_FILE_PATTERNS } from "../localPr"; + +describe("isPrimerFile", () => { + it.each([...PRIMER_FILE_PATTERNS])("matches exact pattern: %s", (pattern) => { + expect(isPrimerFile(pattern)).toBe(true); + }); + + it("matches .instructions.md suffix", () => { + expect(isPrimerFile("src/api/.instructions.md")).toBe(true); + expect(isPrimerFile(".instructions.md")).toBe(true); + expect(isPrimerFile("deep/nested/path/.instructions.md")).toBe(true); + }); + + it("rejects unrelated files", () => { + expect(isPrimerFile("package.json")).toBe(false); + expect(isPrimerFile("src/index.ts")).toBe(false); + expect(isPrimerFile("README.md")).toBe(false); + expect(isPrimerFile(".gitignore")).toBe(false); + }); + + it("rejects partial matches", () => { + expect(isPrimerFile("copilot-instructions.md")).toBe(false); + expect(isPrimerFile("mcp.json")).toBe(false); + expect(isPrimerFile("settings.json")).toBe(false); + expect(isPrimerFile(".vscode/extensions.json")).toBe(false); + }); + + it("rejects files that contain pattern as substring", () => { + expect(isPrimerFile("old/.github/copilot-instructions.md.bak")).toBe(false); + expect(isPrimerFile("backup/AGENTS.md")).toBe(false); + expect(isPrimerFile("other/.vscode/mcp.json")).toBe(false); + }); + + it("rejects instructions.md without dot prefix", () => { + expect(isPrimerFile("instructions.md")).toBe(false); + expect(isPrimerFile("src/instructions.md")).toBe(false); + }); + + it("matches Windows-style backslash paths", () => { + expect(isPrimerFile(".github\\copilot-instructions.md")).toBe(true); + expect(isPrimerFile(".vscode\\mcp.json")).toBe(true); + expect(isPrimerFile(".vscode\\settings.json")).toBe(true); + expect(isPrimerFile("src\\api\\.instructions.md")).toBe(true); + }); +}); diff --git a/src/services/localPr.ts b/src/services/localPr.ts new file mode 100644 index 0000000..379c168 --- /dev/null +++ b/src/services/localPr.ts @@ -0,0 +1,78 @@ +import simpleGit from "simple-git"; +import { pushBranch } from "./git.js"; + +/** File patterns that Primer generates and should be included in PRs. */ +export const PRIMER_FILE_PATTERNS = [ + ".github/copilot-instructions.md", + ".vscode/mcp.json", + ".vscode/settings.json", + "AGENTS.md", + "primer.eval.json" +] as const; + +/** Check if a file path is a Primer-generated file. */ +export function isPrimerFile(filePath: string): boolean { + const normalized = filePath.replace(/\\/g, "/"); + return ( + PRIMER_FILE_PATTERNS.some((p) => normalized === p) || normalized.endsWith(".instructions.md") + ); +} + +export type RemoteInfo = { owner: string; repo: string }; + +/** + * Detect GitHub owner/repo from the origin remote of a local repository. + * Returns null if no GitHub remote is found. + */ +export async function detectGitHubRemote(repoPath: string): Promise { + const git = simpleGit(repoPath); + const remotes = await git.getRemotes(true); + const origin = remotes.find((r) => r.name === "origin"); + if (!origin?.refs.push) return null; + + const match = origin.refs.push.match(/github\.com[:/]([^/]+)\/([^/.]+)/); + if (!match) return null; + + return { owner: match[1]!, repo: match[2]! }; +} + +export type BranchInfo = { current: string; defaultBranch: string }; + +/** + * Get current branch and the default branch (from origin/HEAD). + */ +export async function getBranchInfo(repoPath: string): Promise { + const git = simpleGit(repoPath); + const current = (await git.branch()).current; + const defaultRef = await git + .raw(["symbolic-ref", "refs/remotes/origin/HEAD", "--short"]) + .catch(() => "origin/main"); + const defaultBranch = defaultRef.replace(/^origin\//, "").trim(); + return { current, defaultBranch }; +} + +/** + * Get Primer-generated files from the current git status. + * Returns the filtered file paths. + */ +export async function getPrimerFilesFromStatus(repoPath: string): Promise { + const git = simpleGit(repoPath); + const status = await git.status(); + return status.files.map((f) => f.path).filter(isPrimerFile); +} + +/** + * Commit specific files and push to origin. + */ +export async function commitAndPush( + repoPath: string, + files: string[], + message: string, + branch: string, + token?: string +): Promise { + const git = simpleGit(repoPath); + await git.add(files); + await git.commit(message); + await pushBranch(repoPath, branch, token); +} diff --git a/vscode-extension/package.json b/vscode-extension/package.json index 70e5d18..82dfe75 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -194,6 +194,10 @@ "type": "boolean", "default": false, "description": "Automatically analyze repository on workspace open." + }, + "primer.judgeModel": { + "type": "string", + "description": "Copilot model to use for judging eval responses (defaults to primer.model if unset)." } } }, diff --git a/vscode-extension/src/commands/eval.ts b/vscode-extension/src/commands/eval.ts index 096793f..38f3c02 100644 --- a/vscode-extension/src/commands/eval.ts +++ b/vscode-extension/src/commands/eval.ts @@ -31,6 +31,7 @@ export async function evalCommand(): Promise { const config = vscode.workspace.getConfiguration("primer"); const model = config.get("model") ?? DEFAULT_MODEL; + const judgeModel = config.get("judgeModel") ?? model; await vscode.window.withProgress( { @@ -47,7 +48,7 @@ export async function evalCommand(): Promise { configPath, repoPath: workspacePath, model, - judgeModel: model, + judgeModel, onProgress: (msg) => reporter.update(msg) }); diff --git a/vscode-extension/src/commands/generate.ts b/vscode-extension/src/commands/generate.ts index a8bd7ce..e9082b7 100644 --- a/vscode-extension/src/commands/generate.ts +++ b/vscode-extension/src/commands/generate.ts @@ -67,7 +67,7 @@ export async function generateCommand(): Promise { } else if (skipped.length > 0) { const overwrite = "Overwrite"; const action = await vscode.window.showWarningMessage( - "Primer: All config files already exist.", + `Primer: All ${skipped.length} config files already exist.`, overwrite ); if (action === overwrite) { @@ -77,16 +77,22 @@ export async function generateCommand(): Promise { title: `Primer: Overwriting configs…` }, async () => { - const forceResult = await generateConfigs({ - repoPath: workspacePath, - analysis: analysis!, - selections: picked.map((p) => p.value), - force: true - }); - const forceWrote = forceResult.files.filter((f) => f.action === "wrote"); - if (forceWrote.length > 0) { - const doc = await vscode.workspace.openTextDocument(forceWrote[0]!.path); - await vscode.window.showTextDocument(doc); + try { + const forceResult = await generateConfigs({ + repoPath: workspacePath, + analysis: analysis!, + selections: picked.map((p) => p.value), + force: true + }); + const forceWrote = forceResult.files.filter((f) => f.action === "wrote"); + if (forceWrote.length > 0) { + const doc = await vscode.workspace.openTextDocument(forceWrote[0]!.path); + await vscode.window.showTextDocument(doc); + } + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Config overwrite failed — ${err instanceof Error ? err.message : String(err)}` + ); } } ); diff --git a/vscode-extension/src/commands/init.ts b/vscode-extension/src/commands/init.ts index a48ca3d..0c56773 100644 --- a/vscode-extension/src/commands/init.ts +++ b/vscode-extension/src/commands/init.ts @@ -63,6 +63,54 @@ export async function initCommand(): Promise { skipped.push({ path: ".github/copilot-instructions.md", action: "skipped" }); else if (instructionsContent.trim()) wrote.push({ path: ".github/copilot-instructions.md", action: "wrote" }); + + if (wrote.length === 0 && skipped.length > 0) { + reporter.succeed("All files already exist."); + const overwrite = "Overwrite"; + const action = await vscode.window.showWarningMessage( + `Primer: All ${skipped.length} files already exist.`, + overwrite + ); + if (action === overwrite) { + try { + reporter.update("Overwriting configs…"); + + if (instructionsContent.trim()) { + const instrPath = path.join(workspacePath, ".github", "copilot-instructions.md"); + await safeWriteFile(instrPath, instructionsContent, true); + } + + await generateConfigs({ + repoPath: workspacePath, + analysis, + selections: ["mcp", "vscode"], + force: true + }); + reporter.succeed("Configs overwritten."); + + const instructionsPath = path.join( + workspacePath, + ".github", + "copilot-instructions.md" + ); + try { + const doc = await vscode.workspace.openTextDocument(instructionsPath); + await vscode.window.showTextDocument(doc); + } catch { + // File may not exist if generation was skipped + } + + vscode.window.showInformationMessage(`Primer: ${skipped.length} files overwritten.`); + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Config overwrite failed — ${err instanceof Error ? err.message : String(err)}` + ); + } + } + + return; + } + const parts: string[] = []; if (wrote.length) parts.push(`${wrote.length} files generated`); if (skipped.length) parts.push(`${skipped.length} skipped (already exist)`); diff --git a/vscode-extension/src/commands/instructions.ts b/vscode-extension/src/commands/instructions.ts index 331956d..484f57d 100644 --- a/vscode-extension/src/commands/instructions.ts +++ b/vscode-extension/src/commands/instructions.ts @@ -81,12 +81,16 @@ export async function instructionsCommand(): Promise { onProgress: (msg) => reporter.update(msg) }); + let rootSkipped = false; if (content.trim()) { const dir = path.dirname(instructionFile); await vscode.workspace.fs.createDirectory(vscode.Uri.file(dir)); - await safeWriteFile(instructionFile, content, true); + const { wrote } = await safeWriteFile(instructionFile, content, false); + if (!wrote) rootSkipped = true; } + let areasSkipped = 0; + const areaBodies = new Map(); if (selectedAreas) { for (const area of selectedAreas) { reporter.update(`Generating instructions for ${area.name}…`); @@ -96,13 +100,51 @@ export async function instructionsCommand(): Promise { model, onProgress: (msg) => reporter.update(msg) }); + areaBodies.set(area.name, body); if (body.trim()) { - await writeAreaInstruction(workspacePath, area, body, true); + const result = await writeAreaInstruction(workspacePath, area, body, false); + if (result.status === "skipped") areasSkipped++; } } } - reporter.succeed("Instructions generated."); + const totalSkipped = (rootSkipped ? 1 : 0) + areasSkipped; + const areasWithContent = selectedAreas + ? selectedAreas.filter((a) => (areaBodies.get(a.name) ?? "").trim()).length + : 0; + const totalFiles = (content.trim() ? 1 : 0) + areasWithContent; + + if (totalSkipped > 0 && totalSkipped === totalFiles) { + reporter.succeed("All instruction files already exist."); + const overwrite = "Overwrite"; + const action = await vscode.window.showWarningMessage( + `Primer: All ${totalSkipped} instruction files already exist.`, + overwrite + ); + if (action === overwrite) { + try { + reporter.update("Overwriting instructions…"); + if (content.trim()) { + await safeWriteFile(instructionFile, content, true); + } + if (selectedAreas) { + for (const area of selectedAreas) { + const body = areaBodies.get(area.name) ?? ""; + if (body.trim()) { + await writeAreaInstruction(workspacePath, area, body, true); + } + } + } + reporter.succeed("Instructions overwritten."); + } catch (err) { + vscode.window.showErrorMessage( + `Primer: Instruction overwrite failed — ${err instanceof Error ? err.message : String(err)}` + ); + } + } + } else { + reporter.succeed("Instructions generated."); + } // Open the generated file try { diff --git a/vscode-extension/src/commands/pr.ts b/vscode-extension/src/commands/pr.ts index e091c8d..38d26c1 100644 --- a/vscode-extension/src/commands/pr.ts +++ b/vscode-extension/src/commands/pr.ts @@ -1,37 +1,27 @@ import * as vscode from "vscode"; -import { createPullRequest } from "../services.js"; +import { + createPullRequest, + detectGitHubRemote, + getBranchInfo, + getPrimerFilesFromStatus, + commitAndPush +} from "../services.js"; import { getGitHubToken } from "../auth.js"; import { getWorkspacePath } from "./analyze.js"; -import simpleGit from "simple-git"; export async function prCommand(): Promise { const workspacePath = getWorkspacePath(); if (!workspacePath) return; - const git = simpleGit(workspacePath); - - // Detect remote owner/repo - const remotes = await git.getRemotes(true); - const origin = remotes.find((r) => r.name === "origin"); - if (!origin?.refs.push) { - vscode.window.showErrorMessage("Primer: No origin remote found."); - return; - } - - const match = origin.refs.push.match(/github\.com[:/]([^/]+)\/([^/.]+)/); - if (!match) { - vscode.window.showErrorMessage("Primer: Could not parse GitHub owner/repo from origin remote."); + const remote = await detectGitHubRemote(workspacePath); + if (!remote) { + vscode.window.showErrorMessage("Primer: Could not detect a GitHub remote from origin."); return; } - const [, owner, repo] = match; - - const branch = (await git.branch()).current; - const defaultBranch = await git - .raw(["symbolic-ref", "refs/remotes/origin/HEAD", "--short"]) - .catch(() => "origin/main"); - const base = defaultBranch.replace("origin/", "").trim(); + const { owner, repo } = remote; - if (branch === base) { + const branchInfo = await getBranchInfo(workspacePath); + if (branchInfo.current === branchInfo.defaultBranch) { vscode.window.showErrorMessage( "Primer: Cannot create PR from the default branch. Check out a feature branch first." ); @@ -50,39 +40,41 @@ export async function prCommand(): Promise { try { const token = await getGitHubToken(); - // Commit and push if there are changes - const status = await git.status(); - if (status.files.length > 0) { - const primerFiles = status.files - .map((f) => f.path) - .filter( - (p) => - p === ".github/copilot-instructions.md" || - p === ".vscode/mcp.json" || - p === ".vscode/settings.json" || - p === "AGENTS.md" || - p.endsWith(".instructions.md") || - p === "primer.eval.json" - ); + const primerFiles = await getPrimerFilesFromStatus(workspacePath); - if (primerFiles.length === 0) { - vscode.window.showWarningMessage("Primer: No Primer-generated files to commit."); - return; + if (primerFiles.length === 0) { + vscode.window.showWarningMessage( + "Primer: No Primer-generated files found. Run 'Primer: Initialize Repository' or 'Primer: Generate Configs' first." + ); + return; + } + + const picked = await vscode.window.showQuickPick( + primerFiles.map((f) => ({ label: f, picked: true })), + { + canPickMany: true, + placeHolder: "Select files to commit & push", + title: "Primer: Confirm files" } + ); + if (!picked || picked.length === 0) return; - await git.add(primerFiles); - await git.commit(title); - await git.push("origin", branch); - } + await commitAndPush( + workspacePath, + picked.map((p) => p.label), + title, + branchInfo.current, + token + ); const prUrl = await createPullRequest({ token, - owner: owner!, - repo: repo!, + owner, + repo, title, body: "Generated by Primer VS Code extension.", - head: branch, - base + head: branchInfo.current, + base: branchInfo.defaultBranch }); const openAction = "Open in Browser"; diff --git a/vscode-extension/src/extension.ts b/vscode-extension/src/extension.ts index 5ecf8e3..a6276c9 100644 --- a/vscode-extension/src/extension.ts +++ b/vscode-extension/src/extension.ts @@ -93,7 +93,7 @@ export function activate(context: vscode.ExtensionContext): void { updateAnalysisView(); updateStatusBar(); }) - .catch(() => {}); + .catch((err) => console.error("Primer auto-analyze failed:", err)); } } diff --git a/vscode-extension/src/progress.ts b/vscode-extension/src/progress.ts index 7e1ef48..a3a63d7 100644 --- a/vscode-extension/src/progress.ts +++ b/vscode-extension/src/progress.ts @@ -14,11 +14,11 @@ export class VscodeProgressReporter implements ProgressReporter { } succeed(message: string): void { - this.progress.report({ message: `$(check) ${message}` }); + this.progress.report({ message: `✓ ${message}` }); } fail(message: string): void { - this.progress.report({ message: `$(error) ${message}` }); + this.progress.report({ message: `✗ ${message}` }); } done(): void { diff --git a/vscode-extension/src/services.ts b/vscode-extension/src/services.ts index 89d1ebf..1f89e9c 100644 --- a/vscode-extension/src/services.ts +++ b/vscode-extension/src/services.ts @@ -10,5 +10,11 @@ export { generateEvalScaffold } from "primer/services/evalScaffold.js"; export { runReadinessReport, groupPillars } from "primer/services/readiness.js"; export { generateVisualReport } from "primer/services/visualReport.js"; export { createPullRequest } from "primer/services/github.js"; +export { + detectGitHubRemote, + getBranchInfo, + getPrimerFilesFromStatus, + commitAndPush +} from "primer/services/localPr.js"; export { safeWriteFile } from "primer/utils/fs.js"; export { DEFAULT_MODEL } from "primer/config.js"; From 2a4c080d02c0f81db7bcedd47a94c39092467d24 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 16 Feb 2026 22:09:01 -0800 Subject: [PATCH 67/84] refactor: consolidate PR file handling --- .github/copilot-instructions.md | 133 +++++++----------- .../vscode-extension.instructions.md | 54 +++++++ src/services/__tests__/localPr.test.ts | 47 ------- src/services/__tests__/pr.test.ts | 51 ++++++- src/services/localPr.ts | 78 ---------- src/utils/pr.ts | 17 +++ vscode-extension/package-lock.json | 56 +------- vscode-extension/package.json | 6 +- vscode-extension/src/commands/pr.ts | 121 +++++++++++----- vscode-extension/src/git.d.ts | 59 ++++++++ vscode-extension/src/gitUtils.ts | 28 ++++ vscode-extension/src/services.ts | 7 +- 12 files changed, 349 insertions(+), 308 deletions(-) create mode 100644 .github/instructions/vscode-extension.instructions.md delete mode 100644 src/services/__tests__/localPr.test.ts delete mode 100644 src/services/localPr.ts create mode 100644 vscode-extension/src/git.d.ts create mode 100644 vscode-extension/src/gitUtils.ts diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 941c886..df90129 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,103 +1,70 @@ # Copilot Instructions for This Repository -## Development Checklist - -- Use ESM syntax everywhere (`"type": "module"` in package.json). -- TypeScript strict mode; target ES2022, module ESNext (see tsconfig.json). -- Use Commander for CLI, Ink/React for TUI, simple-git/Octokit for GitHub, Azure DevOps REST for Azure. -- Place CLI commands in `src/commands/`, business logic in `src/services/`, TUI components in `src/ui/`. -- All CLI commands MUST support `--json` and `--quiet` flags for automation-friendly output. -- Only overwrite config files with `--force`; use `safeWriteFile()` from `src/utils/fs.ts`. -- Windows/macOS/Linux compatibility required — use `path.join()`, avoid shell-specific syntax. -- Do not add new build/lint/test tools; use existing npm scripts. - -## Overview - -**Primer** is a TypeScript CLI for priming repositories for AI-assisted development — generating Copilot instructions, VS Code configs, MCP configs, and evaluating AI agent effectiveness. - -- **Entrypoint:** `src/index.ts` → `runCli()` in `src/cli.ts` -- **Tech:** TypeScript (ESM, strict), Node.js, React 19 (Ink 6 for TUI), Copilot SDK +**Primer** is a TypeScript CLI + VS Code extension for priming repositories for AI-assisted development. See `README.md` for full architecture, command reference, and service details. ## Build & Test ```sh npm run build # tsup → dist/ -npm run dev # tsx watch for development npm run typecheck # tsc --noEmit npm run lint # eslint (flat config) -npm run format # prettier --write -npm run test # vitest -npm run test:coverage # vitest with v8 coverage → ./coverage/ +npm run test # vitest (single run) +npm run test:watch # vitest (watch mode) ``` -Run locally without building: `npx tsx src/index.ts [options]` +Run without building: `npx tsx src/index.ts [options]` + +VS Code extension: `node esbuild.mjs` from `vscode-extension/`; typecheck with `npx tsc --noEmit` from there. + +## Code Style + +- ESM syntax everywhere (`"type": "module"`). TypeScript strict mode, ES2022 target. +- Windows/macOS/Linux compatible — use `path.join()`, avoid shell-specific syntax. +- Do not add new build/lint/test tools; use existing npm scripts. ## Architecture -### Commands (`src/commands/`) - -Commands are thin orchestrators — they parse options, call services, and format output. - -| Command | File | Purpose | -| ----------------- | -------------------- | ---------------------------------------------------------------------- | -| `init` | `init.ts` | Interactive/headless repo setup (local, GitHub, Azure) | -| `analyze` | `analyze.ts` | Detect languages, frameworks, monorepo structure, areas | -| `generate` | `generate.ts` | Generate instructions, agents, mcp, vscode configs | -| `instructions` | `instructions.ts` | Generate root + per-area `.instructions.md` files | -| `pr` | `pr.ts` | Create PR with configs on GitHub or Azure DevOps | -| `eval` | `eval.ts` | Compare responses with/without instructions; `--init` scaffolds config | -| `readiness` | `readiness.ts` | AI readiness assessment across 9 pillars | -| `tui` | `tui.tsx` | Full interactive TUI (model picker, areas, eval) | -| `batch` | `batch.tsx` | Bulk-process repos (GitHub or Azure); TUI or headless | -| `batch-readiness` | `batchReadiness.tsx` | Batch readiness HTML report generation | - -### Services (`src/services/`) - -Services contain all business logic. Commands never access APIs or filesystem directly. - -| Service | Key Exports | Purpose | -| ----------------- | ---------------------------------------------------------------------- | --------------------------------------------------------------- | -| `analyzer.ts` | `analyzeRepo()`, `loadPrimerConfig()` | Repo analysis: languages, frameworks, monorepo detection, areas | -| `instructions.ts` | `generateCopilotInstructions()`, `generateAreaInstructions()` | Copilot SDK sessions for instruction generation | -| `generator.ts` | `generateConfigs()` | Write `.vscode/mcp.json` and `.vscode/settings.json` | -| `evaluator.ts` | `runEval()` | Run evals comparing with/without instructions | -| `evalScaffold.ts` | `generateEvalScaffold()` | Auto-generate `primer.eval.json` test cases | -| `readiness.ts` | `runReadinessReport()` | 9-pillar readiness assessment | -| `git.ts` | `cloneRepo()`, `checkoutBranch()`, `commitAll()`, `pushBranch()` | Git operations with sanitized auth URLs | -| `github.ts` | `createGitHubClient()`, `createPullRequest()`, `listAccessibleRepos()` | GitHub API via Octokit | -| `azureDevops.ts` | `listOrganizations()`, `listRepos()`, `createPullRequest()` | Azure DevOps REST API; PAT auth | -| `batch.ts` | `processGitHubRepo()`, `processAzureRepo()` | Batch clone → generate → PR pipeline | -| `copilot.ts` | `assertCopilotCliReady()`, `listCopilotModels()` | Validate Copilot CLI availability; discover models | -| `visualReport.ts` | `generateVisualReport()` | HTML readiness report with dark/light themes | - -### UI (`src/ui/`) - -Ink/React components for interactive terminal workflows: - -- `tui.tsx` — Main TUI state machine (intro → idle → generating → …) -- `BatchTui.tsx` / `BatchTuiAzure.tsx` — GitHub/Azure batch processing UIs -- `BatchReadinessTui.tsx` — Batch readiness report UI -- `AnimatedBanner.tsx` — Intro animation (skip with `--no-animation`) - -### Utils (`src/utils/`) - -- `output.ts` — `CommandResult` type (`{ ok, status, data?, errors? }`), `ProgressReporter` interface -- `fs.ts` — `safeWriteFile()` (rejects symlinks, requires `--force`), `validateCachePath()` (prevents path traversal) -- `logger.ts` — Structured logging -- `repo.ts` / `pr.ts` — Shared repo/PR helpers +- **Entrypoint:** `src/index.ts` → `runCli()` in `src/cli.ts` +- **Commands** (`src/commands/`) are thin orchestrators — parse options, call services, format output. +- **Services** (`src/services/`) contain all business logic. Commands never access APIs or filesystem directly. +- **UI** (`src/ui/`) — Ink/React 19 components for interactive TUI. Use Ink 6 APIs. +- **Utils** (`src/utils/`) — `output.ts`, `fs.ts`, `logger.ts`, `repo.ts`, `pr.ts`. +- **VS Code Extension** (`vscode-extension/`) — companion extension; imports CLI services via path alias `primer/*`. See extension-specific instructions for details. ## Conventions -- **Output discipline:** `stdout` is for JSON only (with `--json`); human-readable output goes to `stderr` -- **CommandResult pattern:** All commands return `CommandResult` with `{ ok, status, data?, errors? }` -- **Safe writes:** `safeWriteFile()` rejects symlinks and skips existing files unless `--force` -- **Path safety:** `validateCachePath()` prevents traversal in `.primer-cache/` -- **Copilot SDK:** Sessions use `workingDirectory` in `SessionConfig` for scoping tool operations -- **Monorepo-aware:** Analyzer detects npm/pnpm/yarn/cargo/go/dotnet/gradle/maven workspaces; `Area` type scopes instructions via `applyTo` globs -- **Single glob pass** for convention source discovery (see `src/services/instructions.ts`) +### Output Discipline + +- `stdout` is for JSON only (with `--json`); **all human-readable output goes to `stderr`**. +- All commands MUST support `--json` and `--quiet` flags. Use `withGlobalOpts()` from `src/cli.ts` to merge global flags into command options. +- Commands return `CommandResult` with `{ ok, status, data?, errors? }` (from `src/utils/output.ts`). Status values: `"success"`, `"partial"`, `"noop"`, `"error"`. +- Use `outputResult()` / `outputError()` for final output — never `console.log()`. + +### File Safety + +- Use `safeWriteFile()` from `src/utils/fs.ts` for all user-path file writes. It rejects symlinks and skips existing files unless `--force`. +- Use `validateCachePath()` to prevent traversal attacks in `.primer-cache/`. + +### Error Handling + +- Services throw meaningful `Error` messages. Commands catch and pass to `outputError()`. +- Don't re-wrap errors or add extra logging in catch blocks. + +### Dependencies + +- CLI uses Commander, simple-git, Octokit. VS Code extension uses the built-in `vscode.git` API — **never bundle `simple-git` in the extension**. +- Copilot SDK sessions use `workingDirectory` in `SessionConfig` for scoping. + +## Testing + +- **Framework:** Vitest. Tests live in `src/services/__tests__/` with `.test.ts` suffix. +- **Mocking:** Use `vi.fn()` for functions, `vi.spyOn()` for methods. No `vi.mock()` — inline mocks and factory helpers preferred. +- **Filesystem tests:** Use real temp directories (`os.tmpdir()` + `fs.mkdtemp`). Clean up in `afterEach()`. +- **Test naming:** `describe()` per function/export, `it()` names start with a verb and form a sentence. +- **No shared test utils** — helper functions are scoped to each test file's `describe()` block. ## Prerequisites -- **Copilot CLI** must be installed and authenticated for SDK calls (`copilot.ts` validates this) -- **GitHub:** `GITHUB_TOKEN` or `GH_TOKEN` env var, or `gh` CLI for token extraction -- **Azure DevOps:** `AZURE_DEVOPS_PAT` env var for Azure operations +- **Copilot CLI** installed and authenticated for SDK calls +- **GitHub:** `GITHUB_TOKEN` or `GH_TOKEN` env var, or `gh` CLI +- **Azure DevOps:** `AZURE_DEVOPS_PAT` env var diff --git a/.github/instructions/vscode-extension.instructions.md b/.github/instructions/vscode-extension.instructions.md new file mode 100644 index 0000000..4f2461f --- /dev/null +++ b/.github/instructions/vscode-extension.instructions.md @@ -0,0 +1,54 @@ +--- +description: "Use when working on the VS Code extension in vscode-extension/. Covers build, git integration, path aliases, and extension-specific patterns." +applyTo: "vscode-extension/**" +--- + +# VS Code Extension Development + +The extension lives in `vscode-extension/` and surfaces Primer CLI commands in VS Code. + +## Build + +```sh +cd vscode-extension +node esbuild.mjs # CJS bundle → out/extension.js +node esbuild.mjs --watch # watch mode +npx tsc --noEmit # typecheck +``` + +Output is CommonJS (not ESM like the CLI). Bundled with esbuild, not tsup. + +## Service Reuse via Path Alias + +The extension imports CLI services through a `primer/*` path alias: + +```typescript +// vscode-extension/src/services.ts — re-export layer +export { analyzeRepo } from "primer/services/analyzer.js"; +``` + +This works because `tsconfig.json` maps `"primer/*": ["../src/*"]` and esbuild resolves it at bundle time. Never duplicate CLI service logic in the extension. + +## Git Integration + +- Use the built-in `vscode.git` extension API — **never import or bundle `simple-git`**. +- The extension declares `"extensionDependencies": ["vscode.git"]`. +- Types are vendored in `src/git.d.ts` from the upstream VS Code repo. +- `gitUtils.ts` finds the deepest matching repo for monorepo support. + +## Command Pattern + +Commands in `vscode-extension/src/commands/` are thin wrappers: + +1. Call shared service from `services.ts` +2. Update tree providers / status bar +3. Show VS Code notifications for results + +## Key Differences from CLI + +| Aspect | CLI | Extension | +| ------------- | ------------- | -------------- | +| Module format | ESM | CommonJS | +| Bundler | tsup | esbuild | +| Git library | simple-git | vscode.git API | +| Output | stdout/stderr | VS Code UI | diff --git a/src/services/__tests__/localPr.test.ts b/src/services/__tests__/localPr.test.ts deleted file mode 100644 index 6206edb..0000000 --- a/src/services/__tests__/localPr.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it } from "vitest"; - -import { isPrimerFile, PRIMER_FILE_PATTERNS } from "../localPr"; - -describe("isPrimerFile", () => { - it.each([...PRIMER_FILE_PATTERNS])("matches exact pattern: %s", (pattern) => { - expect(isPrimerFile(pattern)).toBe(true); - }); - - it("matches .instructions.md suffix", () => { - expect(isPrimerFile("src/api/.instructions.md")).toBe(true); - expect(isPrimerFile(".instructions.md")).toBe(true); - expect(isPrimerFile("deep/nested/path/.instructions.md")).toBe(true); - }); - - it("rejects unrelated files", () => { - expect(isPrimerFile("package.json")).toBe(false); - expect(isPrimerFile("src/index.ts")).toBe(false); - expect(isPrimerFile("README.md")).toBe(false); - expect(isPrimerFile(".gitignore")).toBe(false); - }); - - it("rejects partial matches", () => { - expect(isPrimerFile("copilot-instructions.md")).toBe(false); - expect(isPrimerFile("mcp.json")).toBe(false); - expect(isPrimerFile("settings.json")).toBe(false); - expect(isPrimerFile(".vscode/extensions.json")).toBe(false); - }); - - it("rejects files that contain pattern as substring", () => { - expect(isPrimerFile("old/.github/copilot-instructions.md.bak")).toBe(false); - expect(isPrimerFile("backup/AGENTS.md")).toBe(false); - expect(isPrimerFile("other/.vscode/mcp.json")).toBe(false); - }); - - it("rejects instructions.md without dot prefix", () => { - expect(isPrimerFile("instructions.md")).toBe(false); - expect(isPrimerFile("src/instructions.md")).toBe(false); - }); - - it("matches Windows-style backslash paths", () => { - expect(isPrimerFile(".github\\copilot-instructions.md")).toBe(true); - expect(isPrimerFile(".vscode\\mcp.json")).toBe(true); - expect(isPrimerFile(".vscode\\settings.json")).toBe(true); - expect(isPrimerFile("src\\api\\.instructions.md")).toBe(true); - }); -}); diff --git a/src/services/__tests__/pr.test.ts b/src/services/__tests__/pr.test.ts index a82b6d1..fe9d0a2 100644 --- a/src/services/__tests__/pr.test.ts +++ b/src/services/__tests__/pr.test.ts @@ -1,6 +1,11 @@ import { describe, expect, it } from "vitest"; -import { buildInstructionsPrBody, buildFullPrBody } from "../../utils/pr"; +import { + buildInstructionsPrBody, + buildFullPrBody, + isPrimerFile, + PRIMER_FILE_PATTERNS +} from "../../utils/pr"; describe("buildInstructionsPrBody", () => { it("includes instructions file", () => { @@ -54,3 +59,47 @@ describe("buildFullPrBody", () => { expect(body).toContain("|------|---------|"); }); }); + +describe("isPrimerFile", () => { + it.each([...PRIMER_FILE_PATTERNS])("matches exact pattern: %s", (pattern) => { + expect(isPrimerFile(pattern)).toBe(true); + }); + + it("matches .instructions.md suffix", () => { + expect(isPrimerFile("src/api/.instructions.md")).toBe(true); + expect(isPrimerFile(".instructions.md")).toBe(true); + expect(isPrimerFile("deep/nested/path/.instructions.md")).toBe(true); + }); + + it("rejects unrelated files", () => { + expect(isPrimerFile("package.json")).toBe(false); + expect(isPrimerFile("src/index.ts")).toBe(false); + expect(isPrimerFile("README.md")).toBe(false); + expect(isPrimerFile(".gitignore")).toBe(false); + }); + + it("rejects partial matches", () => { + expect(isPrimerFile("copilot-instructions.md")).toBe(false); + expect(isPrimerFile("mcp.json")).toBe(false); + expect(isPrimerFile("settings.json")).toBe(false); + expect(isPrimerFile(".vscode/extensions.json")).toBe(false); + }); + + it("rejects files that contain pattern as substring", () => { + expect(isPrimerFile("old/.github/copilot-instructions.md.bak")).toBe(false); + expect(isPrimerFile("backup/AGENTS.md")).toBe(false); + expect(isPrimerFile("other/.vscode/mcp.json")).toBe(false); + }); + + it("rejects instructions.md without dot prefix", () => { + expect(isPrimerFile("instructions.md")).toBe(false); + expect(isPrimerFile("src/instructions.md")).toBe(false); + }); + + it("matches Windows-style backslash paths", () => { + expect(isPrimerFile(".github\\copilot-instructions.md")).toBe(true); + expect(isPrimerFile(".vscode\\mcp.json")).toBe(true); + expect(isPrimerFile(".vscode\\settings.json")).toBe(true); + expect(isPrimerFile("src\\api\\.instructions.md")).toBe(true); + }); +}); diff --git a/src/services/localPr.ts b/src/services/localPr.ts deleted file mode 100644 index 379c168..0000000 --- a/src/services/localPr.ts +++ /dev/null @@ -1,78 +0,0 @@ -import simpleGit from "simple-git"; -import { pushBranch } from "./git.js"; - -/** File patterns that Primer generates and should be included in PRs. */ -export const PRIMER_FILE_PATTERNS = [ - ".github/copilot-instructions.md", - ".vscode/mcp.json", - ".vscode/settings.json", - "AGENTS.md", - "primer.eval.json" -] as const; - -/** Check if a file path is a Primer-generated file. */ -export function isPrimerFile(filePath: string): boolean { - const normalized = filePath.replace(/\\/g, "/"); - return ( - PRIMER_FILE_PATTERNS.some((p) => normalized === p) || normalized.endsWith(".instructions.md") - ); -} - -export type RemoteInfo = { owner: string; repo: string }; - -/** - * Detect GitHub owner/repo from the origin remote of a local repository. - * Returns null if no GitHub remote is found. - */ -export async function detectGitHubRemote(repoPath: string): Promise { - const git = simpleGit(repoPath); - const remotes = await git.getRemotes(true); - const origin = remotes.find((r) => r.name === "origin"); - if (!origin?.refs.push) return null; - - const match = origin.refs.push.match(/github\.com[:/]([^/]+)\/([^/.]+)/); - if (!match) return null; - - return { owner: match[1]!, repo: match[2]! }; -} - -export type BranchInfo = { current: string; defaultBranch: string }; - -/** - * Get current branch and the default branch (from origin/HEAD). - */ -export async function getBranchInfo(repoPath: string): Promise { - const git = simpleGit(repoPath); - const current = (await git.branch()).current; - const defaultRef = await git - .raw(["symbolic-ref", "refs/remotes/origin/HEAD", "--short"]) - .catch(() => "origin/main"); - const defaultBranch = defaultRef.replace(/^origin\//, "").trim(); - return { current, defaultBranch }; -} - -/** - * Get Primer-generated files from the current git status. - * Returns the filtered file paths. - */ -export async function getPrimerFilesFromStatus(repoPath: string): Promise { - const git = simpleGit(repoPath); - const status = await git.status(); - return status.files.map((f) => f.path).filter(isPrimerFile); -} - -/** - * Commit specific files and push to origin. - */ -export async function commitAndPush( - repoPath: string, - files: string[], - message: string, - branch: string, - token?: string -): Promise { - const git = simpleGit(repoPath); - await git.add(files); - await git.commit(message); - await pushBranch(repoPath, branch, token); -} diff --git a/src/utils/pr.ts b/src/utils/pr.ts index 0716544..166e5c2 100644 --- a/src/utils/pr.ts +++ b/src/utils/pr.ts @@ -1,3 +1,20 @@ +/** File patterns that Primer generates and should be included in PRs. */ +export const PRIMER_FILE_PATTERNS = [ + ".github/copilot-instructions.md", + ".vscode/mcp.json", + ".vscode/settings.json", + "AGENTS.md", + "primer.eval.json" +] as const; + +/** Check if a file path is a Primer-generated file. */ +export function isPrimerFile(filePath: string): boolean { + const normalized = filePath.replace(/\\/g, "/"); + return ( + PRIMER_FILE_PATTERNS.some((p) => normalized === p) || normalized.endsWith(".instructions.md") + ); +} + export function buildInstructionsPrBody(): string { return [ "## 🤖 Copilot Instructions Added", diff --git a/vscode-extension/package-lock.json b/vscode-extension/package-lock.json index 06ad375..35e5a80 100644 --- a/vscode-extension/package-lock.json +++ b/vscode-extension/package-lock.json @@ -9,8 +9,7 @@ "version": "0.0.1", "license": "ISC", "dependencies": { - "@github/copilot-sdk": "^0.1.24", - "simple-git": "^3.31.1" + "@github/copilot-sdk": "^0.1.24" }, "devDependencies": { "@octokit/rest": "^22.0.1", @@ -592,21 +591,6 @@ "copilot-win32-x64": "copilot.exe" } }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "license": "MIT" - }, "node_modules/@octokit/auth-token": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", @@ -797,23 +781,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/esbuild": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", @@ -873,27 +840,6 @@ ], "license": "MIT" }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/simple-git": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.31.1.tgz", - "integrity": "sha512-oiWP4Q9+kO8q9hHqkX35uuHmxiEbZNTrZ5IPxgMGrJwN76pzjm/jabkZO0ItEcqxAincqGAzL3QHSaHt4+knBg==", - "license": "MIT", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", diff --git a/vscode-extension/package.json b/vscode-extension/package.json index 82dfe75..b1f3ed6 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -282,9 +282,11 @@ "typecheck": "tsc --noEmit", "package": "vsce package" }, + "extensionDependencies": [ + "vscode.git" + ], "dependencies": { - "@github/copilot-sdk": "^0.1.24", - "simple-git": "^3.31.1" + "@github/copilot-sdk": "^0.1.24" }, "devDependencies": { "@octokit/rest": "^22.0.1", diff --git a/vscode-extension/src/commands/pr.ts b/vscode-extension/src/commands/pr.ts index 38d26c1..8f68ca3 100644 --- a/vscode-extension/src/commands/pr.ts +++ b/vscode-extension/src/commands/pr.ts @@ -1,27 +1,44 @@ import * as vscode from "vscode"; -import { - createPullRequest, - detectGitHubRemote, - getBranchInfo, - getPrimerFilesFromStatus, - commitAndPush -} from "../services.js"; +import { createPullRequest, isPrimerFile } from "../services.js"; import { getGitHubToken } from "../auth.js"; import { getWorkspacePath } from "./analyze.js"; +import { getGitRepository } from "../gitUtils.js"; export async function prCommand(): Promise { const workspacePath = getWorkspacePath(); if (!workspacePath) return; - const remote = await detectGitHubRemote(workspacePath); - if (!remote) { - vscode.window.showErrorMessage("Primer: Could not detect a GitHub remote from origin."); + const repository = getGitRepository(workspacePath); + if (!repository) return; + + // Detect remote owner/repo + const origin = repository.state.remotes.find((r) => r.name === "origin"); + const originUrl = origin?.pushUrl ?? origin?.fetchUrl; + if (!originUrl) { + vscode.window.showErrorMessage("Primer: No origin remote found."); + return; + } + + const match = originUrl.match(/github\.com[:/]([^/]+)\/(.+?)(?:\.git)?$/); + if (!match) { + vscode.window.showErrorMessage("Primer: Could not parse GitHub owner/repo from origin remote."); + return; + } + const [, owner, repo] = match; + + const branch = repository.state.HEAD?.name; + if (!branch) { + vscode.window.showErrorMessage("Primer: Could not determine current branch (detached HEAD?)."); return; } - const { owner, repo } = remote; - const branchInfo = await getBranchInfo(workspacePath); - if (branchInfo.current === branchInfo.defaultBranch) { + // Detect default branch by checking remote refs for origin/main or origin/master + const refs = await repository.getRefs({ pattern: "refs/remotes/origin/*" }); + const hasMain = refs.some((r) => r.name === "origin/main"); + const hasMaster = refs.some((r) => r.name === "origin/master"); + const base = hasMain ? "main" : hasMaster ? "master" : "main"; + + if (branch === base) { vscode.window.showErrorMessage( "Primer: Cannot create PR from the default branch. Check out a feature branch first." ); @@ -40,32 +57,64 @@ export async function prCommand(): Promise { try { const token = await getGitHubToken(); - const primerFiles = await getPrimerFilesFromStatus(workspacePath); + // Check for Primer files in both unstaged and staged changes + const allChanges = [ + ...repository.state.workingTreeChanges, + ...repository.state.indexChanges + ]; + // Deduplicate by URI (a file can appear in both working tree and index) + const seen = new Set(); + const changes = allChanges.filter((c) => { + const key = c.uri.toString(); + if (seen.has(key)) return false; + seen.add(key); + return true; + }); + if (changes.length > 0) { + const primerChanges = changes.filter((c) => + isPrimerFile(vscode.workspace.asRelativePath(c.uri, false)) + ); + + if (primerChanges.length === 0) { + vscode.window.showWarningMessage("Primer: No Primer-generated files to commit."); + return; + } - if (primerFiles.length === 0) { - vscode.window.showWarningMessage( - "Primer: No Primer-generated files found. Run 'Primer: Initialize Repository' or 'Primer: Generate Configs' first." + // Warn if there are non-Primer files already staged that would be included in the commit + const stagedNonPrimer = repository.state.indexChanges.filter( + (c) => !isPrimerFile(vscode.workspace.asRelativePath(c.uri, false)) ); - return; + if (stagedNonPrimer.length > 0) { + const proceed = await vscode.window.showWarningMessage( + `Primer: ${stagedNonPrimer.length} non-Primer file(s) are already staged and will be included in the commit.`, + "Continue", + "Cancel" + ); + if (proceed !== "Continue") return; + } + + await repository.add(primerChanges.map((c) => c.uri)); + await repository.commit(title); } - const picked = await vscode.window.showQuickPick( - primerFiles.map((f) => ({ label: f, picked: true })), - { - canPickMany: true, - placeHolder: "Select files to commit & push", - title: "Primer: Confirm files" - } - ); - if (!picked || picked.length === 0) return; + // Push — ensures the branch exists on the remote even if changes were already committed + await repository.push("origin", branch, true); - await commitAndPush( - workspacePath, - picked.map((p) => p.label), - title, - branchInfo.current, - token - ); + // Guard against empty PRs when branch has no diff from base + const baseRefs = await repository.getRefs({ pattern: `refs/remotes/origin/${base}` }); + const headRefs = await repository.getRefs({ pattern: `refs/remotes/origin/${branch}` }); + if ( + baseRefs[0]?.commit && + headRefs[0]?.commit && + baseRefs[0].commit === headRefs[0].commit + ) { + const proceed = await vscode.window.showWarningMessage( + "Primer: No new changes detected. The PR may be empty.", + "Continue", + "Cancel" + ); + if (proceed !== "Continue") return; + } const prUrl = await createPullRequest({ token, @@ -73,8 +122,8 @@ export async function prCommand(): Promise { repo, title, body: "Generated by Primer VS Code extension.", - head: branchInfo.current, - base: branchInfo.defaultBranch + head: branch, + base }); const openAction = "Open in Browser"; diff --git a/vscode-extension/src/git.d.ts b/vscode-extension/src/git.d.ts new file mode 100644 index 0000000..3cb28d4 --- /dev/null +++ b/vscode-extension/src/git.d.ts @@ -0,0 +1,59 @@ +/** + * Vendored subset of VS Code's built-in git extension API types. + * Source: https://github.com/microsoft/vscode/blob/main/extensions/git/src/api/git.d.ts + * + * Only the interfaces used by the Primer extension are included. + */ + +import { Uri } from "vscode"; + +export interface GitExtension { + getAPI(version: 1): API; +} + +export interface API { + readonly repositories: Repository[]; +} + +export interface Repository { + readonly rootUri: Uri; + readonly state: RepositoryState; + add(resources: Uri[]): Promise; + commit(message: string, opts?: CommitOptions): Promise; + push(remoteName?: string, branchName?: string, setUpstream?: boolean): Promise; + getRefs(query: RefQuery): Promise; +} + +export interface RefQuery { + readonly pattern?: string; +} + +export interface RepositoryState { + readonly HEAD: Branch | undefined; + readonly remotes: Remote[]; + readonly workingTreeChanges: Change[]; + readonly indexChanges: Change[]; +} + +export interface Branch { + readonly name?: string; +} + +export interface Ref { + readonly name?: string; + readonly commit?: string; +} + +export interface Remote { + readonly name: string; + readonly fetchUrl?: string; + readonly pushUrl?: string; +} + +export interface Change { + readonly uri: Uri; +} + +export interface CommitOptions { + all?: boolean | "tracked"; +} diff --git a/vscode-extension/src/gitUtils.ts b/vscode-extension/src/gitUtils.ts new file mode 100644 index 0000000..1223274 --- /dev/null +++ b/vscode-extension/src/gitUtils.ts @@ -0,0 +1,28 @@ +import * as path from "node:path"; +import * as vscode from "vscode"; +import type { API, GitExtension, Repository } from "./git.js"; + +export function getGitRepository(workspacePath: string): Repository | undefined { + const gitExtension = vscode.extensions.getExtension("vscode.git"); + if (!gitExtension?.isActive) { + vscode.window.showErrorMessage("Primer: Git extension is not available."); + return undefined; + } + + const api: API = gitExtension.exports.getAPI(1); + const workspaceUri = vscode.Uri.file(workspacePath); + // Find the deepest repo whose root is a prefix of (or equal to) the workspace path + const repository = api.repositories + .filter((r) => { + const root = r.rootUri.fsPath; + return workspaceUri.fsPath === root || workspaceUri.fsPath.startsWith(root + path.sep); + }) + .sort((a, b) => b.rootUri.fsPath.length - a.rootUri.fsPath.length)[0]; + + if (!repository) { + vscode.window.showErrorMessage("Primer: No git repository found in the workspace."); + return undefined; + } + + return repository; +} diff --git a/vscode-extension/src/services.ts b/vscode-extension/src/services.ts index 1f89e9c..0e967e0 100644 --- a/vscode-extension/src/services.ts +++ b/vscode-extension/src/services.ts @@ -10,11 +10,6 @@ export { generateEvalScaffold } from "primer/services/evalScaffold.js"; export { runReadinessReport, groupPillars } from "primer/services/readiness.js"; export { generateVisualReport } from "primer/services/visualReport.js"; export { createPullRequest } from "primer/services/github.js"; -export { - detectGitHubRemote, - getBranchInfo, - getPrimerFilesFromStatus, - commitAndPush -} from "primer/services/localPr.js"; +export { isPrimerFile } from "primer/utils/pr.js"; export { safeWriteFile } from "primer/utils/fs.js"; export { DEFAULT_MODEL } from "primer/config.js"; From d4a090bc1dbd5f2057a8425ada438361c2d06f16 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Tue, 17 Feb 2026 09:05:59 -0800 Subject: [PATCH 68/84] Adds Azure DevOps PR support to the VS Code extension --- .github/copilot-instructions.md | 8 ++ src/services/azureDevops.ts | 35 ++++-- vscode-extension/src/auth.ts | 55 ++++++++++ vscode-extension/src/commands/pr.ts | 160 +++++++++++++++++----------- vscode-extension/src/services.ts | 4 + 5 files changed, 192 insertions(+), 70 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index df90129..7b077bc 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -2,6 +2,14 @@ **Primer** is a TypeScript CLI + VS Code extension for priming repositories for AI-assisted development. See `README.md` for full architecture, command reference, and service details. +## Development Checklist + +All changes MUST be verified against this checklist before considered complete: + +- [ ] Implementation covers both CLI and VS Code extension (if applicable) +- [ ] Ran lint/typecheck/test/build npm tasks. ALL PASSED +- [ ] Ran Review subagent. NO BLOCKERS reported + ## Build & Test ```sh diff --git a/src/services/azureDevops.ts b/src/services/azureDevops.ts index 65d3ab3..bf5c8e1 100644 --- a/src/services/azureDevops.ts +++ b/src/services/azureDevops.ts @@ -70,18 +70,28 @@ function validateAdoSlug(value: string, label: string): string { return encodeURIComponent(value); } -function getAuthHeader(token: string): string { +export type AdoAuthMode = "pat" | "bearer"; + +function getAuthHeader(token: string, authMode: AdoAuthMode = "pat"): string { + if (authMode === "bearer") { + return `Bearer ${token}`; + } const encoded = Buffer.from(`:${token}`).toString("base64"); return `Basic ${encoded}`; } -async function adoRequest(url: string, token: string, init?: RequestInit): Promise { +async function adoRequest( + url: string, + token: string, + init?: RequestInit & { authMode?: AdoAuthMode } +): Promise { + const { authMode, ...fetchInit } = init ?? {}; const response = await fetch(url, { - ...init, + ...fetchInit, headers: { "Content-Type": "application/json", - Authorization: getAuthHeader(token), - ...(init?.headers ?? {}) + Authorization: getAuthHeader(token, authMode), + ...(fetchInit.headers ?? {}) } }); @@ -158,13 +168,14 @@ export async function getRepo( token: string, organization: string, project: string, - repo: string + repo: string, + authMode: AdoAuthMode = "pat" ): Promise { const org = validateAdoSlug(organization, "organization"); const proj = validateAdoSlug(project, "project"); const r = validateAdoSlug(repo, "repo"); const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories/${r}?api-version=7.1-preview.1`; - const response = await adoRequest(url, token); + const response = await adoRequest(url, token, { authMode }); return { id: response.id, @@ -194,6 +205,7 @@ export async function createPullRequest(params: { body: string; sourceBranch: string; targetBranch: string; + authMode?: AdoAuthMode; }): Promise { const org = validateAdoSlug(params.organization, "organization"); const proj = validateAdoSlug(params.project, "project"); @@ -207,7 +219,8 @@ export async function createPullRequest(params: { const response = await adoRequest<{ pullRequestId: number }>(url, params.token, { method: "POST", - body: JSON.stringify(payload) + body: JSON.stringify(payload), + authMode: params.authMode }); return `https://dev.azure.com/${org}/${proj}/_git/${encodeURIComponent( @@ -219,14 +232,15 @@ export async function checkRepoHasInstructions( token: string, organization: string, project: string, - repoId: string + repoId: string, + authMode: AdoAuthMode = "pat" ): Promise { const org = validateAdoSlug(organization, "organization"); const proj = validateAdoSlug(project, "project"); const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories/${encodeURIComponent(repoId)}/items?path=/.github/copilot-instructions.md&includeContentMetadata=true&api-version=7.1-preview.1`; const response = await fetch(url, { headers: { - Authorization: getAuthHeader(token) + Authorization: getAuthHeader(token, authMode) } }); @@ -241,6 +255,7 @@ export async function checkRepoHasInstructions( return true; } +/** CLI-only batch helper — always uses PAT auth (no authMode param needed). */ export async function checkReposForInstructions( token: string, repos: AzureDevOpsRepo[], diff --git a/vscode-extension/src/auth.ts b/vscode-extension/src/auth.ts index a7bd7d1..3e9a447 100644 --- a/vscode-extension/src/auth.ts +++ b/vscode-extension/src/auth.ts @@ -10,3 +10,58 @@ export async function getGitHubToken(): Promise { }); return session.accessToken; } + +/** Azure DevOps well-known resource ID */ +const AZURE_DEVOPS_RESOURCE = "499b84ac-1321-427f-aa17-267ca6975798"; + +/** + * Acquires an Azure DevOps token via VS Code's built-in Microsoft authentication provider. + * Returns a Bearer token (not a PAT). + */ +export async function getAzureDevOpsToken(): Promise { + const session = await vscode.authentication.getSession( + "microsoft", + [`${AZURE_DEVOPS_RESOURCE}/.default`], + { createIfNone: true } + ); + return session.accessToken; +} + +// ── Platform detection ── + +export type GitHubRemote = { owner: string; repo: string }; +export type AzureRemote = { organization: string; project: string; repo: string }; + +// Note: matches github.com only — GitHub Enterprise Server remotes are not supported. +const GITHUB_REMOTE_RE = /github\.com[:/]([^/]+)\/(.+?)(?:\.git)?\/?$/; +const AZURE_HTTPS_RE = /dev\.azure\.com(?::\d+)?\/([^/]+)\/([^/]+)\/_git\/(.+?)(?:\.git)?\/?$/; +const AZURE_SSH_RE = /ssh\.dev\.azure\.com:v3\/([^/]+)\/([^/]+)\/(.+?)(?:\.git)?\/?$/; +const AZURE_LEGACY_RE = /([^./]+)\.visualstudio\.com(?::\d+)?\/([^/]+)\/_git\/(.+?)(?:\.git)?\/?$/; + +export function parseGitHubRemote(url: string): GitHubRemote | null { + const match = url.match(GITHUB_REMOTE_RE); + if (!match) return null; + return { owner: match[1], repo: match[2] }; +} + +export function parseAzureRemote(url: string): AzureRemote | null { + for (const re of [AZURE_HTTPS_RE, AZURE_SSH_RE, AZURE_LEGACY_RE]) { + const match = url.match(re); + if (match) { + return { organization: match[1], project: match[2], repo: match[3] }; + } + } + return null; +} + +export type PlatformInfo = + | { platform: "github"; remote: GitHubRemote } + | { platform: "azure"; remote: AzureRemote }; + +export function detectPlatform(url: string): PlatformInfo | null { + const gh = parseGitHubRemote(url); + if (gh) return { platform: "github", remote: gh }; + const az = parseAzureRemote(url); + if (az) return { platform: "azure", remote: az }; + return null; +} diff --git a/vscode-extension/src/commands/pr.ts b/vscode-extension/src/commands/pr.ts index 8f68ca3..5c87b23 100644 --- a/vscode-extension/src/commands/pr.ts +++ b/vscode-extension/src/commands/pr.ts @@ -1,6 +1,11 @@ import * as vscode from "vscode"; -import { createPullRequest, isPrimerFile } from "../services.js"; -import { getGitHubToken } from "../auth.js"; +import { + createPullRequest, + createAzurePullRequest, + getAzureDevOpsRepo, + isPrimerFile +} from "../services.js"; +import { getGitHubToken, getAzureDevOpsToken, detectPlatform, type PlatformInfo } from "../auth.js"; import { getWorkspacePath } from "./analyze.js"; import { getGitRepository } from "../gitUtils.js"; @@ -19,12 +24,13 @@ export async function prCommand(): Promise { return; } - const match = originUrl.match(/github\.com[:/]([^/]+)\/(.+?)(?:\.git)?$/); - if (!match) { - vscode.window.showErrorMessage("Primer: Could not parse GitHub owner/repo from origin remote."); + const detected = detectPlatform(originUrl); + if (!detected) { + vscode.window.showErrorMessage( + "Primer: Unsupported remote. GitHub and Azure DevOps are supported." + ); return; } - const [, owner, repo] = match; const branch = repository.state.HEAD?.name; if (!branch) { @@ -47,7 +53,7 @@ export async function prCommand(): Promise { const title = await vscode.window.showInputBox({ prompt: "Pull request title", - value: `Add Primer AI configs for ${repo}` + value: `Add Primer AI configs for ${detected.remote.repo}` }); if (!title) return; @@ -55,50 +61,9 @@ export async function prCommand(): Promise { { location: vscode.ProgressLocation.Notification, title: "Primer: Creating pull request…" }, async () => { try { - const token = await getGitHubToken(); - - // Check for Primer files in both unstaged and staged changes - const allChanges = [ - ...repository.state.workingTreeChanges, - ...repository.state.indexChanges - ]; - // Deduplicate by URI (a file can appear in both working tree and index) - const seen = new Set(); - const changes = allChanges.filter((c) => { - const key = c.uri.toString(); - if (seen.has(key)) return false; - seen.add(key); - return true; - }); - if (changes.length > 0) { - const primerChanges = changes.filter((c) => - isPrimerFile(vscode.workspace.asRelativePath(c.uri, false)) - ); - - if (primerChanges.length === 0) { - vscode.window.showWarningMessage("Primer: No Primer-generated files to commit."); - return; - } - - // Warn if there are non-Primer files already staged that would be included in the commit - const stagedNonPrimer = repository.state.indexChanges.filter( - (c) => !isPrimerFile(vscode.workspace.asRelativePath(c.uri, false)) - ); - if (stagedNonPrimer.length > 0) { - const proceed = await vscode.window.showWarningMessage( - `Primer: ${stagedNonPrimer.length} non-Primer file(s) are already staged and will be included in the commit.`, - "Continue", - "Cancel" - ); - if (proceed !== "Continue") return; - } - - await repository.add(primerChanges.map((c) => c.uri)); - await repository.commit(title); - } - - // Push — ensures the branch exists on the remote even if changes were already committed - await repository.push("origin", branch, true); + // Stage, commit, and push Primer files (shared logic for both platforms) + const aborted = await stageAndPush(repository, branch, title); + if (aborted) return; // Guard against empty PRs when branch has no diff from base const baseRefs = await repository.getRefs({ pattern: `refs/remotes/origin/${base}` }); @@ -116,15 +81,7 @@ export async function prCommand(): Promise { if (proceed !== "Continue") return; } - const prUrl = await createPullRequest({ - token, - owner, - repo, - title, - body: "Generated by Primer VS Code extension.", - head: branch, - base - }); + const prUrl = await createPR(detected, branch, base, title); const openAction = "Open in Browser"; const action = await vscode.window.showInformationMessage( @@ -142,3 +99,86 @@ export async function prCommand(): Promise { } ); } + +// ── Helpers ── + +/** Stage Primer files, commit, and push. Returns true if the user aborted. */ +async function stageAndPush( + repository: NonNullable>, + branch: string, + title: string +): Promise { + const allChanges = [...repository.state.workingTreeChanges, ...repository.state.indexChanges]; + const seen = new Set(); + const changes = allChanges.filter((c) => { + const key = c.uri.toString(); + if (seen.has(key)) return false; + seen.add(key); + return true; + }); + if (changes.length > 0) { + const primerChanges = changes.filter((c) => + isPrimerFile(vscode.workspace.asRelativePath(c.uri, false)) + ); + + if (primerChanges.length === 0) { + vscode.window.showWarningMessage("Primer: No Primer-generated files to commit."); + return true; + } + + const stagedNonPrimer = repository.state.indexChanges.filter( + (c) => !isPrimerFile(vscode.workspace.asRelativePath(c.uri, false)) + ); + if (stagedNonPrimer.length > 0) { + const proceed = await vscode.window.showWarningMessage( + `Primer: ${stagedNonPrimer.length} non-Primer file(s) are already staged and will be included in the commit.`, + "Continue", + "Cancel" + ); + if (proceed !== "Continue") return true; + } + + await repository.add(primerChanges.map((c) => c.uri)); + await repository.commit(title); + } + + await repository.push("origin", branch, true); + return false; +} + +async function createPR( + info: PlatformInfo, + branch: string, + base: string, + title: string +): Promise { + if (info.platform === "azure") { + const { organization, project, repo } = info.remote; + const token = await getAzureDevOpsToken(); + const repoInfo = await getAzureDevOpsRepo(token, organization, project, repo, "bearer"); + return createAzurePullRequest({ + token, + organization, + project, + repoId: repoInfo.id, + repoName: repoInfo.name, + title, + body: "Generated by Primer VS Code extension.", + sourceBranch: branch, + targetBranch: base, + authMode: "bearer" + }); + } + + const { owner, repo } = info.remote; + const token = await getGitHubToken(); + return createPullRequest({ + token, + owner, + repo, + title, + body: "Generated by Primer VS Code extension.", + head: branch, + base + }); +} diff --git a/vscode-extension/src/services.ts b/vscode-extension/src/services.ts index 0e967e0..3ab518f 100644 --- a/vscode-extension/src/services.ts +++ b/vscode-extension/src/services.ts @@ -10,6 +10,10 @@ export { generateEvalScaffold } from "primer/services/evalScaffold.js"; export { runReadinessReport, groupPillars } from "primer/services/readiness.js"; export { generateVisualReport } from "primer/services/visualReport.js"; export { createPullRequest } from "primer/services/github.js"; +export { + createPullRequest as createAzurePullRequest, + getRepo as getAzureDevOpsRepo +} from "primer/services/azureDevops.js"; export { isPrimerFile } from "primer/utils/pr.js"; export { safeWriteFile } from "primer/utils/fs.js"; export { DEFAULT_MODEL } from "primer/config.js"; From 63c0021db3f7f01d7acb384bc06a0b999ec3a660 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Tue, 17 Feb 2026 09:06:54 -0800 Subject: [PATCH 69/84] docs: update PR support details --- vscode-extension/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vscode-extension/README.md b/vscode-extension/README.md index cd77c2d..502d0c8 100644 --- a/vscode-extension/README.md +++ b/vscode-extension/README.md @@ -57,7 +57,7 @@ One command to analyze, generate instructions, and create configs: ### Create Pull Request -Commit Primer-generated files and open a PR directly from VS Code: +Commit Primer-generated files and open a PR directly from VS Code. Supports both **GitHub** and **Azure DevOps** repositories — the platform is detected automatically from your git remote. `Primer: Create Pull Request` @@ -84,7 +84,8 @@ Both views show welcome screens with action buttons when no data is loaded yet. - **VS Code 1.100.0+** - **GitHub Copilot Chat extension** (provides the Copilot CLI) - **Copilot authentication** — run `copilot` → `/login` in your terminal -- **GitHub CLI** _(optional)_ — for PR creation: `brew install gh && gh auth login` +- **GitHub account** — for GitHub PR creation (authenticated via VS Code) +- **Microsoft account** _(optional)_ — for Azure DevOps PR creation (authenticated via VS Code) ## Links From b6dd1b7ee5b80e51a95ce8b5a6069890bb21be4f Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Tue, 17 Feb 2026 22:31:09 -0800 Subject: [PATCH 70/84] Enhance readiness report output options --- .github/workflows/release-please.yml | 2 +- README.md | 21 +- examples/policies/README.md | 26 ++ examples/policies/ai-only.json | 25 ++ examples/policies/repo-health-only.json | 15 ++ examples/policies/strict.json | 13 + src/cli.ts | 4 +- src/commands/analyze.ts | 98 ++++++- src/commands/readiness.ts | 175 +++++++++++-- src/services/__tests__/analyze-output.test.ts | 183 +++++++++++++ src/services/__tests__/fs.test.ts | 147 +++++++++++ .../__tests__/readiness-markdown.test.ts | 189 ++++++++++++++ .../__tests__/readiness-output.test.ts | 241 ++++++++++++++++++ src/utils/fs.ts | 223 +++++++++++++++- 14 files changed, 1331 insertions(+), 31 deletions(-) create mode 100644 examples/policies/README.md create mode 100644 examples/policies/ai-only.json create mode 100644 examples/policies/repo-health-only.json create mode 100644 examples/policies/strict.json create mode 100644 src/services/__tests__/analyze-output.test.ts create mode 100644 src/services/__tests__/readiness-markdown.test.ts create mode 100644 src/services/__tests__/readiness-output.test.ts diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 13753bd..2b4eaed 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Release id: release - uses: google-github-actions/release-please-action@v4 + uses: googleapis/release-please-action@v4 with: config-file: release-please-config.json manifest-file: release-please-manifest.json diff --git a/README.md b/README.md index 39aaeb6..cee6b3c 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,18 @@ primer init ## Commands +### `primer analyze` — Inspect Repository Structure + +Detects languages, frameworks, monorepo/workspace structure, and area mappings: + +```bash +primer analyze # terminal summary +primer analyze --json # machine-readable analysis +primer analyze --output analysis.json # save JSON report +primer analyze --output analysis.md # save Markdown report +primer analyze --output analysis.json --force # overwrite existing report +``` + ### `primer readiness` — Assess AI Readiness Score a repo across 9 pillars grouped into **Repo Health** and **AI Setup**: @@ -54,7 +66,10 @@ Score a repo across 9 pillars grouped into **Repo Health** and **AI Setup**: primer readiness # terminal summary primer readiness --visual # GitHub-themed HTML report primer readiness --per-area # include per-area breakdown -primer readiness --policy ./strict.json # apply a custom policy +primer readiness --output readiness.json # save JSON report +primer readiness --output readiness.md # save Markdown report +primer readiness --output readiness.html # save HTML report +primer readiness --policy ./examples/policies/strict.json # apply a custom policy primer readiness --json # machine-readable JSON primer readiness --fail-level 3 # CI gate: exit 1 if below level 3 ``` @@ -133,8 +148,8 @@ All commands support `--json` (structured JSON to stdout) and `--quiet` (suppres Policies customize scoring criteria, override metadata, and tune thresholds: ```bash -primer readiness --policy ./strict.json -primer readiness --policy ./base.json,./strict.json # chain multiple +primer readiness --policy ./examples/policies/strict.json +primer readiness --policy ./examples/policies/strict.json,./my-overrides.json # chain multiple ``` ```json diff --git a/examples/policies/README.md b/examples/policies/README.md new file mode 100644 index 0000000..8f654c2 --- /dev/null +++ b/examples/policies/README.md @@ -0,0 +1,26 @@ +# Example Policies + +Readiness policies customize which criteria are evaluated and how they're scored. + +## Usage + +Pass a policy file with `--policy` using a relative `./` path: + +```sh +primer readiness --policy ./examples/policies/ai-only.json +primer readiness --policy ./examples/policies/strict.json +``` + +Multiple policies can be chained (comma-separated): + +```sh +primer readiness --policy ./examples/policies/ai-only.json,./my-overrides.json +``` + +## Included Policies + +| File | Purpose | +| ----------------------- | ------------------------------------------------------------------------------------ | +| `ai-only.json` | Disables all repo-health criteria, focusing only on AI tooling readiness | +| `repo-health-only.json` | Disables all AI-tooling criteria and the `agents-doc` extra, focusing on repo health | +| `strict.json` | Sets 100% pass-rate threshold and elevates several criteria to high impact | diff --git a/examples/policies/ai-only.json b/examples/policies/ai-only.json new file mode 100644 index 0000000..71292bb --- /dev/null +++ b/examples/policies/ai-only.json @@ -0,0 +1,25 @@ +{ + "name": "ai-only", + "criteria": { + "disable": [ + "lint-config", + "typecheck-config", + "build-script", + "ci-config", + "test-script", + "readme", + "contributing", + "lockfile", + "env-example", + "format-config", + "codeowners", + "license", + "security-policy", + "dependabot", + "observability", + "area-readme", + "area-build-script", + "area-test-script" + ] + } +} diff --git a/examples/policies/repo-health-only.json b/examples/policies/repo-health-only.json new file mode 100644 index 0000000..ab02f12 --- /dev/null +++ b/examples/policies/repo-health-only.json @@ -0,0 +1,15 @@ +{ + "name": "repo-health-only", + "criteria": { + "disable": [ + "custom-instructions", + "mcp-config", + "custom-agents", + "copilot-skills", + "area-instructions" + ] + }, + "extras": { + "disable": ["agents-doc"] + } +} diff --git a/examples/policies/strict.json b/examples/policies/strict.json new file mode 100644 index 0000000..323968e --- /dev/null +++ b/examples/policies/strict.json @@ -0,0 +1,13 @@ +{ + "name": "strict", + "thresholds": { + "passRate": 1.0 + }, + "criteria": { + "override": { + "env-example": { "impact": "high" }, + "format-config": { "impact": "high" }, + "contributing": { "impact": "high" } + } + } +} diff --git a/src/cli.ts b/src/cli.ts index 4072b80..d5e8ce6 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -55,6 +55,8 @@ export function runCli(argv: string[]): void { .command("analyze") .description("Detect languages, frameworks, monorepo structure, and areas") .argument("[path]", "Path to a local repository") + .option("--output ", "Write report to file (.json or .md)") + .option("--force", "Overwrite existing output file") .action(withGlobalOpts(analyzeCommand)); program @@ -120,7 +122,7 @@ export function runCli(argv: string[]): void { .command("readiness") .description("AI readiness assessment across 9 maturity pillars") .argument("[path]", "Path to a local repository") - .option("--output ", "Write report to file (.json or .html)") + .option("--output ", "Write report to file (.json, .md, or .html)") .option("--force", "Overwrite existing output file") .option("--visual", "Generate visual HTML report") .option("--per-area", "Show per-area readiness breakdown") diff --git a/src/commands/analyze.ts b/src/commands/analyze.ts index c90e901..2ef1578 100644 --- a/src/commands/analyze.ts +++ b/src/commands/analyze.ts @@ -1,13 +1,19 @@ import path from "path"; +import chalk from "chalk"; + +import type { RepoAnalysis } from "../services/analyzer"; import { analyzeRepo } from "../services/analyzer"; +import { safeWriteFile } from "../utils/fs"; +import { prettyPrintSummary } from "../utils/logger"; import type { CommandResult } from "../utils/output"; import { outputResult, outputError, shouldLog } from "../utils/output"; -import { prettyPrintSummary } from "../utils/logger"; type AnalyzeOptions = { json?: boolean; quiet?: boolean; + output?: string; + force?: boolean; }; export async function analyzeCommand( @@ -19,6 +25,41 @@ export async function analyzeCommand( try { const analysis = await analyzeRepo(repoPath); + // Write to file when --output is specified + if (options.output) { + const outputPath = path.resolve(options.output); + const ext = path.extname(outputPath).toLowerCase(); + if (ext !== ".json" && ext !== ".md") { + outputError( + `Unsupported output format: ${ext || "(no extension)"}. Use .json or .md`, + Boolean(options.json) + ); + return; + } + const content = + ext === ".md" ? formatAnalysisMarkdown(analysis) : JSON.stringify(analysis, null, 2); + + const { wrote, reason } = await safeWriteFile(outputPath, content, Boolean(options.force)); + if (!wrote) { + const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; + outputError(`Skipped ${outputPath}: ${why}`, Boolean(options.json)); + return; + } + if (options.json) { + const result: CommandResult = { + ok: true, + status: "success", + data: analysis + }; + outputResult(result, true); + return; + } + if (shouldLog(options)) { + process.stderr.write(chalk.green(`✓ Report saved: ${outputPath}`) + "\n"); + } + return; + } + if (options.json) { const result: CommandResult = { ok: true, @@ -33,3 +74,58 @@ export async function analyzeCommand( outputError(error instanceof Error ? error.message : String(error), Boolean(options.json)); } } + +export function formatAnalysisMarkdown(analysis: RepoAnalysis): string { + const lines: string[] = []; + const repoName = path.basename(analysis.path); + + lines.push(`# Repository Analysis: ${repoName}`); + lines.push(""); + lines.push("## Overview"); + lines.push(""); + lines.push(`| Property | Value |`); + lines.push(`| --- | --- |`); + lines.push(`| Path | \`${analysis.path}\` |`); + lines.push(`| Git repository | ${analysis.isGitRepo ? "Yes" : "No"} |`); + lines.push(`| Languages | ${analysis.languages.join(", ") || "Unknown"} |`); + lines.push(`| Frameworks | ${analysis.frameworks.join(", ") || "None detected"} |`); + lines.push(`| Package manager | ${analysis.packageManager ?? "Unknown"} |`); + if (analysis.isMonorepo) { + lines.push( + `| Monorepo | ${analysis.workspaceType ?? "yes"} (${analysis.apps?.length ?? 0} apps) |` + ); + } + + if (analysis.apps && analysis.apps.length > 0) { + lines.push(""); + lines.push("## Applications"); + lines.push(""); + lines.push("| Name | Ecosystem | TypeScript | Path |"); + lines.push("| --- | --- | --- | --- |"); + for (const app of analysis.apps) { + const rel = path.relative(analysis.path, app.path).replace(/\\/gu, "/") || "."; + lines.push( + `| ${app.name} | ${app.ecosystem ?? "—"} | ${app.hasTsConfig ? "Yes" : "No"} | \`${rel}\` |` + ); + } + } + + if (analysis.areas && analysis.areas.length > 0) { + lines.push(""); + lines.push("## Areas"); + lines.push(""); + lines.push("| Name | Source | Pattern |"); + lines.push("| --- | --- | --- |"); + for (const area of analysis.areas) { + const pattern = Array.isArray(area.applyTo) ? area.applyTo.join(", ") : area.applyTo; + lines.push(`| ${area.name} | ${area.source} | \`${pattern}\` |`); + } + } + + lines.push(""); + lines.push(`---`); + lines.push(`*Generated by [Primer](https://github.com/digitarald/primer)*`); + lines.push(""); + + return lines.join("\n"); +} diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts index cae2f2f..7c72080 100644 --- a/src/commands/readiness.ts +++ b/src/commands/readiness.ts @@ -6,7 +6,8 @@ import { parsePolicySources } from "../services/policy"; import type { ReadinessReport, ReadinessCriterionResult, - AreaReadinessReport + AreaReadinessReport, + ReadinessPillarSummary } from "../services/readiness"; import { runReadinessReport, groupPillars } from "../services/readiness"; import { generateVisualReport } from "../services/visualReport"; @@ -31,6 +32,9 @@ export async function readinessCommand( ): Promise { const repoPath = path.resolve(repoPathArg ?? process.cwd()); const repoName = path.basename(repoPath); + const resolvedOutputPath = options.output ? path.resolve(options.output) : ""; + const outputExt = options.output ? path.extname(options.output).toLowerCase() : ""; + let failLevelError: string | undefined; let report: ReadinessReport; try { @@ -52,17 +56,49 @@ export async function readinessCommand( process.stderr.write(`Warning: --fail-level clamped to ${clamped} (valid range: 1–5)\n`); } if ((report.achievedLevel ?? 0) < clamped) { + failLevelError = `Readiness level ${report.achievedLevel ?? 0} is below threshold ${clamped}`; if (shouldLog(options)) { - process.stderr.write( - `Error: Readiness level ${report.achievedLevel ?? 0} is below threshold ${clamped}\n` - ); + process.stderr.write(`Error: ${failLevelError}\n`); } process.exitCode = 1; } } + const jsonResult: CommandResult = failLevelError + ? { + ok: false, + status: "error", + data: report, + errors: [failLevelError] + } + : { + ok: true, + status: "success", + data: report + }; + const emitJsonResult = (): void => outputResult(jsonResult, true); + + // Validate output extension early, before any output branch + if (options.output) { + if (outputExt !== ".json" && outputExt !== ".md" && outputExt !== ".html") { + outputError( + `Unsupported output format: ${outputExt || "(no extension)"}. Use .json, .md, or .html`, + Boolean(options.json) + ); + return; + } + } + + if (options.visual && outputExt && outputExt !== ".html") { + outputError( + `Cannot use --visual with ${outputExt} output. Use a .html output path or omit --output.`, + Boolean(options.json) + ); + return; + } + // Generate visual HTML report - if (options.visual || (options.output && options.output.endsWith(".html"))) { + if (options.visual || outputExt === ".html") { const html = generateVisualReport({ reports: [{ repo: repoName, report }], title: `AI Readiness Report: ${repoName}`, @@ -70,7 +106,7 @@ export async function readinessCommand( }); const outputPath = options.output - ? path.resolve(options.output) + ? resolvedOutputPath : path.join(repoPath, "readiness-report.html"); const { wrote, reason } = await safeWriteFile(outputPath, html, Boolean(options.force)); @@ -82,35 +118,53 @@ export async function readinessCommand( if (shouldLog(options)) { process.stderr.write(chalk.green(`✓ Visual report generated: ${outputPath}`) + "\n"); } + if (options.json) { + emitJsonResult(); + } + return; + } + + // Output to Markdown file + if (outputExt === ".md") { + const md = formatReadinessMarkdown(report, repoName); + const { wrote, reason } = await safeWriteFile(resolvedOutputPath, md, Boolean(options.force)); + if (!wrote) { + const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; + outputError(`Skipped ${resolvedOutputPath}: ${why}`, Boolean(options.json)); + return; + } + if (shouldLog(options)) { + process.stderr.write(chalk.green(`✓ Markdown report saved: ${resolvedOutputPath}`) + "\n"); + } + if (options.json) { + emitJsonResult(); + } return; } // Output to JSON file - if (options.output && options.output.endsWith(".json")) { - const outputPath = path.resolve(options.output); + if (outputExt === ".json") { const { wrote, reason } = await safeWriteFile( - outputPath, + resolvedOutputPath, JSON.stringify(report, null, 2), Boolean(options.force) ); if (!wrote) { const why = reason === "symlink" ? "path is a symlink" : "file exists (use --force)"; - outputError(`Skipped ${outputPath}: ${why}`, Boolean(options.json)); + outputError(`Skipped ${resolvedOutputPath}: ${why}`, Boolean(options.json)); return; } if (shouldLog(options)) { - process.stderr.write(chalk.green(`✓ JSON report saved: ${outputPath}`) + "\n"); + process.stderr.write(chalk.green(`✓ JSON report saved: ${resolvedOutputPath}`) + "\n"); + } + if (options.json) { + emitJsonResult(); } return; } if (options.json) { - const result: CommandResult = { - ok: true, - status: "success", - data: report - }; - outputResult(result, true); + emitJsonResult(); return; } @@ -238,3 +292,90 @@ function printAreaBreakdown(areaReports: AreaReadinessReport[]): void { } } } + +export function formatReadinessMarkdown(report: ReadinessReport, repoName: string): string { + const lines: string[] = []; + + lines.push(`# AI Readiness Report: ${repoName}`); + lines.push(""); + lines.push(`**Level ${report.achievedLevel}** — ${levelName(report.achievedLevel)}`); + lines.push(""); + + // Pillar summary table + const groups = groupPillars(report.pillars); + for (const { label, pillars } of groups) { + if (pillars.length === 0) continue; + lines.push(`## ${label}`); + lines.push(""); + lines.push("| Pillar | Passed | Total | Rate |"); + lines.push("| --- | ---: | ---: | ---: |"); + for (const pillar of pillars) { + const icon = pillar.passRate >= 0.8 ? "✅" : "⚠️"; + lines.push( + `| ${icon} ${pillar.name} | ${pillar.passed} | ${pillar.total} | ${formatPercent(pillar.passRate)} |` + ); + } + lines.push(""); + } + + // Fix-first list + const fixes = rankFixes(report.criteria); + if (fixes.length > 0) { + lines.push("## Fix First"); + lines.push(""); + for (const fix of fixes) { + const detail = fix.appSummary + ? ` (${fix.appSummary.passed}/${fix.appSummary.total} apps)` + : ""; + lines.push(`- **${fix.title}**${detail} — ${fix.impact} impact, ${fix.effort} effort`); + if (fix.reason) { + lines.push(` - ${fix.reason}`); + } + } + lines.push(""); + } + + // Extras + if (report.extras.length > 0) { + lines.push("## AI Readiness Extras"); + lines.push(""); + for (const extra of report.extras) { + const icon = extra.status === "pass" ? "✅" : "❌"; + lines.push(`- ${icon} ${extra.title}`); + } + lines.push(""); + } + + // Area breakdown + if (report.areaReports?.length) { + lines.push("## Per-Area Breakdown"); + lines.push(""); + for (const ar of report.areaReports) { + const passed = ar.pillars.reduce( + (sum: number, p: ReadinessPillarSummary) => sum + p.passed, + 0 + ); + const total = ar.pillars.reduce((sum: number, p: ReadinessPillarSummary) => sum + p.total, 0); + const pct = total ? Math.round((passed / total) * 100) : 0; + lines.push(`### ${ar.area.name} — ${passed}/${total} (${pct}%)`); + lines.push(""); + const failures = ar.criteria.filter((c) => c.status === "fail"); + if (failures.length > 0) { + for (const f of failures) { + lines.push(`- ❌ ${f.title}${f.reason ? ` — ${f.reason}` : ""}`); + } + } else { + lines.push("All criteria passing."); + } + lines.push(""); + } + } + + lines.push("---"); + lines.push( + `*Generated by [Primer](https://github.com/digitarald/primer) on ${report.generatedAt}*` + ); + lines.push(""); + + return lines.join("\n"); +} diff --git a/src/services/__tests__/analyze-output.test.ts b/src/services/__tests__/analyze-output.test.ts new file mode 100644 index 0000000..d0a8374 --- /dev/null +++ b/src/services/__tests__/analyze-output.test.ts @@ -0,0 +1,183 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; + +import { afterEach, describe, expect, it, vi } from "vitest"; + +import { analyzeCommand, formatAnalysisMarkdown } from "../../commands/analyze"; +import type { RepoAnalysis } from "../analyzer"; + +describe("formatAnalysisMarkdown", () => { + function makeAnalysis(overrides: Partial = {}): RepoAnalysis { + return { + path: "/tmp/test-repo", + isGitRepo: true, + languages: ["TypeScript", "JavaScript"], + frameworks: ["React", "Next.js"], + packageManager: "npm", + ...overrides + }; + } + + it("renders a heading with repo name", () => { + const md = formatAnalysisMarkdown(makeAnalysis()); + expect(md).toContain("# Repository Analysis: test-repo"); + }); + + it("includes overview table", () => { + const md = formatAnalysisMarkdown(makeAnalysis()); + expect(md).toContain("| Languages | TypeScript, JavaScript |"); + expect(md).toContain("| Frameworks | React, Next.js |"); + expect(md).toContain("| Package manager | npm |"); + }); + + it("shows monorepo info when present", () => { + const md = formatAnalysisMarkdown( + makeAnalysis({ + isMonorepo: true, + workspaceType: "pnpm", + apps: [ + { + name: "app-a", + path: "/tmp/test-repo/apps/a", + ecosystem: "node", + packageJsonPath: "", + scripts: {}, + hasTsConfig: true + } + ] + }) + ); + expect(md).toContain("| Monorepo | pnpm (1 apps) |"); + expect(md).toContain("## Applications"); + expect(md).toContain("| app-a |"); + }); + + it("shows areas when present", () => { + const md = formatAnalysisMarkdown( + makeAnalysis({ + areas: [ + { name: "frontend", applyTo: "frontend/**", source: "auto" }, + { name: "backend", applyTo: "backend/**", source: "config" } + ] + }) + ); + expect(md).toContain("## Areas"); + expect(md).toContain("| frontend | auto |"); + expect(md).toContain("| backend | config |"); + }); + + it("handles empty languages gracefully", () => { + const md = formatAnalysisMarkdown(makeAnalysis({ languages: [], frameworks: [] })); + expect(md).toContain("| Languages | Unknown |"); + expect(md).toContain("| Frameworks | None detected |"); + }); + + it("includes primer footer", () => { + const md = formatAnalysisMarkdown(makeAnalysis()); + expect(md).toContain("Primer"); + }); +}); + +describe("analyzeCommand --output", () => { + let tmpDir: string; + + async function setup() { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "analyze-output-")); + // Create a minimal directory so analyzeRepo can run against it + await fs.mkdir(path.join(tmpDir, "repo")); + return path.join(tmpDir, "repo"); + } + + afterEach(async () => { + vi.restoreAllMocks(); + process.exitCode = undefined; + if (tmpDir) { + await fs.rm(tmpDir, { recursive: true, force: true }); + } + }); + + it("writes JSON file when output ends in .json", async () => { + const repoPath = await setup(); + const out = path.join(tmpDir, "report.json"); + await analyzeCommand(repoPath, { output: out }); + const content = await fs.readFile(out, "utf-8"); + const parsed = JSON.parse(content); + expect(parsed).toHaveProperty("path"); + expect(parsed).toHaveProperty("languages"); + }); + + it("writes Markdown file when output ends in .md", async () => { + const repoPath = await setup(); + const out = path.join(tmpDir, "report.md"); + await analyzeCommand(repoPath, { output: out }); + const content = await fs.readFile(out, "utf-8"); + expect(content).toContain("# Repository Analysis:"); + }); + + it("refuses to overwrite without --force", async () => { + const repoPath = await setup(); + const out = path.join(tmpDir, "report.json"); + await fs.writeFile(out, "existing"); + const spy = vi.spyOn(process.stderr, "write").mockImplementation(() => true); + await analyzeCommand(repoPath, { output: out }); + spy.mockRestore(); + // File should still have original content + const content = await fs.readFile(out, "utf-8"); + expect(content).toBe("existing"); + }); + + it("overwrites with --force", async () => { + const repoPath = await setup(); + const out = path.join(tmpDir, "report.json"); + await fs.writeFile(out, "existing"); + await analyzeCommand(repoPath, { output: out, force: true }); + const content = await fs.readFile(out, "utf-8"); + expect(content).not.toBe("existing"); + expect(JSON.parse(content)).toHaveProperty("path"); + }); + + it("rejects unsupported extensions", async () => { + const repoPath = await setup(); + const out = path.join(tmpDir, "report.txt"); + const spy = vi.spyOn(process.stderr, "write").mockImplementation(() => true); + await analyzeCommand(repoPath, { output: out }); + spy.mockRestore(); + expect(process.exitCode).toBe(1); + await expect(fs.access(out)).rejects.toThrow(); + }); + + it("rejects symlinks", async () => { + const repoPath = await setup(); + const real = path.join(tmpDir, "real.json"); + await fs.writeFile(real, "x"); + const link = path.join(tmpDir, "link.json"); + await fs.symlink(real, link); + const spy = vi.spyOn(process.stderr, "write").mockImplementation(() => true); + await analyzeCommand(repoPath, { output: link }); + spy.mockRestore(); + // Real file content unchanged + const content = await fs.readFile(real, "utf-8"); + expect(content).toBe("x"); + }); + + it("emits JSON to stdout when --json is used with --output", async () => { + const repoPath = await setup(); + const out = path.join(tmpDir, "report.json"); + const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation(() => true); + + await analyzeCommand(repoPath, { output: out, json: true, quiet: true }); + + const stdout = stdoutSpy.mock.calls + .map(([chunk]) => String(chunk)) + .join("") + .trim(); + const parsed = JSON.parse(stdout) as { ok: boolean; status: string; data: unknown }; + expect(parsed.ok).toBe(true); + expect(parsed.status).toBe("success"); + expect(parsed.data).toBeDefined(); + + const fileContent = await fs.readFile(out, "utf-8"); + expect(JSON.parse(fileContent)).toHaveProperty("path"); + }); +}); diff --git a/src/services/__tests__/fs.test.ts b/src/services/__tests__/fs.test.ts index 071f3a4..4610fa6 100644 --- a/src/services/__tests__/fs.test.ts +++ b/src/services/__tests__/fs.test.ts @@ -101,4 +101,151 @@ describe("safeWriteFile", () => { expect(result.wrote).toBe(false); expect(result.reason).toBe("symlink"); }); + + it("rejects writes through symlinked parent directory", async () => { + const outsideDir = path.join(tmpDir, "outside"); + const symlinkParent = path.join(tmpDir, "linked"); + await fs.mkdir(outsideDir); + await fs.symlink(outsideDir, symlinkParent); + + const targetPath = path.join(symlinkParent, "blocked.txt"); + const result = await safeWriteFile(targetPath, "content", true); + + expect(result.wrote).toBe(false); + expect(result.reason).toBe("symlink"); + await expect(fs.access(path.join(outsideDir, "blocked.txt"))).rejects.toThrow(); + }); + + it("rejects writes through symlinked ancestor with nested missing directories", async () => { + const outsideDir = path.join(tmpDir, "outside"); + const symlinkParent = path.join(tmpDir, "linked"); + await fs.mkdir(outsideDir); + await fs.symlink(outsideDir, symlinkParent); + + const targetPath = path.join(symlinkParent, "nested", "deeper", "blocked.txt"); + const result = await safeWriteFile(targetPath, "content", true); + + expect(result.wrote).toBe(false); + expect(result.reason).toBe("symlink"); + await expect(fs.access(path.join(outsideDir, "nested"))).rejects.toThrow(); + }); + + it("rejects writes when closest existing ancestor is under a symlinked prefix", async () => { + const outsideDir = path.join(tmpDir, "outside"); + const existingDir = path.join(outsideDir, "existing"); + const symlinkParent = path.join(tmpDir, "linked"); + await fs.mkdir(existingDir, { recursive: true }); + await fs.symlink(outsideDir, symlinkParent); + + const targetPath = path.join(symlinkParent, "existing", "blocked.txt"); + const result = await safeWriteFile(targetPath, "content", true); + + expect(result.wrote).toBe(false); + expect(result.reason).toBe("symlink"); + await expect(fs.access(path.join(existingDir, "blocked.txt"))).rejects.toThrow(); + }); + + it("rejects symlink targets in win32 force mode", async () => { + const realFile = path.join(tmpDir, "real.txt"); + const symlink = path.join(tmpDir, "symlink.txt"); + await fs.writeFile(realFile, "original"); + await fs.symlink(realFile, symlink); + + const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); + if (!originalPlatformDescriptor) { + throw new Error("Unable to read process.platform descriptor"); + } + + Object.defineProperty(process, "platform", { + configurable: true, + value: "win32" + }); + + try { + const result = await safeWriteFile(symlink, "malicious content", true); + expect(result.wrote).toBe(false); + expect(result.reason).toBe("symlink"); + const content = await fs.readFile(realFile, "utf8"); + expect(content).toBe("original"); + } finally { + Object.defineProperty(process, "platform", originalPlatformDescriptor); + } + }); + + it("overwrites existing regular files in win32 force mode", async () => { + const canonicalTmpDir = await fs.realpath(tmpDir); + const targetPath = path.join(canonicalTmpDir, "target.txt"); + await fs.writeFile(targetPath, "original"); + + const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); + if (!originalPlatformDescriptor) { + throw new Error("Unable to read process.platform descriptor"); + } + + Object.defineProperty(process, "platform", { + configurable: true, + value: "win32" + }); + + try { + const result = await safeWriteFile(targetPath, "updated", true); + expect(result.wrote).toBe(true); + const content = await fs.readFile(targetPath, "utf8"); + expect(content).toBe("updated"); + } finally { + Object.defineProperty(process, "platform", originalPlatformDescriptor); + } + }); + + it("returns exists for existing regular files in win32 non-force mode", async () => { + const canonicalTmpDir = await fs.realpath(tmpDir); + const targetPath = path.join(canonicalTmpDir, "target.txt"); + await fs.writeFile(targetPath, "original"); + + const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); + if (!originalPlatformDescriptor) { + throw new Error("Unable to read process.platform descriptor"); + } + + Object.defineProperty(process, "platform", { + configurable: true, + value: "win32" + }); + + try { + const result = await safeWriteFile(targetPath, "updated", false); + expect(result.wrote).toBe(false); + expect(result.reason).toBe("exists"); + const content = await fs.readFile(targetPath, "utf8"); + expect(content).toBe("original"); + } finally { + Object.defineProperty(process, "platform", originalPlatformDescriptor); + } + }); + + it("does not replace directory targets in win32 force mode", async () => { + const canonicalTmpDir = await fs.realpath(tmpDir); + const targetPath = path.join(canonicalTmpDir, "target-dir"); + await fs.mkdir(targetPath); + + const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); + if (!originalPlatformDescriptor) { + throw new Error("Unable to read process.platform descriptor"); + } + + Object.defineProperty(process, "platform", { + configurable: true, + value: "win32" + }); + + try { + const result = await safeWriteFile(targetPath, "updated", true); + expect(result.wrote).toBe(false); + expect(result.reason).toBe("exists"); + const stat = await fs.stat(targetPath); + expect(stat.isDirectory()).toBe(true); + } finally { + Object.defineProperty(process, "platform", originalPlatformDescriptor); + } + }); }); diff --git a/src/services/__tests__/readiness-markdown.test.ts b/src/services/__tests__/readiness-markdown.test.ts new file mode 100644 index 0000000..459a7c1 --- /dev/null +++ b/src/services/__tests__/readiness-markdown.test.ts @@ -0,0 +1,189 @@ +import { describe, expect, it } from "vitest"; + +import { formatReadinessMarkdown } from "../../commands/readiness"; +import type { ReadinessReport } from "../readiness"; + +describe("formatReadinessMarkdown", () => { + function makeReport(overrides: Partial = {}): ReadinessReport { + return { + repoPath: "/tmp/test-repo", + generatedAt: "2026-01-01T00:00:00.000Z", + isMonorepo: false, + apps: [], + pillars: [ + { id: "style-validation", name: "Style & Validation", passed: 2, total: 2, passRate: 1 }, + { id: "build-system", name: "Build System", passed: 1, total: 2, passRate: 0.5 }, + { id: "testing", name: "Testing", passed: 0, total: 1, passRate: 0 }, + { id: "documentation", name: "Documentation", passed: 1, total: 2, passRate: 0.5 }, + { id: "dev-environment", name: "Dev Environment", passed: 1, total: 2, passRate: 0.5 }, + { id: "code-quality", name: "Code Quality", passed: 1, total: 1, passRate: 1 }, + { id: "observability", name: "Observability", passed: 0, total: 1, passRate: 0 }, + { + id: "security-governance", + name: "Security & Governance", + passed: 2, + total: 4, + passRate: 0.5 + }, + { id: "ai-tooling", name: "AI Tooling", passed: 1, total: 4, passRate: 0.25 } + ], + levels: [ + { level: 1, name: "Functional", passed: 5, total: 6, passRate: 0.83, achieved: true }, + { level: 2, name: "Documented", passed: 3, total: 6, passRate: 0.5, achieved: false }, + { level: 3, name: "Standardized", passed: 1, total: 4, passRate: 0.25, achieved: false }, + { level: 4, name: "Optimized", passed: 0, total: 0, passRate: 0, achieved: false }, + { level: 5, name: "Autonomous", passed: 0, total: 0, passRate: 0, achieved: false } + ], + achievedLevel: 1, + criteria: [ + { + id: "lint-config", + title: "Linting configured", + pillar: "style-validation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + status: "pass" + }, + { + id: "readme", + title: "README present", + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + status: "fail", + reason: "Missing README documentation." + }, + { + id: "custom-instructions", + title: "Custom AI instructions", + pillar: "ai-tooling", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + status: "fail", + reason: "Missing custom AI instructions." + } + ], + extras: [ + { id: "agents-doc", title: "AGENTS.md present", status: "pass" }, + { id: "architecture-doc", title: "Architecture guide present", status: "fail" } + ], + ...overrides + }; + } + + it("renders heading with repo name and level", () => { + const md = formatReadinessMarkdown(makeReport(), "my-repo"); + expect(md).toContain("# AI Readiness Report: my-repo"); + expect(md).toContain("**Level 1** — Functional"); + }); + + it("includes pillar group sections", () => { + const md = formatReadinessMarkdown(makeReport(), "my-repo"); + expect(md).toContain("## Repo Health"); + expect(md).toContain("## AI Setup"); + }); + + it("renders pillar summary table", () => { + const md = formatReadinessMarkdown(makeReport(), "my-repo"); + expect(md).toContain("| Pillar | Passed | Total | Rate |"); + expect(md).toContain("Style & Validation"); + expect(md).toContain("AI Tooling"); + }); + + it("uses check emoji for passing pillars", () => { + const md = formatReadinessMarkdown(makeReport(), "my-repo"); + // Style & Validation has 100% pass rate + expect(md).toMatch(/✅.*Style & Validation/); + }); + + it("uses warning emoji for low-pass pillars", () => { + const md = formatReadinessMarkdown(makeReport(), "my-repo"); + // Build System has 50% pass rate + expect(md).toMatch(/⚠️.*Build System/); + }); + + it("includes fix-first section for failing criteria", () => { + const md = formatReadinessMarkdown(makeReport(), "my-repo"); + expect(md).toContain("## Fix First"); + expect(md).toContain("README present"); + expect(md).toContain("Custom AI instructions"); + }); + + it("includes extras section", () => { + const md = formatReadinessMarkdown(makeReport(), "my-repo"); + expect(md).toContain("## AI Readiness Extras"); + expect(md).toContain("✅ AGENTS.md present"); + expect(md).toContain("❌ Architecture guide present"); + }); + + it("includes area breakdown when present", () => { + const md = formatReadinessMarkdown( + makeReport({ + areaReports: [ + { + area: { name: "frontend", applyTo: "frontend/**", source: "auto" }, + criteria: [ + { + id: "area-readme", + title: "Area README present", + pillar: "documentation", + level: 1, + scope: "area", + impact: "medium", + effort: "low", + status: "fail", + reason: "Missing README in area directory." + } + ], + pillars: [ + { + id: "documentation", + name: "Documentation", + passed: 0, + total: 1, + passRate: 0 + } + ] + } + ] + }), + "my-repo" + ); + expect(md).toContain("## Per-Area Breakdown"); + expect(md).toContain("### frontend"); + expect(md).toContain("❌ Area README present"); + }); + + it("includes primer footer with timestamp", () => { + const md = formatReadinessMarkdown(makeReport(), "my-repo"); + expect(md).toContain("Primer"); + expect(md).toContain("2026-01-01"); + }); + + it("handles report with no failing criteria", () => { + const md = formatReadinessMarkdown( + makeReport({ + criteria: [ + { + id: "lint-config", + title: "Linting configured", + pillar: "style-validation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + status: "pass" + } + ] + }), + "my-repo" + ); + expect(md).not.toContain("## Fix First"); + }); +}); diff --git a/src/services/__tests__/readiness-output.test.ts b/src/services/__tests__/readiness-output.test.ts new file mode 100644 index 0000000..1b8e532 --- /dev/null +++ b/src/services/__tests__/readiness-output.test.ts @@ -0,0 +1,241 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; + +import { afterEach, describe, expect, it, vi } from "vitest"; + +import { readinessCommand } from "../../commands/readiness"; + +describe("readinessCommand --output", () => { + let tmpDir: string | undefined; + + async function setupRepo(): Promise { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "readiness-output-")); + const repoPath = path.join(tmpDir, "repo"); + await fs.mkdir(repoPath); + return repoPath; + } + + afterEach(async () => { + vi.restoreAllMocks(); + process.exitCode = undefined; + if (tmpDir) { + await fs.rm(tmpDir, { recursive: true, force: true }); + tmpDir = undefined; + } + }); + + it("writes JSON file when output ends in .json", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.json"); + + await readinessCommand(repoPath, { output: outputPath, quiet: true }); + + const content = await fs.readFile(outputPath, "utf-8"); + const parsed = JSON.parse(content); + expect(parsed.repoPath).toBe(repoPath); + expect(parsed).toHaveProperty("achievedLevel"); + }); + + it("writes Markdown file for uppercase extension", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.MD"); + + await readinessCommand(repoPath, { output: outputPath, quiet: true }); + + const content = await fs.readFile(outputPath, "utf-8"); + expect(content).toContain("# AI Readiness Report:"); + expect(content).toContain("## Repo Health"); + }); + + it("writes HTML file for uppercase extension", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.HTML"); + + await readinessCommand(repoPath, { output: outputPath, quiet: true }); + + const content = await fs.readFile(outputPath, "utf-8"); + expect(content).toContain(""); + }); + + it("writes default visual HTML file when --visual is used without --output", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(repoPath, "readiness-report.html"); + + await readinessCommand(repoPath, { visual: true, quiet: true }); + + const content = await fs.readFile(outputPath, "utf-8"); + expect(content).toContain(""); + }); + + it("rejects unsupported extensions before visual rendering", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.txt"); + const fallbackPath = path.join(repoPath, "readiness-report.html"); + + await readinessCommand(repoPath, { output: outputPath, visual: true, quiet: true }); + + expect(process.exitCode).toBe(1); + await expect(fs.access(outputPath)).rejects.toThrow(); + await expect(fs.access(fallbackPath)).rejects.toThrow(); + }); + + it("rejects --visual with non-HTML output extension", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.json"); + const fallbackPath = path.join(repoPath, "readiness-report.html"); + + await readinessCommand(repoPath, { output: outputPath, visual: true, quiet: true }); + + expect(process.exitCode).toBe(1); + await expect(fs.access(outputPath)).rejects.toThrow(); + await expect(fs.access(fallbackPath)).rejects.toThrow(); + }); + + it("refuses to overwrite without --force", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.json"); + await fs.writeFile(outputPath, "existing"); + + await readinessCommand(repoPath, { output: outputPath, quiet: true }); + + const content = await fs.readFile(outputPath, "utf-8"); + expect(content).toBe("existing"); + }); + + it("overwrites with --force", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.json"); + await fs.writeFile(outputPath, "existing"); + + await readinessCommand(repoPath, { output: outputPath, force: true, quiet: true }); + + const content = await fs.readFile(outputPath, "utf-8"); + expect(content).not.toBe("existing"); + expect(JSON.parse(content).repoPath).toBe(repoPath); + }); + + it("rejects symlink paths", async () => { + const repoPath = await setupRepo(); + const realPath = path.join(tmpDir ?? repoPath, "real.json"); + const linkPath = path.join(tmpDir ?? repoPath, "readiness.json"); + await fs.writeFile(realPath, "existing"); + await fs.symlink(realPath, linkPath); + + await readinessCommand(repoPath, { output: linkPath, quiet: true }); + + const content = await fs.readFile(realPath, "utf-8"); + expect(content).toBe("existing"); + }); + + it("sets exit code when fail-level threshold is not met", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.json"); + + await readinessCommand(repoPath, { output: outputPath, failLevel: "5", quiet: true }); + + expect(process.exitCode).toBe(1); + const content = await fs.readFile(outputPath, "utf-8"); + expect(JSON.parse(content).repoPath).toBe(repoPath); + }); + + it("creates parent directories for nested output paths", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "reports", "nested", "readiness.json"); + + await readinessCommand(repoPath, { output: outputPath, quiet: true }); + + const content = await fs.readFile(outputPath, "utf-8"); + expect(JSON.parse(content).repoPath).toBe(repoPath); + }); + + it("emits JSON to stdout when --json is used with --output", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.json"); + const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation(() => true); + + await readinessCommand(repoPath, { output: outputPath, json: true, quiet: true }); + + const stdout = stdoutSpy.mock.calls + .map(([chunk]) => String(chunk)) + .join("") + .trim(); + const parsed = JSON.parse(stdout) as { ok: boolean; status: string; data: unknown }; + expect(parsed.ok).toBe(true); + expect(parsed.status).toBe("success"); + expect(parsed.data).toBeDefined(); + + const fileContent = await fs.readFile(outputPath, "utf-8"); + expect(JSON.parse(fileContent).repoPath).toBe(repoPath); + }); + + it("emits JSON to stdout when --json is used with markdown output", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.md"); + const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation(() => true); + + await readinessCommand(repoPath, { output: outputPath, json: true, quiet: true }); + + const stdout = stdoutSpy.mock.calls + .map(([chunk]) => String(chunk)) + .join("") + .trim(); + const parsed = JSON.parse(stdout) as { ok: boolean; status: string; data: unknown }; + expect(parsed.ok).toBe(true); + expect(parsed.status).toBe("success"); + expect(parsed.data).toBeDefined(); + + const fileContent = await fs.readFile(outputPath, "utf-8"); + expect(fileContent).toContain("# AI Readiness Report:"); + }); + + it("emits JSON to stdout when --json is used with html output", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.html"); + const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation(() => true); + + await readinessCommand(repoPath, { output: outputPath, json: true, quiet: true }); + + const stdout = stdoutSpy.mock.calls + .map(([chunk]) => String(chunk)) + .join("") + .trim(); + const parsed = JSON.parse(stdout) as { ok: boolean; status: string; data: unknown }; + expect(parsed.ok).toBe(true); + expect(parsed.status).toBe("success"); + expect(parsed.data).toBeDefined(); + + const fileContent = await fs.readFile(outputPath, "utf-8"); + expect(fileContent).toContain(""); + }); + + it("emits error JSON status when fail-level threshold is not met", async () => { + const repoPath = await setupRepo(); + const outputPath = path.join(tmpDir ?? repoPath, "readiness.json"); + const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation(() => true); + + await readinessCommand(repoPath, { + output: outputPath, + json: true, + quiet: true, + failLevel: "5" + }); + + const stdout = stdoutSpy.mock.calls + .map(([chunk]) => String(chunk)) + .join("") + .trim(); + const parsed = JSON.parse(stdout) as { + ok: boolean; + status: string; + errors?: string[]; + }; + expect(parsed.ok).toBe(false); + expect(parsed.status).toBe("error"); + expect(parsed.errors?.[0]).toContain("below threshold"); + expect(process.exitCode).toBe(1); + + const fileContent = await fs.readFile(outputPath, "utf-8"); + expect(JSON.parse(fileContent).repoPath).toBe(repoPath); + }); +}); diff --git a/src/utils/fs.ts b/src/utils/fs.ts index 726a2ef..81f72bd 100644 --- a/src/utils/fs.ts +++ b/src/utils/fs.ts @@ -1,3 +1,4 @@ +import { constants as fsConstants } from "fs"; import fs from "fs/promises"; import path from "path"; @@ -13,22 +14,228 @@ export async function safeWriteFile( force: boolean ): Promise { const resolved = path.resolve(filePath); + const noFollowFlag = process.platform === "win32" ? 0 : fsConstants.O_NOFOLLOW; + + if (await hasSymlinkAncestor(resolved)) { + return { wrote: false, reason: "symlink" }; + } + + await fs.mkdir(path.dirname(resolved), { recursive: true }); + if (await hasSymlinkAncestor(resolved)) { + return { wrote: false, reason: "symlink" }; + } + + if (process.platform === "win32") { + try { + const stat = await fs.lstat(resolved); + if (stat.isSymbolicLink()) { + return { wrote: false, reason: "symlink" }; + } + if (!force) { + return { wrote: false, reason: "exists" }; + } + } catch (error) { + const code = (error as NodeJS.ErrnoException).code; + if (code !== "ENOENT") { + throw error; + } + } + } + + if (process.platform === "win32" && force) { + return replaceFileWindows(resolved, content); + } + + const flags = force + ? fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_TRUNC | noFollowFlag + : fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | noFollowFlag; - // Reject symlinks to prevent writing through them to unintended locations try { - const stat = await fs.lstat(resolved); - if (stat.isSymbolicLink()) { + const handle = await fs.open(resolved, flags, 0o666); + try { + await handle.writeFile(content, "utf8"); + } finally { + await handle.close(); + } + return { wrote: true }; + } catch (error) { + const code = (error as NodeJS.ErrnoException).code; + if (code === "EEXIST") { + try { + const stat = await fs.lstat(resolved); + if (stat.isSymbolicLink()) { + return { wrote: false, reason: "symlink" }; + } + } catch { + // Ignore stat errors and fall through to generic exists handling + } + return { wrote: false, reason: "exists" }; + } + if (code === "ELOOP") { return { wrote: false, reason: "symlink" }; } - if (!force) { + throw error; + } +} + +async function replaceFileWindows(targetPath: string, content: string): Promise { + const parentDir = path.dirname(targetPath); + const tempPath = path.join( + parentDir, + `.primer-tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}` + ); + const backupPath = path.join( + parentDir, + `.primer-backup-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}` + ); + + const tempHandle = await fs.open( + tempPath, + fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL, + 0o666 + ); + try { + await tempHandle.writeFile(content, "utf8"); + } finally { + await tempHandle.close(); + } + + let movedOriginal = false; + let placedReplacement = false; + let restoredOriginal = false; + try { + try { + const stat = await fs.lstat(targetPath); + if (stat.isSymbolicLink()) { + await fs.rm(tempPath, { force: true }); + return { wrote: false, reason: "symlink" }; + } + if (stat.isDirectory()) { + await fs.rm(tempPath, { force: true }); + return { wrote: false, reason: "exists" }; + } + await fs.rename(targetPath, backupPath); + movedOriginal = true; + } catch (error) { + const code = (error as NodeJS.ErrnoException).code; + if (code !== "ENOENT") { + throw error; + } + } + + await fs.rename(tempPath, targetPath); + placedReplacement = true; + return { wrote: true }; + } catch (error) { + await fs.rm(tempPath, { force: true }); + + if (movedOriginal) { + try { + await fs.rename(backupPath, targetPath); + restoredOriginal = true; + } catch { + // Best effort restore + } + } + + const code = (error as NodeJS.ErrnoException).code; + if (code === "EEXIST") { + try { + const stat = await fs.lstat(targetPath); + if (stat.isSymbolicLink()) { + return { wrote: false, reason: "symlink" }; + } + } catch { + // Ignore lstat errors and fall through + } return { wrote: false, reason: "exists" }; } - } catch { - // File does not exist — safe to create + + throw error; + } finally { + if (movedOriginal && (placedReplacement || restoredOriginal)) { + await fs.rm(backupPath, { force: true }); + } + } +} + +async function hasSymlinkAncestor(filePath: string): Promise { + const parentDir = path.dirname(filePath); + const closestExistingAncestor = await findClosestExistingAncestor(parentDir); + const closestAncestorStat = await fs.lstat(closestExistingAncestor); + if (closestAncestorStat.isSymbolicLink()) { + return true; + } + + const realClosestAncestor = await fs.realpath(closestExistingAncestor); + if ( + realClosestAncestor !== closestExistingAncestor && + !isAllowedSystemAlias(closestExistingAncestor, realClosestAncestor) + ) { + return true; + } + + const relativeParent = path.relative(closestExistingAncestor, parentDir); + const segments = relativeParent.split(path.sep).filter(Boolean); + let currentPath = closestExistingAncestor; + + for (const segment of segments) { + currentPath = path.join(currentPath, segment); + try { + const stat = await fs.lstat(currentPath); + if (stat.isSymbolicLink()) { + return true; + } + } catch (error) { + const code = (error as NodeJS.ErrnoException).code; + if (code === "ENOENT") { + break; + } + throw error; + } } - await fs.writeFile(resolved, content, "utf8"); - return { wrote: true }; + return false; +} + +async function findClosestExistingAncestor(targetDir: string): Promise { + let currentDir = targetDir; + + while (true) { + try { + await fs.lstat(currentDir); + return currentDir; + } catch (error) { + const code = (error as NodeJS.ErrnoException).code; + if (code !== "ENOENT") { + throw error; + } + + const nextDir = path.dirname(currentDir); + if (nextDir === currentDir) { + return currentDir; + } + currentDir = nextDir; + } + } +} + +function isAllowedSystemAlias(originalPath: string, realPath: string): boolean { + if (process.platform !== "darwin") { + return false; + } + + const allowsVarAlias = + (originalPath === "/var" || originalPath.startsWith("/var/")) && + (realPath === "/private/var" || realPath.startsWith("/private/var/")) && + originalPath.slice("/var".length) === realPath.slice("/private/var".length); + + const allowsTmpAlias = + (originalPath === "/tmp" || originalPath.startsWith("/tmp/")) && + (realPath === "/private/tmp" || realPath.startsWith("/private/tmp/")) && + originalPath.slice("/tmp".length) === realPath.slice("/private/tmp".length); + + return allowsVarAlias || allowsTmpAlias; } /** From e90dabe48bdf2bb5d8eaf48c7b4855de8e22de19 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Wed, 18 Feb 2026 10:37:37 -0800 Subject: [PATCH 71/84] Add win32 file restore error handling --- src/services/__tests__/fs.test.ts | 122 +++++++++++++++++++++++++++++- src/utils/fs.ts | 9 ++- 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/src/services/__tests__/fs.test.ts b/src/services/__tests__/fs.test.ts index 4610fa6..7ef5481 100644 --- a/src/services/__tests__/fs.test.ts +++ b/src/services/__tests__/fs.test.ts @@ -1,8 +1,9 @@ import fs from "fs/promises"; import os from "os"; import path from "path"; +import type { PathLike } from "fs"; -import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { ensureDir, safeWriteFile } from "../../utils/fs"; @@ -223,6 +224,30 @@ describe("safeWriteFile", () => { } }); + it("creates missing files in win32 force mode", async () => { + const canonicalTmpDir = await fs.realpath(tmpDir); + const targetPath = path.join(canonicalTmpDir, "missing.txt"); + + const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); + if (!originalPlatformDescriptor) { + throw new Error("Unable to read process.platform descriptor"); + } + + Object.defineProperty(process, "platform", { + configurable: true, + value: "win32" + }); + + try { + const result = await safeWriteFile(targetPath, "created", true); + expect(result.wrote).toBe(true); + const content = await fs.readFile(targetPath, "utf8"); + expect(content).toBe("created"); + } finally { + Object.defineProperty(process, "platform", originalPlatformDescriptor); + } + }); + it("does not replace directory targets in win32 force mode", async () => { const canonicalTmpDir = await fs.realpath(tmpDir); const targetPath = path.join(canonicalTmpDir, "target-dir"); @@ -248,4 +273,99 @@ describe("safeWriteFile", () => { Object.defineProperty(process, "platform", originalPlatformDescriptor); } }); + + it("throws when win32 force replace cannot restore original file", async () => { + const canonicalTmpDir = await fs.realpath(tmpDir); + const targetPath = path.join(canonicalTmpDir, "target.txt"); + await fs.writeFile(targetPath, "original"); + + const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); + if (!originalPlatformDescriptor) { + throw new Error("Unable to read process.platform descriptor"); + } + + Object.defineProperty(process, "platform", { + configurable: true, + value: "win32" + }); + + const originalRename = fs.rename.bind(fs); + const renameSpy = vi.spyOn(fs, "rename"); + let renameCallCount = 0; + renameSpy.mockImplementation(async (oldPath: PathLike, newPath: PathLike) => { + renameCallCount += 1; + if (renameCallCount === 2 || renameCallCount === 3) { + const error = new Error("EEXIST") as NodeJS.ErrnoException; + error.code = "EEXIST"; + throw error; + } + return originalRename(oldPath, newPath); + }); + + try { + let thrownError: unknown; + try { + await safeWriteFile(targetPath, "updated", true); + } catch (error) { + thrownError = error; + } + + expect(thrownError).toBeInstanceOf(Error); + const message = (thrownError as Error).message; + expect(message).toContain("Failed to restore original file"); + const backupPath = message.split("backup retained at ")[1]; + expect(backupPath).toBeTruthy(); + + const backupContent = await fs.readFile(backupPath, "utf8"); + expect(backupContent).toBe("original"); + } finally { + renameSpy.mockRestore(); + Object.defineProperty(process, "platform", originalPlatformDescriptor); + } + }); + + it("restores original file when win32 force replace fails but rollback succeeds", async () => { + const canonicalTmpDir = await fs.realpath(tmpDir); + const targetPath = path.join(canonicalTmpDir, "target.txt"); + await fs.writeFile(targetPath, "original"); + + const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); + if (!originalPlatformDescriptor) { + throw new Error("Unable to read process.platform descriptor"); + } + + Object.defineProperty(process, "platform", { + configurable: true, + value: "win32" + }); + + const originalRename = fs.rename.bind(fs); + const renameSpy = vi.spyOn(fs, "rename"); + let renameCallCount = 0; + renameSpy.mockImplementation(async (oldPath: PathLike, newPath: PathLike) => { + renameCallCount += 1; + if (renameCallCount === 2) { + const error = new Error("EEXIST") as NodeJS.ErrnoException; + error.code = "EEXIST"; + throw error; + } + return originalRename(oldPath, newPath); + }); + + try { + const result = await safeWriteFile(targetPath, "updated", true); + expect(result.wrote).toBe(false); + expect(result.reason).toBe("exists"); + + const content = await fs.readFile(targetPath, "utf8"); + expect(content).toBe("original"); + + const files = await fs.readdir(canonicalTmpDir); + expect(files.some((file) => file.startsWith(".primer-backup-"))).toBe(false); + expect(files.some((file) => file.startsWith(".primer-tmp-"))).toBe(false); + } finally { + renameSpy.mockRestore(); + Object.defineProperty(process, "platform", originalPlatformDescriptor); + } + }); }); diff --git a/src/utils/fs.ts b/src/utils/fs.ts index 81f72bd..bbb2fd7 100644 --- a/src/utils/fs.ts +++ b/src/utils/fs.ts @@ -103,6 +103,7 @@ async function replaceFileWindows(targetPath: string, content: string): Promise< let movedOriginal = false; let placedReplacement = false; let restoredOriginal = false; + let restoreFailed = false; try { try { const stat = await fs.lstat(targetPath); @@ -134,10 +135,16 @@ async function replaceFileWindows(targetPath: string, content: string): Promise< await fs.rename(backupPath, targetPath); restoredOriginal = true; } catch { - // Best effort restore + restoreFailed = true; } } + if (restoreFailed) { + throw new Error( + `Failed to restore original file after replacement failure; backup retained at ${backupPath}` + ); + } + const code = (error as NodeJS.ErrnoException).code; if (code === "EEXIST") { try { From b4435cd3d0873b14783306e1790ae8fddebe6814 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Wed, 18 Feb 2026 17:46:57 -0800 Subject: [PATCH 72/84] Fix Windows CI: 8.3 path false positive in symlink check + lint import ordering - isAllowedSystemAlias() now returns true on win32 since lstat already confirmed no symlinks; realpath differences are just 8.3/case normalization - Fix import ordering in 7 files to satisfy import-x/order lint rule --- src/commands/batchReadiness.tsx | 2 +- src/commands/tui.tsx | 2 +- src/services/__tests__/boundaries.test.ts | 2 +- src/services/__tests__/cli.test.ts | 2 +- src/services/__tests__/fs.test.ts | 2 +- src/services/__tests__/policy.test.ts | 2 +- src/services/batch.ts | 11 ++++++----- src/utils/fs.ts | 7 +++++++ 8 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/commands/batchReadiness.tsx b/src/commands/batchReadiness.tsx index eaddd06..697849a 100644 --- a/src/commands/batchReadiness.tsx +++ b/src/commands/batchReadiness.tsx @@ -3,8 +3,8 @@ import React from "react"; import { getGitHubToken } from "../services/github"; import { parsePolicySources } from "../services/policy"; -import { outputError } from "../utils/output"; import { BatchReadinessTui } from "../ui/BatchReadinessTui"; +import { outputError } from "../utils/output"; type BatchReadinessOptions = { output?: string; diff --git a/src/commands/tui.tsx b/src/commands/tui.tsx index df451cd..e1f56a0 100644 --- a/src/commands/tui.tsx +++ b/src/commands/tui.tsx @@ -3,8 +3,8 @@ import path from "path"; import { render } from "ink"; import React from "react"; -import { outputError } from "../utils/output"; import { PrimerTui } from "../ui/tui"; +import { outputError } from "../utils/output"; type TuiOptions = { repo?: string; diff --git a/src/services/__tests__/boundaries.test.ts b/src/services/__tests__/boundaries.test.ts index 5233c69..999ae9c 100644 --- a/src/services/__tests__/boundaries.test.ts +++ b/src/services/__tests__/boundaries.test.ts @@ -4,10 +4,10 @@ import path from "path"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { sanitizeError } from "../batch"; import { safeWriteFile } from "../../utils/fs"; import { deriveFileStatus, shouldLog } from "../../utils/output"; import { GITHUB_REPO_RE, AZURE_REPO_RE } from "../../utils/repo"; +import { sanitizeError } from "../batch"; // ── sanitizeError ── diff --git a/src/services/__tests__/cli.test.ts b/src/services/__tests__/cli.test.ts index 2bc48e2..ddc4f42 100644 --- a/src/services/__tests__/cli.test.ts +++ b/src/services/__tests__/cli.test.ts @@ -1,4 +1,4 @@ -import { Command } from "commander"; +import type { Command } from "commander"; import { describe, expect, it, vi } from "vitest"; import { withGlobalOpts } from "../../cli"; diff --git a/src/services/__tests__/fs.test.ts b/src/services/__tests__/fs.test.ts index 7ef5481..e77c25f 100644 --- a/src/services/__tests__/fs.test.ts +++ b/src/services/__tests__/fs.test.ts @@ -1,7 +1,7 @@ +import type { PathLike } from "fs"; import fs from "fs/promises"; import os from "os"; import path from "path"; -import type { PathLike } from "fs"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; diff --git a/src/services/__tests__/policy.test.ts b/src/services/__tests__/policy.test.ts index 41dca70..aabc05f 100644 --- a/src/services/__tests__/policy.test.ts +++ b/src/services/__tests__/policy.test.ts @@ -4,9 +4,9 @@ import path from "path"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import type { ReadinessCriterion } from "../readiness"; import type { ExtraDefinition, PolicyConfig } from "../policy"; import { loadPolicy, resolveChain, parsePolicySources } from "../policy"; +import type { ReadinessCriterion } from "../readiness"; // ─── Helpers ─── diff --git a/src/services/batch.ts b/src/services/batch.ts index 5b51180..dc118e2 100644 --- a/src/services/batch.ts +++ b/src/services/batch.ts @@ -1,10 +1,12 @@ import path from "path"; import { DEFAULT_MODEL } from "../config"; +import { ensureDir, safeWriteFile, validateCachePath } from "../utils/fs"; +import type { ProgressReporter } from "../utils/output"; +import { buildInstructionsPrBody } from "../utils/pr"; + import type { AzureDevOpsRepo } from "./azureDevops"; import { createPullRequest as createAzurePullRequest } from "./azureDevops"; -import type { GitHubRepo } from "./github"; -import { createPullRequest as createGitHubPullRequest } from "./github"; import { buildAuthedUrl, checkoutBranch, @@ -14,10 +16,9 @@ import { pushBranch, setRemoteUrl } from "./git"; +import type { GitHubRepo } from "./github"; +import { createPullRequest as createGitHubPullRequest } from "./github"; import { generateCopilotInstructions } from "./instructions"; -import { ensureDir, safeWriteFile, validateCachePath } from "../utils/fs"; -import type { ProgressReporter } from "../utils/output"; -import { buildInstructionsPrBody } from "../utils/pr"; // ── Types ── diff --git a/src/utils/fs.ts b/src/utils/fs.ts index bbb2fd7..1ca9912 100644 --- a/src/utils/fs.ts +++ b/src/utils/fs.ts @@ -228,6 +228,13 @@ async function findClosestExistingAncestor(targetDir: string): Promise { } function isAllowedSystemAlias(originalPath: string, realPath: string): boolean { + // On Windows, 8.3 short filenames (e.g. RUNNER~1 → runneradmin) cause + // realpath to differ from the original path. Since we already confirmed + // via lstat that the path is not a symlink, treat the difference as safe. + if (process.platform === "win32") { + return true; + } + if (process.platform !== "darwin") { return false; } From a776d849158fa8d19f9f6293552c82e4bbc20b8b Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Wed, 18 Feb 2026 17:59:50 -0800 Subject: [PATCH 73/84] Fix Windows CI: walk ancestors for 8.3 vs symlink detection - Replace blanket isAllowedSystemAlias win32 return with ancestor lstat walk to correctly distinguish 8.3 normalization from real symlinks - Fix policy loadPolicy catch to handle cross-realm errors (instanceof Error fails across vitest worker threads) --- src/services/policy.ts | 15 ++++++++++----- src/utils/fs.ts | 35 +++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/services/policy.ts b/src/services/policy.ts index 5621c02..53e23a1 100644 --- a/src/services/policy.ts +++ b/src/services/policy.ts @@ -218,12 +218,17 @@ export async function loadPolicy( const config = (mod.default ?? mod) as unknown; return validatePolicyConfig(config, source); } catch (err) { + const message = + err instanceof Error + ? err.message + : typeof err === "object" && err !== null && "message" in err + ? String((err as { message: unknown }).message) + : String(err); if ( - err instanceof Error && - (err.message.includes("Cannot find module") || - err.message.includes("Cannot find package") || - err.message.includes("MODULE_NOT_FOUND") || - err.message.includes("ERR_MODULE_NOT_FOUND")) + message.includes("Cannot find module") || + message.includes("Cannot find package") || + message.includes("MODULE_NOT_FOUND") || + message.includes("ERR_MODULE_NOT_FOUND") ) { throw new Error(`Policy "${source}" not found. Install it with: npm install ${source}`); } diff --git a/src/utils/fs.ts b/src/utils/fs.ts index 1ca9912..f87a18c 100644 --- a/src/utils/fs.ts +++ b/src/utils/fs.ts @@ -179,7 +179,33 @@ async function hasSymlinkAncestor(filePath: string): Promise { realClosestAncestor !== closestExistingAncestor && !isAllowedSystemAlias(closestExistingAncestor, realClosestAncestor) ) { - return true; + // On Windows, 8.3 short filenames (e.g. RUNNER~1 → runneradmin) cause + // realpath to differ without any symlinks. Walk each ancestor component + // to check for actual symlinks before concluding. + if (process.platform === "win32") { + const parsed = path.parse(closestExistingAncestor); + const relative = path.relative(parsed.root, closestExistingAncestor); + const components = relative.split(path.sep).filter(Boolean); + let current = parsed.root; + let foundSymlink = false; + for (const component of components) { + current = path.join(current, component); + try { + const stat = await fs.lstat(current); + if (stat.isSymbolicLink()) { + foundSymlink = true; + break; + } + } catch { + break; + } + } + if (foundSymlink) { + return true; + } + } else { + return true; + } } const relativeParent = path.relative(closestExistingAncestor, parentDir); @@ -228,13 +254,6 @@ async function findClosestExistingAncestor(targetDir: string): Promise { } function isAllowedSystemAlias(originalPath: string, realPath: string): boolean { - // On Windows, 8.3 short filenames (e.g. RUNNER~1 → runneradmin) cause - // realpath to differ from the original path. Since we already confirmed - // via lstat that the path is not a symlink, treat the difference as safe. - if (process.platform === "win32") { - return true; - } - if (process.platform !== "darwin") { return false; } From e7f58d34956cdbb158931f8075dc0fe0c54df9f6 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 22 Feb 2026 14:14:17 -0800 Subject: [PATCH 74/84] feat: add plugin-based policy engine with shadow mode Introduce a new plugin-based policy engine that runs alongside the existing readiness system in shadow mode for safe validation. New modules in src/services/policy/: - types.ts: Signal, Recommendation, Grade, PolicyContext interfaces - compiler.ts: compiles policy configs into executable plugin chains - loader.ts: loads and validates plugin chains from policy sources - engine.ts: executes plugins, computes scores and grades - adapter.ts: bridges engine reports to legacy ReadinessReport format - shadow.ts: shadow mode logging for comparison with legacy path Changes to existing code: - readiness.ts: adds optional 'shadow' mode and 'engine' field on ReadinessReport; refactors isConfigSourced tracking for clarity - utils/fs.ts: clarifies validateCachePath caller responsibilities - README.md: documents new policy/ directory and links plugin guide Includes comprehensive test coverage (7 new test files, all 440 tests pass) and plugin authoring documentation in docs/plugins.md. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- README.md | 3 + docs/plugins.md | 202 ++++++ src/services/__tests__/policy-adapter.test.ts | 276 ++++++++ .../__tests__/policy-compiler.test.ts | 353 ++++++++++ .../__tests__/policy-engine-types.test.ts | 413 ++++++++++++ src/services/__tests__/policy-engine.test.ts | 607 ++++++++++++++++++ src/services/__tests__/policy-loader.test.ts | 128 ++++ src/services/__tests__/policy-shadow.test.ts | 402 ++++++++++++ .../__tests__/readiness-baseline.test.ts | 211 ++++++ src/services/policy/adapter.ts | 192 ++++++ src/services/policy/compiler.ts | 256 ++++++++ src/services/policy/engine.ts | 150 +++++ src/services/policy/index.ts | 31 + src/services/policy/loader.ts | 152 +++++ src/services/policy/shadow.ts | 192 ++++++ src/services/policy/types.ts | 343 ++++++++++ src/services/readiness.ts | 42 +- src/utils/fs.ts | 6 +- 18 files changed, 3954 insertions(+), 5 deletions(-) create mode 100644 docs/plugins.md create mode 100644 src/services/__tests__/policy-adapter.test.ts create mode 100644 src/services/__tests__/policy-compiler.test.ts create mode 100644 src/services/__tests__/policy-engine-types.test.ts create mode 100644 src/services/__tests__/policy-engine.test.ts create mode 100644 src/services/__tests__/policy-loader.test.ts create mode 100644 src/services/__tests__/policy-shadow.test.ts create mode 100644 src/services/__tests__/readiness-baseline.test.ts create mode 100644 src/services/policy/adapter.ts create mode 100644 src/services/policy/compiler.ts create mode 100644 src/services/policy/engine.ts create mode 100644 src/services/policy/index.ts create mode 100644 src/services/policy/loader.ts create mode 100644 src/services/policy/shadow.ts create mode 100644 src/services/policy/types.ts diff --git a/README.md b/README.md index cee6b3c..3bd5191 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,8 @@ Policies can also be set in `primer.config.json` (`{ "policies": ["./my-policy.j > **Security:** Config-sourced policies are restricted to JSON files only — JS/TS module policies must be passed via `--policy`. +See [docs/plugins.md](docs/plugins.md) for the full plugin authoring guide, including imperative TypeScript plugins, lifecycle hooks, and the trust model. + ## Development ```bash @@ -203,6 +205,7 @@ src/ │ ├── evaluator.ts # Eval runner + trajectory viewer │ ├── generator.ts # MCP/VS Code config generation │ ├── policy.ts # Readiness policy loading and chain resolution +│ ├── policy/ # Plugin engine (types, compiler, loader, adapter, shadow) │ ├── git.ts # Git operations (clone, branch, push) │ ├── github.ts # GitHub API (Octokit) │ └── azureDevops.ts # Azure DevOps API diff --git a/docs/plugins.md b/docs/plugins.md new file mode 100644 index 0000000..9b9980d --- /dev/null +++ b/docs/plugins.md @@ -0,0 +1,202 @@ +# Primer Plugin System + +The unified plugin policy system allows both imperative (code) plugins and declarative (JSON) policies to run through the same engine. + +## Architecture + +``` +PolicyConfig (JSON) ──┐ + ├─→ compilePolicyConfig() ──→ PolicyPlugin +Module policy (.ts) ──┘ + +Built-in criteria ──→ buildBuiltinPlugin() ──→ PolicyPlugin + +PolicyPlugin[] ──→ executePlugins() ──→ EngineReport + └─→ engineReportToReadiness() ──→ ReadinessReport +``` + +### Pipeline Stages + +The engine executes plugins through 5 deterministic stages: + +1. **Detect** — All detectors emit signals about repository state +2. **afterDetect** — Hooks can modify/add/remove signals via patches +3. **beforeRecommend** — Last chance to adjust signals before recommendations +4. **Recommend** — Recommenders emit actionable recommendations from signals +5. **afterRecommend** — Hooks can modify/add/remove recommendations via patches + +After hooks complete, the engine resolves `supersedes` conflicts and computes a score. + +## Plugin Contract + +```typescript +type PolicyPlugin = { + meta: PluginMeta; + detectors?: Detector[]; + afterDetect?: (signals, ctx) => Promise; + beforeRecommend?: (signals, ctx) => Promise; + recommenders?: Recommender[]; + afterRecommend?: (recs, signals, ctx) => Promise; + onError?: (error, stage, ctx) => boolean; +}; +``` + +### Trust Model + +| Trust Tier | Source | Capabilities | +| ------------------ | ------------------------------ | ---------------------------------------------- | +| `trusted-code` | `.ts`/`.js` module or built-in | Full lifecycle hooks, arbitrary code | +| `safe-declarative` | `.json` policy file | Disable, override metadata, static checks only | + +### Immutable Patches + +All hook stages return patch objects instead of mutating arrays directly: + +```typescript +type SignalPatch = { + add?: Signal[]; + remove?: string[]; // IDs to remove + modify?: Array<{ id: string; changes: Partial }>; +}; +``` + +The engine applies patches and automatically records provenance (`origin.modifiedBy`). + +### Conflict Resolution + +Use `supersedes` on recommendations for explicit conflict resolution: + +```typescript +const rec: Recommendation = { + id: "strict-lint-fix", + signalId: "lint-config", + impact: "high", + message: "Use stricter lint rules", + supersedes: ["basic-lint-fix"], // Replaces this recommendation + origin: { addedBy: "strict-policy" } +}; +``` + +Circular supersedes chains drop all involved recommendations. + +## Writing a Plugin + +There are two authoring APIs: + +- **`PolicyConfig`** — The high-level authoring API. You write a config object with `criteria`/`extras`/`thresholds` and the engine compiles it into a `PolicyPlugin` under the hood. This is the recommended approach for most use cases. +- **`PolicyPlugin`** — The low-level hook-based API (shown in the Plugin Contract section above). Use this only when you need direct control over the 5-stage pipeline hooks. + +### Imperative Plugin (TypeScript via PolicyConfig) + +```typescript +// my-policy.ts +import type { PolicyConfig } from "primer/services/policy"; + +const policy: PolicyConfig = { + name: "my-custom-policy", + criteria: { + disable: ["env-example"], // Skip this check + override: { + "lint-config": { title: "Custom Lint Title", impact: "medium" } + }, + add: [ + { + id: "custom-check", + title: "My Custom Check", + pillar: "code-quality", + level: 2, + scope: "repo", + impact: "high", + effort: "low", + check: async (ctx) => { + // Your check logic here + return { status: "pass", reason: "All good" }; + } + } + ] + } +}; + +export default policy; +``` + +### Declarative Policy (JSON) + +```json +{ + "name": "strict-policy", + "criteria": { + "disable": ["env-example"], + "override": { + "lint-config": { "impact": "high" } + } + }, + "thresholds": { + "passRate": 0.9 + } +} +``` + +## Using Policies + +### CLI + +```bash +# Single policy +primer readiness --policy ./my-policy.json + +# Multiple policies (comma-separated) +primer readiness --policy ./base.json,./strict.json + +# npm package policy +primer readiness --policy @org/primer-policy-strict +``` + +### Configuration File + +In `primer.config.json`: + +```json +{ + "policies": ["./policies/strict.json"] +} +``` + +Config-sourced policies are restricted to JSON-only for security. + +## Scoring + +The engine computes a score from final recommendations: + +- Each recommendation has an `impact`: critical (5), high (4), medium (3), low (2), info (0) +- Score = 1 - (total deductions / max possible weight) +- Max weight = number of detected signals × 5 (signals with status "not-detected" are excluded) +- Grades: A ≥ 0.9, B ≥ 0.8, C ≥ 0.7, D ≥ 0.6, F < 0.6 + +## Shadow Mode + +> **Status: In development.** Shadow mode infrastructure (`compareShadow`, `writeShadowLog`) is implemented but not yet wired into the production readiness path. The `.primer-cache/shadow-mode.log` file is **not** written during normal `primer readiness` runs. + +Shadow mode is designed to validate the new plugin engine against the legacy system before switching it on by default. When wired in, it will run both paths in parallel and log discrepancies: + +```typescript +import { compareShadow, writeShadowLog } from "primer/services/policy/shadow"; + +// Compare legacy ReadinessReport against a new EngineReport +const result = compareShadow(legacyReport, engineReport, { + repoPath: "/path/to/repo", + useNewEngine: false // Use legacy output by default +}); + +// Write any discrepancies to .primer-cache/shadow-mode.log +if (result.discrepancies.length > 0) { + await writeShadowLog(repoPath, result.discrepancies); +} +``` + +To run the plugin engine alongside the legacy path today, pass `shadow: true` to `runReadinessReport`. This populates `report.engine` with engine signals, recommendations, and score, but does not replace the legacy output: + +```typescript +const report = await runReadinessReport({ repoPath, shadow: true }); +// report.engine contains: signals, recommendations, policyWarnings, score, grade +``` diff --git a/src/services/__tests__/policy-adapter.test.ts b/src/services/__tests__/policy-adapter.test.ts new file mode 100644 index 0000000..8a1128a --- /dev/null +++ b/src/services/__tests__/policy-adapter.test.ts @@ -0,0 +1,276 @@ +import { describe, expect, it } from "vitest"; + +import { engineReportToReadiness } from "../policy/adapter"; +import type { EngineReport, Signal } from "../policy/types"; + +function makeSignal(overrides: Partial = {}): Signal { + return { + id: "test-signal", + kind: "file", + status: "detected", + label: "Test Signal", + origin: { addedBy: "test" }, + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + }, + ...overrides + }; +} + +function makeReport(overrides: Partial = {}): EngineReport { + return { + signals: [], + recommendations: [], + policyWarnings: [], + score: 1, + grade: "A", + pluginChain: ["builtin"], + ...overrides + }; +} + +describe("engineReportToReadiness", () => { + it("produces a valid ReadinessReport structure", () => { + const result = engineReportToReadiness(makeReport(), { repoPath: "/tmp/test" }); + expect(result.repoPath).toBe("/tmp/test"); + expect(result.isMonorepo).toBe(false); + expect(result.apps).toEqual([]); + expect(result.generatedAt).toBeDefined(); + expect(result.pillars).toHaveLength(9); + expect(result.levels).toHaveLength(5); + expect(result.criteria).toEqual([]); + expect(result.extras).toEqual([]); + expect(result.policies).toEqual({ chain: ["builtin"], criteriaCount: 0 }); + expect(result.engine).toBeDefined(); + expect(result.engine!.score).toBe(1); + expect(result.engine!.grade).toBe("A"); + }); + + it("maps signals with pillar metadata to criteria", () => { + const signal = makeSignal({ + id: "readme", + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + }); + const result = engineReportToReadiness(makeReport({ signals: [signal] }), { + repoPath: "/tmp/test" + }); + expect(result.criteria).toHaveLength(1); + expect(result.criteria[0].id).toBe("readme"); + expect(result.criteria[0].pillar).toBe("documentation"); + expect(result.criteria[0].status).toBe("pass"); + expect(result.extras).toHaveLength(0); + }); + + it("maps signals without pillar metadata to extras", () => { + const signal = makeSignal({ + id: "agents-doc", + metadata: { checkStatus: "fail" } + }); + const result = engineReportToReadiness(makeReport({ signals: [signal] }), { + repoPath: "/tmp/test" + }); + expect(result.extras).toHaveLength(1); + expect(result.extras[0].id).toBe("agents-doc"); + expect(result.extras[0].status).toBe("fail"); + expect(result.criteria).toHaveLength(0); + }); + + it("computes pillar summaries from criteria", () => { + const signals = [ + makeSignal({ + id: "a", + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + }), + makeSignal({ + id: "b", + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "fail" + } + }) + ]; + const result = engineReportToReadiness(makeReport({ signals }), { repoPath: "/tmp/test" }); + const docPillar = result.pillars.find((p) => p.id === "documentation"); + expect(docPillar).toBeDefined(); + expect(docPillar!.passed).toBe(1); + expect(docPillar!.total).toBe(2); + expect(docPillar!.passRate).toBe(0.5); + }); + + it("computes level summaries and achievedLevel", () => { + const signals = [ + makeSignal({ + id: "c1", + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + }), + makeSignal({ + id: "c2", + metadata: { + pillar: "testing", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + }) + ]; + const result = engineReportToReadiness(makeReport({ signals }), { repoPath: "/tmp/test" }); + expect(result.levels[0].level).toBe(1); + expect(result.levels[0].achieved).toBe(true); + expect(result.achievedLevel).toBe(1); + // Level 2 has no criteria → total=0 → not achieved + expect(result.levels[1].achieved).toBe(false); + }); + + it("skips skip-status criteria from totals", () => { + const signals = [ + makeSignal({ + id: "a", + metadata: { + pillar: "testing", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "skip" + } + }) + ]; + const result = engineReportToReadiness(makeReport({ signals }), { repoPath: "/tmp/test" }); + const testPillar = result.pillars.find((p) => p.id === "testing"); + expect(testPillar!.total).toBe(0); + expect(testPillar!.passRate).toBe(0); + }); + + it("respects passRateThreshold for level achievement", () => { + // 1 pass, 1 fail at level 1 → passRate 0.5 < default 0.8 + const signals = [ + makeSignal({ + id: "a", + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + }), + makeSignal({ + id: "b", + metadata: { + pillar: "testing", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "fail" + } + }) + ]; + const result = engineReportToReadiness(makeReport({ signals }), { + repoPath: "/tmp/test", + passRateThreshold: 0.4 + }); + // With threshold at 0.4, level 1 should be achieved (passRate 0.5 >= 0.4) + expect(result.levels[0].achieved).toBe(true); + expect(result.achievedLevel).toBe(1); + }); + + it("includes policy chain metadata", () => { + const result = engineReportToReadiness( + makeReport({ pluginChain: ["builtin", "custom-policy"] }), + { repoPath: "/tmp/test" } + ); + expect(result.policies!.chain).toEqual(["builtin", "custom-policy"]); + }); + + it("blocks level 2 achievement when level 1 fails (cascading)", () => { + // Level 1: 1 pass + 1 fail → passRate 0.5 < default 0.8 → not achieved + // Level 2: 2 passes → passRate 1.0 ≥ 0.8, but level 2 must NOT be achieved + // because levels are sequential: failing level N blocks N+1 + const signals = [ + makeSignal({ + id: "l1a", + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + }), + makeSignal({ + id: "l1b", + metadata: { + pillar: "testing", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "fail" + } + }), + makeSignal({ + id: "l2a", + metadata: { + pillar: "documentation", + level: 2, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + }), + makeSignal({ + id: "l2b", + metadata: { + pillar: "testing", + level: 2, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + }) + ]; + const result = engineReportToReadiness(makeReport({ signals }), { repoPath: "/tmp/test" }); + const level1 = result.levels.find((l) => l.level === 1); + const level2 = result.levels.find((l) => l.level === 2); + expect(level1!.achieved).toBe(false); + expect(level2!.achieved).toBe(false); + expect(result.achievedLevel).toBe(0); + }); +}); diff --git a/src/services/__tests__/policy-compiler.test.ts b/src/services/__tests__/policy-compiler.test.ts new file mode 100644 index 0000000..1f0eee3 --- /dev/null +++ b/src/services/__tests__/policy-compiler.test.ts @@ -0,0 +1,353 @@ +import { describe, expect, it } from "vitest"; + +import type { PolicyConfig, ExtraDefinition } from "../policy"; +import { compilePolicyConfig } from "../policy/compiler"; +import type { PolicyContext, Signal } from "../policy/types"; +import type { ReadinessCriterion } from "../readiness"; +import { buildCriteria } from "../readiness"; + +// ─── Helpers ─── + +function makeCtx(): PolicyContext { + return { + repoPath: "/tmp/test", + rootFiles: ["package.json"], + cache: new Map() + }; +} + +const baseCriteria = buildCriteria(); + +// ─── compilePolicyConfig ─── + +describe("compilePolicyConfig", () => { + it("compiles a minimal policy with name only", () => { + const config: PolicyConfig = { name: "minimal" }; + const result = compilePolicyConfig(config, baseCriteria); + + expect(result.plugin.meta.name).toBe("minimal"); + expect(result.plugin.meta.sourceType).toBe("json"); + expect(result.plugin.meta.trust).toBe("safe-declarative"); + expect(result.disabledIds).toEqual([]); + expect(result.passRateThreshold).toBeUndefined(); + }); + + it("collects disabled criterion IDs", () => { + const config: PolicyConfig = { + name: "disabler", + criteria: { disable: ["lint-config", "readme"] } + }; + const result = compilePolicyConfig(config, baseCriteria); + expect(result.disabledIds).toEqual(["lint-config", "readme"]); + }); + + it("collects disabled extra IDs", () => { + const config: PolicyConfig = { + name: "disabler", + extras: { disable: ["agents-doc"] } + }; + const result = compilePolicyConfig(config, baseCriteria); + expect(result.disabledIds).toContain("agents-doc"); + }); + + it("combines criteria and extras disabled IDs", () => { + const config: PolicyConfig = { + name: "combined", + criteria: { disable: ["lint-config"] }, + extras: { disable: ["pr-template"] } + }; + const result = compilePolicyConfig(config, baseCriteria); + expect(result.disabledIds).toEqual(["lint-config", "pr-template"]); + }); + + it("extracts passRateThreshold", () => { + const config: PolicyConfig = { + name: "thresholder", + thresholds: { passRate: 0.9 } + }; + const result = compilePolicyConfig(config, baseCriteria); + expect(result.passRateThreshold).toBe(0.9); + }); + + it("creates afterDetect hook for metadata overrides", async () => { + const config: PolicyConfig = { + name: "overrider", + criteria: { + override: { + "lint-config": { title: "Custom Lint Title" } + } + } + }; + const result = compilePolicyConfig(config, baseCriteria); + expect(result.plugin.afterDetect).toBeDefined(); + + // Simulate signals and apply hook + const signals: Signal[] = [ + { + id: "lint-config", + kind: "file", + status: "detected", + label: "Original", + origin: { addedBy: "test" } + } + ]; + const patch = await result.plugin.afterDetect!(signals, makeCtx()); + expect(patch).toBeDefined(); + expect(patch!.modify).toHaveLength(1); + expect(patch!.modify![0].changes.label).toBe("Custom Lint Title"); + }); + + it("afterDetect hook produces metadata overrides for pillar/level/impact", async () => { + const config: PolicyConfig = { + name: "meta-overrider", + criteria: { + override: { + "lint-config": { pillar: "testing", level: 3, impact: "high" } + } + } + }; + const result = compilePolicyConfig(config, baseCriteria); + const signals: Signal[] = [ + { + id: "lint-config", + kind: "file", + status: "detected", + label: "Lint", + origin: { addedBy: "test" }, + metadata: { pillar: "style-validation", level: 1, checkStatus: "pass" } + } + ]; + const patch = await result.plugin.afterDetect!(signals, makeCtx()); + expect(patch).toBeDefined(); + expect(patch!.modify).toHaveLength(1); + const meta = patch!.modify![0].changes.metadata as Record; + expect(meta.pillar).toBe("testing"); + expect(meta.level).toBe(3); + expect(meta.impact).toBe("high"); + }); + + it("afterDetect hook skips non-existent signal IDs", async () => { + const config: PolicyConfig = { + name: "overrider", + criteria: { + override: { + "nonexistent-id": { title: "Nope" } + } + } + }; + const result = compilePolicyConfig(config, baseCriteria); + const signals: Signal[] = [ + { + id: "lint-config", + kind: "file", + status: "detected", + label: "Original", + origin: { addedBy: "test" } + } + ]; + const patch = await result.plugin.afterDetect!(signals, makeCtx()); + expect(patch).toBeUndefined(); + }); + + it("creates detectors and recommenders from criteria.add", () => { + const criterion: ReadinessCriterion = { + id: "custom-check", + title: "Custom Check", + pillar: "code-quality", + level: 1, + scope: "repo", + impact: "medium", + effort: "low", + check: async () => ({ status: "pass" }) + }; + const config: PolicyConfig = { + name: "adder", + criteria: { add: [criterion] } + }; + const result = compilePolicyConfig(config, baseCriteria); + expect(result.plugin.detectors).toHaveLength(1); + expect(result.plugin.detectors![0].id).toBe("custom-check"); + expect(result.plugin.recommenders).toHaveLength(1); + expect(result.plugin.recommenders![0].id).toBe("custom-check-rec"); + }); + + it("compiled detector emits a signal from a passing criterion", async () => { + const criterion: ReadinessCriterion = { + id: "my-criterion", + title: "My Title", + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async () => ({ status: "pass", reason: "All good" }) + }; + const config: PolicyConfig = { + name: "checker", + criteria: { add: [criterion] } + }; + const result = compilePolicyConfig(config, baseCriteria); + const signal = await result.plugin.detectors![0].detect(makeCtx()); + const s = Array.isArray(signal) ? signal[0] : signal; + expect(s.id).toBe("my-criterion"); + expect(s.label).toBe("My Title"); + expect(s.origin.addedBy).toBe("compiled:my-criterion"); + expect(s.metadata).toHaveProperty("checkStatus", "pass"); + }); + + it("compiled recommender emits recommendation for failing criterion", async () => { + const signals: Signal[] = [ + { + id: "my-criterion", + kind: "file", + status: "detected", + label: "My Title", + reason: "Something failed", + origin: { addedBy: "compiled:my-criterion" }, + metadata: { checkStatus: "fail" } + } + ]; + const criterion: ReadinessCriterion = { + id: "my-criterion", + title: "My Title", + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async () => ({ status: "fail", reason: "Something failed" }) + }; + const config: PolicyConfig = { + name: "checker", + criteria: { add: [criterion] } + }; + const result = compilePolicyConfig(config, baseCriteria); + const rec = await result.plugin.recommenders![0].recommend(signals, makeCtx()); + const r = Array.isArray(rec) ? rec[0] : rec; + expect(r.id).toBe("my-criterion-fix"); + expect(r.impact).toBe("high"); + }); + + it("compiled recommender uses runtime impact from signal.metadata (afterDetect override)", async () => { + // Simulate an afterDetect hook that overrides impact to "medium" in signal metadata + const signals: Signal[] = [ + { + id: "my-criterion", + kind: "file", + status: "detected", + label: "My Title", + reason: "Something failed", + origin: { addedBy: "compiled:my-criterion" }, + // afterDetect has patched impact to "medium" (down from original "high") + metadata: { checkStatus: "fail", impact: "medium" } + } + ]; + const criterion: ReadinessCriterion = { + id: "my-criterion", + title: "My Title", + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", // original compile-time impact + effort: "low", + check: async () => ({ status: "fail" }) + }; + const config: PolicyConfig = { + name: "checker", + criteria: { add: [criterion] } + }; + const result = compilePolicyConfig(config, baseCriteria); + const rec = await result.plugin.recommenders![0].recommend(signals, makeCtx()); + const r = Array.isArray(rec) ? rec[0] : rec; + // Must use runtime impact "medium", not compile-time "high" + expect(r.impact).toBe("medium"); + }); + + it("compiled recommender returns empty for passing criterion", async () => { + const signals: Signal[] = [ + { + id: "my-criterion", + kind: "file", + status: "detected", + label: "My Title", + origin: { addedBy: "compiled:my-criterion" }, + metadata: { checkStatus: "pass" } + } + ]; + const criterion: ReadinessCriterion = { + id: "my-criterion", + title: "My Title", + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + check: async () => ({ status: "pass" }) + }; + const config: PolicyConfig = { + name: "checker", + criteria: { add: [criterion] } + }; + const result = compilePolicyConfig(config, baseCriteria); + const rec = await result.plugin.recommenders![0].recommend(signals, makeCtx()); + const recs = Array.isArray(rec) ? rec : [rec]; + expect(recs).toHaveLength(0); + }); + + it("has no detectors/recommenders/hooks when policy only disables", () => { + const config: PolicyConfig = { + name: "disabler-only", + criteria: { disable: ["lint-config"] } + }; + const result = compilePolicyConfig(config, baseCriteria); + expect(result.plugin.detectors).toBeUndefined(); + expect(result.plugin.recommenders).toBeUndefined(); + expect(result.plugin.afterDetect).toBeUndefined(); + }); + + it("creates detectors and recommenders from extras.add", () => { + const extra: ExtraDefinition = { + id: "custom-extra", + title: "Custom Extra", + check: async () => ({ status: "pass", reason: "OK" }) + }; + const config: PolicyConfig = { + name: "extra-adder", + extras: { add: [extra] } + }; + const result = compilePolicyConfig(config, baseCriteria); + expect(result.plugin.detectors).toHaveLength(1); + expect(result.plugin.detectors![0].id).toBe("custom-extra"); + expect(result.plugin.detectors![0].kind).toBe("custom"); + expect(result.plugin.recommenders).toHaveLength(1); + expect(result.plugin.recommenders![0].id).toBe("custom-extra-rec"); + }); + + it("compiled extra recommender emits low-impact recommendation on fail", async () => { + const signals: Signal[] = [ + { + id: "custom-extra", + kind: "custom", + status: "detected", + label: "Custom Extra", + reason: "Missing thing", + origin: { addedBy: "compiled:custom-extra" }, + metadata: { checkStatus: "fail" } + } + ]; + const extra: ExtraDefinition = { + id: "custom-extra", + title: "Custom Extra", + check: async () => ({ status: "fail", reason: "Missing thing" }) + }; + const config: PolicyConfig = { + name: "extra-adder", + extras: { add: [extra] } + }; + const result = compilePolicyConfig(config, baseCriteria); + const rec = await result.plugin.recommenders![0].recommend(signals, makeCtx()); + const r = Array.isArray(rec) ? rec[0] : rec; + expect(r.id).toBe("custom-extra-fix"); + expect(r.impact).toBe("low"); + }); +}); diff --git a/src/services/__tests__/policy-engine-types.test.ts b/src/services/__tests__/policy-engine-types.test.ts new file mode 100644 index 0000000..2057ed3 --- /dev/null +++ b/src/services/__tests__/policy-engine-types.test.ts @@ -0,0 +1,413 @@ +import { describe, expect, it } from "vitest"; + +import type { Signal, Recommendation, SignalPatch, RecommendationPatch } from "../policy/types"; +import { + calculateScore, + applySignalPatch, + applyRecommendationPatch, + resolveSupersedes +} from "../policy/types"; + +// ─── Helpers ─── + +function makeSignal(overrides: Partial & { id: string }): Signal { + return { + kind: "file", + status: "detected", + label: overrides.id, + origin: { addedBy: "test-plugin" }, + ...overrides + }; +} + +function makeRec( + overrides: Partial & { id: string; signalId: string } +): Recommendation { + return { + impact: "medium", + message: `Fix ${overrides.id}`, + origin: { addedBy: "test-plugin" }, + ...overrides + }; +} + +// ─── calculateScore ─── + +describe("calculateScore", () => { + it("returns perfect score when no recommendations exist", () => { + const signals = [makeSignal({ id: "s1" })]; + const { score, grade } = calculateScore(signals, []); + expect(score).toBe(1); + expect(grade).toBe("A"); + }); + + it("returns perfect score when signals array is empty", () => { + const { score, grade } = calculateScore([], []); + expect(score).toBe(1); + expect(grade).toBe("A"); + }); + + it("deducts score based on recommendation impact weights", () => { + const signals = [makeSignal({ id: "s1" }), makeSignal({ id: "s2" })]; + // maxWeight = 2 * 5 (critical) = 10 + // one medium rec = weight 3, deduction = 3/10 = 0.3, score = 0.7 + const recs = [makeRec({ id: "r1", signalId: "s1", impact: "medium" })]; + const { score } = calculateScore(signals, recs); + expect(score).toBeCloseTo(0.7, 3); + }); + + it("returns grade F for high deductions", () => { + const signals = [makeSignal({ id: "s1" })]; + // maxWeight = 1 * 5 = 5, critical = 5, deduction = 5/5 = 1 → score = 0 + const recs = [makeRec({ id: "r1", signalId: "s1", impact: "critical" })]; + const { score, grade } = calculateScore(signals, recs); + expect(score).toBe(0); + expect(grade).toBe("F"); + }); + + it("info impact does not affect score", () => { + const signals = [makeSignal({ id: "s1" })]; + const recs = [makeRec({ id: "r1", signalId: "s1", impact: "info" })]; + const { score } = calculateScore(signals, recs); + expect(score).toBe(1); + }); + + it("assigns grade B for score 0.8-0.89", () => { + const signals = [ + makeSignal({ id: "s1" }), + makeSignal({ id: "s2" }), + makeSignal({ id: "s3" }), + makeSignal({ id: "s4" }), + makeSignal({ id: "s5" }) + ]; + // maxWeight = 5 * 5 = 25 + // one high rec = 4, score = 1 - 4/25 = 0.84 → B + const recs = [makeRec({ id: "r1", signalId: "s1", impact: "high" })]; + const { grade } = calculateScore(signals, recs); + expect(grade).toBe("B"); + }); + + it("assigns grade C for score 0.7-0.79", () => { + // 5 signals, maxWeight = 25, two medium recs = 6, score = 1 - 6/25 = 0.76 → C + const signals = [ + makeSignal({ id: "s1" }), + makeSignal({ id: "s2" }), + makeSignal({ id: "s3" }), + makeSignal({ id: "s4" }), + makeSignal({ id: "s5" }) + ]; + const recs = [ + makeRec({ id: "r1", signalId: "s1", impact: "medium" }), + makeRec({ id: "r2", signalId: "s2", impact: "medium" }) + ]; + const { grade } = calculateScore(signals, recs); + expect(grade).toBe("C"); + }); + + it("assigns grade D for score 0.6-0.69", () => { + const signals = [ + makeSignal({ id: "s1" }), + makeSignal({ id: "s2" }), + makeSignal({ id: "s3" }), + makeSignal({ id: "s4" }), + makeSignal({ id: "s5" }) + ]; + // maxWeight = 5 * 5 = 25, two high recs = 8, score = 1 - 8/25 = 0.68 → D + const recs = [ + makeRec({ id: "r1", signalId: "s1", impact: "high" }), + makeRec({ id: "r2", signalId: "s2", impact: "high" }) + ]; + const { grade } = calculateScore(signals, recs); + expect(grade).toBe("D"); + }); + it("clamps score to 0 when deductions exceed maxWeight", () => { + const signals = [makeSignal({ id: "s1" })]; + // maxWeight = 1 * 5 = 5, two critical recs = 10, clamped to 0 + const recs = [ + makeRec({ id: "r1", signalId: "s1", impact: "critical" }), + makeRec({ id: "r2", signalId: "s1", impact: "critical" }) + ]; + const { score, grade } = calculateScore(signals, recs); + expect(score).toBe(0); + expect(grade).toBe("F"); + }); + + it("excludes not-detected signals from score denominator", () => { + // 3 signals: 2 detected, 1 not-detected (skipped) + // maxWeight should be 2 * 5 = 10, NOT 3 * 5 = 15 + const signals = [ + makeSignal({ id: "s1", status: "detected" }), + makeSignal({ id: "s2", status: "detected" }), + makeSignal({ id: "s3", status: "not-detected" }) + ]; + const recs = [makeRec({ id: "r1", signalId: "s1", impact: "medium" })]; + // deductions = 3 (medium), maxWeight = 2 * 5 = 10, score = 1 - 3/10 = 0.7 + const { score } = calculateScore(signals, recs); + expect(score).toBeCloseTo(0.7, 3); + }); + + it("returns perfect score when all signals are not-detected", () => { + const signals = [ + makeSignal({ id: "s1", status: "not-detected" }), + makeSignal({ id: "s2", status: "not-detected" }) + ]; + const { score, grade } = calculateScore(signals, []); + expect(score).toBe(1); + expect(grade).toBe("A"); + }); +}); + +// ─── applySignalPatch ─── + +describe("applySignalPatch", () => { + it("adds new signals", () => { + const signals = [makeSignal({ id: "s1" })]; + const patch: SignalPatch = { + add: [makeSignal({ id: "s2", origin: { addedBy: "hook-plugin" } })] + }; + const result = applySignalPatch(signals, patch, "hook-plugin"); + expect(result).toHaveLength(2); + expect(result[1].id).toBe("s2"); + }); + + it("removes signals by id", () => { + const signals = [makeSignal({ id: "s1" }), makeSignal({ id: "s2" })]; + const patch: SignalPatch = { remove: ["s1"] }; + const result = applySignalPatch(signals, patch, "hook-plugin"); + expect(result).toHaveLength(1); + expect(result[0].id).toBe("s2"); + }); + + it("modifies signals and records provenance", () => { + const signals = [makeSignal({ id: "s1", status: "detected" })]; + const patch: SignalPatch = { + modify: [{ id: "s1", changes: { status: "not-detected" } }] + }; + const result = applySignalPatch(signals, patch, "hook-plugin"); + expect(result[0].status).toBe("not-detected"); + expect(result[0].origin.modifiedBy).toEqual(["hook-plugin"]); + }); + + it("accumulates multiple modifiers in provenance", () => { + const signals = [ + makeSignal({ + id: "s1", + origin: { addedBy: "original", modifiedBy: ["first-mod"] } + }) + ]; + const patch: SignalPatch = { + modify: [{ id: "s1", changes: { label: "Updated" } }] + }; + const result = applySignalPatch(signals, patch, "second-mod"); + expect(result[0].origin.modifiedBy).toEqual(["first-mod", "second-mod"]); + }); + + it("does not mutate the original array", () => { + const original = makeSignal({ id: "s1" }); + const signals = [original]; + const patch: SignalPatch = { remove: ["s1"] }; + applySignalPatch(signals, patch, "hook"); + expect(signals).toHaveLength(1); // original unchanged + }); + + it("ignores modify for non-existent signal id", () => { + const signals = [makeSignal({ id: "s1" })]; + const patch: SignalPatch = { + modify: [{ id: "nonexistent", changes: { label: "Nope" } }] + }; + const result = applySignalPatch(signals, patch, "hook"); + expect(result).toHaveLength(1); + expect(result[0].label).toBe("s1"); + }); + + it("applies remove, modify, add in correct order", () => { + const signals = [makeSignal({ id: "s1" }), makeSignal({ id: "s2" })]; + const patch: SignalPatch = { + remove: ["s1"], + modify: [{ id: "s2", changes: { label: "Modified" } }], + add: [makeSignal({ id: "s3", origin: { addedBy: "hook" } })] + }; + const result = applySignalPatch(signals, patch, "hook"); + expect(result.map((s) => s.id)).toEqual(["s2", "s3"]); + expect(result[0].label).toBe("Modified"); + }); + + it("handles empty patch as a no-op", () => { + const signals = [makeSignal({ id: "s1" })]; + const result = applySignalPatch(signals, {}, "hook"); + expect(result).toHaveLength(1); + expect(result[0].id).toBe("s1"); + }); + + it("deep-clones evidence and metadata in add", () => { + const evidence = ["file.ts"]; + const metadata = { key: "value" }; + const patch: SignalPatch = { + add: [makeSignal({ id: "s2", evidence, metadata, origin: { addedBy: "hook" } })] + }; + const result = applySignalPatch([], patch, "hook"); + // Mutating original should not affect result + evidence.push("other.ts"); + metadata.key = "mutated"; + expect(result[0].evidence).toEqual(["file.ts"]); + expect(result[0].metadata).toEqual({ key: "value" }); + }); + + it("deep-merges metadata on modify instead of replacing", () => { + const signals = [ + makeSignal({ + id: "s1", + metadata: { pillar: "docs", level: 1, checkStatus: "pass" } + }) + ]; + const patch: SignalPatch = { + modify: [{ id: "s1", changes: { metadata: { pillar: "testing" } } }] + }; + const result = applySignalPatch(signals, patch, "hook"); + // pillar is overridden, but checkStatus and level are preserved + expect(result[0].metadata).toEqual({ pillar: "testing", level: 1, checkStatus: "pass" }); + }); +}); + +// ─── applyRecommendationPatch ─── + +describe("applyRecommendationPatch", () => { + it("adds new recommendations", () => { + const recs = [makeRec({ id: "r1", signalId: "s1" })]; + const patch: RecommendationPatch = { + add: [makeRec({ id: "r2", signalId: "s2", origin: { addedBy: "hook" } })] + }; + const result = applyRecommendationPatch(recs, patch, "hook"); + expect(result).toHaveLength(2); + }); + + it("removes recommendations by id", () => { + const recs = [makeRec({ id: "r1", signalId: "s1" }), makeRec({ id: "r2", signalId: "s2" })]; + const patch: RecommendationPatch = { remove: ["r1"] }; + const result = applyRecommendationPatch(recs, patch, "hook"); + expect(result).toHaveLength(1); + expect(result[0].id).toBe("r2"); + }); + + it("modifies recommendations and records provenance", () => { + const recs = [makeRec({ id: "r1", signalId: "s1", impact: "low" })]; + const patch: RecommendationPatch = { + modify: [{ id: "r1", changes: { impact: "critical" } }] + }; + const result = applyRecommendationPatch(recs, patch, "escalator"); + expect(result[0].impact).toBe("critical"); + expect(result[0].origin.modifiedBy).toEqual(["escalator"]); + }); + + it("does not mutate the original array", () => { + const original = makeRec({ id: "r1", signalId: "s1" }); + const recs = [original]; + const patch: RecommendationPatch = { remove: ["r1"] }; + applyRecommendationPatch(recs, patch, "hook"); + expect(recs).toHaveLength(1); + }); + + it("ignores modify for non-existent recommendation id", () => { + const recs = [makeRec({ id: "r1", signalId: "s1" })]; + const patch: RecommendationPatch = { + modify: [{ id: "nonexistent", changes: { message: "Nope" } }] + }; + const result = applyRecommendationPatch(recs, patch, "hook"); + expect(result).toHaveLength(1); + expect(result[0].message).toBe("Fix r1"); + }); + + it("accumulates multiple modifiers in provenance", () => { + const recs = [ + makeRec({ + id: "r1", + signalId: "s1", + origin: { addedBy: "original", modifiedBy: ["first-mod"] } + }) + ]; + const patch: RecommendationPatch = { + modify: [{ id: "r1", changes: { message: "Updated" } }] + }; + const result = applyRecommendationPatch(recs, patch, "second-mod"); + expect(result[0].origin.modifiedBy).toEqual(["first-mod", "second-mod"]); + }); + + it("applies remove, modify, add in correct order", () => { + const recs = [makeRec({ id: "r1", signalId: "s1" }), makeRec({ id: "r2", signalId: "s2" })]; + const patch: RecommendationPatch = { + remove: ["r1"], + modify: [{ id: "r2", changes: { message: "Modified" } }], + add: [makeRec({ id: "r3", signalId: "s3", origin: { addedBy: "hook" } })] + }; + const result = applyRecommendationPatch(recs, patch, "hook"); + expect(result.map((r) => r.id)).toEqual(["r2", "r3"]); + expect(result[0].message).toBe("Modified"); + }); +}); + +// ─── resolveSupersedes ─── + +describe("resolveSupersedes", () => { + it("removes recommendations that are superseded", () => { + const recs = [ + makeRec({ id: "r1", signalId: "s1" }), + makeRec({ id: "r2", signalId: "s1", supersedes: ["r1"] }) + ]; + const result = resolveSupersedes(recs); + expect(result).toHaveLength(1); + expect(result[0].id).toBe("r2"); + }); + + it("keeps all recommendations when none are superseded", () => { + const recs = [makeRec({ id: "r1", signalId: "s1" }), makeRec({ id: "r2", signalId: "s2" })]; + const result = resolveSupersedes(recs); + expect(result).toHaveLength(2); + }); + + it("handles transitive supersedes", () => { + const recs = [ + makeRec({ id: "r1", signalId: "s1" }), + makeRec({ id: "r2", signalId: "s1", supersedes: ["r1"] }), + makeRec({ id: "r3", signalId: "s1", supersedes: ["r2"] }) + ]; + const result = resolveSupersedes(recs); + expect(result).toHaveLength(1); + expect(result[0].id).toBe("r3"); + }); + + it("handles multiple supersedes in one recommendation", () => { + const recs = [ + makeRec({ id: "r1", signalId: "s1" }), + makeRec({ id: "r2", signalId: "s2" }), + makeRec({ id: "r3", signalId: "s1", supersedes: ["r1", "r2"] }) + ]; + const result = resolveSupersedes(recs); + expect(result).toHaveLength(1); + expect(result[0].id).toBe("r3"); + }); + + it("drops both recommendations in circular supersedes", () => { + const recs = [ + makeRec({ id: "r1", signalId: "s1", supersedes: ["r2"] }), + makeRec({ id: "r2", signalId: "s1", supersedes: ["r1"] }) + ]; + const result = resolveSupersedes(recs); + expect(result).toHaveLength(0); + }); + + it("records provenance on the superseding recommendation", () => { + const recs = [ + makeRec({ id: "r1", signalId: "s1" }), + makeRec({ id: "r2", signalId: "s1", supersedes: ["r1"] }) + ]; + const result = resolveSupersedes(recs); + expect(result[0].origin.modifiedBy).toEqual(["superseded:r1"]); + }); + + it("ignores supersedes references to non-existent IDs", () => { + const recs = [makeRec({ id: "r1", signalId: "s1", supersedes: ["nonexistent"] })]; + const result = resolveSupersedes(recs); + expect(result).toHaveLength(1); + expect(result[0].origin.modifiedBy).toBeUndefined(); + }); +}); diff --git a/src/services/__tests__/policy-engine.test.ts b/src/services/__tests__/policy-engine.test.ts new file mode 100644 index 0000000..16f62f2 --- /dev/null +++ b/src/services/__tests__/policy-engine.test.ts @@ -0,0 +1,607 @@ +import { describe, expect, it, vi } from "vitest"; + +import { executePlugins } from "../policy/engine"; +import type { + PolicyPlugin, + PolicyContext, + Signal, + Recommendation, + Detector, + Recommender +} from "../policy/types"; + +// ─── Helpers ─── + +function makeCtx(overrides?: Partial): PolicyContext { + return { + repoPath: "/tmp/test-repo", + rootFiles: ["README.md", "package.json"], + cache: new Map(), + ...overrides + }; +} + +function makeDetector(id: string, result: Signal | Signal[]): Detector { + return { + id, + kind: "file", + detect: vi.fn().mockResolvedValue(result) + }; +} + +function makeRecommender(id: string, result: Recommendation | Recommendation[]): Recommender { + return { + id, + recommend: vi.fn().mockResolvedValue(result) + }; +} + +function makePlugin( + overrides: Partial & { meta: PolicyPlugin["meta"] } +): PolicyPlugin { + return { ...overrides }; +} + +const META = { + name: "test-plugin", + sourceType: "builtin" as const, + trust: "trusted-code" as const +}; + +// ─── executePlugins ─── + +describe("executePlugins", () => { + it("runs detectors and recommenders through the full pipeline", async () => { + const signal: Signal = { + id: "readme-missing", + kind: "file", + status: "detected", + label: "README missing", + origin: { addedBy: "test-plugin" } + }; + const rec: Recommendation = { + id: "add-readme", + signalId: "readme-missing", + impact: "high", + message: "Add a README.md", + origin: { addedBy: "test-plugin" } + }; + + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("readme-check", signal)], + recommenders: [makeRecommender("readme-rec", rec)] + }); + + const report = await executePlugins([plugin], makeCtx()); + + expect(report.signals).toHaveLength(1); + expect(report.signals[0].id).toBe("readme-missing"); + expect(report.recommendations).toHaveLength(1); + expect(report.recommendations[0].id).toBe("add-readme"); + expect(report.pluginChain).toEqual(["test-plugin"]); + expect(report.score).toBeLessThan(1); + }); + + it("executes multiple plugins in source order", async () => { + const order: string[] = []; + + const plugin1 = makePlugin({ + meta: { ...META, name: "plugin-1" }, + detectors: [ + { + id: "d1", + kind: "file", + detect: async () => { + order.push("detect-1"); + return { + id: "s1", + kind: "file", + status: "detected", + label: "S1", + origin: { addedBy: "plugin-1" } + }; + } + } + ] + }); + + const plugin2 = makePlugin({ + meta: { ...META, name: "plugin-2" }, + detectors: [ + { + id: "d2", + kind: "file", + detect: async () => { + order.push("detect-2"); + return { + id: "s2", + kind: "file", + status: "detected", + label: "S2", + origin: { addedBy: "plugin-2" } + }; + } + } + ] + }); + + await executePlugins([plugin1, plugin2], makeCtx()); + expect(order).toEqual(["detect-1", "detect-2"]); + }); + + it("applies afterDetect hook patches", async () => { + const signal: Signal = { + id: "s1", + kind: "file", + status: "detected", + label: "Original", + origin: { addedBy: "base" } + }; + + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("d1", signal)], + afterDetect: async () => ({ + modify: [{ id: "s1", changes: { label: "Patched" } }] + }), + recommenders: [ + { + id: "r1", + recommend: async (signals) => { + // Verify recommender sees the patched signal + expect(signals[0].label).toBe("Patched"); + return []; + } + } + ] + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.signals[0].label).toBe("Patched"); + expect(report.signals[0].origin.modifiedBy).toEqual(["test-plugin"]); + }); + + it("applies afterRecommend hook patches", async () => { + const signal: Signal = { + id: "s1", + kind: "file", + status: "detected", + label: "S1", + origin: { addedBy: "base" } + }; + const rec: Recommendation = { + id: "r1", + signalId: "s1", + impact: "low", + message: "Original", + origin: { addedBy: "base" } + }; + + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("d1", signal)], + recommenders: [makeRecommender("rec1", rec)], + afterRecommend: async () => ({ + modify: [{ id: "r1", changes: { impact: "critical" } }] + }) + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.recommendations[0].impact).toBe("critical"); + }); + + it("skips disabled rule IDs for detectors and recommenders", async () => { + const plugin = makePlugin({ + meta: META, + detectors: [ + makeDetector("enabled-d", { + id: "s1", + kind: "file", + status: "detected", + label: "S1", + origin: { addedBy: "test" } + }), + makeDetector("disabled-d", { + id: "s2", + kind: "file", + status: "detected", + label: "S2", + origin: { addedBy: "test" } + }) + ], + recommenders: [ + makeRecommender("enabled-r", { + id: "r1", + signalId: "s1", + impact: "medium", + message: "R1", + origin: { addedBy: "test" } + }), + makeRecommender("disabled-r", { + id: "r2", + signalId: "s2", + impact: "medium", + message: "R2", + origin: { addedBy: "test" } + }) + ] + }); + + const report = await executePlugins([plugin], makeCtx(), { + disabledRuleIds: new Set(["disabled-d", "disabled-r"]) + }); + + expect(report.signals).toHaveLength(1); + expect(report.signals[0].id).toBe("s1"); + expect(report.recommendations).toHaveLength(1); + expect(report.recommendations[0].id).toBe("r1"); + }); + + it("resolves supersedes in final output", async () => { + const signal: Signal = { + id: "s1", + kind: "file", + status: "detected", + label: "S1", + origin: { addedBy: "test" } + }; + const recs: Recommendation[] = [ + { id: "r1", signalId: "s1", impact: "low", message: "Base", origin: { addedBy: "base" } }, + { + id: "r2", + signalId: "s1", + impact: "high", + message: "Override", + origin: { addedBy: "override" }, + supersedes: ["r1"] + } + ]; + + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("d1", signal)], + recommenders: [makeRecommender("rec1", recs)] + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.recommendations).toHaveLength(1); + expect(report.recommendations[0].id).toBe("r2"); + }); + + it("records warnings for caught errors and continues", async () => { + const plugin = makePlugin({ + meta: META, + detectors: [ + { + id: "failing", + kind: "file", + detect: async () => { + throw new Error("disk read failed"); + } + } + ], + onError: () => true // continue on error + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.policyWarnings).toHaveLength(1); + expect(report.policyWarnings[0].pluginName).toBe("test-plugin"); + expect(report.policyWarnings[0].stage).toBe("detect"); + expect(report.policyWarnings[0].message).toBe("disk read failed"); + }); + + it("returns empty report for no plugins", async () => { + const report = await executePlugins([], makeCtx()); + expect(report.signals).toEqual([]); + expect(report.recommendations).toEqual([]); + expect(report.score).toBe(1); + expect(report.grade).toBe("A"); + expect(report.pluginChain).toEqual([]); + }); + + it("shares the same context cache across plugins", async () => { + const plugin1 = makePlugin({ + meta: { ...META, name: "writer" }, + detectors: [ + { + id: "d1", + kind: "custom", + detect: async (ctx) => { + ctx.cache.set("shared-key", 42); + return { + id: "s1", + kind: "custom", + status: "detected", + label: "S1", + origin: { addedBy: "writer" } + }; + } + } + ] + }); + + const plugin2 = makePlugin({ + meta: { ...META, name: "reader" }, + detectors: [ + { + id: "d2", + kind: "custom", + detect: async (ctx) => { + const val = ctx.cache.get("shared-key"); + return { + id: "s2", + kind: "custom", + status: val === 42 ? "detected" : "error", + label: "S2", + origin: { addedBy: "reader" } + }; + } + } + ] + }); + + const report = await executePlugins([plugin1, plugin2], makeCtx()); + expect(report.signals[1].status).toBe("detected"); + }); + + it("produces deterministic output for identical inputs", async () => { + const signal: Signal = { + id: "s1", + kind: "file", + status: "detected", + label: "S1", + origin: { addedBy: "test" } + }; + const rec: Recommendation = { + id: "r1", + signalId: "s1", + impact: "medium", + message: "Fix it", + origin: { addedBy: "test" } + }; + + const makeRun = () => { + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("d1", signal)], + recommenders: [makeRecommender("rec1", rec)] + }); + return executePlugins([plugin], makeCtx()); + }; + + const [report1, report2] = await Promise.all([makeRun(), makeRun()]); + expect(report1.signals).toEqual(report2.signals); + expect(report1.recommendations).toEqual(report2.recommendations); + expect(report1.score).toBe(report2.score); + expect(report1.grade).toBe(report2.grade); + }); + + it("applies beforeRecommend hook patches visible to recommenders", async () => { + const signal: Signal = { + id: "s1", + kind: "file", + status: "detected", + label: "Original", + origin: { addedBy: "base" } + }; + + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("d1", signal)], + beforeRecommend: async () => ({ + modify: [{ id: "s1", changes: { label: "Pre-recommend patched" } }] + }), + recommenders: [ + { + id: "r1", + recommend: async (signals) => { + expect(signals[0].label).toBe("Pre-recommend patched"); + return []; + } + } + ] + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.signals[0].label).toBe("Pre-recommend patched"); + expect(report.signals[0].origin.modifiedBy).toEqual(["test-plugin"]); + }); + + it("aborts plugin stage when onError returns false", async () => { + const secondDetect = vi.fn().mockResolvedValue({ + id: "s2", + kind: "file", + status: "detected", + label: "S2", + origin: { addedBy: "test" } + }); + + const plugin = makePlugin({ + meta: META, + detectors: [ + { + id: "failing", + kind: "file", + detect: async () => { + throw new Error("abort trigger"); + } + }, + { + id: "skipped", + kind: "file", + detect: secondDetect + } + ], + onError: () => false // abort + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(secondDetect).not.toHaveBeenCalled(); + expect(report.policyWarnings).toHaveLength(1); + expect(report.policyWarnings[0].message).toBe("abort trigger"); + }); + + it("handles detectors returning arrays", async () => { + const signals: Signal[] = [ + { id: "s1", kind: "file", status: "detected", label: "S1", origin: { addedBy: "test" } }, + { id: "s2", kind: "git", status: "detected", label: "S2", origin: { addedBy: "test" } } + ]; + + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("multi", signals)] + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.signals).toHaveLength(2); + expect(report.signals.map((s) => s.id)).toEqual(["s1", "s2"]); + }); + + it("handles recommenders returning arrays", async () => { + const signal: Signal = { + id: "s1", + kind: "file", + status: "detected", + label: "S1", + origin: { addedBy: "test" } + }; + const recs: Recommendation[] = [ + { id: "r1", signalId: "s1", impact: "medium", message: "R1", origin: { addedBy: "test" } }, + { id: "r2", signalId: "s1", impact: "low", message: "R2", origin: { addedBy: "test" } } + ]; + + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("d1", signal)], + recommenders: [makeRecommender("multi-rec", recs)] + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.recommendations).toHaveLength(2); + }); + + it("records warnings for recommender errors and continues", async () => { + const signal: Signal = { + id: "s1", + kind: "file", + status: "detected", + label: "S1", + origin: { addedBy: "test" } + }; + + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("d1", signal)], + recommenders: [ + { + id: "failing-rec", + recommend: async () => { + throw new Error("recommend failed"); + } + } + ], + onError: () => true + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.policyWarnings).toHaveLength(1); + expect(report.policyWarnings[0].stage).toBe("recommend"); + expect(report.policyWarnings[0].message).toBe("recommend failed"); + }); + + it("continues and records warning when no onError handler is provided", async () => { + const plugin = makePlugin({ + meta: META, + detectors: [ + { + id: "failing", + kind: "file", + detect: async () => { + throw new Error("no handler"); + } + } + ] + // no onError + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.policyWarnings).toHaveLength(1); + expect(report.policyWarnings[0].message).toBe("no handler"); + }); + + it("handles non-Error throwables in detectors", async () => { + const plugin = makePlugin({ + meta: META, + detectors: [ + { + id: "string-throw", + kind: "file", + detect: async () => { + throw "string error"; + } + } + ] + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.policyWarnings).toHaveLength(1); + expect(report.policyWarnings[0].message).toBe("string error"); + }); + + it("records warnings for afterDetect hook errors", async () => { + const signal: Signal = { + id: "s1", + kind: "file", + status: "detected", + label: "S1", + origin: { addedBy: "test" } + }; + + const plugin = makePlugin({ + meta: META, + detectors: [makeDetector("d1", signal)], + afterDetect: async () => { + throw new Error("afterDetect failed"); + } + }); + + const report = await executePlugins([plugin], makeCtx()); + expect(report.policyWarnings).toHaveLength(1); + expect(report.policyWarnings[0].stage).toBe("afterDetect"); + }); + + it("continues other plugins' detectors after one plugin aborts", async () => { + const plugin1 = makePlugin({ + meta: { ...META, name: "aborter" }, + detectors: [ + { + id: "d1", + kind: "file", + detect: async () => { + throw new Error("abort"); + } + } + ], + onError: () => false + }); + + const plugin2 = makePlugin({ + meta: { ...META, name: "survivor" }, + detectors: [ + makeDetector("d2", { + id: "s2", + kind: "file", + status: "detected", + label: "S2", + origin: { addedBy: "survivor" } + }) + ] + }); + + const report = await executePlugins([plugin1, plugin2], makeCtx()); + expect(report.signals).toHaveLength(1); + expect(report.signals[0].id).toBe("s2"); + expect(report.policyWarnings).toHaveLength(1); + }); +}); diff --git a/src/services/__tests__/policy-loader.test.ts b/src/services/__tests__/policy-loader.test.ts new file mode 100644 index 0000000..269dad4 --- /dev/null +++ b/src/services/__tests__/policy-loader.test.ts @@ -0,0 +1,128 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; + +import { afterEach, beforeEach, describe, expect, it } from "vitest"; + +import { executePlugins } from "../policy/engine"; +import { buildBuiltinPlugin, loadPluginChain } from "../policy/loader"; +import type { PolicyContext } from "../policy/types"; +import { buildExtras } from "../readiness"; + +function makeCtx(): PolicyContext { + return { + repoPath: "/tmp/test", + rootFiles: [], + cache: new Map() + }; +} + +describe("buildBuiltinPlugin", () => { + it("returns a plugin with sourceType 'builtin' and trust 'trusted-code'", () => { + const { plugin } = buildBuiltinPlugin(); + expect(plugin.meta.name).toBe("builtin"); + expect(plugin.meta.sourceType).toBe("builtin"); + expect(plugin.meta.trust).toBe("trusted-code"); + }); + + it("has detectors for all repo-scoped built-in criteria and extras", () => { + const { plugin, baseCriteria } = buildBuiltinPlugin(); + const extras = buildExtras(); + // Only repo-scoped criteria are included, plus all extras + const repoCriteria = baseCriteria.filter((c) => c.scope === "repo"); + expect(plugin.detectors).toBeDefined(); + expect(plugin.detectors!.length).toBe(repoCriteria.length + extras.length); + }); + + it("has recommenders for all repo-scoped built-in criteria and extras", () => { + const { plugin, baseCriteria } = buildBuiltinPlugin(); + const extras = buildExtras(); + const repoCriteria = baseCriteria.filter((c) => c.scope === "repo"); + expect(plugin.recommenders).toBeDefined(); + expect(plugin.recommenders!.length).toBe(repoCriteria.length + extras.length); + }); + + it("produces a plugin that can execute through the engine", async () => { + const { plugin } = buildBuiltinPlugin(); + const report = await executePlugins([plugin], makeCtx()); + expect(report.signals.length).toBeGreaterThan(0); + expect(report.pluginChain).toEqual(["builtin"]); + expect(report.grade).toBeDefined(); + }); +}); + +describe("loadPluginChain", () => { + it("always includes builtin as the first plugin", async () => { + const chain = await loadPluginChain([]); + expect(chain.plugins.length).toBe(1); + expect(chain.plugins[0].meta.name).toBe("builtin"); + expect(chain.passRateThreshold).toBe(0.8); + }); + + it("returns empty disabledRuleIds when no policies loaded", async () => { + const chain = await loadPluginChain([]); + expect(chain.options.disabledRuleIds).toBeUndefined(); + }); +}); + +describe("loadPluginChain with JSON policy file", () => { + let tmpDir: string; + + beforeEach(async () => { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "primer-loader-")); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + it("loads a JSON policy and returns 2-plugin chain with policy following builtin", async () => { + const policyPath = path.join(tmpDir, "test-policy.json"); + await fs.writeFile( + policyPath, + JSON.stringify({ name: "test-policy", criteria: { disable: [] } }) + ); + + const chain = await loadPluginChain([policyPath]); + expect(chain.plugins).toHaveLength(2); + expect(chain.plugins[0].meta.name).toBe("builtin"); + expect(chain.plugins[1].meta.name).toBe("test-policy"); + expect(chain.plugins[1].meta.trust).toBe("safe-declarative"); + }); + + it("merges disabledRuleIds from policy criteria.disable", async () => { + const policyPath = path.join(tmpDir, "disable-policy.json"); + await fs.writeFile( + policyPath, + JSON.stringify({ name: "disable-policy", criteria: { disable: ["lint-config", "readme"] } }) + ); + + const chain = await loadPluginChain([policyPath]); + expect(chain.options.disabledRuleIds).toBeDefined(); + expect(chain.options.disabledRuleIds).toContain("lint-config"); + expect(chain.options.disabledRuleIds).toContain("readme"); + }); + + it("picks up passRateThreshold from policy thresholds field", async () => { + const policyPath = path.join(tmpDir, "threshold-policy.json"); + await fs.writeFile( + policyPath, + JSON.stringify({ name: "strict", thresholds: { passRate: 0.95 } }) + ); + + const chain = await loadPluginChain([policyPath]); + expect(chain.passRateThreshold).toBe(0.95); + }); + + it("accepts a safe-declarative policy when jsonOnly is true", async () => { + const policyPath = path.join(tmpDir, "bad-policy.json"); + // compilePolicyConfig with jsonOnly:true rejects policies that declare import sources + // Write a structurally-invalid policy so loadPolicy raises at parse time + await fs.writeFile(policyPath, JSON.stringify({ name: "bad", criteria: { disable: [] } })); + + // jsonOnly flag is set when policySources comes from config (not CLI), but the + // file-based path always resolves to safe-declarative trust — load should succeed + const chain = await loadPluginChain([policyPath], { jsonOnly: true }); + expect(chain.plugins[1].meta.trust).toBe("safe-declarative"); + }); +}); diff --git a/src/services/__tests__/policy-shadow.test.ts b/src/services/__tests__/policy-shadow.test.ts new file mode 100644 index 0000000..02bf8ca --- /dev/null +++ b/src/services/__tests__/policy-shadow.test.ts @@ -0,0 +1,402 @@ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; + +import { afterEach, beforeEach, describe, expect, it } from "vitest"; + +import { compareShadow, writeShadowLog } from "../policy/shadow"; +import type { EngineReport } from "../policy/types"; +import type { ReadinessReport, ReadinessCriterionResult } from "../readiness"; + +function makeLegacyReport(criteria: ReadinessCriterionResult[] = []): ReadinessReport { + return { + repoPath: "/tmp/test", + generatedAt: "2025-01-01T00:00:00.000Z", + isMonorepo: false, + apps: [], + pillars: [], + levels: [], + achievedLevel: 0, + criteria, + extras: [] + }; +} + +function makeEngineReport(overrides: Partial = {}): EngineReport { + return { + signals: [], + recommendations: [], + policyWarnings: [], + score: 1, + grade: "A", + pluginChain: ["builtin"], + ...overrides + }; +} + +function makeCriterion(id: string, status: "pass" | "fail" | "skip"): ReadinessCriterionResult { + return { + id, + title: `Criterion ${id}`, + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + status + }; +} + +describe("compareShadow", () => { + it("returns legacy report by default", () => { + const legacy = makeLegacyReport(); + const engine = makeEngineReport(); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + expect(result.usedNewEngine).toBe(false); + expect(result.report).toBe(legacy); + }); + + it("returns new engine report when useNewEngine is true", () => { + const legacy = makeLegacyReport(); + const engine = makeEngineReport(); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test", useNewEngine: true }); + expect(result.usedNewEngine).toBe(true); + expect(result.report).not.toBe(legacy); + expect(result.report.repoPath).toBe("/tmp/test"); + }); + + it("reports no discrepancies when both engines agree", () => { + const legacy = makeLegacyReport([makeCriterion("readme", "pass")]); + const engine = makeEngineReport({ + signals: [ + { + id: "readme", + kind: "file", + status: "detected", + label: "README present", + origin: { addedBy: "builtin" }, + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + } + ] + }); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + expect(result.discrepancies).toHaveLength(0); + }); + + it("detects status discrepancy", () => { + const legacy = makeLegacyReport([makeCriterion("readme", "pass")]); + const engine = makeEngineReport({ + signals: [ + { + id: "readme", + kind: "file", + status: "detected", + label: "README present", + origin: { addedBy: "builtin" }, + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "fail" + } + } + ] + }); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + expect(result.discrepancies).toHaveLength(1); + expect(result.discrepancies[0].criterionId).toBe("readme"); + expect(result.discrepancies[0].field).toBe("status"); + expect(result.discrepancies[0].legacyValue).toBe("pass"); + expect(result.discrepancies[0].newValue).toBe("fail"); + }); + + it("detects missing criterion in new engine", () => { + const legacy = makeLegacyReport([makeCriterion("custom-thing", "pass")]); + const engine = makeEngineReport(); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + expect(result.discrepancies).toHaveLength(1); + expect(result.discrepancies[0].field).toBe("presence"); + expect(result.discrepancies[0].newValue).toBe("missing"); + }); + + it("detects extra criterion in new engine", () => { + const legacy = makeLegacyReport(); + const engine = makeEngineReport({ + signals: [ + { + id: "new-criterion", + kind: "file", + status: "detected", + label: "New", + origin: { addedBy: "builtin" }, + metadata: { + pillar: "testing", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + } + ] + }); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + expect(result.discrepancies).toHaveLength(1); + expect(result.discrepancies[0].field).toBe("presence"); + expect(result.discrepancies[0].legacyValue).toBe("missing"); + }); + + it("detects pillar discrepancy", () => { + const legacy = makeLegacyReport([ + { + ...makeCriterion("readme", "pass"), + pillar: "documentation" + } + ]); + const engine = makeEngineReport({ + signals: [ + { + id: "readme", + kind: "file", + status: "detected", + label: "README present", + origin: { addedBy: "builtin" }, + metadata: { + pillar: "ai-tooling", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + } + ] + }); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + const pillarDisc = result.discrepancies.find((d) => d.field === "pillar"); + expect(pillarDisc).toBeDefined(); + expect(pillarDisc!.legacyValue).toBe("documentation"); + expect(pillarDisc!.newValue).toBe("ai-tooling"); + }); + + it("detects level discrepancy", () => { + const legacy = makeLegacyReport([ + { + ...makeCriterion("readme", "pass"), + level: 1 + } + ]); + const engine = makeEngineReport({ + signals: [ + { + id: "readme", + kind: "file", + status: "detected", + label: "README present", + origin: { addedBy: "builtin" }, + metadata: { + pillar: "documentation", + level: 3, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + } + ] + }); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + const levelDisc = result.discrepancies.find((d) => d.field === "level"); + expect(levelDisc).toBeDefined(); + expect(levelDisc!.legacyValue).toBe(1); + expect(levelDisc!.newValue).toBe(3); + }); + + it("detects impact discrepancy", () => { + const legacy = makeLegacyReport([{ ...makeCriterion("readme", "pass"), impact: "high" }]); + const engine = makeEngineReport({ + signals: [ + { + id: "readme", + kind: "file", + status: "detected", + label: "README present", + origin: { addedBy: "builtin" }, + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "medium", + effort: "low", + checkStatus: "pass" + } + } + ] + }); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + const disc = result.discrepancies.find((d) => d.field === "impact"); + expect(disc).toBeDefined(); + expect(disc!.legacyValue).toBe("high"); + expect(disc!.newValue).toBe("medium"); + }); + + it("detects effort discrepancy", () => { + const legacy = makeLegacyReport([{ ...makeCriterion("readme", "pass"), effort: "low" }]); + const engine = makeEngineReport({ + signals: [ + { + id: "readme", + kind: "file", + status: "detected", + label: "README present", + origin: { addedBy: "builtin" }, + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "high", + checkStatus: "pass" + } + } + ] + }); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + const disc = result.discrepancies.find((d) => d.field === "effort"); + expect(disc).toBeDefined(); + expect(disc!.legacyValue).toBe("low"); + expect(disc!.newValue).toBe("high"); + }); + + it("filters area-scoped legacy criteria before comparison to avoid false-positive presence discrepancies", () => { + const areaCriterion: ReadinessCriterionResult = { + ...makeCriterion("area-readme", "skip"), + scope: "area" + }; + // Legacy report has an area-scoped criterion; engine has none (engine only runs repo-scoped) + const legacy = makeLegacyReport([makeCriterion("readme", "pass"), areaCriterion]); + const engine = makeEngineReport({ + signals: [ + { + id: "readme", + kind: "file", + status: "detected", + label: "README present", + origin: { addedBy: "builtin" }, + metadata: { + pillar: "documentation", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + } + ] + }); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + // area-readme must not produce a "presence: missing" discrepancy + const presenceDiscs = result.discrepancies.filter((d) => d.field === "presence"); + expect(presenceDiscs).toHaveLength(0); + expect(result.discrepancies).toHaveLength(0); + }); + + it("asserts both values for extra criterion in new engine", () => { + const legacy = makeLegacyReport(); + const engine = makeEngineReport({ + signals: [ + { + id: "new-criterion", + kind: "file", + status: "detected", + label: "New", + origin: { addedBy: "builtin" }, + metadata: { + pillar: "testing", + level: 1, + scope: "repo", + impact: "high", + effort: "low", + checkStatus: "pass" + } + } + ] + }); + const result = compareShadow(legacy, engine, { repoPath: "/tmp/test" }); + expect(result.discrepancies).toHaveLength(1); + expect(result.discrepancies[0].legacyValue).toBe("missing"); + expect(result.discrepancies[0].newValue).toBe("exists"); + }); +}); + +describe("writeShadowLog", () => { + let tmpDir: string; + + beforeEach(async () => { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "primer-shadow-")); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + it("is a no-op when discrepancies array is empty", async () => { + await writeShadowLog(tmpDir, []); + const logPath = path.join(tmpDir, ".primer-cache", "shadow-mode.log"); + let exists = false; + try { + await fs.access(logPath); + exists = true; + } catch { + // expected — file should not be created + } + expect(exists).toBe(false); + }); + + it("creates the log file and appends discrepancy details", async () => { + const discrepancies = [ + { criterionId: "readme", field: "status", legacyValue: "pass", newValue: "fail" } + ]; + await writeShadowLog(tmpDir, discrepancies); + const logPath = path.join(tmpDir, ".primer-cache", "shadow-mode.log"); + const content = await fs.readFile(logPath, "utf-8"); + expect(content).toContain('["readme"] status'); + expect(content).toContain('"pass"'); + expect(content).toContain('"fail"'); + }); + + it("appends on successive calls (does not overwrite)", async () => { + const d = [{ criterionId: "readme", field: "status", legacyValue: "pass", newValue: "fail" }]; + await writeShadowLog(tmpDir, d); + await writeShadowLog(tmpDir, d); + const logPath = path.join(tmpDir, ".primer-cache", "shadow-mode.log"); + const content = await fs.readFile(logPath, "utf-8"); + const matches = content.match(/\["readme"\] status/g) ?? []; + expect(matches).toHaveLength(2); + }); + + it("creates the .primer-cache directory if it does not exist", async () => { + // No .primer-cache dir created — writeShadowLog must mkdir it + const discrepancies = [ + { + criterionId: "codeowners", + field: "pillar", + legacyValue: "security-governance", + newValue: "documentation" + } + ]; + await writeShadowLog(tmpDir, discrepancies); + const logPath = path.join(tmpDir, ".primer-cache", "shadow-mode.log"); + const stat = await fs.stat(logPath); + expect(stat.isFile()).toBe(true); + }); +}); diff --git a/src/services/__tests__/readiness-baseline.test.ts b/src/services/__tests__/readiness-baseline.test.ts new file mode 100644 index 0000000..121e510 --- /dev/null +++ b/src/services/__tests__/readiness-baseline.test.ts @@ -0,0 +1,211 @@ +/** + * Phase C: Characterization baselines. + * + * These tests lock the existing ReadinessReport shape, pillar/level summaries, + * and command output behavior. They serve as the parity gate before the new + * plugin engine is wired into the readiness pipeline (Phase G). + * + * If any of these fail after engine integration, the compatibility adapter + * is incorrect or incomplete. + */ +import fs from "fs/promises"; +import os from "os"; +import path from "path"; + +import { afterEach, beforeEach, describe, expect, it } from "vitest"; + +import { runReadinessReport, buildCriteria, buildExtras, groupPillars } from "../readiness"; + +describe("ReadinessReport shape baseline", () => { + let repoPath: string; + + beforeEach(async () => { + repoPath = await fs.mkdtemp(path.join(os.tmpdir(), "primer-baseline-")); + await fs.writeFile( + path.join(repoPath, "package.json"), + JSON.stringify({ name: "baseline-repo", scripts: { build: "tsc", test: "vitest" } }) + ); + }); + + afterEach(async () => { + await fs.rm(repoPath, { recursive: true, force: true }); + }); + + it("locks the top-level report fields", async () => { + const report = await runReadinessReport({ repoPath }); + const keys = Object.keys(report).sort(); + expect(keys).toEqual([ + "achievedLevel", + "apps", + "areaReports", + "criteria", + "engine", + "extras", + "generatedAt", + "isMonorepo", + "levels", + "pillars", + "policies", + "repoPath" + ]); + }); + + it("locks ReadinessCriterionResult field set", async () => { + const report = await runReadinessReport({ repoPath }); + const criterion = report.criteria[0]; + expect(criterion).toHaveProperty("id"); + expect(criterion).toHaveProperty("title"); + expect(criterion).toHaveProperty("pillar"); + expect(criterion).toHaveProperty("level"); + expect(criterion).toHaveProperty("scope"); + expect(criterion).toHaveProperty("impact"); + expect(criterion).toHaveProperty("effort"); + expect(criterion).toHaveProperty("status"); + }); + + it("locks pillar summary fields", async () => { + const report = await runReadinessReport({ repoPath }); + const pillar = report.pillars[0]; + expect(pillar).toHaveProperty("id"); + expect(pillar).toHaveProperty("name"); + expect(pillar).toHaveProperty("passed"); + expect(pillar).toHaveProperty("total"); + expect(pillar).toHaveProperty("passRate"); + }); + + it("locks level summary fields", async () => { + const report = await runReadinessReport({ repoPath }); + const level = report.levels[0]; + expect(level).toHaveProperty("level"); + expect(level).toHaveProperty("name"); + expect(level).toHaveProperty("passed"); + expect(level).toHaveProperty("total"); + expect(level).toHaveProperty("passRate"); + expect(level).toHaveProperty("achieved"); + }); + + it("locks the allowed ReadinessStatus values", async () => { + const report = await runReadinessReport({ repoPath }); + const statuses = new Set(report.criteria.map((c) => c.status)); + // Every status must be one of the 3 allowed values + for (const status of statuses) { + expect(["pass", "fail", "skip"]).toContain(status); + } + }); + + it("locks the 9 pillar IDs", async () => { + const report = await runReadinessReport({ repoPath }); + const pillarIds = report.pillars.map((p) => p.id).sort(); + expect(pillarIds).toEqual([ + "ai-tooling", + "build-system", + "code-quality", + "dev-environment", + "documentation", + "observability", + "security-governance", + "style-validation", + "testing" + ]); + }); + + it("locks the 5 maturity level names", async () => { + const report = await runReadinessReport({ repoPath }); + const levelNames = report.levels.map((l) => l.name); + expect(levelNames).toEqual([ + "Functional", + "Documented", + "Standardized", + "Optimized", + "Autonomous" + ]); + }); +}); + +describe("countStatus baseline", () => { + it("excludes skip items from total and passed counts", async () => { + const repoPath = await fs.mkdtemp(path.join(os.tmpdir(), "primer-cs-")); + await fs.writeFile(path.join(repoPath, "package.json"), JSON.stringify({ name: "count-repo" })); + + try { + const report = await runReadinessReport({ repoPath }); + // Verify skips don't inflate totals + for (const pillar of report.pillars) { + const criteria = report.criteria.filter((c) => c.pillar === pillar.id); + const nonSkip = criteria.filter((c) => c.status !== "skip"); + expect(pillar.total).toBe(nonSkip.length); + } + } finally { + await fs.rm(repoPath, { recursive: true, force: true }); + } + }); +}); + +describe("groupPillars baseline", () => { + it("groups pillars into repo-health and ai-setup", async () => { + const repoPath = await fs.mkdtemp(path.join(os.tmpdir(), "primer-gp-")); + await fs.writeFile(path.join(repoPath, "package.json"), JSON.stringify({ name: "group-repo" })); + + try { + const report = await runReadinessReport({ repoPath }); + const groups = groupPillars(report.pillars); + expect(groups).toHaveLength(2); + expect(groups[0].group).toBe("repo-health"); + expect(groups[0].label).toBe("Repo Health"); + expect(groups[1].group).toBe("ai-setup"); + expect(groups[1].label).toBe("AI Setup"); + // ai-tooling pillar is in the ai-setup group + expect(groups[1].pillars.map((p) => p.id)).toContain("ai-tooling"); + } finally { + await fs.rm(repoPath, { recursive: true, force: true }); + } + }); +}); + +describe("buildCriteria baseline", () => { + it("locks the set of built-in criterion IDs", () => { + const criteria = buildCriteria(); + const ids = criteria.map((c) => c.id).sort(); + expect(ids).toEqual([ + "area-build-script", + "area-instructions", + "area-readme", + "area-test-script", + "build-script", + "ci-config", + "codeowners", + "contributing", + "copilot-skills", + "custom-agents", + "custom-instructions", + "dependabot", + "env-example", + "format-config", + "license", + "lint-config", + "lockfile", + "mcp-config", + "observability", + "readme", + "security-policy", + "test-script", + "typecheck-config" + ]); + }); + + it("locks the impact and effort allowed values", () => { + const criteria = buildCriteria(); + for (const c of criteria) { + expect(["high", "medium", "low"]).toContain(c.impact); + expect(["low", "medium", "high"]).toContain(c.effort); + } + }); +}); + +describe("buildExtras baseline", () => { + it("locks the set of built-in extra IDs", () => { + const extras = buildExtras(); + const ids = extras.map((e) => e.id).sort(); + expect(ids).toEqual(["agents-doc", "architecture-doc", "pr-template", "pre-commit"]); + }); +}); diff --git a/src/services/policy/adapter.ts b/src/services/policy/adapter.ts new file mode 100644 index 0000000..83ee5a7 --- /dev/null +++ b/src/services/policy/adapter.ts @@ -0,0 +1,192 @@ +/** + * Phase G: Compatibility adapter. + * + * Maps `EngineReport` from the new plugin system to the legacy + * `ReadinessReport` shape so all existing surfaces (CLI, HTML, VS Code) + * continue to work without changes. + * + * Key mapping rules: + * - Signal metadata carries pillar/level/scope/impact/effort/checkStatus + * - checkStatus determines ReadinessCriterionResult.status + * - Extras are signals without pillar metadata + * - Pillar/level summaries and achievedLevel are recomputed from criteria + */ +import type { + ReadinessReport, + ReadinessCriterionResult, + ReadinessExtraResult, + ReadinessPillarSummary, + ReadinessLevelSummary, + ReadinessPillar, + ReadinessScope, + ReadinessStatus +} from "../readiness"; + +import type { EngineReport, Signal, Recommendation } from "./types"; + +const PILLAR_NAMES: Record = { + "style-validation": "Style & Validation", + "build-system": "Build System", + testing: "Testing", + documentation: "Documentation", + "dev-environment": "Dev Environment", + "code-quality": "Code Quality", + observability: "Observability", + "security-governance": "Security & Governance", + "ai-tooling": "AI Tooling" +}; + +const LEVEL_NAMES: Record = { + 1: "Functional", + 2: "Documented", + 3: "Standardized", + 4: "Optimized", + 5: "Autonomous" +}; + +type AdapterOptions = { + repoPath: string; + isMonorepo?: boolean; + apps?: Array<{ name: string; path: string }>; + passRateThreshold?: number; +}; + +/** + * Convert an EngineReport to a legacy ReadinessReport. + * + * This is the bridge that lets the new plugin engine power existing + * readiness surfaces without any surface-level changes. + */ +export function engineReportToReadiness( + report: EngineReport, + options: AdapterOptions +): ReadinessReport { + const passRateThreshold = options.passRateThreshold ?? 0.8; + const { criteria, extras } = partitionSignals(report.signals, report.recommendations); + + const pillars = summarizePillars(criteria); + const levels = summarizeLevels(criteria, passRateThreshold); + const achievedLevel = levels + .filter((l) => l.achieved) + .reduce((max, l) => Math.max(max, l.level), 0); + + return { + repoPath: options.repoPath, + generatedAt: new Date().toISOString(), + isMonorepo: options.isMonorepo ?? false, + apps: options.apps ?? [], + pillars, + levels, + achievedLevel, + criteria, + extras, + policies: { + chain: report.pluginChain as string[], + criteriaCount: criteria.length + }, + engine: { + signals: report.signals, + recommendations: report.recommendations, + policyWarnings: report.policyWarnings, + score: report.score, + grade: report.grade + } + }; +} + +/** + * Partition engine signals into legacy criteria results and extra results. + * + * A signal is treated as a "criterion" if its metadata contains `pillar`. + * Everything else is an "extra". + */ +function partitionSignals( + signals: ReadonlyArray, + _recommendations: ReadonlyArray +): { criteria: ReadinessCriterionResult[]; extras: ReadinessExtraResult[] } { + const criteria: ReadinessCriterionResult[] = []; + const extras: ReadinessExtraResult[] = []; + + for (const signal of signals) { + const meta = (signal.metadata ?? {}) as Record; + if (meta.pillar) { + criteria.push(signalToCriterion(signal, meta)); + } else { + extras.push(signalToExtra(signal, meta)); + } + } + + return { criteria, extras }; +} + +function signalToCriterion( + signal: Signal, + meta: Record +): ReadinessCriterionResult { + const checkStatus = meta.checkStatus as string | undefined; + const status: ReadinessStatus = + checkStatus === "pass" ? "pass" : checkStatus === "fail" ? "fail" : "skip"; + + return { + id: signal.id, + title: signal.label, + pillar: meta.pillar as ReadinessPillar, + level: (meta.level as number) ?? 1, + scope: (meta.scope as ReadinessScope) ?? "repo", + impact: (meta.impact as "high" | "medium" | "low") ?? "medium", + effort: (meta.effort as "low" | "medium" | "high") ?? "medium", + status, + reason: signal.reason, + evidence: signal.evidence + }; +} + +function signalToExtra(signal: Signal, meta: Record): ReadinessExtraResult { + const checkStatus = meta.checkStatus as string | undefined; + const status: ReadinessStatus = + checkStatus === "pass" ? "pass" : checkStatus === "fail" ? "fail" : "skip"; + return { + id: signal.id, + title: signal.label, + status, + reason: signal.reason + }; +} + +function summarizePillars(criteria: ReadinessCriterionResult[]): ReadinessPillarSummary[] { + return (Object.keys(PILLAR_NAMES) as ReadinessPillar[]).map((pillar) => { + const items = criteria.filter((c) => c.pillar === pillar); + const { passed, total } = countStatus(items); + return { + id: pillar, + name: PILLAR_NAMES[pillar], + passed, + total, + passRate: total ? passed / total : 0 + }; + }); +} + +function summarizeLevels( + criteria: ReadinessCriterionResult[], + passRateThreshold: number +): ReadinessLevelSummary[] { + const summaries: ReadinessLevelSummary[] = []; + for (let level = 1; level <= 5; level++) { + const items = criteria.filter((c) => c.level === level); + const { passed, total } = countStatus(items); + const passRate = total ? passed / total : 0; + summaries.push({ level, name: LEVEL_NAMES[level], passed, total, passRate, achieved: false }); + } + for (const summary of summaries) { + const allPrior = summaries.filter((s) => s.level <= summary.level); + summary.achieved = allPrior.every((s) => s.total > 0 && s.passRate >= passRateThreshold); + } + return summaries; +} + +function countStatus(items: ReadinessCriterionResult[]): { passed: number; total: number } { + const relevant = items.filter((item) => item.status !== "skip"); + const passed = relevant.filter((item) => item.status === "pass").length; + return { passed, total: relevant.length }; +} diff --git a/src/services/policy/compiler.ts b/src/services/policy/compiler.ts new file mode 100644 index 0000000..8f2b060 --- /dev/null +++ b/src/services/policy/compiler.ts @@ -0,0 +1,256 @@ +/** + * Phase E: Declarative-to-Plugin Compiler. + * + * Compiles a declarative PolicyConfig (JSON policy) into a PolicyPlugin adapter + * so that both imperative and declarative policies share the same runtime. + * + * Declarative policies can: + * - disable criteria/extras → mapped to EngineOptions.disabledRuleIds + * - override criterion metadata → mapped to afterDetect hook (SignalPatch.modify) + * - add new criteria → mapped to detectors + recommenders + * - set thresholds → returned alongside the plugin for engine-level use + */ +import type { PolicyConfig, ExtraDefinition } from "../policy"; +import type { ReadinessCriterion, ReadinessContext } from "../readiness"; + +import type { + PolicyPlugin, + Detector, + RecommendationImpact, + Recommender, + Signal, + SignalPatch, + PolicyContext +} from "./types"; + +export type CompilationResult = { + plugin: PolicyPlugin; + /** Criterion/extra IDs to disable at engine level. */ + disabledIds: string[]; + /** Pass-rate threshold from the policy (undefined if not set). */ + passRateThreshold?: number; +}; + +/** + * Compile a declarative PolicyConfig into a PolicyPlugin. + * + * The compiled plugin has trust "safe-declarative" and sourceType "json". + * It cannot contain arbitrary code — only metadata overrides and static checks. + */ +export function compilePolicyConfig( + config: PolicyConfig, + /** Base criteria used for metadata override resolution. */ + _baseCriteria: ReadonlyArray +): CompilationResult { + const disabledIds: string[] = []; + const detectors: Detector[] = []; + const recommenders: Recommender[] = []; + let afterDetect: + | ((signals: ReadonlyArray, ctx: PolicyContext) => Promise) + | undefined; + + // ── Collect disabled IDs ── + if (config.criteria?.disable?.length) { + disabledIds.push(...config.criteria.disable); + } + if (config.extras?.disable?.length) { + disabledIds.push(...config.extras.disable); + } + + // ── Build afterDetect hook for metadata overrides ── + if (config.criteria?.override && Object.keys(config.criteria.override).length > 0) { + const overrides = config.criteria.override; + afterDetect = async (signals) => { + const modifications: SignalPatch["modify"] = []; + for (const [id, changes] of Object.entries(overrides)) { + // Only modify signals that exist + const exists = signals.some((s) => s.id === id); + if (exists) { + // Map criterion metadata overrides to signal label/metadata changes + const signalChanges: Record = {}; + if (changes.title) { + signalChanges.label = changes.title; + } + // Store remaining overrides in metadata + const meta: Record = {}; + if (changes.pillar) meta.pillar = changes.pillar; + if (changes.level !== undefined) meta.level = changes.level; + if (changes.scope) meta.scope = changes.scope; + if (changes.impact) meta.impact = changes.impact; + if (changes.effort) meta.effort = changes.effort; + if (Object.keys(meta).length > 0) { + signalChanges.metadata = meta; + } + if (Object.keys(signalChanges).length > 0) { + modifications.push({ + id, + changes: signalChanges as Partial> + }); + } + } + } + return modifications.length > 0 ? { modify: modifications } : undefined; + }; + } + + // ── Build detectors + recommenders from criteria.add ── + if (config.criteria?.add?.length) { + for (const criterion of config.criteria.add) { + detectors.push(criterionToDetector(criterion)); + recommenders.push(criterionToRecommender(criterion)); + } + } + + // ── Build detectors + recommenders from extras.add ── + if (config.extras?.add?.length) { + for (const extra of config.extras.add) { + detectors.push(extraToDetector(extra)); + recommenders.push(extraToRecommender(extra)); + } + } + + const plugin: PolicyPlugin = { + meta: { + name: config.name, + version: config.version, + sourceType: "json", + trust: "safe-declarative" + }, + ...(detectors.length > 0 ? { detectors } : {}), + ...(afterDetect ? { afterDetect } : {}), + ...(recommenders.length > 0 ? { recommenders } : {}) + }; + + return { + plugin, + disabledIds, + passRateThreshold: config.thresholds?.passRate + }; +} + +function criterionToDetector(criterion: ReadinessCriterion): Detector { + return { + id: criterion.id, + kind: mapScope(criterion.scope), + detect: async (ctx) => { + const readinessCtx = policyCtxToReadinessCtx(ctx); + const result = await criterion.check(readinessCtx); + return { + id: criterion.id, + kind: mapScope(criterion.scope), + status: result.status === "skip" ? "not-detected" : "detected", + label: criterion.title, + evidence: result.evidence, + reason: result.reason, + origin: { addedBy: `compiled:${criterion.id}` }, + metadata: { + pillar: criterion.pillar, + level: criterion.level, + scope: criterion.scope, + impact: criterion.impact, + effort: criterion.effort, + checkStatus: result.status + } + }; + } + }; +} + +function criterionToRecommender(criterion: ReadinessCriterion): Recommender { + return { + id: `${criterion.id}-rec`, + recommend: async (signals) => { + const signal = signals.find((s) => s.id === criterion.id); + if (!signal) return []; + const checkStatus = (signal.metadata as Record)?.checkStatus; + if (checkStatus !== "fail") return []; + // Read impact from signal metadata at call time so afterDetect overrides + // (e.g. from a declarative policy's override block) are reflected in scoring. + const runtimeImpact = (signal.metadata as Record)?.impact as + | RecommendationImpact + | undefined; + const impact = + runtimeImpact ?? + (criterion.impact === "high" ? "high" : criterion.impact === "medium" ? "medium" : "low"); + return { + id: `${criterion.id}-fix`, + signalId: criterion.id, + impact, + message: signal.reason ?? `Fix: ${criterion.title}`, + origin: { addedBy: `compiled:${criterion.id}` } + }; + } + }; +} + +function extraToDetector(extra: ExtraDefinition): Detector { + return { + id: extra.id, + kind: "custom", + detect: async (ctx) => { + const readinessCtx = policyCtxToReadinessCtx(ctx); + const result = await extra.check(readinessCtx); + return { + id: extra.id, + kind: "custom" as const, + status: "detected" as const, + label: extra.title, + reason: result.reason, + origin: { addedBy: `compiled:${extra.id}` }, + metadata: { checkStatus: result.status } + }; + } + }; +} + +function extraToRecommender(extra: ExtraDefinition): Recommender { + return { + id: `${extra.id}-rec`, + recommend: async (signals) => { + const signal = signals.find((s) => s.id === extra.id); + if (!signal) return []; + const checkStatus = (signal.metadata as Record)?.checkStatus; + if (checkStatus !== "fail") return []; + return { + id: `${extra.id}-fix`, + signalId: extra.id, + impact: "low" as const, + message: signal.reason ?? `Fix: ${extra.title}`, + origin: { addedBy: `compiled:${extra.id}` } + }; + } + }; +} + +function mapScope(scope: string): "file" | "git" | "custom" { + switch (scope) { + case "repo": + return "file"; + case "app": + return "file"; + case "area": + return "file"; + default: + return "custom"; + } +} + +/** + * Bridge from PolicyContext to ReadinessContext. + * Used by compiled detectors to run legacy check functions. + */ +function policyCtxToReadinessCtx(ctx: PolicyContext): ReadinessContext { + return { + repoPath: ctx.repoPath, + analysis: { + path: ctx.repoPath, + isGitRepo: true, + languages: [], + frameworks: [], + isMonorepo: false + }, + apps: [], + rootFiles: ctx.rootFiles, + rootPackageJson: ctx.rootPackageJson + }; +} diff --git a/src/services/policy/engine.ts b/src/services/policy/engine.ts new file mode 100644 index 0000000..d7a600f --- /dev/null +++ b/src/services/policy/engine.ts @@ -0,0 +1,150 @@ +import type { + PolicyPlugin, + PolicyContext, + Signal, + Recommendation, + PolicyWarning, + EngineReport, + PluginStage +} from "./types"; +import { + applySignalPatch, + applyRecommendationPatch, + resolveSupersedes, + calculateScore +} from "./types"; + +export type EngineOptions = { + /** IDs of rules to skip entirely (detectors + recommenders). */ + disabledRuleIds?: Set; +}; + +/** + * Execute a chain of plugins through the deterministic pipeline: + * 1. All detectors (all plugins, source order) + * 2. afterDetect hooks (all plugins, source order) + * 3. beforeRecommend hooks (all plugins, source order) + * 4. All recommenders (all plugins, source order) + * 5. afterRecommend hooks (all plugins, source order) + * 6. Resolve supersedes + * 7. Engine-level scoring + */ +export async function executePlugins( + plugins: PolicyPlugin[], + ctx: PolicyContext, + options?: EngineOptions +): Promise { + const warnings: PolicyWarning[] = []; + const disabledIds = options?.disabledRuleIds ?? new Set(); + + // ── Stage 1: Detect ── + let signals: Signal[] = []; + for (const plugin of plugins) { + if (!plugin.detectors?.length) continue; + for (const detector of plugin.detectors) { + if (disabledIds.has(detector.id)) continue; + try { + const result = await detector.detect(ctx); + const emitted = Array.isArray(result) ? result : [result]; + signals.push(...emitted); + } catch (err) { + const cont = handleError(plugin, err, "detect", ctx, warnings); + if (!cont) break; + } + } + } + + // ── Stage 2: afterDetect hooks ── + // Hook stages (2, 3, 5) do not honor onError abort on the outer plugin loop. + // Each hook is a single call per plugin, so "abort" only applies to inner + // detector/recommender loops in stages 1 and 4. + for (const plugin of plugins) { + if (!plugin.afterDetect) continue; + try { + const patch = await plugin.afterDetect(signals, ctx); + if (patch) { + signals = applySignalPatch(signals, patch, plugin.meta.name); + } + } catch (err) { + handleError(plugin, err, "afterDetect", ctx, warnings); + } + } + + // ── Stage 3: beforeRecommend hooks ── + for (const plugin of plugins) { + if (!plugin.beforeRecommend) continue; + try { + const patch = await plugin.beforeRecommend(signals, ctx); + if (patch) { + signals = applySignalPatch(signals, patch, plugin.meta.name); + } + } catch (err) { + handleError(plugin, err, "beforeRecommend", ctx, warnings); + } + } + + // ── Stage 4: Recommend ── + let recommendations: Recommendation[] = []; + for (const plugin of plugins) { + if (!plugin.recommenders?.length) continue; + for (const recommender of plugin.recommenders) { + if (disabledIds.has(recommender.id)) continue; + try { + const result = await recommender.recommend(signals, ctx); + const emitted = Array.isArray(result) ? result : [result]; + recommendations.push(...emitted); + } catch (err) { + const cont = handleError(plugin, err, "recommend", ctx, warnings); + if (!cont) break; + } + } + } + + // ── Stage 5: afterRecommend hooks ── + for (const plugin of plugins) { + if (!plugin.afterRecommend) continue; + try { + const patch = await plugin.afterRecommend(recommendations, signals, ctx); + if (patch) { + recommendations = applyRecommendationPatch(recommendations, patch, plugin.meta.name); + } + } catch (err) { + handleError(plugin, err, "afterRecommend", ctx, warnings); + } + } + + // ── Stage 6: Resolve supersedes ── + recommendations = resolveSupersedes(recommendations); + + // ── Stage 7: Score ── + const { score, grade } = calculateScore(signals, recommendations); + + return { + signals, + recommendations, + policyWarnings: warnings, + score, + grade, + pluginChain: plugins.map((p) => p.meta.name) + }; +} + +function handleError( + plugin: PolicyPlugin, + err: unknown, + stage: PluginStage, + ctx: PolicyContext, + warnings: PolicyWarning[] +): boolean { + const error = err instanceof Error ? err : new Error(String(err)); + // Always record the warning for audit trail, even on abort + warnings.push({ + pluginName: plugin.meta.name, + stage, + message: error.message + }); + if (plugin.onError) { + return plugin.onError(error, stage, ctx); + } + return true; +} diff --git a/src/services/policy/index.ts b/src/services/policy/index.ts new file mode 100644 index 0000000..4247923 --- /dev/null +++ b/src/services/policy/index.ts @@ -0,0 +1,31 @@ +export type { + Signal, + SignalKind, + SignalStatus, + SignalPatch, + Recommendation, + RecommendationImpact, + RecommendationPatch, + PolicyWarning, + Provenance, + PolicyContext, + Detector, + Recommender, + PolicyPlugin, + PluginMeta, + PluginTrust, + PluginSourceType, + PluginStage, + EngineReport, + Grade +} from "./types"; +export { calculateScore } from "./types"; +export { executePlugins } from "./engine"; +export type { EngineOptions } from "./engine"; +export { compilePolicyConfig } from "./compiler"; +export type { CompilationResult } from "./compiler"; +export { buildBuiltinPlugin, loadPluginChain } from "./loader"; +export type { LoadedChain } from "./loader"; +export { engineReportToReadiness } from "./adapter"; +export { compareShadow, writeShadowLog } from "./shadow"; +export type { ShadowResult, ShadowDiscrepancy } from "./shadow"; diff --git a/src/services/policy/loader.ts b/src/services/policy/loader.ts new file mode 100644 index 0000000..cc01c61 --- /dev/null +++ b/src/services/policy/loader.ts @@ -0,0 +1,152 @@ +/** + * Phase F: Plugin loader and chain composition. + * + * Resolves built-in, local/npm imperative, and compiled JSON plugins + * into an ordered plugin chain. Source/load order determines execution. + * + * Loader responsibilities: + * - Build the built-in plugin from current `buildCriteria`/`buildExtras` + * - Load imperative (.ts/.js) plugins with trust "trusted-code" + * - Load declarative (.json) policies via the DSL compiler (trust "safe-declarative") + * - Aggregate disabledIds across all compiled policies into EngineOptions + * - Return the ready-to-execute plugin chain + engine options + */ +import type { PolicyConfig } from "../policy"; +import { loadPolicy } from "../policy"; +import type { ReadinessCriterion } from "../readiness"; +import { buildCriteria, buildExtras } from "../readiness"; + +import { compilePolicyConfig } from "./compiler"; +import type { CompilationResult } from "./compiler"; +import type { EngineOptions } from "./engine"; +import type { PolicyPlugin } from "./types"; + +export type LoadedChain = { + plugins: PolicyPlugin[]; + options: EngineOptions; + /** Pass-rate threshold (last policy wins). */ + passRateThreshold: number; +}; + +/** + * Build the built-in plugin from the current `buildCriteria`/`buildExtras`. + * Each criterion becomes a detector + recommender pair. + * Extras also become detector + recommender pairs. + */ +export function buildBuiltinPlugin(): { plugin: PolicyPlugin; baseCriteria: ReadinessCriterion[] } { + const baseCriteria = buildCriteria(); + const baseExtras = buildExtras(); + + // Only include repo-scoped criteria — app/area-scoped criteria need + // iteration context that the engine doesn't provide yet. + const repoCriteria = baseCriteria.filter((c) => c.scope === "repo"); + + const compiledCriteria = compilePolicyConfig( + { + name: "__builtin__", + criteria: { add: repoCriteria }, + extras: { add: baseExtras } + }, + [] + ); + + const plugin: PolicyPlugin = { + ...compiledCriteria.plugin, + meta: { + ...compiledCriteria.plugin.meta, + name: "builtin", + sourceType: "builtin", + trust: "trusted-code" + } + }; + + return { plugin, baseCriteria }; +} + +/** + * Load a chain of plugins from policy sources. + * + * @param policySources - Policy file paths or npm specifiers + * @param options - Loading options + * @returns Ready-to-execute plugin chain and engine options + */ +export async function loadPluginChain( + policySources: string[], + options?: { jsonOnly?: boolean } +): Promise { + const { plugin: builtinPlugin, baseCriteria } = buildBuiltinPlugin(); + const plugins: PolicyPlugin[] = [builtinPlugin]; + const allDisabledIds: string[] = []; + let passRateThreshold = 0.8; + + for (const source of policySources) { + const policyConfig: PolicyConfig = await loadPolicy(source, { + jsonOnly: options?.jsonOnly + }); + + // Check if this is a module policy (imperative plugin) with code-level hooks + if (isImperativePlugin(policyConfig)) { + // Module policies: wrap as trusted-code plugin + const { plugin: imperativePlugin, compiled } = wrapImperativePolicy( + policyConfig, + baseCriteria + ); + plugins.push(imperativePlugin); + allDisabledIds.push(...compiled.disabledIds); + if (compiled.passRateThreshold !== undefined) { + passRateThreshold = compiled.passRateThreshold; + } + } else { + // Declarative JSON policies: compile to safe-declarative plugin + const compiled: CompilationResult = compilePolicyConfig(policyConfig, baseCriteria); + plugins.push(compiled.plugin); + allDisabledIds.push(...compiled.disabledIds); + if (compiled.passRateThreshold !== undefined) { + passRateThreshold = compiled.passRateThreshold; + } + } + } + + return { + plugins, + options: { + disabledRuleIds: allDisabledIds.length > 0 ? new Set(allDisabledIds) : undefined + }, + passRateThreshold + }; +} + +/** + * Detect if a PolicyConfig contains imperative code. + * + * Module-sourced policies may contain check functions (criteria.add/extras.add) + * which cannot exist in JSON policies. Any policy with add entries + * is treated as imperative; policies with only disable/override are + * purely declarative regardless of source format. + */ +function isImperativePlugin(config: PolicyConfig): boolean { + const hasAddedCriteria = Boolean(config.criteria?.add?.length); + const hasAddedExtras = Boolean(config.extras?.add?.length); + return hasAddedCriteria || hasAddedExtras; +} + +/** + * Wrap a module-sourced PolicyConfig as a trusted-code plugin. + * Uses the compiler for the heavy lifting, then overrides the trust tier. + * Also propagates disabledIds and passRateThreshold from the module policy. + */ +function wrapImperativePolicy( + config: PolicyConfig, + baseCriteria: ReadonlyArray +): { plugin: PolicyPlugin; compiled: CompilationResult } { + const compiled = compilePolicyConfig(config, baseCriteria); + const plugin: PolicyPlugin = { + ...compiled.plugin, + meta: { + ...compiled.plugin.meta, + sourceType: "module", + trust: "trusted-code" + } + }; + return { plugin, compiled }; +} diff --git a/src/services/policy/shadow.ts b/src/services/policy/shadow.ts new file mode 100644 index 0000000..6cca78e --- /dev/null +++ b/src/services/policy/shadow.ts @@ -0,0 +1,192 @@ +/** + * Phase H: Shadow mode and parity gating. + * + * Runs the new plugin engine alongside the legacy readiness system, + * compares outputs, and logs discrepancies. This lets us validate that + * the new engine produces equivalent results before switching the default. + * + * Key design decisions: + * - Legacy and new engine share the same `ReadinessContext` (no duplicate I/O). + * - Discrepancies are logged to `.primer-cache/shadow-mode.log`, not stderr. + * - The function returns the legacy result by default; callers opt into + * the new engine via `useNewEngine: true`. + */ +import fs from "fs/promises"; +import path from "path"; + +import { validateCachePath } from "../../utils/fs"; +import type { ReadinessReport, ReadinessCriterionResult } from "../readiness"; + +import { engineReportToReadiness } from "./adapter"; +import type { EngineReport } from "./types"; + +export type ShadowResult = { + /** The report that should be used by the caller. */ + report: ReadinessReport; + /** Whether the new engine was used as the primary result source. */ + usedNewEngine: boolean; + /** Discrepancies found between legacy and new engine outputs. */ + discrepancies: ShadowDiscrepancy[]; +}; + +export type ShadowDiscrepancy = { + criterionId: string; + field: string; + legacyValue: unknown; + newValue: unknown; +}; + +/** + * Compare a legacy ReadinessReport with a new-engine EngineReport and + * record discrepancies. + * + * @returns The chosen report and any discrepancies found. + */ +export function compareShadow( + legacyReport: ReadinessReport, + engineReport: EngineReport, + options: { + repoPath: string; + passRateThreshold?: number; + useNewEngine?: boolean; + } +): ShadowResult { + const newReport = engineReportToReadiness(engineReport, { + repoPath: options.repoPath, + isMonorepo: legacyReport.isMonorepo, + apps: legacyReport.apps, + passRateThreshold: options.passRateThreshold + }); + + // Pre-filter legacy criteria to repo-scope only: the engine's built-in plugin only + // runs repo-scoped criteria, so area/app-scoped entries would produce false-positive + // "presence: missing" discrepancies on every comparison. + const legacyRepoCriteria = legacyReport.criteria.filter((c) => c.scope === "repo"); + const discrepancies = diffCriteria(legacyRepoCriteria, newReport.criteria); + + return { + report: options.useNewEngine ? newReport : legacyReport, + usedNewEngine: options.useNewEngine ?? false, + discrepancies + }; +} + +/** + * Append shadow-mode discrepancies to `.primer-cache/shadow-mode.log`. + */ +export async function writeShadowLog( + repoPath: string, + discrepancies: ShadowDiscrepancy[] +): Promise { + if (discrepancies.length === 0) return; + + const lines = [ + `Shadow mode comparison — ${new Date().toISOString()}`, + `Discrepancies: ${discrepancies.length}`, + "", + ...discrepancies.map( + (d) => + `[${JSON.stringify(d.criterionId)}] ${d.field}: legacy=${JSON.stringify(d.legacyValue)} new=${JSON.stringify(d.newValue)}` + ), + "" + ]; + + const cacheDir = path.join(repoPath, ".primer-cache"); + const logPath = validateCachePath(cacheDir, "shadow-mode.log"); + await fs.mkdir(path.dirname(logPath), { recursive: true }); + await fs.appendFile(logPath, lines.join("\n") + "\n"); +} + +/** + * Diff criteria between legacy and new engine outputs. + * Compares id, status, pillar, level, impact, effort, and scope fields. + */ +function diffCriteria( + legacy: ReadinessCriterionResult[], + newCriteria: ReadinessCriterionResult[] +): ShadowDiscrepancy[] { + const discrepancies: ShadowDiscrepancy[] = []; + const newById = new Map(newCriteria.map((c) => [c.id, c])); + + for (const legacyCriterion of legacy) { + const newCriterion = newById.get(legacyCriterion.id); + if (!newCriterion) { + discrepancies.push({ + criterionId: legacyCriterion.id, + field: "presence", + legacyValue: "exists", + newValue: "missing" + }); + continue; + } + + if (legacyCriterion.status !== newCriterion.status) { + discrepancies.push({ + criterionId: legacyCriterion.id, + field: "status", + legacyValue: legacyCriterion.status, + newValue: newCriterion.status + }); + } + + if (legacyCriterion.pillar !== newCriterion.pillar) { + discrepancies.push({ + criterionId: legacyCriterion.id, + field: "pillar", + legacyValue: legacyCriterion.pillar, + newValue: newCriterion.pillar + }); + } + + if (legacyCriterion.level !== newCriterion.level) { + discrepancies.push({ + criterionId: legacyCriterion.id, + field: "level", + legacyValue: legacyCriterion.level, + newValue: newCriterion.level + }); + } + + if (legacyCriterion.impact !== newCriterion.impact) { + discrepancies.push({ + criterionId: legacyCriterion.id, + field: "impact", + legacyValue: legacyCriterion.impact, + newValue: newCriterion.impact + }); + } + + if (legacyCriterion.effort !== newCriterion.effort) { + discrepancies.push({ + criterionId: legacyCriterion.id, + field: "effort", + legacyValue: legacyCriterion.effort, + newValue: newCriterion.effort + }); + } + + if (legacyCriterion.scope !== newCriterion.scope) { + discrepancies.push({ + criterionId: legacyCriterion.id, + field: "scope", + legacyValue: legacyCriterion.scope, + newValue: newCriterion.scope + }); + } + } + + // Check for criteria in new engine not present in legacy + const legacyIds = new Set(legacy.map((c) => c.id)); + for (const newCriterion of newCriteria) { + if (!legacyIds.has(newCriterion.id)) { + discrepancies.push({ + criterionId: newCriterion.id, + field: "presence", + legacyValue: "missing", + newValue: "exists" + }); + } + } + + return discrepancies; +} diff --git a/src/services/policy/types.ts b/src/services/policy/types.ts new file mode 100644 index 0000000..2746655 --- /dev/null +++ b/src/services/policy/types.ts @@ -0,0 +1,343 @@ +// ─── Signal & Recommendation Types ─── +// Core types for the unified plugin policy system. +// Both imperative hook plugins and declarative JSON policies compile to +// the same runtime contract via these types. + +/** Classification of what a signal detects. */ +export type SignalKind = "file" | "setting" | "mcp-server" | "model-config" | "git" | "custom"; + +/** Result status of a signal detection. */ +export type SignalStatus = "detected" | "not-detected" | "error"; + +/** Tracks which plugin created or modified a signal/recommendation. */ +export type Provenance = { + addedBy: string; + modifiedBy?: string[]; +}; + +/** A single detection emitted by a detector. */ +export type Signal = { + id: string; + kind: SignalKind; + status: SignalStatus; + label: string; + evidence?: string[]; + reason?: string; + origin: Provenance; + metadata?: Record; +}; + +/** Impact level for a recommendation. */ +export type RecommendationImpact = "critical" | "high" | "medium" | "low" | "info"; + +/** An actionable recommendation derived from signals. */ +export type Recommendation = { + id: string; + signalId: string; + impact: RecommendationImpact; + message: string; + origin: Provenance; + supersedes?: string[]; + metadata?: Record; +}; + +/** A warning emitted during policy execution (non-fatal). */ +export type PolicyWarning = { + pluginName: string; + stage: PluginStage; + message: string; +}; + +// ─── Patch types for immutable hook returns ─── + +export type SignalPatch = { + add?: Signal[]; + remove?: string[]; + modify?: Array<{ id: string; changes: Partial> }>; +}; + +export type RecommendationPatch = { + add?: Recommendation[]; + remove?: string[]; + modify?: Array<{ id: string; changes: Partial> }>; +}; + +// ─── Plugin lifecycle ─── + +export type PluginStage = + | "detect" + | "afterDetect" + | "beforeRecommend" + | "recommend" + | "afterRecommend"; + +/** Read-only context available to all plugin lifecycle stages. */ +export type PolicyContext = { + repoPath: string; + rootFiles: string[]; + rootPackageJson?: Record; + /** Shared key-value cache scoped to a single engine run. */ + cache: Map; +}; + +/** A detector emits signals about the state of a repository. */ +export type Detector = { + id: string; + kind: SignalKind; + detect: (ctx: PolicyContext) => Promise; +}; + +/** A recommender emits actionable recommendations based on signals. */ +export type Recommender = { + id: string; + recommend: ( + signals: ReadonlyArray, + ctx: PolicyContext + ) => Promise; +}; + +/** Trust tier determines what a plugin is allowed to do. */ +export type PluginTrust = "trusted-code" | "safe-declarative"; + +/** Source type of the plugin. */ +export type PluginSourceType = "module" | "json" | "builtin"; + +/** Metadata describing a plugin. */ +export type PluginMeta = { + name: string; + version?: string; + /** Semver range of engine versions this plugin is compatible with. */ + engine?: string; + /** Capabilities this plugin implements (e.g. "detect", "recommend", "hook"). */ + capabilities?: string[]; + sourceType: PluginSourceType; + trust: PluginTrust; +}; + +/** + * The canonical plugin contract. + * Both imperative module plugins and compiled JSON policies implement this. + * All hook stages are optional — plugins only implement what they need. + */ +export type PolicyPlugin = { + meta: PluginMeta; + + /** Detectors that emit signals about repository state. */ + detectors?: Detector[]; + + /** Called after all detectors run. Returns a patch to mutate signals. */ + afterDetect?: ( + signals: ReadonlyArray, + ctx: PolicyContext + ) => Promise; + + /** Called before recommenders run. Returns a patch to mutate signals. */ + beforeRecommend?: ( + signals: ReadonlyArray, + ctx: PolicyContext + ) => Promise; + + /** Recommenders that emit actionable recommendations. */ + recommenders?: Recommender[]; + + /** Called after all recommenders run. Returns a patch to mutate recommendations. */ + afterRecommend?: ( + recommendations: ReadonlyArray, + signals: ReadonlyArray, + ctx: PolicyContext + ) => Promise; + + /** Per-plugin error handler. Return true to continue remaining detectors/recommenders for this plugin, false to abort them. Does not affect other plugins in the chain. Note: return value is ignored for hook stages (afterDetect, beforeRecommend, afterRecommend); only effective in detect/recommend loops. */ + onError?: (error: Error, stage: PluginStage, ctx: PolicyContext) => boolean; +}; + +// ─── Engine output ─── + +/** Grade label for a readiness score. */ +export type Grade = "A" | "B" | "C" | "D" | "F"; + +/** Complete output from the plugin engine. */ +export type EngineReport = { + readonly signals: ReadonlyArray; + readonly recommendations: ReadonlyArray; + readonly policyWarnings: ReadonlyArray; + readonly score: number; + readonly grade: Grade; + readonly pluginChain: ReadonlyArray; +}; + +// ─── Scoring ─── + +const IMPACT_WEIGHTS: Record = { + critical: 5, + high: 4, + medium: 3, + low: 2, + info: 0 +}; + +/** + * Engine-level scoring reducer. + * Score = 1 - (weighted unresolved recommendations / max possible weight). + * Max weight per signal is "critical" (5) — a single critical recommendation + * against one signal will produce score 0. This is intentional: critical + * findings are designed to dominate the score. + */ +export function calculateScore( + signals: ReadonlyArray, + recommendations: ReadonlyArray +): { score: number; grade: Grade } { + // Exclude not-detected (skipped/non-applicable) signals from scoring denominator. + // Including them would inflate maxWeight and artificially boost scores for repos + // with many non-applicable criteria. + const activeSignals = signals.filter((s) => s.status !== "not-detected"); + if (activeSignals.length === 0) { + return { score: 1, grade: "A" }; + } + + const maxWeight = activeSignals.length * IMPACT_WEIGHTS.critical; + + const deductions = recommendations.reduce((sum, rec) => sum + IMPACT_WEIGHTS[rec.impact], 0); + + const score = Math.max(0, Math.min(1, 1 - deductions / maxWeight)); + return { score, grade: scoreToGrade(score) }; +} + +function scoreToGrade(score: number): Grade { + if (score >= 0.9) return "A"; + if (score >= 0.8) return "B"; + if (score >= 0.7) return "C"; + if (score >= 0.6) return "D"; + return "F"; +} + +// ─── Patch application ─── + +/** Apply a SignalPatch to a list of signals, recording provenance. */ +export function applySignalPatch( + signals: Signal[], + patch: SignalPatch, + pluginName: string +): Signal[] { + let result = [...signals]; + + if (patch.remove?.length) { + const removeSet = new Set(patch.remove); + result = result.filter((s) => !removeSet.has(s.id)); + } + + if (patch.modify?.length) { + for (const mod of patch.modify) { + const idx = result.findIndex((s) => s.id === mod.id); + if (idx >= 0) { + const existing = result[idx]; + const changes = { ...mod.changes }; + // Deep-merge metadata to avoid wiping existing fields (e.g. checkStatus) + if (changes.metadata && existing.metadata) { + changes.metadata = { ...existing.metadata, ...changes.metadata }; + } + result[idx] = { + ...existing, + ...changes, + origin: { + ...existing.origin, + modifiedBy: [...(existing.origin.modifiedBy ?? []), pluginName] + } + }; + } + } + } + + if (patch.add?.length) { + result.push( + ...patch.add.map((s) => ({ + ...s, + evidence: s.evidence ? [...s.evidence] : undefined, + metadata: s.metadata ? { ...s.metadata } : undefined + })) + ); + } + + return result; +} + +/** Apply a RecommendationPatch to a list of recommendations, recording provenance. */ +export function applyRecommendationPatch( + recommendations: Recommendation[], + patch: RecommendationPatch, + pluginName: string +): Recommendation[] { + let result = [...recommendations]; + + if (patch.remove?.length) { + const removeSet = new Set(patch.remove); + result = result.filter((r) => !removeSet.has(r.id)); + } + + if (patch.modify?.length) { + for (const mod of patch.modify) { + const idx = result.findIndex((r) => r.id === mod.id); + if (idx >= 0) { + const existing = result[idx]; + result[idx] = { + ...existing, + ...mod.changes, + origin: { + ...existing.origin, + modifiedBy: [...(existing.origin.modifiedBy ?? []), pluginName] + } + }; + } + } + } + + if (patch.add?.length) { + result.push( + ...patch.add.map((r) => ({ + ...r, + supersedes: r.supersedes ? [...r.supersedes] : undefined, + metadata: r.metadata ? { ...r.metadata } : undefined + })) + ); + } + + return result; +} + +/** + * Resolve supersedes: remove recommendations that are superseded by others. + * Records provenance on the superseding recommendation. + * Circular supersedes chains result in all involved recommendations being dropped. + */ +export function resolveSupersedes(recommendations: Recommendation[]): Recommendation[] { + const supersededIds = new Set(); + const recIds = new Set(recommendations.map((r) => r.id)); + for (const rec of recommendations) { + if (rec.supersedes?.length) { + for (const id of rec.supersedes) { + // Only supersede IDs that actually exist in the list + if (recIds.has(id)) { + supersededIds.add(id); + } + } + } + } + return recommendations + .filter((r) => !supersededIds.has(r.id)) + .map((r) => { + if (!r.supersedes?.length) return r; + // Record which recommendations were actually superseded + const actuallySuperseded = r.supersedes.filter((id) => supersededIds.has(id)); + if (actuallySuperseded.length === 0) return r; + return { + ...r, + origin: { + ...r.origin, + modifiedBy: [ + ...(r.origin.modifiedBy ?? []), + ...actuallySuperseded.map((id) => `superseded:${id}`) + ] + } + }; + }); +} diff --git a/src/services/readiness.ts b/src/services/readiness.ts index d069988..7cfec63 100644 --- a/src/services/readiness.ts +++ b/src/services/readiness.ts @@ -7,6 +7,9 @@ import type { RepoApp, RepoAnalysis, Area } from "./analyzer"; import { analyzeRepo, sanitizeAreaName, loadPrimerConfig } from "./analyzer"; import type { ExtraDefinition, PolicyConfig } from "./policy"; import { loadPolicy, resolveChain } from "./policy"; +import { executePlugins } from "./policy/engine"; +import { loadPluginChain } from "./policy/loader"; +import type { Grade, PolicyContext, PolicyWarning, Recommendation, Signal } from "./policy/types"; export type ReadinessPillar = | "style-validation" @@ -113,6 +116,14 @@ export type ReadinessReport = { extras: ReadinessExtraResult[]; areaReports?: AreaReadinessReport[]; policies?: { chain: string[]; criteriaCount: number }; + /** New plugin engine data (populated when using the unified engine). */ + engine?: { + signals: ReadonlyArray; + recommendations: ReadonlyArray; + policyWarnings: ReadonlyArray; + score: number; + grade: Grade; + }; }; type ReadinessOptions = { @@ -120,6 +131,8 @@ type ReadinessOptions = { includeExtras?: boolean; perArea?: boolean; policies?: string[]; + /** Run the plugin engine alongside the legacy path and populate report.engine. */ + shadow?: boolean; }; export type ReadinessContext = { @@ -166,11 +179,15 @@ export async function runReadinessReport(options: ReadinessOptions): Promise Date: Sun, 22 Feb 2026 15:27:38 -0800 Subject: [PATCH 75/84] Build extension cross-platform on release and update deps --- .github/workflows/release-please.yml | 36 +- package-lock.json | 620 +++++++++++++++------------ package.json | 2 +- vscode-extension/package-lock.json | 100 +++-- vscode-extension/package.json | 2 +- 5 files changed, 436 insertions(+), 324 deletions(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 2b4eaed..713f1ed 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -22,11 +22,41 @@ jobs: config-file: release-please-config.json manifest-file: release-please-manifest.json + build-extension-cross-platform: + name: Build Extension (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + needs: release-please + if: ${{ needs.release-please.outputs.release_created == 'true' }} + permissions: + contents: read + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: | + package-lock.json + vscode-extension/package-lock.json + - run: npm ci --ignore-scripts + - run: npm ci + working-directory: vscode-extension + - name: Typecheck extension + run: npx tsc --noEmit + working-directory: vscode-extension + - name: Build extension + run: node esbuild.mjs --production + working-directory: vscode-extension + package-extension: name: Package Extension runs-on: ubuntu-latest - needs: release-please - if: ${{ needs.release-please.outputs.release_created }} + needs: [release-please, build-extension-cross-platform] + if: ${{ needs.release-please.outputs.release_created == 'true' && needs.build-extension-cross-platform.result == 'success' }} permissions: contents: write steps: @@ -50,4 +80,4 @@ jobs: - name: Upload VSIX to release env: GH_TOKEN: ${{ github.token }} - run: gh release upload ${{ needs.release-please.outputs.tag_name }} vscode-extension/*.vsix + run: gh release upload --clobber ${{ needs.release-please.outputs.tag_name }} vscode-extension/*.vsix diff --git a/package-lock.json b/package-lock.json index f34a6a6..5c160f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "primer", "version": "1.0.0", - "license": "ISC", + "license": "MIT", "dependencies": { "@github/copilot-sdk": "^0.1.24", "@inquirer/prompts": "^8.2.1", @@ -602,6 +602,13 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -614,9 +621,9 @@ } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "license": "ISC", "dependencies": { @@ -676,6 +683,13 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -711,9 +725,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "license": "ISC", "dependencies": { @@ -724,9 +738,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", "dev": true, "license": "MIT", "engines": { @@ -761,26 +775,26 @@ } }, "node_modules/@github/copilot": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.409.tgz", - "integrity": "sha512-rkYWOKjTSuGg99KsgmA0QAP4X2cpJzAYk6lZDlVxKPhuLP03wC5E+jLctrSLjpxhX32p9n13rm1+7Jun80a1hw==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.411.tgz", + "integrity": "sha512-I3/7gw40Iu1O+kTyNPKJHNqDRyOebjsUW6wJsvSVrOpT0TNa3/lfm8xdS2XUuJWkp+PgEG/PRwF7u3DVNdP7bQ==", "license": "SEE LICENSE IN LICENSE.md", "bin": { "copilot": "npm-loader.js" }, "optionalDependencies": { - "@github/copilot-darwin-arm64": "0.0.409", - "@github/copilot-darwin-x64": "0.0.409", - "@github/copilot-linux-arm64": "0.0.409", - "@github/copilot-linux-x64": "0.0.409", - "@github/copilot-win32-arm64": "0.0.409", - "@github/copilot-win32-x64": "0.0.409" + "@github/copilot-darwin-arm64": "0.0.411", + "@github/copilot-darwin-x64": "0.0.411", + "@github/copilot-linux-arm64": "0.0.411", + "@github/copilot-linux-x64": "0.0.411", + "@github/copilot-win32-arm64": "0.0.411", + "@github/copilot-win32-x64": "0.0.411" } }, "node_modules/@github/copilot-darwin-arm64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.409.tgz", - "integrity": "sha512-yjrrp++UNNvRoWsZ1+UioBqb3DEVxL5M5ePnMO5/Sf1sngxh0y5P9P6ePFZU4PVlM5BgC38DtrcauZaKf/oArQ==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.411.tgz", + "integrity": "sha512-dtr+iHxTS4f8HlV2JT9Fp0FFoxuiPWCnU3XGmrHK+rY6bX5okPC2daU5idvs77WKUGcH8yHTZtfbKYUiMxKosw==", "cpu": [ "arm64" ], @@ -794,9 +808,9 @@ } }, "node_modules/@github/copilot-darwin-x64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.409.tgz", - "integrity": "sha512-EhLfY5DGU/BZmwjVcfnwKuJA7BxS9zdNCGeynUq7z/SI93ziastFqOddUX4D+ySz6yMrrXieN8cUKgzAlRCOJg==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.411.tgz", + "integrity": "sha512-zhdbQCbPi1L4iHClackSLx8POfklA+NX9RQLuS48HlKi/0KI/JlaDA/bdbIeMR79wjif5t9gnc/m+RTVmHlRtA==", "cpu": [ "x64" ], @@ -810,9 +824,9 @@ } }, "node_modules/@github/copilot-linux-arm64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.409.tgz", - "integrity": "sha512-O7b/9LmBO8ljPqNngonx+v5d3cOs6HKvj2E9f5/Flb9Uw2lut7g6KGerfDYCMZUpvFCMDfbZSBJD3SDuJj1uPg==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.411.tgz", + "integrity": "sha512-oZYZ7oX/7O+jzdTUcHkfD1A8YnNRW6mlUgdPjUg+5rXC43bwIdyatAnc0ObY21m9h8ghxGqholoLhm5WnGv1LQ==", "cpu": [ "arm64" ], @@ -826,9 +840,9 @@ } }, "node_modules/@github/copilot-linux-x64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.409.tgz", - "integrity": "sha512-zSfFqyPxNaBE5/ClrSjsKxhhTpJaVOqSJY0q87iV9fw6xwdzcJ1/FlZGKjE7W8YVb4tdJx+OBMjQCU8WYewF1A==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.411.tgz", + "integrity": "sha512-nnXrKANmmGnkwa3ROlKdAhVNOx8daeMSE8Xh0o3ybKckFv4s38blhKdcxs0RJQRxgAk4p7XXGlDDKNRhurqF1g==", "cpu": [ "x64" ], @@ -842,12 +856,12 @@ } }, "node_modules/@github/copilot-sdk": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.24.tgz", - "integrity": "sha512-BkP4OCrB8zFYS77JhzbAfB9xCzpUN6h2XTUsWQJaTR2xSvyBdXulrpXaeF2P2tOE5R4/sozDpjRtPgwz0v8V5Q==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.25.tgz", + "integrity": "sha512-hIgYLPXzWw9bNgrsD5BLKmgVH20ow5Or5UyVXfVe3YgeiaTgFxC4jWSAVHLGB6ufHZUrvbjppcq2dWK63FmDRA==", "license": "MIT", "dependencies": { - "@github/copilot": "^0.0.409", + "@github/copilot": "^0.0.411", "vscode-jsonrpc": "^8.2.1", "zod": "^4.3.6" }, @@ -856,9 +870,9 @@ } }, "node_modules/@github/copilot-win32-arm64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.409.tgz", - "integrity": "sha512-VizZsdK7L3ym/OR4wahiFx+6hFtaOYN9qvsHmNSo8pb65AZ6ORdRnCPE7w9ZejMpdNEa6x6WqHfxDKJlF85zyA==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.411.tgz", + "integrity": "sha512-h+Bovb2YVCQSeELZOO7zxv8uht45XHcvAkFbRsc1gf9dl109sSUJIcB4KAhs8Aznk28qksxz7kvdSgUWyQBlIA==", "cpu": [ "arm64" ], @@ -872,9 +886,9 @@ } }, "node_modules/@github/copilot-win32-x64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.409.tgz", - "integrity": "sha512-c6dP3XRFk550PmH1Vxe7n/bStNSLnVGH5B+ErUKXk/SPqmZ59pyoa7H2USNdoC6Nav5tkwYYR1vwNZRy+iKvrA==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.411.tgz", + "integrity": "sha512-xmOgi1lGvUBHQJWmq5AK1EP95+Y8xR4TFoK9OCSOaGbQ+LFcX2jF7iavnMolfWwddabew/AMQjsEHlXvbgMG8Q==", "cpu": [ "x64" ], @@ -949,13 +963,13 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.0.6.tgz", - "integrity": "sha512-qLZ1gOpsqsieB5k98GQ9bWYggvMsCXTc7HUwhEQpTsxFQYGthqR9UysCwqB7L9h47THYdXhJegnYb1IqURMjng==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.1.0.tgz", + "integrity": "sha512-/HjF1LN0a1h4/OFsbGKHNDtWICFU/dqXCdym719HFTyJo9IG7Otr+ziGWc9S0iQuohRZllh+WprSgd5UW5Fw0g==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, @@ -972,12 +986,12 @@ } }, "node_modules/@inquirer/confirm": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.6.tgz", - "integrity": "sha512-9ZkrGYiWnOKQPc3xfLIORE3lZW1qvtgRoJcoqopr5zssBn7yk4yONmzGynEOjc16FnUXzkAejj/I29BbfcoUfQ==", + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.8.tgz", + "integrity": "sha512-Di6dgmiZ9xCSUxWUReWTqDtbhXCuG2MQm2xmgSAIruzQzBqNf49b8E07/vbCYY506kDe8BiwJbegXweG8M1klw==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "engines": { @@ -993,9 +1007,9 @@ } }, "node_modules/@inquirer/core": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.3.tgz", - "integrity": "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.5.tgz", + "integrity": "sha512-QQPAX+lka8GyLcZ7u7Nb1h6q72iZ/oy0blilC3IB2nSt1Qqxp7akt94Jqhi/DzARuN3Eo9QwJRvtl4tmVe4T5A==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.3", @@ -1019,12 +1033,12 @@ } }, "node_modules/@inquirer/editor": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.0.6.tgz", - "integrity": "sha512-dxTi/TB29NaW18u0pQl3B140695izGUMzr340a4Yhxll3oa0/iwxl6C88sX9LDUPFaaM4FDASEMnLm8XVk2VVg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.0.8.tgz", + "integrity": "sha512-sLcpbb9B3XqUEGrj1N66KwhDhEckzZ4nI/W6SvLXyBX8Wic3LDLENlWRvkOGpCPoserabe+MxQkpiMoI8irvyA==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/external-editor": "^2.0.3", "@inquirer/type": "^4.0.3" }, @@ -1041,12 +1055,12 @@ } }, "node_modules/@inquirer/expand": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.6.tgz", - "integrity": "sha512-HmgMzFdMk/gmPXfuFy4xgWkyIVbdH81otQkrFbhklFZcGauwDFD1EbgmZdgmYCN5pWhSEnYIadg1kysLgPIYag==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.8.tgz", + "integrity": "sha512-QieW3F1prNw3j+hxO7/NKkG1pk3oz7pOB6+5Upwu3OIwADfPX0oZVppsqlL+Vl/uBHHDSOBY0BirLctLnXwGGg==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "engines": { @@ -1092,12 +1106,12 @@ } }, "node_modules/@inquirer/input": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.6.tgz", - "integrity": "sha512-RZsJcjMJA3QNI9q9OiAi1fAom+Pb8on6alJB1Teh5jjKaiG5C79P69cG955ZRfgPdxTmI4uyhf33+94Xj7xWig==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.8.tgz", + "integrity": "sha512-p0IJslw0AmedLEkOU+yrEX3Aj2RTpQq7ZOf8nc1DIhjzaxRWrrgeuE5Kyh39fVRgtcACaMXx/9WNo8+GjgBOfw==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "engines": { @@ -1113,12 +1127,12 @@ } }, "node_modules/@inquirer/number": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.6.tgz", - "integrity": "sha512-owMkAY+gR0BggomDTL+Z22x/yfE4ocFrmNyJacOiaDVA/d+iL4IWyk7Ds7JEuDMxuhHFB46Dubdxg1uiD7GlCA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.8.tgz", + "integrity": "sha512-uGLiQah9A0F9UIvJBX52m0CnqtLaym0WpT9V4YZrjZ+YRDKZdwwoEPz06N6w8ChE2lrnsdyhY9sL+Y690Kh9gQ==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "engines": { @@ -1134,13 +1148,13 @@ } }, "node_modules/@inquirer/password": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.6.tgz", - "integrity": "sha512-c4BT4SB79iYwPhtGVBSvrlTnn4oFSYnwocafmktpay8RK75T2c2+fLlR0i1Cxw0QOhdy/YULdmpHoy1sOrPzvA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.8.tgz", + "integrity": "sha512-zt1sF4lYLdvPqvmvHdmjOzuUUjuCQ897pdUCO8RbXMUDKXJTTyOQgtn23le+jwcb+MpHl3VAFvzIdxRAf6aPlA==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "engines": { @@ -1156,21 +1170,21 @@ } }, "node_modules/@inquirer/prompts": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.2.1.tgz", - "integrity": "sha512-76knJFW2oXdI6If5YRmEoT5u7l+QroXYrMiINFcb97LsyECgsbO9m6iWlPuhBtaFgNITPHQCk3wbex38q8gsjg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.3.0.tgz", + "integrity": "sha512-JAj66kjdH/F1+B7LCigjARbwstt3SNUOSzMdjpsvwJmzunK88gJeXmcm95L9nw1KynvFVuY4SzXh/3Y0lvtgSg==", "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^5.0.5", - "@inquirer/confirm": "^6.0.5", - "@inquirer/editor": "^5.0.5", - "@inquirer/expand": "^5.0.5", - "@inquirer/input": "^5.0.5", - "@inquirer/number": "^4.0.5", - "@inquirer/password": "^5.0.5", - "@inquirer/rawlist": "^5.2.1", - "@inquirer/search": "^4.1.1", - "@inquirer/select": "^5.0.5" + "@inquirer/checkbox": "^5.1.0", + "@inquirer/confirm": "^6.0.8", + "@inquirer/editor": "^5.0.8", + "@inquirer/expand": "^5.0.8", + "@inquirer/input": "^5.0.8", + "@inquirer/number": "^4.0.8", + "@inquirer/password": "^5.0.8", + "@inquirer/rawlist": "^5.2.4", + "@inquirer/search": "^4.1.4", + "@inquirer/select": "^5.1.0" }, "engines": { "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" @@ -1185,12 +1199,12 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.2.tgz", - "integrity": "sha512-ld2EhLlf3fsBv7QfxR31NdBecGdS6eeFFZ+Nx88ApjtifeCEc9TNrw8x5tGe+gd6HG1ERczOb4B/bMojiGIp1g==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.4.tgz", + "integrity": "sha512-fTuJ5Cq9W286isLxwj6GGyfTjx1Zdk4qppVEPexFuA6yioCCXS4V1zfKroQqw7QdbDPN73xs2DiIAlo55+kBqg==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "engines": { @@ -1206,12 +1220,12 @@ } }, "node_modules/@inquirer/search": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.2.tgz", - "integrity": "sha512-kdGbbbWYKldWxpxodKYPmFl/ctBi3DjWlA4LX48jXtqJ7NEeoEKlyFTbE4xNEFcGDi15tvaxRLzCV4A53zqYIw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.4.tgz", + "integrity": "sha512-9yPTxq7LPmYjrGn3DRuaPuPbmC6u3fiWcsE9ggfLcdgO/ICHYgxq7mEy1yJ39brVvgXhtOtvDVjDh9slJxE4LQ==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, @@ -1228,13 +1242,13 @@ } }, "node_modules/@inquirer/select": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.0.6.tgz", - "integrity": "sha512-9DyVbNCo4q0C3CkGd6zW0SW3NQuuk4Hy0NSbP6zErz2YNWF4EHHJCRzcV34/CDQLraeAQXbHYlMofuUrs6BBZQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.1.0.tgz", + "integrity": "sha512-OyYbKnchS1u+zRe14LpYrN8S0wH1vD0p2yKISvSsJdH2TpI87fh4eZdWnpdbrGauCRWDph3NwxRmM4Pcm/hx1Q==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.3", + "@inquirer/core": "^11.1.5", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, @@ -1384,9 +1398,9 @@ } }, "node_modules/@octokit/endpoint": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", - "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", "license": "MIT", "dependencies": { "@octokit/types": "^16.0.0", @@ -1459,15 +1473,16 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", - "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", + "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", "license": "MIT", "dependencies": { - "@octokit/endpoint": "^11.0.2", + "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "fast-content-type-parse": "^3.0.0", + "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" }, "engines": { @@ -1511,9 +1526,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -1525,9 +1540,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -1539,9 +1554,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -1553,9 +1568,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -1567,9 +1582,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -1581,9 +1596,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -1595,9 +1610,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -1609,9 +1624,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -1623,9 +1638,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -1637,9 +1652,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -1651,9 +1666,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], @@ -1665,9 +1680,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -1679,9 +1694,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], @@ -1693,9 +1708,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -1707,9 +1722,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -1721,9 +1736,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -1735,9 +1750,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -1749,9 +1764,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], @@ -1763,9 +1778,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -1777,9 +1792,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ "x64" ], @@ -1791,9 +1806,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -1805,9 +1820,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -1819,9 +1834,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -1833,9 +1848,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -1847,9 +1862,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -1914,13 +1929,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "devOptional": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/react": { @@ -2154,9 +2169,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", - "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2309,9 +2324,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -2332,9 +2347,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -2584,11 +2599,14 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/before-after-hook": { "version": "4.0.0", @@ -2597,13 +2615,16 @@ "license": "Apache-2.0" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -2791,6 +2812,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -3045,6 +3082,12 @@ "node": ">= 0.4" } }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, "node_modules/enhanced-resolve": { "version": "5.19.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", @@ -3293,9 +3336,9 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", "dependencies": { @@ -3305,7 +3348,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/js": "9.39.3", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -3487,6 +3530,13 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -3509,9 +3559,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "license": "ISC", "dependencies": { @@ -3646,6 +3696,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -3698,9 +3755,9 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "license": "ISC", "dependencies": { @@ -4070,9 +4127,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "license": "MIT", "engines": { "node": ">=18" @@ -4404,9 +4461,9 @@ } }, "node_modules/ink": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ink/-/ink-6.7.0.tgz", - "integrity": "sha512-dhB16KfdTO8yYwF2K0E4wPXpL88tdrjjB6w44AZ0ljSktYoUQQcxccq9KL1vpRhk8JIa0A7B7zvjajHqI42teA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/ink/-/ink-6.8.0.tgz", + "integrity": "sha512-sbl1RdLOgkO9isK42WCZlJCFN9hb++sX9dsklOvfd1YQ3bQ2AiFu12Q6tFlr0HvEUvzraJntQCCpfEoUe9DSzA==", "license": "MIT", "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.4", @@ -4425,7 +4482,7 @@ "react-reconciler": "^0.33.0", "scheduler": "^0.27.0", "signal-exit": "^3.0.7", - "slice-ansi": "^7.1.0", + "slice-ansi": "^8.0.0", "stack-utils": "^2.0.6", "string-width": "^8.1.1", "terminal-size": "^4.0.1", @@ -4441,7 +4498,7 @@ "peerDependencies": { "@types/react": ">=19.0.0", "react": ">=19.0.0", - "react-devtools-core": "^6.1.2" + "react-devtools-core": ">=6.1.2" }, "peerDependenciesMeta": { "@types/react": { @@ -4996,6 +5053,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-with-bigint": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.3.tgz", + "integrity": "sha512-QObKu6nxy7NsxqR0VK4rkXnsNr5L9ElJaGEg+ucJ6J7/suoKZ0n+p76cu9aCqowytxEbwYNzvrMerfMkXneF5A==", + "license": "MIT" + }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -5198,6 +5261,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -5291,13 +5371,13 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -6007,9 +6087,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { @@ -6023,31 +6103,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -6322,9 +6402,9 @@ } }, "node_modules/simple-git": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.31.1.tgz", - "integrity": "sha512-oiWP4Q9+kO8q9hHqkX35uuHmxiEbZNTrZ5IPxgMGrJwN76pzjm/jabkZO0ItEcqxAincqGAzL3QHSaHt4+knBg==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.32.2.tgz", + "integrity": "sha512-n/jhNmvYh8dwyfR6idSfpXrFazuyd57jwNMzgjGnKZV/1lTh0HKvPq20v4AQ62rP+l19bWjjXPTCdGHMt0AdrQ==", "license": "MIT", "dependencies": { "@kwsites/file-exists": "^1.1.1", @@ -6337,16 +6417,16 @@ } }, "node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" @@ -6432,13 +6512,13 @@ } }, "node_modules/string-width": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz", - "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { "node": ">=20" @@ -7057,9 +7137,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "devOptional": true, "license": "MIT" }, @@ -7459,12 +7539,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", diff --git a/package.json b/package.json index 3fad5ed..ee0472d 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ }, "keywords": [], "author": "", - "license": "ISC", + "license": "MIT", "dependencies": { "@github/copilot-sdk": "^0.1.24", "@inquirer/prompts": "^8.2.1", diff --git a/vscode-extension/package-lock.json b/vscode-extension/package-lock.json index 35e5a80..349546c 100644 --- a/vscode-extension/package-lock.json +++ b/vscode-extension/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "primer-vscode", "version": "0.0.1", - "license": "ISC", + "license": "MIT", "dependencies": { "@github/copilot-sdk": "^0.1.24" }, @@ -465,26 +465,26 @@ } }, "node_modules/@github/copilot": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.409.tgz", - "integrity": "sha512-rkYWOKjTSuGg99KsgmA0QAP4X2cpJzAYk6lZDlVxKPhuLP03wC5E+jLctrSLjpxhX32p9n13rm1+7Jun80a1hw==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.411.tgz", + "integrity": "sha512-I3/7gw40Iu1O+kTyNPKJHNqDRyOebjsUW6wJsvSVrOpT0TNa3/lfm8xdS2XUuJWkp+PgEG/PRwF7u3DVNdP7bQ==", "license": "SEE LICENSE IN LICENSE.md", "bin": { "copilot": "npm-loader.js" }, "optionalDependencies": { - "@github/copilot-darwin-arm64": "0.0.409", - "@github/copilot-darwin-x64": "0.0.409", - "@github/copilot-linux-arm64": "0.0.409", - "@github/copilot-linux-x64": "0.0.409", - "@github/copilot-win32-arm64": "0.0.409", - "@github/copilot-win32-x64": "0.0.409" + "@github/copilot-darwin-arm64": "0.0.411", + "@github/copilot-darwin-x64": "0.0.411", + "@github/copilot-linux-arm64": "0.0.411", + "@github/copilot-linux-x64": "0.0.411", + "@github/copilot-win32-arm64": "0.0.411", + "@github/copilot-win32-x64": "0.0.411" } }, "node_modules/@github/copilot-darwin-arm64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.409.tgz", - "integrity": "sha512-yjrrp++UNNvRoWsZ1+UioBqb3DEVxL5M5ePnMO5/Sf1sngxh0y5P9P6ePFZU4PVlM5BgC38DtrcauZaKf/oArQ==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-0.0.411.tgz", + "integrity": "sha512-dtr+iHxTS4f8HlV2JT9Fp0FFoxuiPWCnU3XGmrHK+rY6bX5okPC2daU5idvs77WKUGcH8yHTZtfbKYUiMxKosw==", "cpu": [ "arm64" ], @@ -498,9 +498,9 @@ } }, "node_modules/@github/copilot-darwin-x64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.409.tgz", - "integrity": "sha512-EhLfY5DGU/BZmwjVcfnwKuJA7BxS9zdNCGeynUq7z/SI93ziastFqOddUX4D+ySz6yMrrXieN8cUKgzAlRCOJg==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-0.0.411.tgz", + "integrity": "sha512-zhdbQCbPi1L4iHClackSLx8POfklA+NX9RQLuS48HlKi/0KI/JlaDA/bdbIeMR79wjif5t9gnc/m+RTVmHlRtA==", "cpu": [ "x64" ], @@ -514,9 +514,9 @@ } }, "node_modules/@github/copilot-linux-arm64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.409.tgz", - "integrity": "sha512-O7b/9LmBO8ljPqNngonx+v5d3cOs6HKvj2E9f5/Flb9Uw2lut7g6KGerfDYCMZUpvFCMDfbZSBJD3SDuJj1uPg==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-0.0.411.tgz", + "integrity": "sha512-oZYZ7oX/7O+jzdTUcHkfD1A8YnNRW6mlUgdPjUg+5rXC43bwIdyatAnc0ObY21m9h8ghxGqholoLhm5WnGv1LQ==", "cpu": [ "arm64" ], @@ -530,9 +530,9 @@ } }, "node_modules/@github/copilot-linux-x64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.409.tgz", - "integrity": "sha512-zSfFqyPxNaBE5/ClrSjsKxhhTpJaVOqSJY0q87iV9fw6xwdzcJ1/FlZGKjE7W8YVb4tdJx+OBMjQCU8WYewF1A==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-0.0.411.tgz", + "integrity": "sha512-nnXrKANmmGnkwa3ROlKdAhVNOx8daeMSE8Xh0o3ybKckFv4s38blhKdcxs0RJQRxgAk4p7XXGlDDKNRhurqF1g==", "cpu": [ "x64" ], @@ -546,12 +546,12 @@ } }, "node_modules/@github/copilot-sdk": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.24.tgz", - "integrity": "sha512-BkP4OCrB8zFYS77JhzbAfB9xCzpUN6h2XTUsWQJaTR2xSvyBdXulrpXaeF2P2tOE5R4/sozDpjRtPgwz0v8V5Q==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.25.tgz", + "integrity": "sha512-hIgYLPXzWw9bNgrsD5BLKmgVH20ow5Or5UyVXfVe3YgeiaTgFxC4jWSAVHLGB6ufHZUrvbjppcq2dWK63FmDRA==", "license": "MIT", "dependencies": { - "@github/copilot": "^0.0.409", + "@github/copilot": "^0.0.411", "vscode-jsonrpc": "^8.2.1", "zod": "^4.3.6" }, @@ -560,9 +560,9 @@ } }, "node_modules/@github/copilot-win32-arm64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.409.tgz", - "integrity": "sha512-VizZsdK7L3ym/OR4wahiFx+6hFtaOYN9qvsHmNSo8pb65AZ6ORdRnCPE7w9ZejMpdNEa6x6WqHfxDKJlF85zyA==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-0.0.411.tgz", + "integrity": "sha512-h+Bovb2YVCQSeELZOO7zxv8uht45XHcvAkFbRsc1gf9dl109sSUJIcB4KAhs8Aznk28qksxz7kvdSgUWyQBlIA==", "cpu": [ "arm64" ], @@ -576,9 +576,9 @@ } }, "node_modules/@github/copilot-win32-x64": { - "version": "0.0.409", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.409.tgz", - "integrity": "sha512-c6dP3XRFk550PmH1Vxe7n/bStNSLnVGH5B+ErUKXk/SPqmZ59pyoa7H2USNdoC6Nav5tkwYYR1vwNZRy+iKvrA==", + "version": "0.0.411", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-0.0.411.tgz", + "integrity": "sha512-xmOgi1lGvUBHQJWmq5AK1EP95+Y8xR4TFoK9OCSOaGbQ+LFcX2jF7iavnMolfWwddabew/AMQjsEHlXvbgMG8Q==", "cpu": [ "x64" ], @@ -621,9 +621,9 @@ } }, "node_modules/@octokit/endpoint": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", - "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -702,16 +702,17 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", - "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", + "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/endpoint": "^11.0.2", + "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "fast-content-type-parse": "^3.0.0", + "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" }, "engines": { @@ -758,13 +759,13 @@ } }, "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/vscode": { @@ -840,6 +841,13 @@ ], "license": "MIT" }, + "node_modules/json-with-bigint": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.3.tgz", + "integrity": "sha512-QObKu6nxy7NsxqR0VK4rkXnsNr5L9ElJaGEg+ucJ6J7/suoKZ0n+p76cu9aCqowytxEbwYNzvrMerfMkXneF5A==", + "dev": true, + "license": "MIT" + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -855,9 +863,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, diff --git a/vscode-extension/package.json b/vscode-extension/package.json index b1f3ed6..c0ea452 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -4,7 +4,7 @@ "description": "Prime repositories for AI-assisted development: generate Copilot instructions, VS Code configs, MCP configs, and evaluate AI agent effectiveness.", "version": "0.0.1", "publisher": "digitarald", - "license": "ISC", + "license": "MIT", "engines": { "vscode": "^1.100.0" }, From aa062107d1dace2a7a0e3a0bae807ed3f1a2422e Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 22 Feb 2026 15:34:00 -0800 Subject: [PATCH 76/84] Update repository links to pierceboggan --- README.md | 6 +++--- src/commands/analyze.ts | 2 +- src/commands/readiness.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3bd5191..c3601bb 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ > Prime your repositories for AI-assisted development. -[![CI](https://github.com/digitarald/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/digitarald/primer/actions/workflows/ci.yml) +[![CI](https://github.com/pierceboggan/primer/actions/workflows/ci.yml/badge.svg)](https://github.com/pierceboggan/primer/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) Primer is a CLI and VS Code extension that helps teams prepare repositories for AI-assisted development. It generates custom instructions, assesses AI readiness across a maturity model, and supports batch processing across organizations. @@ -11,13 +11,13 @@ Primer is a CLI and VS Code extension that helps teams prepare repositories for ```bash # Run directly (no install needed) -npx github:digitarald/primer readiness +npx github:pierceboggan/primer readiness ``` Or install locally: ```bash -git clone https://github.com/digitarald/primer.git +git clone https://github.com/pierceboggan/primer.git cd primer && npm install && npm run build && npm link # 1. Check how AI-ready your repo is diff --git a/src/commands/analyze.ts b/src/commands/analyze.ts index 2ef1578..242c530 100644 --- a/src/commands/analyze.ts +++ b/src/commands/analyze.ts @@ -124,7 +124,7 @@ export function formatAnalysisMarkdown(analysis: RepoAnalysis): string { lines.push(""); lines.push(`---`); - lines.push(`*Generated by [Primer](https://github.com/digitarald/primer)*`); + lines.push(`*Generated by [Primer](https://github.com/pierceboggan/primer)*`); lines.push(""); return lines.join("\n"); diff --git a/src/commands/readiness.ts b/src/commands/readiness.ts index 7c72080..0552077 100644 --- a/src/commands/readiness.ts +++ b/src/commands/readiness.ts @@ -373,7 +373,7 @@ export function formatReadinessMarkdown(report: ReadinessReport, repoName: strin lines.push("---"); lines.push( - `*Generated by [Primer](https://github.com/digitarald/primer) on ${report.generatedAt}*` + `*Generated by [Primer](https://github.com/pierceboggan/primer) on ${report.generatedAt}*` ); lines.push(""); From e44b4ecb2796136ea030f2a53cd7278986eea0de Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 22 Feb 2026 19:24:17 -0800 Subject: [PATCH 77/84] fix(vscode-extension): resolve vsce packaging blockers --- vscode-extension/LICENSE | 21 +++++++++++++++++++++ vscode-extension/package-lock.json | 2 +- vscode-extension/package.json | 6 +++++- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 vscode-extension/LICENSE diff --git a/vscode-extension/LICENSE b/vscode-extension/LICENSE new file mode 100644 index 0000000..cb6db3e --- /dev/null +++ b/vscode-extension/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Primer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vscode-extension/package-lock.json b/vscode-extension/package-lock.json index 349546c..19a9cbc 100644 --- a/vscode-extension/package-lock.json +++ b/vscode-extension/package-lock.json @@ -19,7 +19,7 @@ "typescript": "^5.9.3" }, "engines": { - "vscode": "^1.100.0" + "vscode": "^1.109.0" } }, "node_modules/@esbuild/aix-ppc64": { diff --git a/vscode-extension/package.json b/vscode-extension/package.json index c0ea452..78dadd6 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -5,8 +5,12 @@ "version": "0.0.1", "publisher": "digitarald", "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/digitarald/primer.git" + }, "engines": { - "vscode": "^1.100.0" + "vscode": "^1.109.0" }, "categories": [ "Machine Learning", From 701ca6dd6aca021e8f211765188d285649b46788 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Sun, 22 Feb 2026 19:24:53 -0800 Subject: [PATCH 78/84] chore(lint): fix visual report imports --- src/services/visualReport.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/services/visualReport.ts b/src/services/visualReport.ts index 0b758b2..c77bb5f 100644 --- a/src/services/visualReport.ts +++ b/src/services/visualReport.ts @@ -1,6 +1,5 @@ -import type { ReadinessReport, AreaReadinessReport, ReadinessPillarSummary } from "./readiness"; import { PILLAR_GROUPS, PILLAR_GROUP_NAMES } from "./readiness"; -import type { PillarGroup } from "./readiness"; +import type { AreaReadinessReport, PillarGroup, ReadinessReport } from "./readiness"; type VisualReportOptions = { reports: Array<{ repo: string; report: ReadinessReport; error?: string }>; From 30645e674e0e4acf2c1320ba9e536c7fe903df44 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 23 Feb 2026 14:30:41 -0800 Subject: [PATCH 79/84] feat: add maxWidth prop to banners --- src/ui/AnimatedBanner.tsx | 20 ++++++++-- src/ui/tui.tsx | 83 +++++++++++++++++++++++++++++---------- 2 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/ui/AnimatedBanner.tsx b/src/ui/AnimatedBanner.tsx index 7191416..ccd99b4 100644 --- a/src/ui/AnimatedBanner.tsx +++ b/src/ui/AnimatedBanner.tsx @@ -64,12 +64,14 @@ type AnimatedBannerProps = { onComplete?: () => void; skipAnimation?: boolean; darkMode?: boolean; + maxWidth?: number; }; export function AnimatedBanner({ onComplete, skipAnimation = false, - darkMode = true + darkMode = true, + maxWidth }: AnimatedBannerProps): React.JSX.Element { const [frameIndex, setFrameIndex] = useState(skipAnimation ? FRAMES.length - 1 : 0); const [isComplete, setIsComplete] = useState(skipAnimation); @@ -103,6 +105,8 @@ export function AnimatedBanner({ const currentFrame = FRAMES[frameIndex]; const showSparkles = frameIndex < 3; + const bannerWidth = FULL_BANNER[0].length; + const shouldTruncate = maxWidth != null && maxWidth < bannerWidth; return ( @@ -112,7 +116,7 @@ export function AnimatedBanner({ color={showSparkles && line.includes("✦") ? theme.sparkle : theme.primary} bold={!showSparkles} > - {line || " "} + {(shouldTruncate ? line.slice(0, maxWidth) : line) || " "} ))} @@ -122,14 +126,22 @@ export function AnimatedBanner({ /** * Static banner for use after animation or when animation is disabled. */ -export function StaticBanner({ darkMode = true }: { darkMode?: boolean }): React.JSX.Element { +export function StaticBanner({ + darkMode = true, + maxWidth +}: { + darkMode?: boolean; + maxWidth?: number; +}): React.JSX.Element { const color = darkMode ? "magentaBright" : "magenta"; + const bannerWidth = FULL_BANNER[0].length; + const shouldTruncate = maxWidth != null && maxWidth < bannerWidth; return ( {FULL_BANNER.map((line, i) => ( - {line} + {(shouldTruncate ? line.slice(0, maxWidth) : line) || " "} ))} diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 517562d..13990a2 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -2,7 +2,7 @@ import fs from "fs/promises"; import path from "path"; import type { Key } from "ink"; -import { Box, Text, useApp, useInput } from "ink"; +import { Box, Text, useApp, useInput, useStdout } from "ink"; import React, { useEffect, useMemo, useState } from "react"; import type { RepoApp, Area } from "../services/analyzer"; @@ -61,6 +61,20 @@ type LogEntry = { const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]; +/** Track terminal columns reactively so resize triggers a re-render. */ +function useTerminalColumns(): number { + const { stdout } = useStdout(); + const [columns, setColumns] = useState(stdout.columns ?? 80); + useEffect(() => { + const onResize = () => setColumns(stdout.columns ?? 80); + stdout.on("resize", onResize); + return () => { + stdout.off("resize", onResize); + }; + }, [stdout]); + return columns; +} + function useSpinner(active: boolean): string { const [frame, setFrame] = useState(0); useEffect(() => { @@ -99,26 +113,34 @@ function KeyHint({ k, label }: { k: string; label: string }): React.JSX.Element ); } -function Divider({ label }: { label?: string }): React.JSX.Element { +function Divider({ label, columns }: { label?: string; columns: number }): React.JSX.Element { + // Account for root Box border (2) + padding (2) = 4 chars + const innerWidth = Math.max(0, columns - 4); if (label) { + const prefix = "── "; + const suffix = " "; + const used = prefix.length + label.length + suffix.length; + const fill = "─".repeat(Math.max(1, innerWidth - used)); return ( - {"── "} + {prefix} {label} - {" ──────────────────────────────────────────"} + {suffix} + {fill} ); } + const fill = "─".repeat(Math.max(1, innerWidth)); return ( - {"────────────────────────────────────────────────────"} + {fill} ); @@ -135,6 +157,7 @@ function pickBestModel(available: string[], fallback: string): string { export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX.Element { const app = useApp(); + const terminalColumns = useTerminalColumns(); const [status, setStatus] = useState(skipAnimation ? "idle" : "intro"); const [message, setMessage] = useState(""); const [generatedContent, setGeneratedContent] = useState(""); @@ -362,11 +385,6 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return; } - if (key.escape || input.toLowerCase() === "q") { - app.exit(); - return; - } - if (status === "preview") { if (input.toLowerCase() === "s") { try { @@ -397,6 +415,10 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setGeneratedContent(""); return; } + if (key.escape || input.toLowerCase() === "q") { + app.exit(); + return; + } return; } @@ -431,6 +453,13 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return; } + if (key.escape) { + setStatus("idle"); + setMessage(""); + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + return; + } return; } @@ -446,11 +475,16 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return; } - if (input.toLowerCase() === "n") { + if (input.toLowerCase() === "n" || key.escape) { setStatus("idle"); setMessage("Bootstrap cancelled."); setEvalCaseCountInput(""); setEvalBootstrapCount(null); + return; + } + if (input.toLowerCase() === "q") { + app.exit(); + return; } return; } @@ -823,6 +857,11 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX setModelCursor(idx >= 0 ? idx : 0); return; } + + if (key.escape || input.toLowerCase() === "q") { + app.exit(); + return; + } } catch (err) { setStatus("error"); setMessage(err instanceof Error ? err.message : "Unexpected error"); @@ -885,12 +924,14 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX return ; } + const innerWidth = Math.max(0, terminalColumns - 4); + return ( - + {status === "intro" ? ( - + ) : ( - + )} {/* Status Bar */} @@ -904,7 +945,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {/* Context */} - + Repo @@ -945,7 +986,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {/* Activity */} - + {activityLog.length === 0 && !message ? ( @@ -989,7 +1030,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {/* Model Picker */} {status === "model-pick" && availableModels.length > 0 && ( <> - + {availableModels.map((model, i) => { const current = modelPickTarget === "eval" ? evalModel : judgeModel; @@ -1025,7 +1066,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {/* App picker for monorepo generate */} {status === "generate-app-pick" && repoApps.length > 0 && ( <> - + {repoApps.map((app, i) => ( @@ -1047,7 +1088,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {/* Area picker for file-based instructions */} {status === "generate-area-pick" && repoAreas.length > 0 && ( <> - + {repoAreas.map((area, i) => ( @@ -1103,7 +1144,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX {/* Eval Results */} {evalResults && evalResults.length > 0 && ( <> - + {evalResults.map((r) => ( @@ -1129,7 +1170,7 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX )} {/* Commands */} - + {status === "intro" ? ( Press any key to skip animation... From 55cc9d4f6947d387a5fa0bc3a187a9974e0c8149 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 23 Feb 2026 14:38:12 -0800 Subject: [PATCH 80/84] fix(tui): fix Esc key handling, guard idle keys, remove dead modelPicker state --- README.md | 2 + package.json | 2 +- src/services/copilot.ts | 123 +++- src/services/copilotSdk.ts | 191 ++++++ src/services/evalScaffold.ts | 4 +- src/services/evaluator.ts | 4 +- src/services/instructions.ts | 7 +- src/ui/tui.tsx | 888 ++++++++++++++-------------- vscode-extension/esbuild.mjs | 3 +- vscode-extension/package.json | 4 +- vscode-extension/primer-vscode.vsix | Bin 0 -> 459643 bytes 11 files changed, 752 insertions(+), 476 deletions(-) create mode 100644 src/services/copilotSdk.ts create mode 100644 vscode-extension/primer-vscode.vsix diff --git a/README.md b/README.md index c3601bb..6e22c27 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ Primer is a CLI and VS Code extension that helps teams prepare repositories for npx github:pierceboggan/primer readiness ``` +`npx github:/primer ...` installs from the Git repository and runs the package `prepare` script, which builds the CLI before first use. + Or install locally: ```bash diff --git a/package.json b/package.json index ee0472d..c65b5cd 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "scripts": { "build": "tsup", "dev": "tsx src/index.ts", - "prepare": "test \"$CI\" = true || husky", + "prepare": "npm run build && (test \"$CI\" = true || husky)", "lint": "eslint .", "format": "prettier --write .", "format:check": "prettier --check .", diff --git a/src/services/copilot.ts b/src/services/copilot.ts index 2816803..c666a0e 100644 --- a/src/services/copilot.ts +++ b/src/services/copilot.ts @@ -7,11 +7,23 @@ import fg from "fast-glob"; const execFileAsync = promisify(execFile); +const COPILOT_DEBUG_ENABLED = /^(1|true|yes|on)$/iu.test(process.env.PRIMER_DEBUG_COPILOT ?? ""); + +export function logCopilotDebug(message: string): void { + if (!COPILOT_DEBUG_ENABLED) return; + process.stderr.write(`[primer:copilot] ${message}\n`); +} + export type CopilotCliConfig = { cliPath: string; cliArgs?: string[]; }; +type CopilotCliCandidate = { + config: CopilotCliConfig; + source: string; +}; + let cachedCliConfig: CopilotCliConfig | null = null; let cachedCliConfigTimestamp = 0; const CLI_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes @@ -24,13 +36,18 @@ function cacheConfig(config: CopilotCliConfig): CopilotCliConfig { export async function assertCopilotCliReady(): Promise { const config = await findCopilotCliConfig(); + const desc = config.cliArgs ? `${config.cliPath} ${config.cliArgs.join(" ")}` : config.cliPath; + logCopilotDebug(`validating CLI compatibility with ${desc}`); try { - const [cmd, args] = buildExecArgs(config, ["--version"]); + const [cmd, args] = buildExecArgs(config, ["--headless", "--version"]); await execFileAsync(cmd, args, { timeout: 5000 }); } catch { - const desc = config.cliArgs ? `${config.cliPath} ${config.cliArgs.join(" ")}` : config.cliPath; - throw new Error(`Copilot CLI at ${desc} is not working.`); + cachedCliConfig = null; + throw new Error( + `Copilot CLI at ${desc} is not compatible with SDK server mode. ` + + "Expected support for '--headless'. Install/update the VS Code Copilot Chat CLI or adjust PATH." + ); } return config; @@ -43,7 +60,7 @@ export async function listCopilotModels(): Promise { return extractModelChoices(stdout); } -function buildExecArgs(config: CopilotCliConfig, extraArgs: string[]): [string, string[]] { +export function buildExecArgs(config: CopilotCliConfig, extraArgs: string[]): [string, string[]] { if (config.cliArgs && config.cliArgs.length > 0) { return [config.cliPath, [...config.cliArgs, ...extraArgs]]; } @@ -58,12 +75,28 @@ function buildExecArgs(config: CopilotCliConfig, extraArgs: string[]): [string, async function findCopilotCliConfig(): Promise { if (cachedCliConfig && Date.now() - cachedCliConfigTimestamp < CLI_CACHE_TTL_MS) { + logCopilotDebug("using cached CLI config"); return cachedCliConfig; } + const overrideCliPath = process.env.PRIMER_COPILOT_CLI_PATH; + if (overrideCliPath) { + const overrideConfig = { cliPath: overrideCliPath }; + logCopilotDebug(`trying override PRIMER_COPILOT_CLI_PATH=${overrideCliPath}`); + if (await isHeadlessCompatible(overrideConfig)) { + logCopilotDebug("override CLI is compatible"); + return cacheConfig(overrideConfig); + } + throw new Error( + `PRIMER_COPILOT_CLI_PATH points to an incompatible CLI (${overrideCliPath}). ` + + "It must support '--headless --version'." + ); + } + const isWindows = process.platform === "win32"; const home = process.env.HOME ?? process.env.USERPROFILE ?? ""; const appData = process.env.APPDATA ?? ""; + const candidates: CopilotCliCandidate[] = []; // On Windows, prefer npm-installed binary and use node + cliArgs approach. // This bypasses .cmd/.bat wrapper issues that prevent direct spawning. @@ -79,7 +112,13 @@ async function findCopilotCliConfig(): Promise { ); try { await fs.access(npmLoaderPath); - return cacheConfig({ cliPath: process.execPath, cliArgs: [npmLoaderPath] }); + candidates.push({ + config: { cliPath: process.execPath, cliArgs: [npmLoaderPath] }, + source: "Windows npm loader" + }); + logCopilotDebug( + `discovered candidate from Windows npm loader: ${process.execPath} ${npmLoaderPath}` + ); } catch { // npm binary not found, will try PATH and VS Code locations } @@ -90,7 +129,8 @@ async function findCopilotCliConfig(): Promise { const { stdout } = await execFileAsync(whichCmd, ["copilot"], { timeout: 5000 }); const found = stdout.trim().split(/\r?\n/)[0]; if (found) { - return cacheConfig({ cliPath: found }); + candidates.push({ config: { cliPath: found }, source: "PATH" }); + logCopilotDebug(`discovered candidate from PATH: ${found}`); } } catch { // Not on PATH, will try VS Code locations @@ -118,7 +158,8 @@ async function findCopilotCliConfig(): Promise { for (const location of staticLocations) { try { await fs.access(location); - return cacheConfig({ cliPath: location }); + candidates.push({ config: { cliPath: location }, source: "VS Code globalStorage" }); + logCopilotDebug(`discovered candidate from VS Code globalStorage: ${location}`); } catch { // Try next } @@ -133,11 +174,37 @@ async function findCopilotCliConfig(): Promise { for (const pattern of globPatterns) { const matches = await fg(pattern, { onlyFiles: true }); - if (matches.length > 0) { - return cacheConfig({ cliPath: path.normalize(matches[0]) }); + for (const match of matches) { + const normalized = path.normalize(match); + candidates.push({ + config: { cliPath: normalized }, + source: "VS Code extensions" + }); + logCopilotDebug(`discovered candidate from VS Code extensions: ${normalized}`); } } + const compatible = await findFirstCompatibleCandidate(candidates); + if (compatible) { + const desc = compatible.config.cliArgs + ? `${compatible.config.cliPath} ${compatible.config.cliArgs.join(" ")}` + : compatible.config.cliPath; + logCopilotDebug(`selected compatible candidate from ${compatible.source}: ${desc}`); + return cacheConfig(compatible.config); + } + + if (candidates.length > 0) { + const first = candidates[0]; + const desc = first.config.cliArgs + ? `${first.config.cliPath} ${first.config.cliArgs.join(" ")}` + : first.config.cliPath; + throw new Error( + `Found Copilot CLI candidate from ${first.source} (${desc}) but it does not support '--headless'. ` + + "Primer requires a Copilot CLI build compatible with SDK server mode. " + + "Install/update GitHub Copilot Chat in VS Code, or point PRIMER_COPILOT_CLI_PATH to a compatible CLI binary." + ); + } + const platformHint = isWindows ? " Searched APPDATA and VS Code extension paths." : process.platform === "linux" @@ -149,6 +216,44 @@ async function findCopilotCliConfig(): Promise { ); } +async function findFirstCompatibleCandidate( + candidates: CopilotCliCandidate[] +): Promise { + const seen = new Set(); + + for (const candidate of candidates) { + const key = [candidate.config.cliPath, ...(candidate.config.cliArgs ?? [])].join("\u0000"); + if (seen.has(key)) { + logCopilotDebug(`skipping duplicate candidate: ${candidate.config.cliPath}`); + continue; + } + seen.add(key); + + const compatible = await isHeadlessCompatible(candidate.config); + const desc = candidate.config.cliArgs + ? `${candidate.config.cliPath} ${candidate.config.cliArgs.join(" ")}` + : candidate.config.cliPath; + logCopilotDebug( + `probe ${candidate.source}: ${desc} => ${compatible ? "compatible" : "incompatible"}` + ); + if (compatible) { + return candidate; + } + } + + return null; +} + +async function isHeadlessCompatible(config: CopilotCliConfig): Promise { + try { + const [cmd, args] = buildExecArgs(config, ["--headless", "--version"]); + await execFileAsync(cmd, args, { timeout: 5000 }); + return true; + } catch { + return false; + } +} + function extractModelChoices(helpText: string): string[] { const lines = helpText.split("\n"); let captured = ""; diff --git a/src/services/copilotSdk.ts b/src/services/copilotSdk.ts new file mode 100644 index 0000000..2fefadd --- /dev/null +++ b/src/services/copilotSdk.ts @@ -0,0 +1,191 @@ +import { spawn, type ChildProcess } from "node:child_process"; + +import type * as CopilotSdk from "@github/copilot-sdk"; + +import { buildExecArgs, logCopilotDebug, type CopilotCliConfig } from "./copilot"; + +export type CopilotSdkModule = typeof CopilotSdk; + +let cachedSdkModule: Promise | null = null; + +function normalizeSdkLoadError(error: unknown): Error { + const message = error instanceof Error ? error.message : String(error); + const isMissingModule = + message.includes("@github/copilot-sdk") && + /(Cannot find module|Cannot find package|ERR_MODULE_NOT_FOUND)/iu.test(message); + + if (!isMissingModule) { + return error instanceof Error ? error : new Error(message); + } + + return new Error( + "Copilot SDK package '@github/copilot-sdk' could not be loaded. " + + "Run `npm install` in this repository. " + + "If this is running inside the Primer VS Code extension, rebuild and reinstall the extension so the SDK is bundled (`cd vscode-extension && npm run build`)." + ); +} + +function normalizeError(error: unknown): Error { + return error instanceof Error ? error : new Error(String(error)); +} + +function shouldFallbackToExternalServer(error: unknown): boolean { + const message = normalizeError(error).message.toLowerCase(); + return ( + message.includes("unknown option '--headless'") || + message.includes("unknown option '--no-auto-update'") + ); +} + +async function startExternalServer(cliConfig: CopilotCliConfig): Promise<{ + cliProcess: ChildProcess; + cliUrl: string; +}> { + const [cmd, args] = buildExecArgs(cliConfig, ["--headless", "--log-level", "debug"]); + logCopilotDebug(`starting external CLI server: ${cmd} ${args.join(" ")}`); + + return await new Promise((resolve, reject) => { + const cliProcess = spawn(cmd, args, { + cwd: process.cwd(), + env: process.env, + stdio: ["ignore", "pipe", "pipe"], + windowsHide: true + }); + + let stdout = ""; + let stderr = ""; + let settled = false; + let timer: ReturnType | undefined; + + const finishReject = (reason: unknown): void => { + if (settled) return; + settled = true; + clearTimeout(timer); + if (!cliProcess.killed) { + cliProcess.kill(); + } + reject(normalizeError(reason)); + }; + + const finishResolve = (port: string): void => { + if (settled) return; + settled = true; + clearTimeout(timer); + // Stop accumulating output after settling to avoid unbounded memory growth + cliProcess.stdout?.removeAllListeners("data"); + cliProcess.stderr?.removeAllListeners("data"); + resolve({ + cliProcess, + cliUrl: `localhost:${port}` + }); + }; + + cliProcess.stdout?.on("data", (data: Buffer) => { + const chunk = data.toString(); + stdout += chunk; + const match = stdout.match(/listening on port (\d+)/iu); + if (match) { + finishResolve(match[1]); + } + }); + + cliProcess.stderr?.on("data", (data: Buffer) => { + const chunk = data.toString(); + stderr += chunk; + const lines = chunk.split("\n"); + for (const line of lines) { + if (line.trim()) { + process.stderr.write(`[CLI subprocess] ${line}\n`); + } + } + }); + + cliProcess.on("error", (error) => { + finishReject(error); + }); + + cliProcess.on("exit", (code) => { + if (settled) return; + const details = stderr.trim() || stdout.trim(); + finishReject( + new Error( + details + ? `External CLI server exited with code ${code}\n${details}` + : `External CLI server exited with code ${code}` + ) + ); + }); + + timer = setTimeout(() => { + finishReject(new Error("Timeout waiting for external CLI server to start")); + }, 10000); + }); +} + +function attachExternalServerCleanup( + client: InstanceType, + cliProcess: ChildProcess +): void { + const originalStop = client.stop.bind(client); + client.stop = (async () => { + const errors = await originalStop(); + if (!cliProcess.killed) { + cliProcess.kill(); + } + return errors; + }) as typeof client.stop; +} + +export async function loadCopilotSdk(): Promise { + if (!cachedSdkModule) { + cachedSdkModule = import("@github/copilot-sdk").catch((error) => { + cachedSdkModule = null; + throw normalizeSdkLoadError(error); + }); + } + + return cachedSdkModule; +} + +export async function createCopilotClient( + cliConfig: CopilotCliConfig +): Promise> { + const sdk = await loadCopilotSdk(); + const desc = cliConfig.cliArgs + ? `${cliConfig.cliPath} ${cliConfig.cliArgs.join(" ")}` + : cliConfig.cliPath; + logCopilotDebug(`creating SDK client with cliPath=${desc} useStdio=false`); + // Always pass an explicit CLI config so the SDK does not fall back to package-local CLI resolution. + // Use TCP transport because some VS Code Copilot CLI shims reject stdio mode. + const primaryClient = new sdk.CopilotClient({ ...cliConfig, useStdio: false }); + + try { + await primaryClient.start(); + return primaryClient; + } catch (error) { + if (!shouldFallbackToExternalServer(error)) { + throw normalizeError(error); + } + + logCopilotDebug("primary SDK-managed startup failed; falling back to external server mode"); + try { + await primaryClient.stop(); + } catch { + // Best-effort cleanup before fallback + } + + const external = await startExternalServer(cliConfig); + const fallbackClient = new sdk.CopilotClient({ cliUrl: external.cliUrl }); + try { + await fallbackClient.start(); + } catch (fallbackError) { + if (!external.cliProcess.killed) { + external.cliProcess.kill(); + } + throw normalizeError(fallbackError); + } + + attachExternalServerCleanup(fallbackClient, external.cliProcess); + return fallbackClient; + } +} diff --git a/src/services/evalScaffold.ts b/src/services/evalScaffold.ts index ef6a7d4..01beec7 100644 --- a/src/services/evalScaffold.ts +++ b/src/services/evalScaffold.ts @@ -2,6 +2,7 @@ import { DEFAULT_MODEL } from "../config"; import type { Area } from "./analyzer"; import { assertCopilotCliReady } from "./copilot"; +import { createCopilotClient } from "./copilotSdk"; const EVAL_SCAFFOLD_TIMEOUT_MS = 600000; const EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS = 90000; @@ -40,8 +41,7 @@ export async function generateEvalScaffold(options: EvalScaffoldOptions): Promis const cliConfig = await assertCopilotCliReady(); progress("Starting Copilot SDK..."); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient(cliConfig); + const client = await createCopilotClient(cliConfig); try { progress("Creating session..."); diff --git a/src/services/evaluator.ts b/src/services/evaluator.ts index b7827c2..bf50d4f 100644 --- a/src/services/evaluator.ts +++ b/src/services/evaluator.ts @@ -4,6 +4,7 @@ import path from "path"; import { buildTimestampedName, safeWriteFile } from "../utils/fs"; import { assertCopilotCliReady } from "./copilot"; +import { createCopilotClient } from "./copilotSdk"; import type { EvalConfig } from "./evalScaffold"; const DEFAULT_SYSTEM_MESSAGE = @@ -97,8 +98,7 @@ export async function runEval( progress("Starting Copilot SDK..."); const cliConfig = await assertCopilotCliReady(); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient(cliConfig); + const client = await createCopilotClient(cliConfig); try { const results: EvalResult[] = []; diff --git a/src/services/instructions.ts b/src/services/instructions.ts index 68ede47..affadec 100644 --- a/src/services/instructions.ts +++ b/src/services/instructions.ts @@ -6,6 +6,7 @@ import { ensureDir, safeWriteFile } from "../utils/fs"; import type { Area } from "./analyzer"; import { sanitizeAreaName } from "./analyzer"; import { assertCopilotCliReady } from "./copilot"; +import { createCopilotClient } from "./copilotSdk"; type GenerateInstructionsOptions = { repoPath: string; @@ -23,8 +24,7 @@ export async function generateCopilotInstructions( const cliConfig = await assertCopilotCliReady(); progress("Starting Copilot SDK..."); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient(cliConfig); + const client = await createCopilotClient(cliConfig); try { progress("Creating session..."); @@ -109,8 +109,7 @@ export async function generateAreaInstructions( const cliConfig = await assertCopilotCliReady(); progress(`Starting Copilot SDK for area "${area.name}"...`); - const sdk = await import("@github/copilot-sdk"); - const client = new sdk.CopilotClient(cliConfig); + const client = await createCopilotClient(cliConfig); try { const applyToPatterns = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo]; diff --git a/src/ui/tui.tsx b/src/ui/tui.tsx index 13990a2..b0d7d37 100644 --- a/src/ui/tui.tsx +++ b/src/ui/tui.tsx @@ -37,7 +37,6 @@ type Status = | "generating" | "bootstrapping" | "evaluating" - | "modelPicker" | "preview" | "done" | "error" @@ -225,11 +224,6 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX }); }, [repoPath]); - const indexForModel = (model: string): number => { - const index = availableModels.indexOf(model); - return index === -1 ? 0 : index; - }; - useEffect(() => { let active = true; listCopilotModels() @@ -337,537 +331,510 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX // NOTE: The useInput handler below is intentionally kept as a single callback // to avoid prop-drilling ~20 state setters. If this grows further, consider // extracting each status into a sub-component with its own useInput hook. - useInput((input: string, key: Key) => { - void (async () => { - try { - if (status === "intro") { - setStatus("idle"); - return; - } - - if (status === "modelPicker") { - if (key.escape) { + const inputActive = status !== "batch-github" && status !== "batch-azure"; + useInput( + (input: string, key: Key) => { + void (async () => { + try { + if (status === "intro") { setStatus("idle"); - setMessage("Model picker cancelled."); return; } - if (key.upArrow) { - setModelCursor((prev: number) => { - if (!availableModels.length) return 0; - return (prev - 1 + availableModels.length) % availableModels.length; - }); - return; - } - - if (key.downArrow) { - setModelCursor((prev: number) => { - if (!availableModels.length) return 0; - return (prev + 1) % availableModels.length; - }); - return; - } - - if (key.return) { - const selected = availableModels[modelCursor]; - if (!selected) return; - if (modelPickTarget === "eval") { - setEvalModel(selected); - setModelPickTarget("judge"); - setModelCursor(indexForModel(judgeModel)); - setMessage(`Eval model set: ${selected}. Select judge model.`); + if (status === "preview") { + if (input.toLowerCase() === "s") { + try { + const outputPath = + generateSavePath || path.join(repoPath, ".github", "copilot-instructions.md"); + await fs.mkdir(path.dirname(outputPath), { recursive: true }); + const { wrote, reason } = await safeWriteFile(outputPath, generatedContent, true); + if (!wrote) + throw new Error(reason === "symlink" ? "Path is a symlink" : "Write failed"); + setStatus("done"); + const relPath = path.relative(repoPath, outputPath); + const msg = `Saved to ${relPath}`; + setMessage(msg); + addLog(msg, "success"); + setGeneratedContent(""); + } catch (error) { + setStatus("error"); + const msg = error instanceof Error ? error.message : "Failed to save."; + setMessage(msg); + addLog(msg, "error"); + } return; } - setJudgeModel(selected); - setStatus("idle"); - setMessage(`Models set: eval ${evalModel} • judge ${selected}.`); - } - return; - } - - if (status === "preview") { - if (input.toLowerCase() === "s") { - try { - const outputPath = - generateSavePath || path.join(repoPath, ".github", "copilot-instructions.md"); - await fs.mkdir(path.dirname(outputPath), { recursive: true }); - const { wrote, reason } = await safeWriteFile(outputPath, generatedContent, true); - if (!wrote) - throw new Error(reason === "symlink" ? "Path is a symlink" : "Write failed"); - setStatus("done"); - const relPath = path.relative(repoPath, outputPath); - const msg = `Saved to ${relPath}`; - setMessage(msg); - addLog(msg, "success"); + if (input.toLowerCase() === "d") { + setStatus("idle"); + setMessage("Discarded generated instructions."); + addLog("Discarded instructions.", "info"); setGeneratedContent(""); - } catch (error) { - setStatus("error"); - const msg = error instanceof Error ? error.message : "Failed to save."; - setMessage(msg); - addLog(msg, "error"); + return; + } + if (key.escape || input.toLowerCase() === "q") { + app.exit(); + return; } return; } - if (input.toLowerCase() === "d") { - setStatus("idle"); - setMessage("Discarded generated instructions."); - addLog("Discarded instructions.", "info"); - setGeneratedContent(""); - return; - } - if (key.escape || input.toLowerCase() === "q") { - app.exit(); - return; - } - return; - } - if (status === "bootstrapEvalCount") { - if (key.return) { - const trimmed = evalCaseCountInput.trim(); - const count = Number.parseInt(trimmed, 10); - if (!trimmed || !Number.isFinite(count) || count <= 0) { - setMessage("Enter a positive number of eval cases, then press Enter."); + if (status === "bootstrapEvalCount") { + if (key.return) { + const trimmed = evalCaseCountInput.trim(); + const count = Number.parseInt(trimmed, 10); + if (!trimmed || !Number.isFinite(count) || count <= 0) { + setMessage("Enter a positive number of eval cases, then press Enter."); + return; + } + + const configPath = path.join(repoPath, "primer.eval.json"); + setEvalBootstrapCount(count); + try { + await fs.access(configPath); + setStatus("bootstrapEvalConfirm"); + setMessage("primer.eval.json exists. Overwrite? (Y/N)"); + } catch { + await bootstrapEvalConfig(count, false); + } return; } - const configPath = path.join(repoPath, "primer.eval.json"); - setEvalBootstrapCount(count); - try { - await fs.access(configPath); - setStatus("bootstrapEvalConfirm"); - setMessage("primer.eval.json exists. Overwrite? (Y/N)"); - } catch { - await bootstrapEvalConfig(count, false); + if (key.backspace || key.delete) { + setEvalCaseCountInput((prev) => prev.slice(0, -1)); + return; } - return; - } - if (key.backspace || key.delete) { - setEvalCaseCountInput((prev) => prev.slice(0, -1)); - return; - } - - if (/^\d$/.test(input)) { - setEvalCaseCountInput((prev) => prev + input); - return; - } + if (/^\d$/.test(input)) { + setEvalCaseCountInput((prev) => prev + input); + return; + } - if (key.escape) { - setStatus("idle"); - setMessage(""); - setEvalCaseCountInput(""); - setEvalBootstrapCount(null); + if (key.escape) { + setStatus("idle"); + setMessage(""); + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + return; + } return; } - return; - } - if (status === "bootstrapEvalConfirm") { - if (input.toLowerCase() === "y") { - const count = evalBootstrapCount ?? 0; - if (count <= 0) { - setStatus("error"); - setMessage("Missing eval case count. Restart bootstrap."); + if (status === "bootstrapEvalConfirm") { + if (input.toLowerCase() === "y") { + const count = evalBootstrapCount ?? 0; + if (count <= 0) { + setStatus("error"); + setMessage("Missing eval case count. Restart bootstrap."); + return; + } + await bootstrapEvalConfig(count, true); return; } - await bootstrapEvalConfig(count, true); - return; - } - if (input.toLowerCase() === "n" || key.escape) { - setStatus("idle"); - setMessage("Bootstrap cancelled."); - setEvalCaseCountInput(""); - setEvalBootstrapCount(null); - return; - } - if (input.toLowerCase() === "q") { - app.exit(); + if (input.toLowerCase() === "n" || key.escape) { + setStatus("idle"); + setMessage("Bootstrap cancelled."); + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + return; + } + if (input.toLowerCase() === "q") { + app.exit(); + return; + } return; } - return; - } - if (status === "generate-pick") { - if (input.toLowerCase() === "c") { - setGenerateTarget("copilot-instructions"); - if (isMonorepo && repoApps.length > 1) { - setStatus("generate-app-pick"); - setMessage("Generate for root or per-app?"); - } else { - const savePath = path.join(repoPath, ".github", "copilot-instructions.md"); - setGenerateSavePath(savePath); - await doGenerate(repoPath, savePath, "copilot-instructions"); + if (status === "generate-pick") { + if (input.toLowerCase() === "c") { + setGenerateTarget("copilot-instructions"); + if (isMonorepo && repoApps.length > 1) { + setStatus("generate-app-pick"); + setMessage("Generate for root or per-app?"); + } else { + const savePath = path.join(repoPath, ".github", "copilot-instructions.md"); + setGenerateSavePath(savePath); + await doGenerate(repoPath, savePath, "copilot-instructions"); + } + return; } - return; - } - if (input.toLowerCase() === "a") { - setGenerateTarget("agents-md"); - if (isMonorepo && repoApps.length > 1) { - setStatus("generate-app-pick"); - setMessage("Generate for root or per-app?"); - } else { - const savePath = path.join(repoPath, "AGENTS.md"); - setGenerateSavePath(savePath); - await doGenerate(repoPath, savePath, "agents-md"); + if (input.toLowerCase() === "a") { + setGenerateTarget("agents-md"); + if (isMonorepo && repoApps.length > 1) { + setStatus("generate-app-pick"); + setMessage("Generate for root or per-app?"); + } else { + const savePath = path.join(repoPath, "AGENTS.md"); + setGenerateSavePath(savePath); + await doGenerate(repoPath, savePath, "agents-md"); + } + return; } - return; - } - if (input.toLowerCase() === "f") { - if (repoAreas.length === 0) { - setMessage("No areas detected. Add primer.config.json to define areas."); + if (input.toLowerCase() === "f") { + if (repoAreas.length === 0) { + setMessage("No areas detected. Add primer.config.json to define areas."); + return; + } + setAreaCursor(0); + setStatus("generate-area-pick"); + setMessage("Generate file-based instructions for areas."); + return; + } + if (key.escape) { + setStatus("idle"); + setMessage(""); return; } - setAreaCursor(0); - setStatus("generate-area-pick"); - setMessage("Generate file-based instructions for areas."); - return; - } - if (key.escape) { - setStatus("idle"); - setMessage(""); return; } - return; - } - if (status === "generate-app-pick") { - if (input.toLowerCase() === "r") { - // Root only - const savePath = - generateTarget === "copilot-instructions" - ? path.join(repoPath, ".github", "copilot-instructions.md") - : path.join(repoPath, "AGENTS.md"); - setGenerateSavePath(savePath); - await doGenerate(repoPath, savePath, generateTarget); - return; - } - if (input.toLowerCase() === "a") { - // All apps sequentially - setStatus("generating"); - addLog(`Generating ${generateTarget} for ${repoApps.length} apps...`, "progress"); - let count = 0; - for (const app of repoApps) { + if (status === "generate-app-pick") { + if (input.toLowerCase() === "r") { + // Root only const savePath = generateTarget === "copilot-instructions" - ? path.join(app.path, ".github", "copilot-instructions.md") - : path.join(app.path, "AGENTS.md"); - setMessage(`Generating for ${app.name} (${count + 1}/${repoApps.length})...`); - try { - const content = await generateCopilotInstructions({ - repoPath: app.path, - onProgress: (msg) => setMessage(`${app.name}: ${msg}`) - }); - if (content.trim()) { - await fs.mkdir(path.dirname(savePath), { recursive: true }); - const { wrote: saved } = await safeWriteFile(savePath, content, true); - if (!saved) continue; - count++; - addLog(`${app.name}: saved ${path.basename(savePath)}`, "success"); + ? path.join(repoPath, ".github", "copilot-instructions.md") + : path.join(repoPath, "AGENTS.md"); + setGenerateSavePath(savePath); + await doGenerate(repoPath, savePath, generateTarget); + return; + } + if (input.toLowerCase() === "a") { + // All apps sequentially + setStatus("generating"); + addLog(`Generating ${generateTarget} for ${repoApps.length} apps...`, "progress"); + let count = 0; + for (const app of repoApps) { + const savePath = + generateTarget === "copilot-instructions" + ? path.join(app.path, ".github", "copilot-instructions.md") + : path.join(app.path, "AGENTS.md"); + setMessage(`Generating for ${app.name} (${count + 1}/${repoApps.length})...`); + try { + const content = await generateCopilotInstructions({ + repoPath: app.path, + onProgress: (msg) => setMessage(`${app.name}: ${msg}`) + }); + if (content.trim()) { + await fs.mkdir(path.dirname(savePath), { recursive: true }); + const { wrote: saved } = await safeWriteFile(savePath, content, true); + if (!saved) continue; + count++; + addLog(`${app.name}: saved ${path.basename(savePath)}`, "success"); + } + } catch (error) { + const msg = error instanceof Error ? error.message : "Failed."; + addLog(`${app.name}: ${msg}`, "error"); } - } catch (error) { - const msg = error instanceof Error ? error.message : "Failed."; - addLog(`${app.name}: ${msg}`, "error"); } + setStatus("done"); + setMessage(`Generated ${generateTarget} for ${count}/${repoApps.length} apps.`); + return; + } + // Number to pick a specific app + const num = Number.parseInt(input, 10); + if (Number.isFinite(num) && num >= 1 && num <= repoApps.length) { + const app = repoApps[num - 1]; + const savePath = + generateTarget === "copilot-instructions" + ? path.join(app.path, ".github", "copilot-instructions.md") + : path.join(app.path, "AGENTS.md"); + setGenerateSavePath(savePath); + await doGenerate(app.path, savePath, generateTarget); + return; + } + if (key.escape) { + setStatus("generate-pick"); + setMessage("Select what to generate."); + return; } - setStatus("done"); - setMessage(`Generated ${generateTarget} for ${count}/${repoApps.length} apps.`); - return; - } - // Number to pick a specific app - const num = Number.parseInt(input, 10); - if (Number.isFinite(num) && num >= 1 && num <= repoApps.length) { - const app = repoApps[num - 1]; - const savePath = - generateTarget === "copilot-instructions" - ? path.join(app.path, ".github", "copilot-instructions.md") - : path.join(app.path, "AGENTS.md"); - setGenerateSavePath(savePath); - await doGenerate(app.path, savePath, generateTarget); - return; - } - if (key.escape) { - setStatus("generate-pick"); - setMessage("Select what to generate."); return; } - return; - } - if (status === "generate-area-pick") { - if (input.toLowerCase() === "a") { - // All areas - setStatus("generating-areas"); - addLog( - `Generating file-based instructions for ${repoAreas.length} areas...`, - "progress" - ); - let written = 0; - for (const [i, area] of repoAreas.entries()) { - setMessage(`Generating for "${area.name}" (${i + 1}/${repoAreas.length})...`); + if (status === "generate-area-pick") { + if (input.toLowerCase() === "a") { + // All areas + setStatus("generating-areas"); + addLog( + `Generating file-based instructions for ${repoAreas.length} areas...`, + "progress" + ); + let written = 0; + for (const [i, area] of repoAreas.entries()) { + setMessage(`Generating for "${area.name}" (${i + 1}/${repoAreas.length})...`); + try { + const body = await generateAreaInstructions({ + repoPath, + area, + onProgress: (msg) => setMessage(`${area.name}: ${msg}`) + }); + const result = await writeAreaInstruction(repoPath, area, body); + if (result.status === "written") { + written++; + addLog(`${area.name}: saved ${path.basename(result.filePath)}`, "success"); + } else if (result.status === "skipped") { + addLog(`${area.name}: skipped (file exists)`, "info"); + } + } catch (error) { + const msg = error instanceof Error ? error.message : "Failed."; + addLog(`${area.name}: ${msg}`, "error"); + } + } + setStatus("done"); + setMessage( + `Generated file-based instructions for ${written}/${repoAreas.length} areas.` + ); + return; + } + if (key.upArrow) { + setAreaCursor((prev) => Math.max(0, prev - 1)); + return; + } + if (key.downArrow) { + setAreaCursor((prev) => Math.min(repoAreas.length - 1, prev + 1)); + return; + } + if (key.return) { + const area = repoAreas[areaCursor]; + if (!area) return; + setStatus("generating-areas"); + setMessage(`Generating for "${area.name}"...`); + addLog(`Generating file-based instructions for "${area.name}"...`, "progress"); try { const body = await generateAreaInstructions({ repoPath, area, onProgress: (msg) => setMessage(`${area.name}: ${msg}`) }); - const result = await writeAreaInstruction(repoPath, area, body); - if (result.status === "written") { - written++; - addLog(`${area.name}: saved ${path.basename(result.filePath)}`, "success"); - } else if (result.status === "skipped") { - addLog(`${area.name}: skipped (file exists)`, "info"); + if (body.trim()) { + const filePath = areaInstructionPath(repoPath, area); + setGeneratedContent(buildAreaInstructionContent(area, body)); + setGenerateSavePath(filePath); + setStatus("preview"); + setMessage("Review the generated area instructions."); + addLog(`"${area.name}" generated — review and save.`, "success"); + } else { + setStatus("done"); + setMessage(`No content generated for "${area.name}".`); } } catch (error) { const msg = error instanceof Error ? error.message : "Failed."; + setStatus("error"); + setMessage(msg); addLog(`${area.name}: ${msg}`, "error"); } + return; + } + if (key.escape) { + setStatus("generate-pick"); + setMessage("Select what to generate."); + return; } - setStatus("done"); - setMessage( - `Generated file-based instructions for ${written}/${repoAreas.length} areas.` - ); - return; - } - if (key.upArrow) { - setAreaCursor((prev) => Math.max(0, prev - 1)); return; } - if (key.downArrow) { - setAreaCursor((prev) => Math.min(repoAreas.length - 1, prev + 1)); + + if (status === "model-pick") { + if (key.escape) { + setStatus("idle"); + setMessage(""); + return; + } + if (key.upArrow) { + setModelCursor((prev) => Math.max(0, prev - 1)); + return; + } + if (key.downArrow) { + setModelCursor((prev) => Math.min(availableModels.length - 1, prev + 1)); + return; + } + if (key.return) { + const chosen = availableModels[modelCursor]; + if (chosen) { + if (modelPickTarget === "eval") { + setEvalModel(chosen); + addLog(`Eval model → ${chosen}`, "success"); + } else { + setJudgeModel(chosen); + addLog(`Judge model → ${chosen}`, "success"); + } + setStatus("idle"); + setMessage( + `${modelPickTarget === "eval" ? "Eval" : "Judge"} model set to ${chosen}` + ); + } + return; + } return; } - if (key.return) { - const area = repoAreas[areaCursor]; - if (!area) return; - setStatus("generating-areas"); - setMessage(`Generating for "${area.name}"...`); - addLog(`Generating file-based instructions for "${area.name}"...`, "progress"); - try { - const body = await generateAreaInstructions({ + + if (status === "eval-pick") { + if (input.toLowerCase() === "r") { + // Run eval + const configPath = path.join(repoPath, "primer.eval.json"); + const outputPath = path.join( repoPath, - area, - onProgress: (msg) => setMessage(`${area.name}: ${msg}`) - }); - if (body.trim()) { - const filePath = areaInstructionPath(repoPath, area); - setGeneratedContent(buildAreaInstructionContent(area, body)); - setGenerateSavePath(filePath); - setStatus("preview"); - setMessage("Review the generated area instructions."); - addLog(`"${area.name}" generated — review and save.`, "success"); - } else { + ".primer", + "evals", + buildTimestampedName("eval-results") + ); + try { + await fs.access(configPath); + } catch { + setStatus("error"); + const msg = "No primer.eval.json found. Press [E] then [I] to create one."; + setMessage(msg); + addLog(msg, "error"); + return; + } + + setStatus("evaluating"); + setMessage("Running evals... (this may take a few minutes)"); + addLog("Running evals...", "progress"); + setEvalResults(null); + setEvalViewerPath(null); + try { + const { results, viewerPath } = await runEval({ + configPath, + repoPath, + model: evalModel, + judgeModel: judgeModel, + outputPath + }); + setEvalResults(results); + setEvalViewerPath(viewerPath ?? null); + const passed = results.filter((r) => r.verdict === "pass").length; + const failed = results.filter((r) => r.verdict === "fail").length; setStatus("done"); - setMessage(`No content generated for "${area.name}".`); + const msg = `Eval complete: ${passed} pass, ${failed} fail out of ${results.length} cases.`; + setMessage(msg); + addLog(msg, "success"); + } catch (error) { + setStatus("error"); + const msg = error instanceof Error ? error.message : "Eval failed."; + setMessage(msg); + addLog(msg, "error"); } - } catch (error) { - const msg = error instanceof Error ? error.message : "Failed."; - setStatus("error"); - setMessage(msg); - addLog(`${area.name}: ${msg}`, "error"); + return; + } + if (input.toLowerCase() === "i") { + setStatus("bootstrapEvalCount"); + setMessage("Enter number of eval cases, then press Enter."); + setEvalCaseCountInput(""); + setEvalBootstrapCount(null); + return; + } + if (key.escape || input.toLowerCase() === "b") { + setStatus("idle"); + setMessage(""); + return; } return; } - if (key.escape) { - setStatus("generate-pick"); - setMessage("Select what to generate."); - return; - } - return; - } - if (status === "model-pick") { - if (key.escape) { - setStatus("idle"); - setMessage(""); - return; - } - if (key.upArrow) { - setModelCursor((prev) => Math.max(0, prev - 1)); - return; - } - if (key.downArrow) { - setModelCursor((prev) => Math.min(availableModels.length - 1, prev + 1)); - return; - } - if (key.return) { - const chosen = availableModels[modelCursor]; - if (chosen) { - if (modelPickTarget === "eval") { - setEvalModel(chosen); - addLog(`Eval model → ${chosen}`, "success"); - } else { - setJudgeModel(chosen); - addLog(`Judge model → ${chosen}`, "success"); + if (status === "batch-pick") { + if (input.toLowerCase() === "g") { + setStatus("generating"); + setMessage("Checking GitHub authentication..."); + addLog("Starting batch (GitHub)...", "progress"); + const token = await getGitHubToken(); + if (!token) { + setStatus("error"); + const msg = "GitHub auth required. Run 'gh auth login' or set GITHUB_TOKEN."; + setMessage(msg); + addLog(msg, "error"); + return; + } + setBatchToken(token); + setStatus("batch-github"); + return; + } + if (input.toLowerCase() === "a") { + setStatus("generating"); + setMessage("Checking Azure DevOps authentication..."); + addLog("Starting batch (Azure DevOps)...", "progress"); + const token = getAzureDevOpsToken(); + if (!token) { + setStatus("error"); + const msg = "Azure DevOps PAT required. Set AZURE_DEVOPS_PAT or AZDO_PAT."; + setMessage(msg); + addLog(msg, "error"); + return; } + setBatchAzureToken(token); + setStatus("batch-azure"); + return; + } + if (key.escape || input.toLowerCase() === "b") { setStatus("idle"); - setMessage(`${modelPickTarget === "eval" ? "Eval" : "Judge"} model set to ${chosen}`); + setMessage(""); + return; } return; } - return; - } - if (status === "eval-pick") { - if (input.toLowerCase() === "r") { - // Run eval - const configPath = path.join(repoPath, "primer.eval.json"); - const outputPath = path.join( - repoPath, - ".primer", - "evals", - buildTimestampedName("eval-results") - ); - try { - await fs.access(configPath); - } catch { - setStatus("error"); - const msg = "No primer.eval.json found. Press [E] then [I] to create one."; - setMessage(msg); - addLog(msg, "error"); + // Idle-state shortcuts — only active from idle, done, or error + if (status === "idle" || status === "done" || status === "error") { + if (input.toLowerCase() === "g") { + setStatus("generate-pick"); + setMessage("Select what to generate."); return; } - setStatus("evaluating"); - setMessage("Running evals... (this may take a few minutes)"); - addLog("Running evals...", "progress"); - setEvalResults(null); - setEvalViewerPath(null); - try { - const { results, viewerPath } = await runEval({ - configPath, - repoPath, - model: evalModel, - judgeModel: judgeModel, - outputPath - }); - setEvalResults(results); - setEvalViewerPath(viewerPath ?? null); - const passed = results.filter((r) => r.verdict === "pass").length; - const failed = results.filter((r) => r.verdict === "fail").length; - setStatus("done"); - const msg = `Eval complete: ${passed} pass, ${failed} fail out of ${results.length} cases.`; - setMessage(msg); - addLog(msg, "success"); - } catch (error) { - setStatus("error"); - const msg = error instanceof Error ? error.message : "Eval failed."; - setMessage(msg); - addLog(msg, "error"); + if (input.toLowerCase() === "b") { + setStatus("batch-pick"); + setMessage("Select batch provider."); + return; } - return; - } - if (input.toLowerCase() === "i") { - setStatus("bootstrapEvalCount"); - setMessage("Enter number of eval cases, then press Enter."); - setEvalCaseCountInput(""); - setEvalBootstrapCount(null); - return; - } - if (key.escape || input.toLowerCase() === "b") { - setStatus("idle"); - setMessage(""); - return; - } - return; - } - if (status === "batch-pick") { - if (input.toLowerCase() === "g") { - setStatus("generating"); - setMessage("Checking GitHub authentication..."); - addLog("Starting batch (GitHub)...", "progress"); - const token = await getGitHubToken(); - if (!token) { - setStatus("error"); - const msg = "GitHub auth required. Run 'gh auth login' or set GITHUB_TOKEN."; - setMessage(msg); - addLog(msg, "error"); + if (input.toLowerCase() === "e") { + setStatus("eval-pick"); + setMessage("Select eval action."); return; } - setBatchToken(token); - setStatus("batch-github"); - return; - } - if (input.toLowerCase() === "a") { - setStatus("generating"); - setMessage("Checking Azure DevOps authentication..."); - addLog("Starting batch (Azure DevOps)...", "progress"); - const token = getAzureDevOpsToken(); - if (!token) { - setStatus("error"); - const msg = "Azure DevOps PAT required. Set AZURE_DEVOPS_PAT or AZDO_PAT."; - setMessage(msg); - addLog(msg, "error"); + + if (input.toLowerCase() === "m") { + if (hideModelPicker) { + setMessage( + 'Model picker hidden. Set ui.modelPicker to "visible" in primer.eval.json.' + ); + return; + } + setModelPickTarget("eval"); + setStatus("model-pick"); + setMessage("Pick eval model."); + const idx = availableModels.indexOf(evalModel); + setModelCursor(idx >= 0 ? idx : 0); return; } - setBatchAzureToken(token); - setStatus("batch-azure"); - return; - } - if (key.escape || input.toLowerCase() === "b") { - setStatus("idle"); - setMessage(""); - return; - } - return; - } - - if (input.toLowerCase() === "g") { - setStatus("generate-pick"); - setMessage("Select what to generate."); - return; - } - - if (input.toLowerCase() === "b") { - setStatus("batch-pick"); - setMessage("Select batch provider."); - return; - } - if (input.toLowerCase() === "e") { - setStatus("eval-pick"); - setMessage("Select eval action."); - return; - } - - if (input.toLowerCase() === "m") { - if (hideModelPicker) { - setMessage('Model picker hidden. Set ui.modelPicker to "visible" in primer.eval.json.'); - return; + if (input.toLowerCase() === "j") { + if (hideModelPicker) { + setMessage( + 'Model picker hidden. Set ui.modelPicker to "visible" in primer.eval.json.' + ); + return; + } + setModelPickTarget("judge"); + setStatus("model-pick"); + setMessage("Pick judge model."); + const idx = availableModels.indexOf(judgeModel); + setModelCursor(idx >= 0 ? idx : 0); + return; + } } - setModelPickTarget("eval"); - setStatus("model-pick"); - setMessage("Pick eval model."); - const idx = availableModels.indexOf(evalModel); - setModelCursor(idx >= 0 ? idx : 0); - return; - } - if (input.toLowerCase() === "j") { - if (hideModelPicker) { - setMessage('Model picker hidden. Set ui.modelPicker to "visible" in primer.eval.json.'); + if (key.escape || input.toLowerCase() === "q") { + app.exit(); return; } - setModelPickTarget("judge"); - setStatus("model-pick"); - setMessage("Pick judge model."); - const idx = availableModels.indexOf(judgeModel); - setModelCursor(idx >= 0 ? idx : 0); - return; - } - - if (key.escape || input.toLowerCase() === "q") { - app.exit(); - return; + } catch (err) { + setStatus("error"); + setMessage(err instanceof Error ? err.message : "Unexpected error"); } - } catch (err) { - setStatus("error"); - setMessage(err instanceof Error ? err.message : "Unexpected error"); - } - })(); - }); + })(); + }, + { isActive: inputActive } + ); const statusIcon = status === "error" ? "✗" : status === "done" ? "✓" : isLoading ? spinner : "●"; const statusLabel = @@ -1235,17 +1202,30 @@ export function PrimerTui({ repoPath, skipAnimation = false }: Props): React.JSX + ) : status === "bootstrapEvalCount" ? ( + + Type number, then + + Enter + + to confirm + + ) : status === "eval-pick" ? ( - + ) : status === "batch-pick" ? ( - + + + ) : isLoading ? ( + + ) : ( diff --git a/vscode-extension/esbuild.mjs b/vscode-extension/esbuild.mjs index 1cddc54..c454be2 100644 --- a/vscode-extension/esbuild.mjs +++ b/vscode-extension/esbuild.mjs @@ -11,7 +11,8 @@ const buildOptions = { platform: "node", target: "node22", outfile: "out/extension.js", - external: ["vscode", "@github/copilot-sdk"], + // Keep Copilot SDK bundled: packaged extensions may not have node_modules at runtime. + external: ["vscode"], sourcemap: !production, minify: production, alias: { diff --git a/vscode-extension/package.json b/vscode-extension/package.json index 78dadd6..8f96dd3 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -289,10 +289,8 @@ "extensionDependencies": [ "vscode.git" ], - "dependencies": { - "@github/copilot-sdk": "^0.1.24" - }, "devDependencies": { + "@github/copilot-sdk": "^0.1.24", "@octokit/rest": "^22.0.1", "@types/node": "^25.2.3", "@types/vscode": "^1.109.0", diff --git a/vscode-extension/primer-vscode.vsix b/vscode-extension/primer-vscode.vsix new file mode 100644 index 0000000000000000000000000000000000000000..e1939c0d5d6e1d457b091e3b6b5c1fee3112816e GIT binary patch literal 459643 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

    +dao7q@pCJb@) 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 C7&V7 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ɝV)c_3p9$MqGc3#S|WX+nY;( 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 =MO-c7@Fc_onrRtC1hTH!}FjX0YzE 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 literal 0 HcmV?d00001 From ee42d27333203c10162f000db5c52cc2c75141cf Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 23 Feb 2026 14:38:37 -0800 Subject: [PATCH 81/84] chore: remove .vsix from repo, add to gitignore --- .gitignore | 1 + vscode-extension/primer-vscode.vsix | Bin 459643 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 vscode-extension/primer-vscode.vsix diff --git a/.gitignore b/.gitignore index f6d10ec..2b64acf 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ npm-debug.log* # Primer outputs .primer/ readiness-report.html +*.vsix diff --git a/vscode-extension/primer-vscode.vsix b/vscode-extension/primer-vscode.vsix deleted file mode 100644 index e1939c0d5d6e1d457b091e3b6b5c1fee3112816e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 459643 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

    +dao7q@pCJb@) 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 C7&V7 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ɝV)c_3p9$MqGc3#S|WX+nY;( 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 =MO-c7@Fc_onrRtC1hTH!}FjX0YzE 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 From 3443e412ed1340bf8e1e77e0168cde13d0a42a52 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 23 Feb 2026 19:58:06 -0800 Subject: [PATCH 82/84] refactor: improve instruction generation clarity --- src/services/instructions.ts | 6 +++--- vscode-extension/esbuild.mjs | 28 ++++++++++++++++++++++++++++ vscode-extension/package-lock.json | 14 +++++++++++--- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/services/instructions.ts b/src/services/instructions.ts index affadec..3ed8f4d 100644 --- a/src/services/instructions.ts +++ b/src/services/instructions.ts @@ -67,7 +67,7 @@ export async function generateCopilotInstructions( // Simple prompt - let the agent use tools to explore const prompt = `Analyze this codebase and generate a .github/copilot-instructions.md file. -Use tools to explore: +Fan out multiple Explore subagents to map out the codebase in parallel: 1. Check for existing instruction files: glob for **/{.github/copilot-instructions.md,AGENT.md,CLAUDE.md,.cursorrules,README.md} 2. Identify the tech stack: look at package.json, tsconfig.json, pyproject.toml, Cargo.toml, go.mod, *.csproj, *.sln, build.gradle, pom.xml, etc. 3. Understand the structure: list key directories @@ -80,7 +80,7 @@ Generate concise instructions (~20-50 lines) covering: - Key files/directories - Monorepo structure and per-app layout (if this is a monorepo, describe the workspace organization, how apps relate to each other, and any shared libraries) -Output ONLY the markdown content for the instructions file.`; +Output ONLY the markdown content for the instructions file, not wrapped in markdown code fences.`; progress("Analyzing codebase..."); await session.sendAndWait({ prompt }, 180000); @@ -122,7 +122,7 @@ export async function generateAreaInstructions( streaming: true, workingDirectory: repoPath, systemMessage: { - content: `You are an expert codebase analyst. Your task is to generate a concise .instructions.md file for a specific area of a codebase. This file will be used as a file-based custom instruction in VS Code Copilot, automatically applied when working on files matching certain patterns. Use the available tools (glob, view, grep) to explore the codebase. Output ONLY the final markdown content (no frontmatter, no explanations).` + content: `You are an expert codebase analyst. Your task is to generate a concise .instructions.md file for a specific area of a codebase. This file will be used as a file-based custom instruction in VS Code Copilot, automatically applied when working on files matching certain patterns. Use the Explore subagents and read-only tools to explore the codebase. Output ONLY the final markdown content, not wrapped in markdown code fences.` }, infiniteSessions: { enabled: false } }); diff --git a/vscode-extension/esbuild.mjs b/vscode-extension/esbuild.mjs index c454be2..79db18f 100644 --- a/vscode-extension/esbuild.mjs +++ b/vscode-extension/esbuild.mjs @@ -1,8 +1,35 @@ import * as esbuild from "esbuild"; +import { readFile } from "node:fs/promises"; const production = process.argv.includes("--production"); const watch = process.argv.includes("--watch"); +/** + * esbuild plugin: neutralise the SDK's getBundledCliPath() which calls + * import.meta.resolve("@github/copilot/sdk"). In CJS bundles esbuild replaces + * import.meta with {}, making .resolve undefined and crashing at runtime. + * Primer always passes an explicit cliPath so this function is dead code, but + * the SDK constructor still evaluates it as a default value. + */ +const shimSdkImportMeta = { + name: "shim-sdk-import-meta", + setup(build) { + build.onLoad( + { filter: /copilot-sdk[\\/]dist[\\/]client\.js$/ }, + async (args) => { + let contents = await readFile(args.path, "utf8"); + // Replace the body of getBundledCliPath with a safe no-op return. + // The function signature and surrounding code stay intact. + contents = contents.replace( + 'const sdkUrl = import.meta.resolve("@github/copilot/sdk");\n const sdkPath = fileURLToPath(sdkUrl);\n return join(dirname(dirname(sdkPath)), "index.js");', + 'return "bundled-cli-unavailable";' + ); + return { contents, loader: "js" }; + } + ); + } +}; + /** @type {esbuild.BuildOptions} */ const buildOptions = { entryPoints: ["src/extension.ts"], @@ -15,6 +42,7 @@ const buildOptions = { external: ["vscode"], sourcemap: !production, minify: production, + plugins: [shimSdkImportMeta], alias: { // Resolve Primer source imports via the parent src/ directory primer: "../src" diff --git a/vscode-extension/package-lock.json b/vscode-extension/package-lock.json index 19a9cbc..b69a95d 100644 --- a/vscode-extension/package-lock.json +++ b/vscode-extension/package-lock.json @@ -8,10 +8,8 @@ "name": "primer-vscode", "version": "0.0.1", "license": "MIT", - "dependencies": { - "@github/copilot-sdk": "^0.1.24" - }, "devDependencies": { + "@github/copilot-sdk": "^0.1.24", "@octokit/rest": "^22.0.1", "@types/node": "^25.2.3", "@types/vscode": "^1.109.0", @@ -468,6 +466,7 @@ "version": "0.0.411", "resolved": "https://registry.npmjs.org/@github/copilot/-/copilot-0.0.411.tgz", "integrity": "sha512-I3/7gw40Iu1O+kTyNPKJHNqDRyOebjsUW6wJsvSVrOpT0TNa3/lfm8xdS2XUuJWkp+PgEG/PRwF7u3DVNdP7bQ==", + "dev": true, "license": "SEE LICENSE IN LICENSE.md", "bin": { "copilot": "npm-loader.js" @@ -488,6 +487,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.md", "optional": true, "os": [ @@ -504,6 +504,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.md", "optional": true, "os": [ @@ -520,6 +521,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.md", "optional": true, "os": [ @@ -536,6 +538,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.md", "optional": true, "os": [ @@ -549,6 +552,7 @@ "version": "0.1.25", "resolved": "https://registry.npmjs.org/@github/copilot-sdk/-/copilot-sdk-0.1.25.tgz", "integrity": "sha512-hIgYLPXzWw9bNgrsD5BLKmgVH20ow5Or5UyVXfVe3YgeiaTgFxC4jWSAVHLGB6ufHZUrvbjppcq2dWK63FmDRA==", + "dev": true, "license": "MIT", "dependencies": { "@github/copilot": "^0.0.411", @@ -566,6 +570,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.md", "optional": true, "os": [ @@ -582,6 +587,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "SEE LICENSE IN LICENSE.md", "optional": true, "os": [ @@ -880,6 +886,7 @@ "version": "8.2.1", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=14.0.0" @@ -889,6 +896,7 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" From ad1a0981bb6488184712732d58ef6e0014374be0 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 23 Feb 2026 20:00:01 -0800 Subject: [PATCH 83/84] chore: update version to 2.0.0 --- CHANGELOG.md | 2 +- package.json | 2 +- release-please-manifest.json | 2 +- vscode-extension/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e09f2fd..97d493f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. -## [Unreleased] +## [2.0.0] ### Complete Rewrite diff --git a/package.json b/package.json index c65b5cd..4923e6a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "primer", - "version": "1.0.0", + "version": "2.0.0", "description": "Prime repositories for AI-assisted development", "main": "dist/index.js", "type": "module", diff --git a/release-please-manifest.json b/release-please-manifest.json index 37fcefa..895bf0e 100644 --- a/release-please-manifest.json +++ b/release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.0.0" + ".": "2.0.0" } diff --git a/vscode-extension/package.json b/vscode-extension/package.json index 8f96dd3..02bd23f 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -2,7 +2,7 @@ "name": "primer-vscode", "displayName": "Primer — AI Repository Setup", "description": "Prime repositories for AI-assisted development: generate Copilot instructions, VS Code configs, MCP configs, and evaluate AI agent effectiveness.", - "version": "0.0.1", + "version": "0.0.2", "publisher": "digitarald", "license": "MIT", "repository": { From dea45f37adeb4547e878b6882e45a98041e0c757 Mon Sep 17 00:00:00 2001 From: Harald Kirschner Date: Mon, 23 Feb 2026 20:01:52 -0800 Subject: [PATCH 84/84] refactor: simplify shimSdkImportMeta setup --- vscode-extension/esbuild.mjs | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/vscode-extension/esbuild.mjs b/vscode-extension/esbuild.mjs index 79db18f..bf4e942 100644 --- a/vscode-extension/esbuild.mjs +++ b/vscode-extension/esbuild.mjs @@ -14,19 +14,16 @@ const watch = process.argv.includes("--watch"); const shimSdkImportMeta = { name: "shim-sdk-import-meta", setup(build) { - build.onLoad( - { filter: /copilot-sdk[\\/]dist[\\/]client\.js$/ }, - async (args) => { - let contents = await readFile(args.path, "utf8"); - // Replace the body of getBundledCliPath with a safe no-op return. - // The function signature and surrounding code stay intact. - contents = contents.replace( - 'const sdkUrl = import.meta.resolve("@github/copilot/sdk");\n const sdkPath = fileURLToPath(sdkUrl);\n return join(dirname(dirname(sdkPath)), "index.js");', - 'return "bundled-cli-unavailable";' - ); - return { contents, loader: "js" }; - } - ); + build.onLoad({ filter: /copilot-sdk[\\/]dist[\\/]client\.js$/ }, async (args) => { + let contents = await readFile(args.path, "utf8"); + // Replace the body of getBundledCliPath with a safe no-op return. + // The function signature and surrounding code stay intact. + contents = contents.replace( + 'const sdkUrl = import.meta.resolve("@github/copilot/sdk");\n const sdkPath = fileURLToPath(sdkUrl);\n return join(dirname(dirname(sdkPath)), "index.js");', + 'return "bundled-cli-unavailable";' + ); + return { contents, loader: "js" }; + }); } };