@gaud_erp/paperclip-github-manager 1.5.0 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -126
- package/dist/manifest.js +58 -2
- package/dist/manifest.js.map +2 -2
- package/dist/ui/index.js +14 -2
- package/dist/ui/index.js.map +2 -2
- package/package.json +18 -2
package/README.md
CHANGED
|
@@ -1,164 +1,136 @@
|
|
|
1
|
-
# GitHub Manager
|
|
1
|
+
# GitHub Manager — Paperclip Plugin
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@gaud_erp/paperclip-github-manager)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
Open-source [Paperclip](https://github.com/paperclipai/paperclip) plugin that brings GitHub repository management, PR/issue sync, AI-powered code reviews, and knowledge graphs into your Paperclip instance.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
- **PR ↔ Card**: detecção automática de links via branch/título (CARD-123, #456)
|
|
9
|
-
- **Review por agentes**: ferramentas para agentes IA revisarem PRs (diff, comentários inline, veredito)
|
|
10
|
-
- **Quick check**: checklist automático (descrição, testes, arquivos sensíveis)
|
|
11
|
-
- **Graphify**: knowledge graphs de alto nível e por repositório
|
|
12
|
-
- **DB local**: zero chamadas à API GitHub ao renderizar UI — tudo lido do banco
|
|
8
|
+
## Features
|
|
13
9
|
|
|
14
|
-
|
|
10
|
+
- **3-layer sync**: webhooks (real-time) + cron every 5 min (safety net) + manual full sync
|
|
11
|
+
- **PR ↔ Card linking**: automatic detection via branch name or title patterns (CARD-123, #456)
|
|
12
|
+
- **AI code review**: 7 agent tools for reviewing PRs (diff, inline comments, verdicts)
|
|
13
|
+
- **Repo structure cache**: agents get a pre-built codebase map in one call, saving 60-90% of tokens
|
|
14
|
+
- **Managed skill**: `github-codebase-access` skill teaches agents how to navigate repos via tools
|
|
15
|
+
- **Knowledge graphs**: visual repo structure, exportable as Obsidian Canvas (`.canvas`)
|
|
16
|
+
- **Local DB**: zero GitHub API calls when rendering UI — all data read from synced database
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
src/
|
|
18
|
-
manifest.ts — declaração de capabilities, slots, tools, agents
|
|
19
|
-
worker.ts — entry point: registra jobs, data/action handlers, webhook
|
|
20
|
-
types.ts — tipos compartilhados
|
|
21
|
-
db/
|
|
22
|
-
migrations/001.sql — tabelas: repos, PRs, issues, links, sync_log
|
|
23
|
-
queries.ts — camada de queries tipada
|
|
24
|
-
sync/
|
|
25
|
-
webhook-handler.ts — processa eventos GitHub (PR, issues)
|
|
26
|
-
incremental-sync.ts — cron 5min: busca atualizações desde último sync
|
|
27
|
-
full-sync.ts — sync manual completo
|
|
28
|
-
link-detector.ts — regex matching para vincular PRs a cards
|
|
29
|
-
github/
|
|
30
|
-
api-client.ts — fetch autenticado com rate-limit awareness
|
|
31
|
-
config.ts — resolução de token (PAT → secret → env)
|
|
32
|
-
review/
|
|
33
|
-
review-tools.ts — 6 ferramentas para agentes: diff, read, comment, submit, list, search
|
|
34
|
-
quick-check.ts — checklist automático de PR
|
|
35
|
-
graphify/
|
|
36
|
-
graph-generator.ts — gera grafos de repositórios e código
|
|
37
|
-
ui/
|
|
38
|
-
index.tsx — re-exports de todos os componentes
|
|
39
|
-
components/ — Settings, Repos, PRs, Graphs, DetailTab, Dashboard, Sidebar
|
|
40
|
-
```
|
|
18
|
+
## Installation
|
|
41
19
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
| Slot | Componente | Descrição |
|
|
45
|
-
|------|-----------|-----------|
|
|
46
|
-
| sidebar | GitHubSidebarLink | Link na sidebar principal |
|
|
47
|
-
| sidebarPanel | GitHubSidebarPanel | Painel rápido com contadores |
|
|
48
|
-
| routeSidebar | GitHubRouteSidebar | Navegação entre páginas GitHub |
|
|
49
|
-
| page | GitHubSettingsPage | Token, repos, sync |
|
|
50
|
-
| page | GitHubReposPage | Lista de repositórios |
|
|
51
|
-
| page | GitHubPullRequestsPage | PRs com filtros |
|
|
52
|
-
| page | GitHubGraphsPage | Knowledge graphs |
|
|
53
|
-
| dashboardWidget | GitHubDashboardWidget | Status no dashboard |
|
|
54
|
-
| detailTab | GitHubDetailTab | Tab GitHub dentro de cards |
|
|
55
|
-
| contextMenuItem | GitHubContextMenu | Ação no menu de contexto |
|
|
56
|
-
|
|
57
|
-
## Agent Tools
|
|
20
|
+
### Via Paperclip UI (recommended)
|
|
58
21
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
| `github_submit_pr_review` | Submete review (approve/request_changes/comment) |
|
|
65
|
-
| `github_list_repositories` | Lista repos rastreados |
|
|
66
|
-
| `github_search_issues` | Busca issues/PRs via GitHub search |
|
|
22
|
+
1. Open your Paperclip instance
|
|
23
|
+
2. Go to **Settings > Plugins**
|
|
24
|
+
3. Click **Install Plugin**
|
|
25
|
+
4. Enter the npm package name: `@gaud_erp/paperclip-github-manager`
|
|
26
|
+
5. Wait for installation — status will change to **Ready**
|
|
67
27
|
|
|
68
|
-
|
|
28
|
+
### Via CLI
|
|
69
29
|
|
|
70
30
|
```bash
|
|
71
|
-
|
|
72
|
-
npm run dev # watch mode
|
|
73
|
-
npm run build # build de produção
|
|
74
|
-
npm run typecheck # verificação de tipos
|
|
75
|
-
npm test # testes (vitest)
|
|
31
|
+
paperclipai plugin install @gaud_erp/paperclip-github-manager
|
|
76
32
|
```
|
|
77
33
|
|
|
78
|
-
##
|
|
34
|
+
## Configuration
|
|
79
35
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
36
|
+
1. Go to **Settings > Plugins > GitHub Manager > Configuration**
|
|
37
|
+
2. Enter your GitHub Personal Access Token (PAT)
|
|
38
|
+
3. Optionally set the **Default Organization** to auto-discover repos on first sync
|
|
39
|
+
4. Click **Save**
|
|
40
|
+
5. Navigate to **GitHub > Repositories** and click **Sync**
|
|
84
41
|
|
|
85
|
-
|
|
42
|
+
### Required GitHub PAT permissions
|
|
86
43
|
|
|
87
|
-
|
|
44
|
+
- `repo` — full access to private repositories
|
|
45
|
+
- `read:org` — list organization repositories
|
|
88
46
|
|
|
89
|
-
|
|
90
|
-
2. No menu lateral, clique em **Settings** (ícone de engrenagem)
|
|
91
|
-
3. Navegue até a seção **Plugins**
|
|
92
|
-
4. Clique em **Install Plugin**
|
|
93
|
-
5. Informe o nome do pacote npm: `@gaud_erp/paperclip-github-manager`
|
|
94
|
-
6. Aguarde a instalação — o status mudará para **Ready**
|
|
95
|
-
7. O plugin aparecerá na lista com as 6 tools e o job de sync registrados
|
|
47
|
+
### Webhook (optional)
|
|
96
48
|
|
|
97
|
-
|
|
49
|
+
Set up a GitHub webhook pointing to:
|
|
98
50
|
|
|
99
|
-
```bash
|
|
100
|
-
# pelo nome do pacote npm
|
|
101
|
-
paperclipai plugin install @gaud_erp/paperclip-github-manager
|
|
102
|
-
|
|
103
|
-
# ou pelo arquivo .tgz local
|
|
104
|
-
paperclipai plugin install ./gaud_erp-paperclip-github-manager-1.0.0.tgz
|
|
105
51
|
```
|
|
106
|
-
|
|
107
|
-
### Via Dockerfile (deploy automatizado)
|
|
108
|
-
|
|
109
|
-
Para instalar automaticamente durante o deploy (ex: Fly.io), adicione o `.tgz` ao Dockerfile e use o entrypoint para instalar via API após o servidor iniciar:
|
|
110
|
-
|
|
111
|
-
```dockerfile
|
|
112
|
-
COPY gaud_erp-paperclip-github-manager-1.0.0.tgz /app/plugins/github-manager.tgz
|
|
52
|
+
https://<your-paperclip-host>/plugins/cus.github-manager/webhooks/github-events
|
|
113
53
|
```
|
|
114
54
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
## Configuração
|
|
55
|
+
Events: `pull_request`, `issues`
|
|
118
56
|
|
|
119
|
-
|
|
120
|
-
2. Configure o Personal Access Token (PAT) ou secret reference
|
|
121
|
-
3. Teste a conexão
|
|
122
|
-
4. Adicione repositórios (formato `owner/repo`)
|
|
123
|
-
5. O sync automático inicia a cada 5 minutos
|
|
57
|
+
## Agent Tools
|
|
124
58
|
|
|
125
|
-
|
|
59
|
+
The plugin registers 7 tools available to Paperclip agents:
|
|
126
60
|
|
|
127
|
-
|
|
128
|
-
|
|
61
|
+
| Tool | Description |
|
|
62
|
+
|------|-------------|
|
|
63
|
+
| `github_get_repo_structure` | Get cached directory/file structure (call this FIRST) |
|
|
64
|
+
| `github_get_pull_request_diff` | Get unified diff of a PR |
|
|
65
|
+
| `github_read_file_content` | Read a file from a repository |
|
|
66
|
+
| `github_create_review_comment` | Post an inline review comment on a PR |
|
|
67
|
+
| `github_submit_pr_review` | Submit a review verdict (approve/request_changes/comment) |
|
|
68
|
+
| `github_list_repositories` | List all tracked repositories |
|
|
69
|
+
| `github_search_issues` | Search issues and PRs using GitHub search syntax |
|
|
129
70
|
|
|
130
|
-
###
|
|
71
|
+
### Agent Skill
|
|
131
72
|
|
|
132
|
-
|
|
133
|
-
```
|
|
134
|
-
https://<paperclip-host>/plugins/cus.github-manager/webhooks/github-events
|
|
135
|
-
```
|
|
136
|
-
Eventos: `pull_request`, `issues`
|
|
73
|
+
The plugin ships a managed skill **`github-codebase-access`** that appears in your Paperclip skill library. Enable it on any agent (CEO, FoundingEngineer, etc.) to give it access to GitHub repositories without needing local filesystem access.
|
|
137
74
|
|
|
138
|
-
##
|
|
75
|
+
## UI Pages
|
|
139
76
|
|
|
140
|
-
|
|
77
|
+
| Page | Description |
|
|
78
|
+
|------|-------------|
|
|
79
|
+
| **Repositories** | List synced repos, trigger sync, generate knowledge graphs |
|
|
80
|
+
| **Pull Requests** | Browse PRs with filters by repo, state, author |
|
|
81
|
+
| **Knowledge Graphs** | Generate and export repo structure graphs (Obsidian Canvas) |
|
|
82
|
+
| **Settings** | Configure GitHub PAT, default org, sync interval |
|
|
141
83
|
|
|
142
|
-
|
|
84
|
+
The plugin also adds a **dashboard widget** (GitHub Status), a **detail tab** on issue cards (linked PRs), and a **sidebar link** for quick navigation.
|
|
143
85
|
|
|
144
|
-
|
|
86
|
+
## Architecture
|
|
145
87
|
|
|
146
|
-
|
|
88
|
+
```
|
|
89
|
+
src/
|
|
90
|
+
manifest.ts — capabilities, tools, agents, skills, UI slots
|
|
91
|
+
worker.ts — jobs, data/action handlers, webhook registration
|
|
92
|
+
types.ts — shared types
|
|
93
|
+
db/
|
|
94
|
+
migrations/ — PostgreSQL schema (plugin-namespaced)
|
|
95
|
+
queries.ts — typed query layer
|
|
96
|
+
sync/
|
|
97
|
+
webhook-handler.ts — real-time GitHub event processing
|
|
98
|
+
incremental-sync.ts — cron job: fetch updates since last sync
|
|
99
|
+
full-sync.ts — full sync with auto-discovery
|
|
100
|
+
link-detector.ts — regex matching for PR ↔ card linking
|
|
101
|
+
github/
|
|
102
|
+
api-client.ts — authenticated fetch with rate-limit awareness
|
|
103
|
+
config.ts — token resolution (config → state → env)
|
|
104
|
+
review/
|
|
105
|
+
review-tools.ts — 7 agent tools registration
|
|
106
|
+
quick-check.ts — automated PR checklist
|
|
107
|
+
graphify/
|
|
108
|
+
graph-generator.ts — high-level and code-level graph generation
|
|
109
|
+
ui/
|
|
110
|
+
index.tsx — component re-exports
|
|
111
|
+
components/ — Settings, Repos, PRs, Graphs, Dashboard, DetailTab, Sidebar
|
|
112
|
+
```
|
|
147
113
|
|
|
148
|
-
|
|
114
|
+
## Development
|
|
149
115
|
|
|
150
|
-
|
|
116
|
+
```bash
|
|
117
|
+
npm install
|
|
118
|
+
npm run dev # watch mode
|
|
119
|
+
npm run build # production build
|
|
120
|
+
npm run typecheck # type checking
|
|
121
|
+
npm test # tests (vitest)
|
|
122
|
+
```
|
|
151
123
|
|
|
152
|
-
|
|
153
|
-
2. O agente usa `github_get_pull_request_diff` para obter o diff
|
|
154
|
-
3. Lê arquivos com `github_read_file_content` quando precisa de contexto
|
|
155
|
-
4. Posta comentários inline com `github_create_review_comment`
|
|
156
|
-
5. Finaliza com `github_submit_pr_review` (approve, request changes ou comment)
|
|
124
|
+
## Publishing
|
|
157
125
|
|
|
158
|
-
|
|
126
|
+
Releases are published automatically to npm via GitHub Actions when a new release is created on GitHub.
|
|
159
127
|
|
|
160
|
-
|
|
128
|
+
```bash
|
|
129
|
+
npm version patch # or minor/major
|
|
130
|
+
git push && git push --tags
|
|
131
|
+
# Then create a GitHub release from the tag
|
|
132
|
+
```
|
|
161
133
|
|
|
162
|
-
|
|
134
|
+
## License
|
|
163
135
|
|
|
164
|
-
|
|
136
|
+
MIT
|
package/dist/manifest.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/manifest.ts
|
|
2
2
|
var manifest = {
|
|
3
3
|
id: "cus.github-manager",
|
|
4
|
-
version: "1.
|
|
4
|
+
version: "1.6.2",
|
|
5
5
|
apiVersion: 1,
|
|
6
6
|
displayName: "GitHub Manager",
|
|
7
7
|
description: "Manage GitHub repos, PRs, issues, agent code reviews, and knowledge graphs \u2014 all from Paperclip",
|
|
@@ -29,7 +29,8 @@ var manifest = {
|
|
|
29
29
|
"ui.sidebar.register",
|
|
30
30
|
"ui.detailTab.register",
|
|
31
31
|
"ui.action.register",
|
|
32
|
-
"instance.settings.register"
|
|
32
|
+
"instance.settings.register",
|
|
33
|
+
"skills.managed"
|
|
33
34
|
],
|
|
34
35
|
instanceConfigSchema: {
|
|
35
36
|
type: "object",
|
|
@@ -181,6 +182,61 @@ var manifest = {
|
|
|
181
182
|
title: "Senior Code Reviewer"
|
|
182
183
|
}
|
|
183
184
|
],
|
|
185
|
+
skills: [
|
|
186
|
+
{
|
|
187
|
+
skillKey: "github-codebase-access",
|
|
188
|
+
displayName: "GitHub Codebase Access",
|
|
189
|
+
description: "Provides agents with tools to read repository structure and files from GitHub without needing local filesystem access",
|
|
190
|
+
markdown: `# GitHub Codebase Access
|
|
191
|
+
|
|
192
|
+
You have access to GitHub repositories through the GitHub Manager plugin tools. NEVER say you don't have access to the codebase.
|
|
193
|
+
|
|
194
|
+
## Available Tools
|
|
195
|
+
|
|
196
|
+
### 1. github_get_repo_structure
|
|
197
|
+
Get the directory and file structure of a repository. **Always call this FIRST** before reading any files.
|
|
198
|
+
|
|
199
|
+
Parameters:
|
|
200
|
+
- \`repo_full_name\` (required): Repository in "owner/repo" format
|
|
201
|
+
- \`refresh\` (optional): Set to true to regenerate from GitHub if cache is stale
|
|
202
|
+
|
|
203
|
+
### 2. github_read_file_content
|
|
204
|
+
Read the content of a specific file from a GitHub repository.
|
|
205
|
+
|
|
206
|
+
Parameters:
|
|
207
|
+
- \`owner\` (required): Repository owner (e.g. "gauderp")
|
|
208
|
+
- \`repo\` (required): Repository name (e.g. "gaud-erp-api")
|
|
209
|
+
- \`path\` (required): File path (e.g. "src/main/java/com/gaud/App.java")
|
|
210
|
+
- \`ref\` (optional): Branch or commit SHA (defaults to main branch)
|
|
211
|
+
|
|
212
|
+
### 3. github_get_pull_request_diff
|
|
213
|
+
Get the unified diff of a pull request for code review.
|
|
214
|
+
|
|
215
|
+
Parameters:
|
|
216
|
+
- \`owner\`, \`repo\`, \`pull_number\`
|
|
217
|
+
|
|
218
|
+
### 4. github_search_issues
|
|
219
|
+
Search GitHub issues and PRs using GitHub search syntax.
|
|
220
|
+
|
|
221
|
+
Parameters:
|
|
222
|
+
- \`query\`: GitHub search query (e.g. "is:open label:bug")
|
|
223
|
+
|
|
224
|
+
### 5. github_list_repositories
|
|
225
|
+
List all tracked GitHub repositories (no parameters needed).
|
|
226
|
+
|
|
227
|
+
## Mandatory Workflow
|
|
228
|
+
|
|
229
|
+
1. **ALWAYS** start with \`github_get_repo_structure\` to understand the codebase layout
|
|
230
|
+
2. Read only the files you actually need with \`github_read_file_content\`
|
|
231
|
+
3. If the structure seems outdated, call \`github_get_repo_structure\` with \`refresh=true\`
|
|
232
|
+
4. Never try to access the local filesystem for source code \u2014 always use these tools
|
|
233
|
+
|
|
234
|
+
## Token Efficiency
|
|
235
|
+
The structure cache returns directories and key files in a single call (~5-50KB).
|
|
236
|
+
This replaces hundreds of file-listing API calls, saving 60-90% of tokens.
|
|
237
|
+
`
|
|
238
|
+
}
|
|
239
|
+
],
|
|
184
240
|
ui: {
|
|
185
241
|
slots: [
|
|
186
242
|
{
|
package/dist/manifest.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/manifest.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: \"cus.github-manager\",\n version: \"1.
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: \"cus.github-manager\",\n version: \"1.6.2\",\n apiVersion: 1,\n displayName: \"GitHub Manager\",\n description: \"Manage GitHub repos, PRs, issues, agent code reviews, and knowledge graphs \u2014 all from Paperclip\",\n author: \"Gaud ERP\",\n categories: [\"connector\", \"automation\"],\n\n capabilities: [\n \"events.subscribe\",\n \"events.emit\",\n \"http.outbound\",\n \"plugin.state.read\",\n \"plugin.state.write\",\n \"database.namespace.read\",\n \"database.namespace.write\",\n \"database.namespace.migrate\",\n \"jobs.schedule\",\n \"webhooks.receive\",\n \"agent.tools.register\",\n \"agents.managed\",\n \"agents.invoke\",\n \"agents.read\",\n \"issues.read\",\n \"companies.read\",\n \"ui.page.register\",\n \"ui.dashboardWidget.register\",\n \"ui.sidebar.register\",\n \"ui.detailTab.register\",\n \"ui.action.register\",\n \"instance.settings.register\",\n \"skills.managed\",\n ],\n\n instanceConfigSchema: {\n type: \"object\",\n required: [\"githubToken\"],\n properties: {\n githubToken: {\n type: \"string\",\n title: \"GitHub Personal Access Token\",\n description: \"Cole aqui o PAT do GitHub com permiss\u00F5es 'repo' e 'read:org'\",\n },\n defaultOrg: {\n type: \"string\",\n title: \"Default Organization\",\n description: \"GitHub organization to sync repositories from (optional)\",\n },\n syncIntervalMinutes: {\n type: \"number\",\n title: \"Sync Interval (minutes)\",\n description: \"How often to sync PRs and issues (default: 5)\",\n default: 5,\n minimum: 1,\n maximum: 1440,\n },\n },\n },\n\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n\n database: {\n migrationsDir: \"src/db/migrations\",\n },\n\n jobs: [\n {\n jobKey: \"sync-github\",\n displayName: \"Sync GitHub PRs and Issues\",\n schedule: \"*/5 * * * *\",\n description: \"Incremental sync of open PRs and issues for tracked repositories\",\n },\n ],\n\n webhooks: [\n {\n endpointKey: \"github-events\",\n displayName: \"GitHub Events\",\n description: \"Receives GitHub webhook events (pull_request, issues)\",\n },\n ],\n\n tools: [\n {\n name: \"github_get_pull_request_diff\",\n displayName: \"Get PR Diff\",\n description: \"Retrieve the unified diff of a GitHub pull request\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n pull_number: { type: \"number\" },\n },\n required: [\"owner\", \"repo\", \"pull_number\"],\n },\n },\n {\n name: \"github_read_file_content\",\n displayName: \"Read File\",\n description: \"Read a file from a GitHub repository\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n path: { type: \"string\" },\n ref: { type: \"string\" },\n },\n required: [\"owner\", \"repo\", \"path\"],\n },\n },\n {\n name: \"github_create_review_comment\",\n displayName: \"Add Review Comment\",\n description: \"Post an inline review comment on a pull request\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n pull_number: { type: \"number\" },\n commit_id: { type: \"string\" },\n path: { type: \"string\" },\n line: { type: \"number\" },\n body: { type: \"string\" },\n },\n required: [\"owner\", \"repo\", \"pull_number\", \"commit_id\", \"path\", \"line\", \"body\"],\n },\n },\n {\n name: \"github_submit_pr_review\",\n displayName: \"Submit PR Review\",\n description: \"Submit a review verdict (approve, request changes, comment)\",\n parametersSchema: {\n type: \"object\",\n properties: {\n owner: { type: \"string\" },\n repo: { type: \"string\" },\n pull_number: { type: \"number\" },\n event: { type: \"string\", enum: [\"APPROVE\", \"REQUEST_CHANGES\", \"COMMENT\"] },\n body: { type: \"string\" },\n },\n required: [\"owner\", \"repo\", \"pull_number\", \"event\", \"body\"],\n },\n },\n {\n name: \"github_list_repositories\",\n displayName: \"List Repositories\",\n description: \"List all tracked GitHub repositories\",\n parametersSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"github_search_issues\",\n displayName: \"Search Issues\",\n description: \"Search GitHub issues and PRs using search syntax\",\n parametersSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"github_get_repo_structure\",\n displayName: \"Get Repo Structure\",\n description: \"Get the cached directory/file structure of a repository. Use this FIRST before reading files to understand the codebase layout and save tokens. Set refresh=true to regenerate from GitHub.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n repo_full_name: { type: \"string\", description: \"owner/repo format\" },\n refresh: { type: \"boolean\", description: \"Set true to regenerate the structure from GitHub (use when cache is stale)\" },\n },\n required: [\"repo_full_name\"],\n },\n },\n ],\n\n agents: [\n {\n agentKey: \"github-reviewer\",\n displayName: \"GitHub Code Reviewer\",\n role: \"code-review\",\n title: \"Senior Code Reviewer\",\n },\n ],\n\n skills: [\n {\n skillKey: \"github-codebase-access\",\n displayName: \"GitHub Codebase Access\",\n description: \"Provides agents with tools to read repository structure and files from GitHub without needing local filesystem access\",\n markdown: `# GitHub Codebase Access\n\nYou have access to GitHub repositories through the GitHub Manager plugin tools. NEVER say you don't have access to the codebase.\n\n## Available Tools\n\n### 1. github_get_repo_structure\nGet the directory and file structure of a repository. **Always call this FIRST** before reading any files.\n\nParameters:\n- \\`repo_full_name\\` (required): Repository in \"owner/repo\" format\n- \\`refresh\\` (optional): Set to true to regenerate from GitHub if cache is stale\n\n### 2. github_read_file_content\nRead the content of a specific file from a GitHub repository.\n\nParameters:\n- \\`owner\\` (required): Repository owner (e.g. \"gauderp\")\n- \\`repo\\` (required): Repository name (e.g. \"gaud-erp-api\")\n- \\`path\\` (required): File path (e.g. \"src/main/java/com/gaud/App.java\")\n- \\`ref\\` (optional): Branch or commit SHA (defaults to main branch)\n\n### 3. github_get_pull_request_diff\nGet the unified diff of a pull request for code review.\n\nParameters:\n- \\`owner\\`, \\`repo\\`, \\`pull_number\\`\n\n### 4. github_search_issues\nSearch GitHub issues and PRs using GitHub search syntax.\n\nParameters:\n- \\`query\\`: GitHub search query (e.g. \"is:open label:bug\")\n\n### 5. github_list_repositories\nList all tracked GitHub repositories (no parameters needed).\n\n## Mandatory Workflow\n\n1. **ALWAYS** start with \\`github_get_repo_structure\\` to understand the codebase layout\n2. Read only the files you actually need with \\`github_read_file_content\\`\n3. If the structure seems outdated, call \\`github_get_repo_structure\\` with \\`refresh=true\\`\n4. Never try to access the local filesystem for source code \u2014 always use these tools\n\n## Token Efficiency\nThe structure cache returns directories and key files in a single call (~5-50KB).\nThis replaces hundreds of file-listing API calls, saving 60-90% of tokens.\n`,\n },\n ],\n\n ui: {\n slots: [\n {\n type: \"sidebar\",\n id: \"github-sidebar\",\n exportName: \"GitHubSidebarLink\",\n displayName: \"GitHub\",\n },\n {\n type: \"page\",\n id: \"github-settings\",\n exportName: \"GitHubSettingsPage\",\n displayName: \"Configura\u00E7\u00F5es GitHub\",\n routePath: \"github-settings\",\n },\n {\n type: \"page\",\n id: \"github-repos\",\n exportName: \"GitHubReposPage\",\n displayName: \"Reposit\u00F3rios\",\n routePath: \"github-repos\",\n },\n {\n type: \"page\",\n id: \"github-prs\",\n exportName: \"GitHubPullRequestsPage\",\n displayName: \"Pull Requests\",\n routePath: \"github-prs\",\n },\n {\n type: \"page\",\n id: \"github-graphs\",\n exportName: \"GitHubGraphsPage\",\n displayName: \"Knowledge Graphs\",\n routePath: \"github-graphs\",\n },\n {\n type: \"dashboardWidget\",\n id: \"github-dashboard\",\n exportName: \"GitHubDashboardWidget\",\n displayName: \"GitHub Status\",\n },\n {\n type: \"detailTab\",\n id: \"github-detail\",\n exportName: \"GitHubDetailTab\",\n displayName: \"GitHub\",\n entityTypes: [\"issue\"],\n },\n {\n type: \"contextMenuItem\",\n id: \"github-context-menu\",\n exportName: \"GitHubContextMenu\",\n displayName: \"GitHub Actions\",\n entityTypes: [\"issue\"],\n },\n ],\n },\n};\n\nexport default manifest;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/ui/index.js
CHANGED
|
@@ -341,7 +341,7 @@ function GitHubReposPage() {
|
|
|
341
341
|
setGraphLoading(repo.fullName);
|
|
342
342
|
try {
|
|
343
343
|
await generateGraph({ companyId, repoFullName: repo.fullName, level: "code" });
|
|
344
|
-
nav.navigate(PATHS.graphs);
|
|
344
|
+
nav.navigate(`${PATHS.graphs}?repo=${encodeURIComponent(repo.fullName)}`);
|
|
345
345
|
} catch (err) {
|
|
346
346
|
console.error(err);
|
|
347
347
|
} finally {
|
|
@@ -450,7 +450,7 @@ function GitHubPullRequestsPage() {
|
|
|
450
450
|
}
|
|
451
451
|
|
|
452
452
|
// src/ui/components/GraphsPage.tsx
|
|
453
|
-
import { useState as useState4 } from "react";
|
|
453
|
+
import { useState as useState4, useEffect } from "react";
|
|
454
454
|
import { useHostContext as useHostContext4, usePluginAction as usePluginAction4 } from "@paperclipai/plugin-sdk/ui";
|
|
455
455
|
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
456
456
|
function toObsidianCanvas(graph) {
|
|
@@ -515,7 +515,19 @@ function GitHubGraphsPage() {
|
|
|
515
515
|
const [graphData, setGraphData] = useState4(null);
|
|
516
516
|
const [loading, setLoading] = useState4(false);
|
|
517
517
|
const [repoInput, setRepoInput] = useState4("");
|
|
518
|
+
const [autoLoaded, setAutoLoaded] = useState4(false);
|
|
518
519
|
const generateGraph = usePluginAction4("generate-graph");
|
|
520
|
+
useEffect(() => {
|
|
521
|
+
if (autoLoaded || !companyId) return;
|
|
522
|
+
const params = new URLSearchParams(window.location.search);
|
|
523
|
+
const repo = params.get("repo");
|
|
524
|
+
if (repo) {
|
|
525
|
+
setRepoInput(repo);
|
|
526
|
+
setAutoLoaded(true);
|
|
527
|
+
setLoading(true);
|
|
528
|
+
generateGraph({ companyId, repoFullName: repo, level: "code" }).then((result) => setGraphData(result)).catch(console.error).finally(() => setLoading(false));
|
|
529
|
+
}
|
|
530
|
+
}, [companyId, autoLoaded]);
|
|
519
531
|
if (!companyId) return /* @__PURE__ */ jsx5("div", { style: layoutStack, children: "Selecione uma empresa." });
|
|
520
532
|
const handleGenerateHighLevel = async () => {
|
|
521
533
|
setLoading(true);
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/ui/components/Sidebar.tsx", "../../src/ui/components/shared.ts", "../../src/ui/components/SettingsPage.tsx", "../../src/ui/components/ReposPage.tsx", "../../src/ui/components/PullRequestsPage.tsx", "../../src/ui/components/GraphsPage.tsx", "../../src/ui/components/DetailTab.tsx", "../../src/ui/components/ReviewDropdown.tsx", "../../src/ui/components/DashboardWidget.tsx", "../../src/ui/components/ContextMenu.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from \"react\";\nimport { useHostNavigation, usePluginData } from \"@paperclipai/plugin-sdk/ui\";\nimport { PATHS } from \"./shared.js\";\n\ntype NavItem = { label: string; path: string };\n\nconst NAV_ITEMS: NavItem[] = [\n { label: \"Configura\u00E7\u00F5es\", path: PATHS.settings },\n { label: \"Reposit\u00F3rios\", path: PATHS.repos },\n { label: \"Pull Requests\", path: PATHS.prs },\n { label: \"Knowledge Graphs\", path: PATHS.graphs },\n];\n\nexport function GitHubSidebarLink() {\n const nav = useHostNavigation();\n const href = nav.resolveHref(PATHS.repos);\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n\n return (\n <a\n {...nav.linkProps(PATHS.repos)}\n aria-current={isActive ? \"page\" : undefined}\n className={[\n \"flex items-center gap-2.5 px-3 py-2 text-[13px] font-medium\",\n isActive ? \"bg-accent text-foreground\" : \"text-foreground/80 hover:bg-accent/50\",\n ].join(\" \")}\n >\n <span className=\"relative shrink-0\">\n <svg viewBox=\"0 0 16 16\" className=\"h-4 w-4\" fill=\"currentColor\">\n <path d=\"M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z\" />\n </svg>\n </span>\n <span className=\"flex-1 truncate\">GitHub</span>\n </a>\n );\n}\n\nexport function GitHubSidebarPanel() {\n const syncStatus = usePluginData<{ lastSync: string | null; repoCount: number; openPRCount: number }>(\"sync-status\");\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\", fontSize: \"12px\", padding: \"8px\" }}>\n <strong>GitHub</strong>\n <div>Repos: {syncStatus.data?.repoCount ?? 0}</div>\n <div>PRs abertos: {syncStatus.data?.openPRCount ?? 0}</div>\n <div>\u00DAltimo sync: {syncStatus.data?.lastSync ? new Date(syncStatus.data.lastSync).toLocaleString() : \"nunca\"}</div>\n </div>\n );\n}\n\nexport function GitHubRouteSidebar() {\n const nav = useHostNavigation();\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\", padding: \"4px\" }}>\n {NAV_ITEMS.map((item) => {\n const href = nav.resolveHref(item.path);\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n return (\n <a\n key={item.path}\n {...nav.linkProps(item.path)}\n aria-current={isActive ? \"page\" : undefined}\n style={{\n display: \"block\",\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: isActive ? 600 : 400,\n background: isActive ? \"rgba(128,128,128,0.1)\" : \"transparent\",\n textDecoration: \"none\",\n color: \"inherit\",\n }}\n >\n {item.label}\n </a>\n );\n })}\n </div>\n );\n}\n", "import type React from \"react\";\n\nexport const ROUTES = {\n settings: \"github-settings\",\n repos: \"github-repos\",\n prs: \"github-prs\",\n graphs: \"github-graphs\",\n} as const;\n\nexport const PATHS = {\n settings: \"/github-settings\",\n repos: \"/github-repos\",\n prs: \"/github-prs\",\n graphs: \"/github-graphs\",\n} as const;\n\nexport const layoutStack: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\",\n padding: \"16px\",\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid rgba(128,128,128,0.2)\",\n borderRadius: \"8px\",\n padding: \"12px\",\n background: \"rgba(128,128,128,0.04)\",\n};\n\nexport const buttonStyle: React.CSSProperties = {\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n border: \"1px solid rgba(128,128,128,0.3)\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n};\n\nexport const primaryButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n background: \"rgba(59,130,246,0.1)\",\n borderColor: \"rgba(59,130,246,0.3)\",\n color: \"#3b82f6\",\n};\n\nexport const badgeStyle = (color: string): React.CSSProperties => ({\n display: \"inline-block\",\n padding: \"2px 8px\",\n borderRadius: \"12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n background: `${color}20`,\n color,\n});\n\nexport function prStateBadge(state: string): { label: string; color: string } {\n switch (state) {\n case \"open\": return { label: \"Open\", color: \"#22c55e\" };\n case \"closed\": return { label: \"Closed\", color: \"#ef4444\" };\n case \"merged\": return { label: \"Merged\", color: \"#a855f7\" };\n case \"draft\": return { label: \"Draft\", color: \"#6b7280\" };\n default: return { label: state, color: \"#6b7280\" };\n }\n}\n\nexport function timeAgo(dateStr: string): string {\n const diff = Date.now() - new Date(dateStr).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle } from \"./shared.js\";\n\nexport function GitHubSettingsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n\n const [token, setToken] = useState(\"\");\n const [secretRef, setSecretRef] = useState(\"\");\n const [repoInput, setRepoInput] = useState(\"\");\n const [status, setStatus] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const saveToken = usePluginAction(\"save-token\");\n const saveSecretRefAction = usePluginAction(\"save-secret-ref\");\n const testConnection = usePluginAction(\"test-connection\");\n const addRepo = usePluginAction(\"add-repo\");\n const syncAll = usePluginAction(\"sync-all\");\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const handleSaveToken = async () => {\n if (!token.trim()) return;\n setLoading(true);\n try {\n await saveToken({ companyId, token: token.trim() });\n setStatus(\"Token salvo com sucesso\");\n setToken(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleSaveSecretRef = async () => {\n if (!secretRef.trim()) return;\n setLoading(true);\n try {\n await saveSecretRefAction({ companyId, secretRef: secretRef.trim() });\n setStatus(\"Secret ref salvo com sucesso\");\n setSecretRef(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleTestConnection = async () => {\n setLoading(true);\n try {\n const result = await testConnection({ companyId }) as { ok: boolean; login?: string; error?: string };\n if (result.ok) {\n setStatus(`Conectado como ${result.login}`);\n } else {\n setStatus(`Falha: ${result.error}`);\n }\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleAddRepo = async () => {\n if (!repoInput.trim()) return;\n setLoading(true);\n try {\n await addRepo({ companyId, fullName: repoInput.trim() });\n setStatus(`Reposit\u00F3rio ${repoInput.trim()} adicionado`);\n setRepoInput(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleFullSync = async () => {\n setLoading(true);\n setStatus(\"Sincronizando...\");\n try {\n await syncAll({ companyId });\n setStatus(\"Sync completo finalizado\");\n } catch (err) {\n setStatus(`Erro no sync: ${err}`);\n }\n setLoading(false);\n };\n\n return (\n <div style={layoutStack}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Configura\u00E7\u00F5es GitHub</h2>\n\n {status && (\n <div style={{ ...cardStyle, fontSize: \"13px\", color: status.startsWith(\"Erro\") ? \"#ef4444\" : \"#22c55e\" }}>\n {status}\n </div>\n )}\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Autentica\u00E7\u00E3o</h3>\n <div style={{ display: \"flex\", gap: \"8px\", marginBottom: \"8px\" }}>\n <input\n type=\"password\"\n placeholder=\"GitHub Personal Access Token\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleSaveToken} disabled={loading}>\n Salvar PAT\n </button>\n </div>\n <div style={{ display: \"flex\", gap: \"8px\", marginBottom: \"8px\" }}>\n <input\n placeholder=\"UUID do secret (alternativa)\"\n value={secretRef}\n onChange={(e) => setSecretRef(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleSaveSecretRef} disabled={loading}>\n Salvar Ref\n </button>\n </div>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleTestConnection} disabled={loading}>\n Testar Conex\u00E3o\n </button>\n </div>\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Adicionar Reposit\u00F3rio</h3>\n <div style={{ display: \"flex\", gap: \"8px\" }}>\n <input\n placeholder=\"owner/repo (ex: gauderp/gaud-erp-api)\"\n value={repoInput}\n onChange={(e) => setRepoInput(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={primaryButtonStyle} onClick={handleAddRepo} disabled={loading}>\n Adicionar\n </button>\n </div>\n </div>\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Sincroniza\u00E7\u00E3o</h3>\n <p style={{ margin: \"0 0 8px\", fontSize: \"12px\", opacity: 0.7 }}>\n Sync autom\u00E1tico a cada 5 minutos. Use o bot\u00E3o abaixo para for\u00E7ar um sync completo.\n </p>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleFullSync} disabled={loading}>\n {loading ? \"Sincronizando...\" : \"Sync Completo\"}\n </button>\n </div>\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, useHostNavigation, usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle, timeAgo, PATHS } from \"./shared.js\";\nimport type { GitHubRepo } from \"../../types.js\";\n\nexport function GitHubReposPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [filter, setFilter] = useState(\"\");\n\n const nav = useHostNavigation();\n const reposData = usePluginData<{ repos: GitHubRepo[]; lastSync: string | null }>(\"repos\", { companyId });\n const syncAction = usePluginAction(\"sync-all\");\n const generateGraph = usePluginAction(\"generate-graph\");\n const [graphLoading, setGraphLoading] = useState<string | null>(null);\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const repos = (reposData.data?.repos ?? []).filter((r) =>\n !filter || r.fullName.toLowerCase().includes(filter.toLowerCase()),\n );\n\n return (\n <div style={layoutStack}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Reposit\u00F3rios ({repos.length})</h2>\n <div style={{ display: \"flex\", gap: \"8px\", alignItems: \"center\" }}>\n <span style={{ fontSize: \"11px\", opacity: 0.6 }}>\n \u00DAltimo sync: {reposData.data?.lastSync ? timeAgo(reposData.data.lastSync) : \"nunca\"}\n </span>\n <button\n type=\"button\"\n style={buttonStyle}\n onClick={() => syncAction({ companyId }).catch(console.error)}\n >\n Sync\n </button>\n </div>\n </div>\n\n <input\n placeholder=\"Filtrar reposit\u00F3rios...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n style={{ padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n\n {repos.length === 0 && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.6 }}>\n Nenhum reposit\u00F3rio rastreado. Adicione em Configura\u00E7\u00F5es.\n </div>\n )}\n\n {repos.map((repo) => (\n <div key={repo.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div>\n <a href={repo.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"14px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n {repo.fullName}\n </a>\n {repo.private && <span style={{ marginLeft: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>privado</span>}\n {repo.description && <p style={{ margin: \"4px 0 0\", fontSize: \"12px\", opacity: 0.7 }}>{repo.description}</p>}\n </div>\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n style={buttonStyle}\n disabled={graphLoading === repo.fullName}\n onClick={async () => {\n setGraphLoading(repo.fullName);\n try {\n await generateGraph({ companyId, repoFullName: repo.fullName, level: \"code\" });\n nav.navigate(PATHS.graphs);\n } catch (err) {\n console.error(err);\n } finally {\n setGraphLoading(null);\n }\n }}\n title=\"Gerar Knowledge Graph\"\n >\n {graphLoading === repo.fullName ? \"Gerando...\" : \"Graphify\"}\n </button>\n </div>\n </div>\n <div style={{ display: \"flex\", gap: \"16px\", marginTop: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>\n {repo.language && <span>{repo.language}</span>}\n <span>branch: {repo.defaultBranch}</span>\n <span>sync: {timeAgo(repo.syncedAt)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, badgeStyle, prStateBadge, timeAgo } from \"./shared.js\";\nimport type { PRWithRepo } from \"../../types.js\";\n\nexport function GitHubPullRequestsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [stateFilter, setStateFilter] = useState<string>(\"open\");\n const [search, setSearch] = useState(\"\");\n\n const prsData = usePluginData<{ pullRequests: PRWithRepo[] }>(\"pull-requests\", {\n companyId,\n filters: stateFilter ? { state: stateFilter } : undefined,\n });\n\n const syncAction = usePluginAction(\"sync-incremental\");\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const prs = (prsData.data?.pullRequests ?? []).filter((pr) =>\n !search || pr.title.toLowerCase().includes(search.toLowerCase()) || pr.repoFullName.toLowerCase().includes(search.toLowerCase()),\n );\n\n return (\n <div style={layoutStack}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Pull Requests ({prs.length})</h2>\n <button type=\"button\" style={buttonStyle} onClick={() => syncAction({ companyId }).catch(console.error)}>\n Sync\n </button>\n </div>\n\n <div style={{ display: \"flex\", gap: \"8px\", flexWrap: \"wrap\" }}>\n {[\"open\", \"closed\", \"merged\", \"\"].map((state) => (\n <button\n key={state}\n type=\"button\"\n style={{\n ...buttonStyle,\n background: stateFilter === state ? \"rgba(128,128,128,0.15)\" : \"transparent\",\n fontWeight: stateFilter === state ? 600 : 400,\n }}\n onClick={() => setStateFilter(state)}\n >\n {state || \"Todos\"}\n </button>\n ))}\n <input\n placeholder=\"Buscar por t\u00EDtulo ou repo...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n style={{ flex: 1, minWidth: \"200px\", padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n </div>\n\n {prs.length === 0 && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.6 }}>\n Nenhum PR encontrado com os filtros atuais.\n </div>\n )}\n\n {prs.map((pr) => {\n const badge = prStateBadge(pr.draft ? \"draft\" : pr.state);\n return (\n <div key={pr.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <span style={badgeStyle(badge.color)}>{badge.label}</span>\n <a href={pr.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"14px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n #{pr.number} {pr.title}\n </a>\n </div>\n <div style={{ marginTop: \"4px\", fontSize: \"12px\", opacity: 0.6 }}>\n {pr.repoFullName} \u00B7 {pr.author} \u00B7 {pr.headBranch} \u2192 {pr.baseBranch} \u00B7 {timeAgo(pr.updatedAt)}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle } from \"./shared.js\";\nimport type { GraphData } from \"../../graphify/graph-generator.js\";\n\nfunction toObsidianCanvas(graph: GraphData): string {\n const CARD_W = 250;\n const CARD_H = 60;\n const COL_GAP = 300;\n const ROW_GAP = 100;\n\n const typeOrder: Record<string, number> = { repo: 0, module: 1, file: 2, pr: 3, agent: 4 };\n const grouped: Record<string, typeof graph.nodes> = {};\n for (const n of graph.nodes) {\n const t = n.type;\n if (!grouped[t]) grouped[t] = [];\n grouped[t].push(n);\n }\n\n const canvasNodes: Array<Record<string, unknown>> = [];\n const posMap: Record<string, { x: number; y: number }> = {};\n let col = 0;\n\n for (const type of Object.keys(grouped).sort((a, b) => (typeOrder[a] ?? 9) - (typeOrder[b] ?? 9))) {\n const items = grouped[type];\n let row = 0;\n for (const node of items) {\n const x = col * COL_GAP;\n const y = row * ROW_GAP;\n posMap[node.id] = { x, y };\n const color = type === \"repo\" ? \"1\" : type === \"pr\" ? \"4\" : type === \"module\" ? \"3\" : \"0\";\n canvasNodes.push({\n id: node.id,\n type: \"text\",\n x,\n y,\n width: CARD_W,\n height: CARD_H,\n color,\n text: `**[${node.type}]** ${node.label}`,\n });\n row++;\n }\n col++;\n }\n\n const canvasEdges = graph.edges.map((e, i) => ({\n id: `edge-${i}`,\n fromNode: e.source,\n toNode: e.target,\n fromSide: \"right\",\n toSide: \"left\",\n label: e.label,\n }));\n\n return JSON.stringify({ nodes: canvasNodes, edges: canvasEdges }, null, 2);\n}\n\nfunction downloadFile(filename: string, content: string, mime = \"application/json\") {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport function GitHubGraphsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [graphData, setGraphData] = useState<GraphData | null>(null);\n const [loading, setLoading] = useState(false);\n const [repoInput, setRepoInput] = useState(\"\");\n\n const generateGraph = usePluginAction(\"generate-graph\");\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const handleGenerateHighLevel = async () => {\n setLoading(true);\n try {\n const result = await generateGraph({ companyId, level: \"high\" }) as GraphData;\n setGraphData(result);\n } catch (err) {\n console.error(err);\n }\n setLoading(false);\n };\n\n const handleGenerateCode = async () => {\n if (!repoInput.trim()) return;\n setLoading(true);\n try {\n const result = await generateGraph({ companyId, repoFullName: repoInput.trim(), level: \"code\" }) as GraphData;\n setGraphData(result);\n } catch (err) {\n console.error(err);\n }\n setLoading(false);\n };\n\n const handleExportObsidian = () => {\n if (!graphData) return;\n const canvas = toObsidianCanvas(graphData);\n const name = graphData.repoFullName === \"*\"\n ? \"github-overview\"\n : graphData.repoFullName.replace(\"/\", \"-\");\n downloadFile(`${name}.canvas`, canvas);\n };\n\n return (\n <div style={layoutStack}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Knowledge Graphs</h2>\n\n <div style={{ display: \"flex\", gap: \"8px\", flexWrap: \"wrap\" }}>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleGenerateHighLevel} disabled={loading}>\n {loading ? \"Gerando...\" : \"Grafo de Alto N\u00EDvel\"}\n </button>\n <div style={{ display: \"flex\", gap: \"4px\", flex: 1 }}>\n <input\n placeholder=\"owner/repo para drill-down...\"\n value={repoInput}\n onChange={(e) => setRepoInput(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleGenerateCode} disabled={loading || !repoInput.trim()}>\n Grafo de C\u00F3digo\n </button>\n </div>\n </div>\n\n {graphData && (\n <div style={cardStyle}>\n <div style={{ marginBottom: \"8px\", fontSize: \"13px\", display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <div>\n <strong>{graphData.level === \"high\" ? \"Vis\u00E3o Geral\" : graphData.repoFullName}</strong>\n <span style={{ marginLeft: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>\n {graphData.nodes.length} n\u00F3s \u00B7 {graphData.edges.length} arestas \u00B7 {new Date(graphData.generatedAt).toLocaleString()}\n </span>\n </div>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleExportObsidian}>\n Abrir no Obsidian\n </button>\n </div>\n <div style={{ maxHeight: \"400px\", overflow: \"auto\", fontSize: \"12px\" }}>\n <div style={{ marginBottom: \"8px\" }}>\n <strong>N\u00F3s:</strong>\n {graphData.nodes.map((node) => (\n <div key={node.id} style={{ padding: \"2px 0\", paddingLeft: \"12px\" }}>\n <span style={{ opacity: 0.5 }}>[{node.type}]</span> {node.label}\n </div>\n ))}\n </div>\n <div>\n <strong>Arestas:</strong>\n {graphData.edges.map((edge, i) => (\n <div key={i} style={{ padding: \"2px 0\", paddingLeft: \"12px\" }}>\n {edge.source} \u2192 {edge.target} <span style={{ opacity: 0.5 }}>({edge.label})</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {!graphData && !loading && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.5 }}>\n Clique em um dos bot\u00F5es acima para gerar um knowledge graph.\n </div>\n )}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport type { PluginDetailTabProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { cardStyle, buttonStyle, badgeStyle, prStateBadge, timeAgo } from \"./shared.js\";\nimport { ReviewDropdown } from \"./ReviewDropdown.js\";\nimport type { PRWithRepo } from \"../../types.js\";\n\nexport function GitHubDetailTab({ context }: PluginDetailTabProps) {\n const issueId = context.entityId;\n const companyId = context.companyId;\n const [showLinkInput, setShowLinkInput] = useState(false);\n const [selectedPrId, setSelectedPrId] = useState<number | null>(null);\n\n const cardPRs = usePluginData<{ pullRequests: PRWithRepo[] }>(\"card-prs\", {\n companyId,\n issueId,\n });\n\n const allPRs = usePluginData<{ pullRequests: PRWithRepo[] }>(\"pull-requests\", {\n companyId,\n filters: { state: \"open\" },\n });\n\n const linkAction = usePluginAction(\"link-pr-to-card\");\n const quickCheck = usePluginAction(\"run-quick-check\");\n\n if (!companyId || !issueId) {\n return <div style={{ padding: \"12px\", fontSize: \"13px\", opacity: 0.5 }}>Sem contexto dispon\u00EDvel.</div>;\n }\n\n const prs = cardPRs.data?.pullRequests ?? [];\n\n const handleLink = async () => {\n if (!selectedPrId) return;\n await linkAction({ prId: selectedPrId, issueId });\n setShowLinkInput(false);\n setSelectedPrId(null);\n };\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\", padding: \"12px\" }}>\n {prs.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: \"20px 0\" }}>\n <p style={{ fontSize: \"13px\", opacity: 0.5, margin: \"0 0 12px\" }}>\n Nenhum PR vinculado a este card.\n </p>\n <button type=\"button\" style={buttonStyle} onClick={() => setShowLinkInput(true)}>\n Vincular PR\n </button>\n </div>\n ) : (\n <>\n {prs.map((pr) => {\n const badge = prStateBadge(pr.draft ? \"draft\" : pr.state);\n return (\n <div key={pr.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\" }}>\n <span style={badgeStyle(badge.color)}>{badge.label}</span>\n <a href={pr.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"13px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n #{pr.number} {pr.title}\n </a>\n </div>\n <div style={{ marginTop: \"4px\", fontSize: \"11px\", opacity: 0.5 }}>\n {pr.repoFullName} \u00B7 {pr.author} \u00B7 {pr.headBranch} \u2192 {pr.baseBranch} \u00B7 {timeAgo(pr.updatedAt)}\n </div>\n </div>\n <ReviewDropdown\n companyId={companyId}\n prId={pr.id}\n repoFullName={pr.repoFullName}\n prNumber={pr.number}\n />\n </div>\n </div>\n );\n })}\n <button type=\"button\" style={{ ...buttonStyle, alignSelf: \"flex-start\", fontSize: \"12px\" }} onClick={() => setShowLinkInput(true)}>\n + Vincular outro PR\n </button>\n </>\n )}\n\n {showLinkInput && (\n <div style={cardStyle}>\n <div style={{ fontSize: \"13px\", fontWeight: 500, marginBottom: \"8px\" }}>Selecionar PR</div>\n <select\n style={{ width: \"100%\", padding: \"6px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\", marginBottom: \"8px\" }}\n onChange={(e) => setSelectedPrId(Number(e.target.value))}\n value={selectedPrId ?? \"\"}\n >\n <option value=\"\">Selecione um PR...</option>\n {(allPRs.data?.pullRequests ?? []).map((pr) => (\n <option key={pr.id} value={pr.id}>\n {pr.repoFullName} #{pr.number} \u2014 {pr.title}\n </option>\n ))}\n </select>\n <div style={{ display: \"flex\", gap: \"8px\" }}>\n <button type=\"button\" style={buttonStyle} onClick={handleLink} disabled={!selectedPrId}>\n Vincular\n </button>\n <button type=\"button\" style={buttonStyle} onClick={() => setShowLinkInput(false)}>\n Cancelar\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { buttonStyle, primaryButtonStyle } from \"./shared.js\";\n\ntype Agent = { id: string; displayName: string; role: string };\n\ntype Props = {\n companyId: string;\n prId: number;\n repoFullName: string;\n prNumber: number;\n};\n\nexport function ReviewDropdown({ companyId, prId, repoFullName, prNumber }: Props) {\n const [open, setOpen] = useState(false);\n const [reviewing, setReviewing] = useState(false);\n\n const agentsData = usePluginData<{ agents: Agent[] }>(\"available-agents\", { companyId });\n const requestReview = usePluginAction(\"request-review\");\n\n const agents = agentsData.data?.agents ?? [];\n\n const handleReview = async (agentId: string) => {\n setReviewing(true);\n setOpen(false);\n try {\n await requestReview({ companyId, prId, repoFullName, prNumber, agentId });\n } catch (err) {\n console.error(\"Review request failed:\", err);\n }\n setReviewing(false);\n };\n\n if (reviewing) {\n return <span style={{ fontSize: \"12px\", opacity: 0.6 }}>Revisando...</span>;\n }\n\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }}>\n <button type=\"button\" style={primaryButtonStyle} onClick={() => setOpen(!open)}>\n Revisar \u25BE\n </button>\n {open && (\n <div style={{\n position: \"absolute\", top: \"100%\", right: 0, marginTop: \"4px\",\n background: \"var(--background, #1a1a1a)\", border: \"1px solid rgba(128,128,128,0.3)\",\n borderRadius: \"8px\", padding: \"4px\", minWidth: \"200px\", zIndex: 10,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n }}>\n {agents.length === 0 && (\n <div style={{ padding: \"8px\", fontSize: \"12px\", opacity: 0.5 }}>Nenhum agente dispon\u00EDvel</div>\n )}\n {agents.map((agent) => (\n <button\n key={agent.id}\n type=\"button\"\n style={{ ...buttonStyle, width: \"100%\", textAlign: \"left\", border: \"none\", borderRadius: \"4px\" }}\n onClick={() => handleReview(agent.id)}\n >\n <div style={{ fontWeight: 500 }}>{agent.displayName}</div>\n <div style={{ fontSize: \"11px\", opacity: 0.5 }}>{agent.role}</div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n", "import React from \"react\";\nimport type { PluginWidgetProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { useHostNavigation, usePluginData } from \"@paperclipai/plugin-sdk/ui\";\nimport { PATHS, timeAgo } from \"./shared.js\";\n\nexport function GitHubDashboardWidget({ context }: PluginWidgetProps) {\n const nav = useHostNavigation();\n const syncStatus = usePluginData<{ lastSync: string | null; repoCount: number; openPRCount: number }>(\"sync-status\", {\n companyId: context.companyId,\n });\n\n const data = syncStatus.data;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\", fontSize: \"12px\" }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <strong style={{ fontSize: \"13px\" }}>GitHub</strong>\n <span style={{\n display: \"inline-block\", width: \"8px\", height: \"8px\", borderRadius: \"50%\",\n background: data ? \"#22c55e\" : \"#6b7280\",\n }} />\n </div>\n <div style={{ display: \"grid\", gap: \"2px\" }}>\n <div>Reposit\u00F3rios: {data?.repoCount ?? 0}</div>\n <div>PRs abertos: {data?.openPRCount ?? 0}</div>\n <div>\u00DAltimo sync: {data?.lastSync ? timeAgo(data.lastSync) : \"nunca\"}</div>\n </div>\n <a {...nav.linkProps(PATHS.prs)} style={{ fontSize: \"12px\", color: \"#3b82f6\" }}>\n Ver Pull Requests \u2192\n </a>\n </div>\n );\n}\n", "import React from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { buttonStyle } from \"./shared.js\";\n\nexport function GitHubContextMenu() {\n const context = useHostContext();\n const generateGraph = usePluginAction(\"generate-graph\");\n\n const handleGraphify = () => {\n if (!context.companyId) return;\n void generateGraph({\n companyId: context.companyId,\n level: \"high\",\n }).catch(console.error);\n };\n\n return (\n <button type=\"button\" style={buttonStyle} onClick={handleGraphify}>\n Gerar Knowledge Graph\n </button>\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport { useHostNavigation, usePluginData } from \"@paperclipai/plugin-sdk/ui\";\nimport { PATHS } from \"./shared.js\";\n\ntype NavItem = { label: string; path: string };\n\nconst NAV_ITEMS: NavItem[] = [\n { label: \"Configura\u00E7\u00F5es\", path: PATHS.settings },\n { label: \"Reposit\u00F3rios\", path: PATHS.repos },\n { label: \"Pull Requests\", path: PATHS.prs },\n { label: \"Knowledge Graphs\", path: PATHS.graphs },\n];\n\nexport function GitHubSidebarLink() {\n const nav = useHostNavigation();\n const href = nav.resolveHref(PATHS.repos);\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n\n return (\n <a\n {...nav.linkProps(PATHS.repos)}\n aria-current={isActive ? \"page\" : undefined}\n className={[\n \"flex items-center gap-2.5 px-3 py-2 text-[13px] font-medium\",\n isActive ? \"bg-accent text-foreground\" : \"text-foreground/80 hover:bg-accent/50\",\n ].join(\" \")}\n >\n <span className=\"relative shrink-0\">\n <svg viewBox=\"0 0 16 16\" className=\"h-4 w-4\" fill=\"currentColor\">\n <path d=\"M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z\" />\n </svg>\n </span>\n <span className=\"flex-1 truncate\">GitHub</span>\n </a>\n );\n}\n\nexport function GitHubSidebarPanel() {\n const syncStatus = usePluginData<{ lastSync: string | null; repoCount: number; openPRCount: number }>(\"sync-status\");\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"4px\", fontSize: \"12px\", padding: \"8px\" }}>\n <strong>GitHub</strong>\n <div>Repos: {syncStatus.data?.repoCount ?? 0}</div>\n <div>PRs abertos: {syncStatus.data?.openPRCount ?? 0}</div>\n <div>\u00DAltimo sync: {syncStatus.data?.lastSync ? new Date(syncStatus.data.lastSync).toLocaleString() : \"nunca\"}</div>\n </div>\n );\n}\n\nexport function GitHubRouteSidebar() {\n const nav = useHostNavigation();\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"2px\", padding: \"4px\" }}>\n {NAV_ITEMS.map((item) => {\n const href = nav.resolveHref(item.path);\n const isActive = typeof window !== \"undefined\" && window.location.pathname === href;\n return (\n <a\n key={item.path}\n {...nav.linkProps(item.path)}\n aria-current={isActive ? \"page\" : undefined}\n style={{\n display: \"block\",\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: isActive ? 600 : 400,\n background: isActive ? \"rgba(128,128,128,0.1)\" : \"transparent\",\n textDecoration: \"none\",\n color: \"inherit\",\n }}\n >\n {item.label}\n </a>\n );\n })}\n </div>\n );\n}\n", "import type React from \"react\";\n\nexport const ROUTES = {\n settings: \"github-settings\",\n repos: \"github-repos\",\n prs: \"github-prs\",\n graphs: \"github-graphs\",\n} as const;\n\nexport const PATHS = {\n settings: \"/github-settings\",\n repos: \"/github-repos\",\n prs: \"/github-prs\",\n graphs: \"/github-graphs\",\n} as const;\n\nexport const layoutStack: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"12px\",\n padding: \"16px\",\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid rgba(128,128,128,0.2)\",\n borderRadius: \"8px\",\n padding: \"12px\",\n background: \"rgba(128,128,128,0.04)\",\n};\n\nexport const buttonStyle: React.CSSProperties = {\n padding: \"6px 12px\",\n borderRadius: \"6px\",\n border: \"1px solid rgba(128,128,128,0.3)\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n};\n\nexport const primaryButtonStyle: React.CSSProperties = {\n ...buttonStyle,\n background: \"rgba(59,130,246,0.1)\",\n borderColor: \"rgba(59,130,246,0.3)\",\n color: \"#3b82f6\",\n};\n\nexport const badgeStyle = (color: string): React.CSSProperties => ({\n display: \"inline-block\",\n padding: \"2px 8px\",\n borderRadius: \"12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n background: `${color}20`,\n color,\n});\n\nexport function prStateBadge(state: string): { label: string; color: string } {\n switch (state) {\n case \"open\": return { label: \"Open\", color: \"#22c55e\" };\n case \"closed\": return { label: \"Closed\", color: \"#ef4444\" };\n case \"merged\": return { label: \"Merged\", color: \"#a855f7\" };\n case \"draft\": return { label: \"Draft\", color: \"#6b7280\" };\n default: return { label: state, color: \"#6b7280\" };\n }\n}\n\nexport function timeAgo(dateStr: string): string {\n const diff = Date.now() - new Date(dateStr).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle } from \"./shared.js\";\n\nexport function GitHubSettingsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n\n const [token, setToken] = useState(\"\");\n const [secretRef, setSecretRef] = useState(\"\");\n const [repoInput, setRepoInput] = useState(\"\");\n const [status, setStatus] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n\n const saveToken = usePluginAction(\"save-token\");\n const saveSecretRefAction = usePluginAction(\"save-secret-ref\");\n const testConnection = usePluginAction(\"test-connection\");\n const addRepo = usePluginAction(\"add-repo\");\n const syncAll = usePluginAction(\"sync-all\");\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const handleSaveToken = async () => {\n if (!token.trim()) return;\n setLoading(true);\n try {\n await saveToken({ companyId, token: token.trim() });\n setStatus(\"Token salvo com sucesso\");\n setToken(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleSaveSecretRef = async () => {\n if (!secretRef.trim()) return;\n setLoading(true);\n try {\n await saveSecretRefAction({ companyId, secretRef: secretRef.trim() });\n setStatus(\"Secret ref salvo com sucesso\");\n setSecretRef(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleTestConnection = async () => {\n setLoading(true);\n try {\n const result = await testConnection({ companyId }) as { ok: boolean; login?: string; error?: string };\n if (result.ok) {\n setStatus(`Conectado como ${result.login}`);\n } else {\n setStatus(`Falha: ${result.error}`);\n }\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleAddRepo = async () => {\n if (!repoInput.trim()) return;\n setLoading(true);\n try {\n await addRepo({ companyId, fullName: repoInput.trim() });\n setStatus(`Reposit\u00F3rio ${repoInput.trim()} adicionado`);\n setRepoInput(\"\");\n } catch (err) {\n setStatus(`Erro: ${err}`);\n }\n setLoading(false);\n };\n\n const handleFullSync = async () => {\n setLoading(true);\n setStatus(\"Sincronizando...\");\n try {\n await syncAll({ companyId });\n setStatus(\"Sync completo finalizado\");\n } catch (err) {\n setStatus(`Erro no sync: ${err}`);\n }\n setLoading(false);\n };\n\n return (\n <div style={layoutStack}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Configura\u00E7\u00F5es GitHub</h2>\n\n {status && (\n <div style={{ ...cardStyle, fontSize: \"13px\", color: status.startsWith(\"Erro\") ? \"#ef4444\" : \"#22c55e\" }}>\n {status}\n </div>\n )}\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Autentica\u00E7\u00E3o</h3>\n <div style={{ display: \"flex\", gap: \"8px\", marginBottom: \"8px\" }}>\n <input\n type=\"password\"\n placeholder=\"GitHub Personal Access Token\"\n value={token}\n onChange={(e) => setToken(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleSaveToken} disabled={loading}>\n Salvar PAT\n </button>\n </div>\n <div style={{ display: \"flex\", gap: \"8px\", marginBottom: \"8px\" }}>\n <input\n placeholder=\"UUID do secret (alternativa)\"\n value={secretRef}\n onChange={(e) => setSecretRef(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleSaveSecretRef} disabled={loading}>\n Salvar Ref\n </button>\n </div>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleTestConnection} disabled={loading}>\n Testar Conex\u00E3o\n </button>\n </div>\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Adicionar Reposit\u00F3rio</h3>\n <div style={{ display: \"flex\", gap: \"8px\" }}>\n <input\n placeholder=\"owner/repo (ex: gauderp/gaud-erp-api)\"\n value={repoInput}\n onChange={(e) => setRepoInput(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={primaryButtonStyle} onClick={handleAddRepo} disabled={loading}>\n Adicionar\n </button>\n </div>\n </div>\n\n <div style={cardStyle}>\n <h3 style={{ margin: \"0 0 8px\", fontSize: \"14px\" }}>Sincroniza\u00E7\u00E3o</h3>\n <p style={{ margin: \"0 0 8px\", fontSize: \"12px\", opacity: 0.7 }}>\n Sync autom\u00E1tico a cada 5 minutos. Use o bot\u00E3o abaixo para for\u00E7ar um sync completo.\n </p>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleFullSync} disabled={loading}>\n {loading ? \"Sincronizando...\" : \"Sync Completo\"}\n </button>\n </div>\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, useHostNavigation, usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle, timeAgo, PATHS } from \"./shared.js\";\nimport type { GitHubRepo } from \"../../types.js\";\n\nexport function GitHubReposPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [filter, setFilter] = useState(\"\");\n\n const nav = useHostNavigation();\n const reposData = usePluginData<{ repos: GitHubRepo[]; lastSync: string | null }>(\"repos\", { companyId });\n const syncAction = usePluginAction(\"sync-all\");\n const generateGraph = usePluginAction(\"generate-graph\");\n const [graphLoading, setGraphLoading] = useState<string | null>(null);\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const repos = (reposData.data?.repos ?? []).filter((r) =>\n !filter || r.fullName.toLowerCase().includes(filter.toLowerCase()),\n );\n\n return (\n <div style={layoutStack}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Reposit\u00F3rios ({repos.length})</h2>\n <div style={{ display: \"flex\", gap: \"8px\", alignItems: \"center\" }}>\n <span style={{ fontSize: \"11px\", opacity: 0.6 }}>\n \u00DAltimo sync: {reposData.data?.lastSync ? timeAgo(reposData.data.lastSync) : \"nunca\"}\n </span>\n <button\n type=\"button\"\n style={buttonStyle}\n onClick={() => syncAction({ companyId }).catch(console.error)}\n >\n Sync\n </button>\n </div>\n </div>\n\n <input\n placeholder=\"Filtrar reposit\u00F3rios...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n style={{ padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n\n {repos.length === 0 && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.6 }}>\n Nenhum reposit\u00F3rio rastreado. Adicione em Configura\u00E7\u00F5es.\n </div>\n )}\n\n {repos.map((repo) => (\n <div key={repo.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div>\n <a href={repo.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"14px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n {repo.fullName}\n </a>\n {repo.private && <span style={{ marginLeft: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>privado</span>}\n {repo.description && <p style={{ margin: \"4px 0 0\", fontSize: \"12px\", opacity: 0.7 }}>{repo.description}</p>}\n </div>\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n style={buttonStyle}\n disabled={graphLoading === repo.fullName}\n onClick={async () => {\n setGraphLoading(repo.fullName);\n try {\n await generateGraph({ companyId, repoFullName: repo.fullName, level: \"code\" });\n nav.navigate(`${PATHS.graphs}?repo=${encodeURIComponent(repo.fullName)}`);\n } catch (err) {\n console.error(err);\n } finally {\n setGraphLoading(null);\n }\n }}\n title=\"Gerar Knowledge Graph\"\n >\n {graphLoading === repo.fullName ? \"Gerando...\" : \"Graphify\"}\n </button>\n </div>\n </div>\n <div style={{ display: \"flex\", gap: \"16px\", marginTop: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>\n {repo.language && <span>{repo.language}</span>}\n <span>branch: {repo.defaultBranch}</span>\n <span>sync: {timeAgo(repo.syncedAt)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { useHostContext, usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, badgeStyle, prStateBadge, timeAgo } from \"./shared.js\";\nimport type { PRWithRepo } from \"../../types.js\";\n\nexport function GitHubPullRequestsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [stateFilter, setStateFilter] = useState<string>(\"open\");\n const [search, setSearch] = useState(\"\");\n\n const prsData = usePluginData<{ pullRequests: PRWithRepo[] }>(\"pull-requests\", {\n companyId,\n filters: stateFilter ? { state: stateFilter } : undefined,\n });\n\n const syncAction = usePluginAction(\"sync-incremental\");\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const prs = (prsData.data?.pullRequests ?? []).filter((pr) =>\n !search || pr.title.toLowerCase().includes(search.toLowerCase()) || pr.repoFullName.toLowerCase().includes(search.toLowerCase()),\n );\n\n return (\n <div style={layoutStack}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Pull Requests ({prs.length})</h2>\n <button type=\"button\" style={buttonStyle} onClick={() => syncAction({ companyId }).catch(console.error)}>\n Sync\n </button>\n </div>\n\n <div style={{ display: \"flex\", gap: \"8px\", flexWrap: \"wrap\" }}>\n {[\"open\", \"closed\", \"merged\", \"\"].map((state) => (\n <button\n key={state}\n type=\"button\"\n style={{\n ...buttonStyle,\n background: stateFilter === state ? \"rgba(128,128,128,0.15)\" : \"transparent\",\n fontWeight: stateFilter === state ? 600 : 400,\n }}\n onClick={() => setStateFilter(state)}\n >\n {state || \"Todos\"}\n </button>\n ))}\n <input\n placeholder=\"Buscar por t\u00EDtulo ou repo...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n style={{ flex: 1, minWidth: \"200px\", padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n </div>\n\n {prs.length === 0 && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.6 }}>\n Nenhum PR encontrado com os filtros atuais.\n </div>\n )}\n\n {prs.map((pr) => {\n const badge = prStateBadge(pr.draft ? \"draft\" : pr.state);\n return (\n <div key={pr.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n <span style={badgeStyle(badge.color)}>{badge.label}</span>\n <a href={pr.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"14px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n #{pr.number} {pr.title}\n </a>\n </div>\n <div style={{ marginTop: \"4px\", fontSize: \"12px\", opacity: 0.6 }}>\n {pr.repoFullName} \u00B7 {pr.author} \u00B7 {pr.headBranch} \u2192 {pr.baseBranch} \u00B7 {timeAgo(pr.updatedAt)}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n", "import React, { useState, useEffect } from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { layoutStack, cardStyle, buttonStyle, primaryButtonStyle } from \"./shared.js\";\nimport type { GraphData } from \"../../graphify/graph-generator.js\";\n\nfunction toObsidianCanvas(graph: GraphData): string {\n const CARD_W = 250;\n const CARD_H = 60;\n const COL_GAP = 300;\n const ROW_GAP = 100;\n\n const typeOrder: Record<string, number> = { repo: 0, module: 1, file: 2, pr: 3, agent: 4 };\n const grouped: Record<string, typeof graph.nodes> = {};\n for (const n of graph.nodes) {\n const t = n.type;\n if (!grouped[t]) grouped[t] = [];\n grouped[t].push(n);\n }\n\n const canvasNodes: Array<Record<string, unknown>> = [];\n const posMap: Record<string, { x: number; y: number }> = {};\n let col = 0;\n\n for (const type of Object.keys(grouped).sort((a, b) => (typeOrder[a] ?? 9) - (typeOrder[b] ?? 9))) {\n const items = grouped[type];\n let row = 0;\n for (const node of items) {\n const x = col * COL_GAP;\n const y = row * ROW_GAP;\n posMap[node.id] = { x, y };\n const color = type === \"repo\" ? \"1\" : type === \"pr\" ? \"4\" : type === \"module\" ? \"3\" : \"0\";\n canvasNodes.push({\n id: node.id,\n type: \"text\",\n x,\n y,\n width: CARD_W,\n height: CARD_H,\n color,\n text: `**[${node.type}]** ${node.label}`,\n });\n row++;\n }\n col++;\n }\n\n const canvasEdges = graph.edges.map((e, i) => ({\n id: `edge-${i}`,\n fromNode: e.source,\n toNode: e.target,\n fromSide: \"right\",\n toSide: \"left\",\n label: e.label,\n }));\n\n return JSON.stringify({ nodes: canvasNodes, edges: canvasEdges }, null, 2);\n}\n\nfunction downloadFile(filename: string, content: string, mime = \"application/json\") {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport function GitHubGraphsPage() {\n const context = useHostContext();\n const companyId = context.companyId;\n const [graphData, setGraphData] = useState<GraphData | null>(null);\n const [loading, setLoading] = useState(false);\n const [repoInput, setRepoInput] = useState(\"\");\n const [autoLoaded, setAutoLoaded] = useState(false);\n\n const generateGraph = usePluginAction(\"generate-graph\");\n\n // Auto-load graph from query param (when coming from Repos page Graphify button)\n useEffect(() => {\n if (autoLoaded || !companyId) return;\n const params = new URLSearchParams(window.location.search);\n const repo = params.get(\"repo\");\n if (repo) {\n setRepoInput(repo);\n setAutoLoaded(true);\n setLoading(true);\n generateGraph({ companyId, repoFullName: repo, level: \"code\" })\n .then((result) => setGraphData(result as GraphData))\n .catch(console.error)\n .finally(() => setLoading(false));\n }\n }, [companyId, autoLoaded]);\n\n if (!companyId) return <div style={layoutStack}>Selecione uma empresa.</div>;\n\n const handleGenerateHighLevel = async () => {\n setLoading(true);\n try {\n const result = await generateGraph({ companyId, level: \"high\" }) as GraphData;\n setGraphData(result);\n } catch (err) {\n console.error(err);\n }\n setLoading(false);\n };\n\n const handleGenerateCode = async () => {\n if (!repoInput.trim()) return;\n setLoading(true);\n try {\n const result = await generateGraph({ companyId, repoFullName: repoInput.trim(), level: \"code\" }) as GraphData;\n setGraphData(result);\n } catch (err) {\n console.error(err);\n }\n setLoading(false);\n };\n\n const handleExportObsidian = () => {\n if (!graphData) return;\n const canvas = toObsidianCanvas(graphData);\n const name = graphData.repoFullName === \"*\"\n ? \"github-overview\"\n : graphData.repoFullName.replace(\"/\", \"-\");\n downloadFile(`${name}.canvas`, canvas);\n };\n\n return (\n <div style={layoutStack}>\n <h2 style={{ margin: 0, fontSize: \"18px\" }}>Knowledge Graphs</h2>\n\n <div style={{ display: \"flex\", gap: \"8px\", flexWrap: \"wrap\" }}>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleGenerateHighLevel} disabled={loading}>\n {loading ? \"Gerando...\" : \"Grafo de Alto N\u00EDvel\"}\n </button>\n <div style={{ display: \"flex\", gap: \"4px\", flex: 1 }}>\n <input\n placeholder=\"owner/repo para drill-down...\"\n value={repoInput}\n onChange={(e) => setRepoInput(e.target.value)}\n style={{ flex: 1, padding: \"6px 10px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\" }}\n />\n <button type=\"button\" style={buttonStyle} onClick={handleGenerateCode} disabled={loading || !repoInput.trim()}>\n Grafo de C\u00F3digo\n </button>\n </div>\n </div>\n\n {graphData && (\n <div style={cardStyle}>\n <div style={{ marginBottom: \"8px\", fontSize: \"13px\", display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <div>\n <strong>{graphData.level === \"high\" ? \"Vis\u00E3o Geral\" : graphData.repoFullName}</strong>\n <span style={{ marginLeft: \"8px\", fontSize: \"11px\", opacity: 0.5 }}>\n {graphData.nodes.length} n\u00F3s \u00B7 {graphData.edges.length} arestas \u00B7 {new Date(graphData.generatedAt).toLocaleString()}\n </span>\n </div>\n <button type=\"button\" style={primaryButtonStyle} onClick={handleExportObsidian}>\n Abrir no Obsidian\n </button>\n </div>\n <div style={{ maxHeight: \"400px\", overflow: \"auto\", fontSize: \"12px\" }}>\n <div style={{ marginBottom: \"8px\" }}>\n <strong>N\u00F3s:</strong>\n {graphData.nodes.map((node) => (\n <div key={node.id} style={{ padding: \"2px 0\", paddingLeft: \"12px\" }}>\n <span style={{ opacity: 0.5 }}>[{node.type}]</span> {node.label}\n </div>\n ))}\n </div>\n <div>\n <strong>Arestas:</strong>\n {graphData.edges.map((edge, i) => (\n <div key={i} style={{ padding: \"2px 0\", paddingLeft: \"12px\" }}>\n {edge.source} \u2192 {edge.target} <span style={{ opacity: 0.5 }}>({edge.label})</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {!graphData && !loading && (\n <div style={{ ...cardStyle, textAlign: \"center\", opacity: 0.5 }}>\n Clique em um dos bot\u00F5es acima para gerar um knowledge graph.\n </div>\n )}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport type { PluginDetailTabProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { cardStyle, buttonStyle, badgeStyle, prStateBadge, timeAgo } from \"./shared.js\";\nimport { ReviewDropdown } from \"./ReviewDropdown.js\";\nimport type { PRWithRepo } from \"../../types.js\";\n\nexport function GitHubDetailTab({ context }: PluginDetailTabProps) {\n const issueId = context.entityId;\n const companyId = context.companyId;\n const [showLinkInput, setShowLinkInput] = useState(false);\n const [selectedPrId, setSelectedPrId] = useState<number | null>(null);\n\n const cardPRs = usePluginData<{ pullRequests: PRWithRepo[] }>(\"card-prs\", {\n companyId,\n issueId,\n });\n\n const allPRs = usePluginData<{ pullRequests: PRWithRepo[] }>(\"pull-requests\", {\n companyId,\n filters: { state: \"open\" },\n });\n\n const linkAction = usePluginAction(\"link-pr-to-card\");\n const quickCheck = usePluginAction(\"run-quick-check\");\n\n if (!companyId || !issueId) {\n return <div style={{ padding: \"12px\", fontSize: \"13px\", opacity: 0.5 }}>Sem contexto dispon\u00EDvel.</div>;\n }\n\n const prs = cardPRs.data?.pullRequests ?? [];\n\n const handleLink = async () => {\n if (!selectedPrId) return;\n await linkAction({ prId: selectedPrId, issueId });\n setShowLinkInput(false);\n setSelectedPrId(null);\n };\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\", padding: \"12px\" }}>\n {prs.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: \"20px 0\" }}>\n <p style={{ fontSize: \"13px\", opacity: 0.5, margin: \"0 0 12px\" }}>\n Nenhum PR vinculado a este card.\n </p>\n <button type=\"button\" style={buttonStyle} onClick={() => setShowLinkInput(true)}>\n Vincular PR\n </button>\n </div>\n ) : (\n <>\n {prs.map((pr) => {\n const badge = prStateBadge(pr.draft ? \"draft\" : pr.state);\n return (\n <div key={pr.id} style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\" }}>\n <div style={{ flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\" }}>\n <span style={badgeStyle(badge.color)}>{badge.label}</span>\n <a href={pr.htmlUrl} target=\"_blank\" rel=\"noopener\" style={{ fontWeight: 600, fontSize: \"13px\", color: \"#3b82f6\", textDecoration: \"none\" }}>\n #{pr.number} {pr.title}\n </a>\n </div>\n <div style={{ marginTop: \"4px\", fontSize: \"11px\", opacity: 0.5 }}>\n {pr.repoFullName} \u00B7 {pr.author} \u00B7 {pr.headBranch} \u2192 {pr.baseBranch} \u00B7 {timeAgo(pr.updatedAt)}\n </div>\n </div>\n <ReviewDropdown\n companyId={companyId}\n prId={pr.id}\n repoFullName={pr.repoFullName}\n prNumber={pr.number}\n />\n </div>\n </div>\n );\n })}\n <button type=\"button\" style={{ ...buttonStyle, alignSelf: \"flex-start\", fontSize: \"12px\" }} onClick={() => setShowLinkInput(true)}>\n + Vincular outro PR\n </button>\n </>\n )}\n\n {showLinkInput && (\n <div style={cardStyle}>\n <div style={{ fontSize: \"13px\", fontWeight: 500, marginBottom: \"8px\" }}>Selecionar PR</div>\n <select\n style={{ width: \"100%\", padding: \"6px\", borderRadius: \"6px\", border: \"1px solid rgba(128,128,128,0.3)\", background: \"transparent\", fontSize: \"13px\", marginBottom: \"8px\" }}\n onChange={(e) => setSelectedPrId(Number(e.target.value))}\n value={selectedPrId ?? \"\"}\n >\n <option value=\"\">Selecione um PR...</option>\n {(allPRs.data?.pullRequests ?? []).map((pr) => (\n <option key={pr.id} value={pr.id}>\n {pr.repoFullName} #{pr.number} \u2014 {pr.title}\n </option>\n ))}\n </select>\n <div style={{ display: \"flex\", gap: \"8px\" }}>\n <button type=\"button\" style={buttonStyle} onClick={handleLink} disabled={!selectedPrId}>\n Vincular\n </button>\n <button type=\"button\" style={buttonStyle} onClick={() => setShowLinkInput(false)}>\n Cancelar\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n", "import React, { useState } from \"react\";\nimport { usePluginData, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { buttonStyle, primaryButtonStyle } from \"./shared.js\";\n\ntype Agent = { id: string; displayName: string; role: string };\n\ntype Props = {\n companyId: string;\n prId: number;\n repoFullName: string;\n prNumber: number;\n};\n\nexport function ReviewDropdown({ companyId, prId, repoFullName, prNumber }: Props) {\n const [open, setOpen] = useState(false);\n const [reviewing, setReviewing] = useState(false);\n\n const agentsData = usePluginData<{ agents: Agent[] }>(\"available-agents\", { companyId });\n const requestReview = usePluginAction(\"request-review\");\n\n const agents = agentsData.data?.agents ?? [];\n\n const handleReview = async (agentId: string) => {\n setReviewing(true);\n setOpen(false);\n try {\n await requestReview({ companyId, prId, repoFullName, prNumber, agentId });\n } catch (err) {\n console.error(\"Review request failed:\", err);\n }\n setReviewing(false);\n };\n\n if (reviewing) {\n return <span style={{ fontSize: \"12px\", opacity: 0.6 }}>Revisando...</span>;\n }\n\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }}>\n <button type=\"button\" style={primaryButtonStyle} onClick={() => setOpen(!open)}>\n Revisar \u25BE\n </button>\n {open && (\n <div style={{\n position: \"absolute\", top: \"100%\", right: 0, marginTop: \"4px\",\n background: \"var(--background, #1a1a1a)\", border: \"1px solid rgba(128,128,128,0.3)\",\n borderRadius: \"8px\", padding: \"4px\", minWidth: \"200px\", zIndex: 10,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.3)\",\n }}>\n {agents.length === 0 && (\n <div style={{ padding: \"8px\", fontSize: \"12px\", opacity: 0.5 }}>Nenhum agente dispon\u00EDvel</div>\n )}\n {agents.map((agent) => (\n <button\n key={agent.id}\n type=\"button\"\n style={{ ...buttonStyle, width: \"100%\", textAlign: \"left\", border: \"none\", borderRadius: \"4px\" }}\n onClick={() => handleReview(agent.id)}\n >\n <div style={{ fontWeight: 500 }}>{agent.displayName}</div>\n <div style={{ fontSize: \"11px\", opacity: 0.5 }}>{agent.role}</div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n", "import React from \"react\";\nimport type { PluginWidgetProps } from \"@paperclipai/plugin-sdk/ui\";\nimport { useHostNavigation, usePluginData } from \"@paperclipai/plugin-sdk/ui\";\nimport { PATHS, timeAgo } from \"./shared.js\";\n\nexport function GitHubDashboardWidget({ context }: PluginWidgetProps) {\n const nav = useHostNavigation();\n const syncStatus = usePluginData<{ lastSync: string | null; repoCount: number; openPRCount: number }>(\"sync-status\", {\n companyId: context.companyId,\n });\n\n const data = syncStatus.data;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\", fontSize: \"12px\" }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <strong style={{ fontSize: \"13px\" }}>GitHub</strong>\n <span style={{\n display: \"inline-block\", width: \"8px\", height: \"8px\", borderRadius: \"50%\",\n background: data ? \"#22c55e\" : \"#6b7280\",\n }} />\n </div>\n <div style={{ display: \"grid\", gap: \"2px\" }}>\n <div>Reposit\u00F3rios: {data?.repoCount ?? 0}</div>\n <div>PRs abertos: {data?.openPRCount ?? 0}</div>\n <div>\u00DAltimo sync: {data?.lastSync ? timeAgo(data.lastSync) : \"nunca\"}</div>\n </div>\n <a {...nav.linkProps(PATHS.prs)} style={{ fontSize: \"12px\", color: \"#3b82f6\" }}>\n Ver Pull Requests \u2192\n </a>\n </div>\n );\n}\n", "import React from \"react\";\nimport { useHostContext, usePluginAction } from \"@paperclipai/plugin-sdk/ui\";\nimport { buttonStyle } from \"./shared.js\";\n\nexport function GitHubContextMenu() {\n const context = useHostContext();\n const generateGraph = usePluginAction(\"generate-graph\");\n\n const handleGraphify = () => {\n if (!context.companyId) return;\n void generateGraph({\n companyId: context.companyId,\n level: \"high\",\n }).catch(console.error);\n };\n\n return (\n <button type=\"button\" style={buttonStyle} onClick={handleGraphify}>\n Gerar Knowledge Graph\n </button>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["jsx", "jsxs", "useState", "useHostContext", "useHostNavigation", "usePluginData", "usePluginAction", "jsx", "jsxs", "useHostContext", "useState", "useHostNavigation", "usePluginData", "usePluginAction", "useState", "useHostContext", "usePluginData", "usePluginAction", "jsx", "jsxs", "useHostContext", "useState", "usePluginData", "usePluginAction", "useState", "useHostContext", "usePluginAction", "jsx", "jsxs", "useHostContext", "useState", "usePluginAction", "useState", "usePluginData", "usePluginAction", "useState", "usePluginData", "usePluginAction", "jsx", "jsxs", "useState", "usePluginData", "usePluginAction", "jsx", "jsxs", "useState", "usePluginData", "usePluginAction", "useHostNavigation", "usePluginData", "jsx", "jsxs", "useHostNavigation", "usePluginData", "useHostContext", "usePluginAction", "jsx", "useHostContext", "usePluginAction"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gaud_erp/paperclip-github-manager",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Paperclip plugin for GitHub
|
|
3
|
+
"version": "1.6.2",
|
|
4
|
+
"description": "Paperclip plugin for GitHub repository management, PR/issue sync, AI code review, and knowledge graphs",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"paperclip",
|
|
8
|
+
"paperclip-plugin",
|
|
9
|
+
"github",
|
|
10
|
+
"github-manager",
|
|
11
|
+
"pull-request",
|
|
12
|
+
"code-review",
|
|
13
|
+
"ai-agent",
|
|
14
|
+
"knowledge-graph",
|
|
15
|
+
"repository-sync",
|
|
16
|
+
"webhook",
|
|
17
|
+
"obsidian",
|
|
18
|
+
"devops",
|
|
19
|
+
"automation",
|
|
20
|
+
"issue-tracking"
|
|
21
|
+
],
|
|
6
22
|
"repository": {
|
|
7
23
|
"type": "git",
|
|
8
24
|
"url": "https://github.com/gauderp/paperclip-github-manager"
|