Skip to content

Commit 5437ee2

Browse files
authored
Merge release/2.0.4 into master. Forced merge with PAT token.
Merge release/2.0.4 into master
2 parents b58aee7 + b8e26f0 commit 5437ee2

26 files changed

Lines changed: 932 additions & 131 deletions

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
Full documentation: **[docs.page/vypdev/copilot](https://docs.page/vypdev/copilot)**
1212

13+
*Maintains state and configuration persisted in issue descriptions for seamless workflow automation.*
14+
1315
---
1416

1517
## Documentation index

_agent/docs/architecture.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
name: Architecture
3+
description: Project architecture, entry points, and use case flows.
4+
---
5+
6+
# Architecture & Key Paths
7+
8+
## Entry and main flow
9+
10+
1. **GitHub Action**: `src/actions/github_action.ts` reads inputs, builds `Execution`, calls `mainRun(execution)` from `common_action.ts`.
11+
2. **CLI**: `src/actions/local_action.ts` same flow with CLI/config inputs.
12+
3. **common_action.ts**: Sets up; calls `waitForPreviousRuns(execution)` (sequential workflow); then:
13+
- **Single action**`SingleActionUseCase`
14+
- **Issue**`IssueCommentUseCase` or `IssueUseCase`
15+
- **Pull request**`PullRequestReviewCommentUseCase` or `PullRequestUseCase`
16+
- **Push**`CommitUseCase`
17+
18+
## Key paths
19+
20+
| Area | Path | Purpose |
21+
|------|------|--------|
22+
| Action entry | `src/actions/github_action.ts` | Reads inputs, builds Execution |
23+
| CLI entry | `src/cli.ts``local_action.ts` | Same flow, local inputs |
24+
| Shared flow | `src/actions/common_action.ts` | mainRun, waitForPreviousRuns, dispatch to use cases |
25+
| Use cases | `src/usecase/` | issue_use_case, pull_request_use_case, commit_use_case, single_action_use_case |
26+
| Single actions | `src/usecase/actions/` | check_progress, detect_errors, recommend_steps, think, initial_setup, create_release, create_tag, publish_github_action, deployed_action |
27+
| Steps (issue) | `src/usecase/steps/issue/` | check_permissions, close_not_allowed_issue, assign_members, update_title, update_issue_type, link_issue_project, check_priority_issue_size, prepare_branches, remove_issue_branches, remove_not_needed_branches, label_deploy_added, label_deployed_added, move_issue_to_in_progress, answer_issue_help_use_case (question/help on open). On issue opened: RecommendStepsUseCase (non release/question/help) or AnswerIssueHelpUseCase (question/help). |
28+
| Steps (PR) | `src/usecase/steps/pull_request/` | update_title, assign_members (issue), assign_reviewers_to_issue, link_pr_project, link_pr_issue, sync_size_and_progress_from_issue, check_priority_pull_request_size, update_description (AI), close_issue_after_merging |
29+
| Steps (commit) | `src/usecase/steps/commit/` | notify commit, check size |
30+
| Steps (issue comment) | `src/usecase/steps/issue_comment/` | check_issue_comment_language (translation) |
31+
| Steps (PR review comment) | `src/usecase/steps/pull_request_review_comment/` | check_pull_request_comment_language (translation) |
32+
| Bugbot autofix & user request | `src/usecase/steps/commit/bugbot/` + `user_request_use_case.ts` | detect_bugbot_fix_intent_use_case (plan agent: is_fix_request, is_do_request, target_finding_ids), BugbotAutofixUseCase + runBugbotAutofixCommitAndPush (fix findings), DoUserRequestUseCase + runUserRequestCommitAndPush (generic “do this”). Permission: ProjectRepository.isActorAllowedToModifyFiles (org member or repo owner). |
33+
| Manager (content) | `src/manager/` | description handlers, configuration_handler, markdown_content_hotfix_handler (PR description, hotfix changelog content) |
34+
| Models | `src/data/model/` | Execution, Issue, PullRequest, SingleAction, etc. |
35+
| Repos | `src/data/repository/` | branch_repository, issue_repository, workflow_repository, ai_repository (OpenCode), file_repository, project_repository |
36+
| Config | `src/utils/constants.ts` | INPUT_KEYS, ACTIONS, defaults |
37+
| Metadata | `action.yml` | Action inputs and defaults |

_agent/docs/bugbot.md

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
---
2+
name: Bugbot
3+
description: Detailed technical reference for Bugbot (detection, markers, context, intent, autofix, do user request, permissions)
4+
---
5+
6+
# Bugbot – technical reference
7+
8+
Bugbot has two main modes: **detection** (on push or single action) and **fix/do** (on issue comment or PR review comment). All Bugbot code lives under `src/usecase/steps/commit/bugbot/` and `src/usecase/steps/commit/` (DetectPotentialProblemsUseCase, user_request_use_case).
9+
10+
---
11+
12+
## 1. Detection flow (push or single action)
13+
14+
**Entry:** `CommitUseCase` (on push) calls `DetectPotentialProblemsUseCase`; or `SingleActionUseCase` when action is `detect_potential_problems_action`.
15+
16+
**Steps:**
17+
18+
1. **Guard:** OpenCode must be configured; `issueNumber !== -1`.
19+
2. **Load context:** `loadBugbotContext(param)` → issue comments + PR review comments parsed for markers; builds `existingByFindingId`, `issueComments`, `openPrNumbers`, `previousFindingsBlock`, `prContext`, `unresolvedFindingsWithBody`. Branch is `param.commit.branch` (or `options.branchOverride` when provided). PR context includes `prHeadSha`, `prFiles`, `pathToFirstDiffLine` for the first open PR.
20+
3. **Build prompt:** `buildBugbotPrompt(param, context)` – repo context, head/base branch, issue number, optional `ai-ignore-files`, and `previousFindingsBlock` (task 2: which previous findings are now resolved). OpenCode is asked to compute the diff itself and return `findings` + `resolved_finding_ids`.
21+
4. **Call OpenCode:** `askAgent(OPENCODE_AGENT_PLAN, prompt, BUGBOT_RESPONSE_SCHEMA)`.
22+
5. **Process response:** Filter findings: safe path (`isSafeFindingFilePath`), not in `ai-ignore-files` (`fileMatchesIgnorePatterns`), `meetsMinSeverity` (min from `bugbot-severity`), `deduplicateFindings`. Apply `applyCommentLimit(findings, bugbot-comment-limit)``toPublish`, `overflowCount`, `overflowTitles`.
23+
6. **Mark resolved:** `markFindingsResolved(execution, context, resolvedFindingIds, normalizedResolvedIds)` – for each existing finding in context whose id is in resolved set, update issue comment (and PR review comment if any) via `replaceMarkerInBody` to set `resolved:true`; if PR comment, call `resolveReviewThread` when applicable.
24+
7. **Publish:** `publishFindings(execution, context, toPublish, overflowCount?, overflowTitles?)` – for each finding: add or update **issue comment** (always); add or update **PR review comment** only when `finding.file` is in `prContext.prFiles` (using `pathToFirstDiffLine` when finding has no line). Each comment body is built with `buildCommentBody(finding, resolved)` and includes the **marker** `<!-- copilot-bugbot finding_id:"id" resolved:false -->`. Overflow: one extra issue comment summarizing excess findings.
25+
26+
**Key paths (detection):**
27+
28+
- `detect_potential_problems_use_case.ts` – orchestration
29+
- `load_bugbot_context_use_case.ts` – issue/PR comments, markers, previousFindingsBlock, prContext
30+
- `build_bugbot_prompt.ts` – prompt for plan agent (task 1: new findings, task 2: resolved ids)
31+
- `schema.ts` – BUGBOT_RESPONSE_SCHEMA (findings, resolved_finding_ids)
32+
- `marker.ts` – BUGBOT_MARKER_PREFIX, buildMarker, parseMarker, replaceMarkerInBody, extractTitleFromBody, buildCommentBody
33+
- `publish_findings_use_case.ts` – add/update issue comment, create/update PR review comment
34+
- `mark_findings_resolved_use_case.ts` – update comment body with resolved marker, resolve PR thread
35+
- `severity.ts`, `file_ignore.ts`, `path_validation.ts`, `limit_comments.ts`, `deduplicate_findings.ts`
36+
37+
---
38+
39+
## 2. Marker format and context
40+
41+
**Marker:** Hidden HTML comment in every finding comment (issue and PR):
42+
43+
`<!-- copilot-bugbot finding_id:"<id>" resolved:true|false -->`
44+
45+
- **Parse:** `parseMarker(body)` returns `{ findingId, resolved }[]`. Used when loading context from issue comments and PR review comments.
46+
- **Build:** `buildMarker(findingId, resolved)`. IDs are sanitized (`sanitizeFindingIdForMarker`) so they cannot break HTML (no `-->`, `<`, `>`, newlines, etc.).
47+
- **Update:** `replaceMarkerInBody(body, findingId, newResolved)` – used when marking a finding as resolved (same comment, body updated with `resolved:true`).
48+
49+
**Context (`BugbotContext`):**
50+
51+
- `existingByFindingId[id]`: `{ issueCommentId?, prCommentId?, prNumber?, resolved }` – from parsing all issue + PR comments for markers.
52+
- `issueComments`: raw list from API (for body when building previousFindingsBlock / unresolvedFindingsWithBody).
53+
- `openPrNumbers`, `previousFindingsBlock`, `prContext` (prHeadSha, prFiles, pathToFirstDiffLine), `unresolvedFindingsWithBody`: `{ id, fullBody }[]` for findings that are not resolved (body truncated to MAX_FINDING_BODY_LENGTH when loading).
54+
55+
---
56+
57+
## 3. Fix intent and file-modifying actions (issue comment / PR review comment)
58+
59+
**Entry:** `IssueCommentUseCase` or `PullRequestReviewCommentUseCase` (after language check).
60+
61+
**Steps:**
62+
63+
1. **Intent:** `DetectBugbotFixIntentUseCase.invoke(param)`
64+
- Guards: OpenCode configured, issue number set, comment body non-empty, branch (or branchOverride from `getHeadBranchForIssue` when commit.branch empty).
65+
- `loadBugbotContext(param, { branchOverride })` → unresolved findings.
66+
- Build `UnresolvedFindingSummary[]` (id, title from `extractTitleFromBody`, description = fullBody.slice(0, 4000)).
67+
- If PR review comment and `commentInReplyToId`: fetch parent comment body (`getPullRequestReviewCommentBody`), slice(0,1500).trim for prompt.
68+
- `buildBugbotFixIntentPrompt(commentBody, unresolvedFindings, parentCommentBody?)` → prompt asks: is_fix_request?, target_finding_ids?, is_do_request?
69+
- `askAgent(OPENCODE_AGENT_PLAN, prompt, BUGBOT_FIX_INTENT_RESPONSE_SCHEMA)``{ is_fix_request, target_finding_ids, is_do_request }`.
70+
- Payload: `isFixRequest`, `isDoRequest`, `targetFindingIds` (filtered to valid unresolved ids), `context`, `branchOverride`.
71+
72+
2. **Permission:** `ProjectRepository.isActorAllowedToModifyFiles(owner, actor, token)`.
73+
- If owner is Organization: `orgs.checkMembershipForUser` (204 = allowed).
74+
- If owner is User: allowed only if `actor === owner`.
75+
76+
3. **Branch A – Bugbot autofix** (when `canRunBugbotAutofix(payload)` and `allowedToModifyFiles`):
77+
- `BugbotAutofixUseCase.invoke({ execution, targetFindingIds, userComment, context, branchOverride })`
78+
- Load context if not provided; filter targets to valid unresolved ids; `buildBugbotFixPrompt(...)` with repo, findings block (truncated fullBody per finding), user comment, verify commands; `copilotMessage(ai, prompt)` (build agent).
79+
- If success: `runBugbotAutofixCommitAndPush(execution, { branchOverride, targetFindingIds })` – optional checkout if branchOverride, run verify commands (from `getBugbotFixVerifyCommands`, max 20), git add/commit/push (message `fix(#N): bugbot autofix - resolve ...`).
80+
- If committed and context: `markFindingsResolved({ execution, context, resolvedFindingIds, normalizedResolvedIds })`.
81+
82+
4. **Branch B – Do user request** (when `!runAutofix && canRunDoUserRequest(payload)` and `allowedToModifyFiles`):
83+
- `DoUserRequestUseCase.invoke({ execution, userComment, branchOverride })`
84+
- `buildUserRequestPrompt(execution, userComment)` – repo context + sanitized user request; `copilotMessage(ai, prompt)`.
85+
- If success: `runUserRequestCommitAndPush(execution, { branchOverride })` – same verify/checkout/add/commit/push with message `chore(#N): apply user request` or `chore: apply user request`.
86+
87+
5. **Think** (when no file-modifying action ran): `ThinkUseCase.invoke(param)` – answers the user (e.g. question).
88+
89+
**Key paths (fix/do):**
90+
91+
- `detect_bugbot_fix_intent_use_case.ts` – intent detection, branch resolution for issue_comment
92+
- `build_bugbot_fix_intent_prompt.ts` – prompt for is_fix_request / is_do_request / target_finding_ids
93+
- `bugbot_fix_intent_payload.ts` – getBugbotFixIntentPayload, canRunBugbotAutofix, canRunDoUserRequest
94+
- `schema.ts` – BUGBOT_FIX_INTENT_RESPONSE_SCHEMA (is_fix_request, target_finding_ids, is_do_request)
95+
- `bugbot_autofix_use_case.ts` – build prompt, copilotMessage (build agent)
96+
- `build_bugbot_fix_prompt.ts` – fix prompt (findings block, verify commands, truncate finding body to MAX_FINDING_BODY_LENGTH)
97+
- `bugbot_autofix_commit.ts` – runBugbotAutofixCommitAndPush, runUserRequestCommitAndPush (checkout, verify commands max 20, git config, add, commit, push)
98+
- `user_request_use_case.ts` – DoUserRequestUseCase, buildUserRequestPrompt
99+
- `mark_findings_resolved_use_case.ts` – update issue/PR comment with resolved marker
100+
- `project_repository.ts` – isActorAllowedToModifyFiles
101+
102+
---
103+
104+
## 4. Configuration (inputs / Ai model)
105+
106+
- **bugbot-severity:** Minimum severity to publish (info, low, medium, high). Default low. `getBugbotMinSeverity()`, `normalizeMinSeverity`, `meetsMinSeverity`.
107+
- **bugbot-comment-limit:** Max individual finding comments per issue/PR (overflow gets one summary). Default 20. `getBugbotCommentLimit()`, `applyCommentLimit`.
108+
- **bugbot-fix-verify-commands:** Comma-separated commands run after autofix (and do user request) before commit. `getBugbotFixVerifyCommands()`, parsed with shell-quote; max 20 executed. Stored in `Ai` model; read in `github_action.ts` / `local_action.ts`.
109+
- **ai-ignore-files:** Exclude paths from detection (and from reporting). Used in buildBugbotPrompt and in filtering findings.
110+
111+
---
112+
113+
## 5. Constants and types
114+
115+
- `BUGBOT_MARKER_PREFIX`: `'copilot-bugbot'`
116+
- `BUGBOT_MAX_COMMENTS`: 20 (default limit)
117+
- `MAX_FINDING_BODY_LENGTH`: 12000 (truncation when loading context and in build_bugbot_fix_prompt)
118+
- `MAX_VERIFY_COMMANDS`: 20 (in bugbot_autofix_commit)
119+
- Types: `BugbotContext`, `BugbotFinding` (id, title, description, file?, line?, severity?, suggestion?), `UnresolvedFindingSummary`, `BugbotFixIntentPayload`.
120+
121+
---
122+
123+
## 6. Sanitization and safety
124+
125+
- **User comment in prompts:** `sanitizeUserCommentForPrompt(raw)` – trim, escape backslashes, replace `"""`, truncate 4000 with no lone trailing backslash.
126+
- **Finding body in prompts:** `truncateFindingBody(body, MAX_FINDING_BODY_LENGTH)` with suffix `[... truncated for length ...]` (used in load_bugbot_context and build_bugbot_fix_prompt).
127+
- **Verify commands:** Parsed with shell-quote; no shell operators (;, |, etc.); max 20 run.
128+
- **Path:** `isSafeFindingFilePath` (no null byte, no `..`, no absolute); PR review comment only if file in `prFiles`.

_agent/docs/code-conventions.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
---
2+
name: Code Conventions
3+
description: Copilot – coding conventions and where to change things
4+
---
5+
6+
# Code Conventions
7+
8+
## Logging and constants
9+
10+
- Use **logger**: `logInfo`, `logError`, `logDebugInfo` from `src/utils/logger`. No ad-hoc `console.log`.
11+
- Use **constants**: `INPUT_KEYS` and `ACTIONS` from `src/utils/constants.ts` for input names and action names. No hardcoded strings for these.
12+
13+
## Adding a new action input
14+
15+
1. **`action.yml`**: Add the input with `description` and `default` (if any).
16+
2. **`src/utils/constants.ts`**: Add the key to `INPUT_KEYS` (e.g. `NEW_INPUT: 'new-input'`).
17+
3. **`src/actions/github_action.ts`**: Read the input (e.g. `core.getInput(INPUT_KEYS.NEW_INPUT)`) and pass it into the object used to build `Execution`.
18+
4. **Optional**: If the CLI must support it, add to `local_action.ts` and the corresponding CLI option.
19+
20+
## Where to change content/descriptions
21+
22+
- **PR description** (template filling, AI content): `src/manager/description/` (configuration_handler, content interfaces).
23+
- **Hotfix/release changelog** (markdown extraction, formatting): `src/manager/description/markdown_content_hotfix_handler.ts`.
24+
25+
## Build and bundles
26+
27+
- The project uses **`@vercel/ncc`** to bundle the action and CLI. Keep imports and dependencies compatible with ncc (no dynamic requires that ncc cannot see).
28+
- **Do not** edit or rely on `build/`; it is generated. Run tests and lint only on `src/`.
29+
30+
## Style and lint
31+
32+
- Prefer TypeScript; avoid `any` (lint rule: no-explicit-any).
33+
- Run `npm run lint` before committing; use `npm run lint:fix` when possible.

_agent/docs/commit-messages.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
name: Commit Messages
3+
description: Commit message nomenclature (prefix = current branch)
4+
---
5+
6+
# Commit messages
7+
8+
The commit message must use the **current branch name as prefix**, with any `/` replaced by `-`.
9+
10+
## Format
11+
12+
```
13+
<normalized-branch>: <short description>
14+
15+
[optional body]
16+
```
17+
18+
- **Prefix**: current branch name, replacing `/` with `-`. Example: branch `feature/292-github-action-rename` → prefix `feature-292-github-action-rename`.
19+
- **Description**: imperative, lowercase, no trailing period. You may optionally include conventional type (`feat`, `fix`, `docs`, etc.) in the description.
20+
21+
## Examples
22+
23+
Branch `feature-292-github-action-rename`:
24+
25+
- `feature-292-github-action-rename: add concurrency and permissions to ci_check`
26+
- `feature-292-github-action-rename: fix docs callouts (Info instead of Note/Tip)`
27+
28+
Branch `fix/123-docs-anchor` (normalized to `fix-123-docs-anchor`):
29+
30+
- `fix-123-docs-anchor: remove invalid MDX heading anchors`
31+
32+
When suggesting or writing a commit message, use the current branch with `/` replaced by `-` as the prefix. If you don't know the branch, tell the user to use their branch name as the prefix.

_agent/docs/project-context.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
name: Project Context
3+
description: Copilot – quick read, commands, and where to find more
4+
---
5+
6+
# Copilot – Project Context
7+
8+
## Quick read (for fast understanding)
9+
10+
- **What it is**: GitHub Action + CLI that automates Git-Flow: creates branches from issue labels, links issues/PRs to projects, tracks commits; AI via OpenCode (progress, errors, PR descriptions).
11+
- **Entry points**: GitHub Action → `src/actions/github_action.ts`; CLI → `src/cli.ts`. Shared logic in `src/actions/common_action.ts` (single actions vs issue/PR/push).
12+
- **Do**: Use Node 20, run from repo root; edit only `src/`; use `INPUT_KEYS`/`ACTIONS` and `logInfo`/`logError`/`logDebugInfo`. When adding inputs: update `action.yml`, `constants.ts` (INPUT_KEYS), and `github_action.ts` (and optionally `local_action.ts`).
13+
- **Don’t**: Edit or depend on `build/` (generated by `ncc`); run tests/lint on `build/`.
14+
15+
## Commands (repo root)
16+
17+
```bash
18+
nvm use 20
19+
npm install
20+
npm run build
21+
npm test
22+
npm run test:watch
23+
npm run test:coverage
24+
npm run lint
25+
npm run lint:fix
26+
```
27+
28+
- **Build**: `npm run build` → bundles `github_action.ts` and `cli.ts` into `build/`.
29+
- **Tests**: Jest; `npm run test:watch` / `npm run test:coverage` as needed.
30+
- **Lint**: ESLint + typescript-eslint on `src/`; `npm run lint:fix` to auto-fix.
31+
32+
## What to ignore
33+
34+
- **`build/`** – Generated output; do not edit or run tests/lint against it.
35+
- **`.agent-sessions/`** – Session data; ignore unless debugging.
36+
37+
## Other rules
38+
39+
- **Architecture & paths**: see `architecture.md` (entry points, use cases, single actions, key files).
40+
- **Code conventions**: see `code-conventions.md` (logger, constants, adding inputs, ncc).

0 commit comments

Comments
 (0)