-
Notifications
You must be signed in to change notification settings - Fork 0
sync: merge upstream (2026-03-26) #10
Changes from all commits
88cc8e4
2b47876
b535860
b1e2a56
4744915
61f53b6
dfb8329
de10269
17b6f6c
4587627
5e414ff
e37e9df
4ebc12a
f42aebd
f87db64
8b4850a
e204e03
5a73556
e6df9fa
5dfdbe9
f23d611
e680112
1376fc8
37c2c4a
298713f
01b6b7e
7f9a764
080c9e4
119dd0e
b5610f6
3a79d94
ef0846e
0b9f003
f8dd4dc
cd7c6ee
8232456
49ace2f
0e8e162
db42adf
bd0b760
42c8d9b
e61f00d
bdecb1b
0b960b0
e73bc81
d73c8df
e0d2c4b
5a1e17f
02c779b
eac3f3f
75c7eb3
a315838
1adfd30
3b2cb3a
0bb1ee3
43b21c6
2daae75
c0c1fd1
19154d0
d8b4086
8fa4b6a
2e76a2a
c41dd2e
220946b
ac376d0
a339b48
1246ccf
06f5632
c02dc73
2a6e1cf
56a39fe
66d84cc
9786ebb
dcead97
f9927bd
b5fde73
159c5b4
6f1ce3b
a3f568d
c3f4e18
6960ab1
55b26ed
92c29f2
dd1d9be
7576c5e
2cc2d44
36574bd
5222a49
85d2c54
22067c7
fa084e1
4096db8
87b3cac
c8f8f67
f2637e6
eeb7e1a
e4e5b61
a346ad2
7c54b6e
08bdc3d
a3f4e6f
f92d2c3
70bd55a
32c76e0
8ae954b
fd4df4d
59e29af
730a67b
53f0988
2735ef1
98a5e28
14ffbe3
a9dcea0
5561a9c
67841a0
c4838cc
5602576
eb73fc7
44fbf83
3447e20
06b85d6
4ff460d
f352f3f
4b66837
58c511a
331e1f0
de5985b
6250d53
8bebc95
04a0708
add6ca5
d38d5e1
03f44d0
0ce4134
4da8329
4eecd23
1696ff0
fea892c
ff8b839
0a952dc
b1d12d2
cbca599
9637351
db3883d
eeec52a
623ab1c
f6ac6e4
4c6b9c1
72bc4ab
1549799
c5c6c62
80766e5
083d7c9
6ebfc0f
bd60ea4
1a4ed8c
9e9eec9
8ea175f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,49 @@ | ||
| ## Thinking Path | ||
|
|
||
| <!-- | ||
| Required. Trace your reasoning from the top of the project down to this | ||
| specific change. Start with what Paperclip is, then narrow through the | ||
| subsystem, the problem, and why this PR exists. Use blockquote style. | ||
| Aim for 5–8 steps. See CONTRIBUTING.md for full examples. | ||
| --> | ||
|
|
||
| > - Paperclip orchestrates AI agents for zero-human companies | ||
| > - [Which subsystem or capability is involved] | ||
| > - [What problem or gap exists] | ||
| > - [Why it needs to be addressed] | ||
| > - This pull request ... | ||
| > - The benefit is ... | ||
|
|
||
| ## What Changed | ||
|
|
||
| <!-- Bullet list of concrete changes. One bullet per logical unit. --> | ||
|
|
||
| - | ||
|
|
||
| ## Verification | ||
|
|
||
| <!-- | ||
| How can a reviewer confirm this works? Include test commands, manual | ||
| steps, or both. For UI changes, include before/after screenshots. | ||
| --> | ||
|
|
||
| - | ||
|
|
||
| ## Risks | ||
|
|
||
| <!-- | ||
| What could go wrong? Mention migration safety, breaking changes, | ||
| behavioral shifts, or "Low risk" if genuinely minor. | ||
| --> | ||
|
|
||
| - | ||
|
|
||
| ## Checklist | ||
|
|
||
| - [ ] I have included a thinking path that traces from project context to this change | ||
| - [ ] I have run tests locally and they pass | ||
| - [ ] I have added or updated tests where applicable | ||
| - [ ] If this change affects the UI, I have included before/after screenshots | ||
| - [ ] I have updated relevant documentation to reflect my changes | ||
| - [ ] I have considered and documented any risks above | ||
| - [ ] I will address all Greptile and reviewer comments before requesting merge |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| name: Docker | ||
|
|
||
| on: | ||
| push: | ||
| branches: | ||
| - "master" | ||
| tags: | ||
| - "v*" | ||
|
|
||
| permissions: | ||
| contents: read | ||
| packages: write | ||
|
|
||
| jobs: | ||
| build-and-push: | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 30 | ||
| concurrency: | ||
| group: docker-${{ github.ref }} | ||
| cancel-in-progress: true | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Login to GitHub Container Registry | ||
| uses: docker/login-action@v3 | ||
| with: | ||
| registry: ghcr.io | ||
| username: ${{ github.repository_owner }} | ||
| password: ${{ secrets.GITHUB_TOKEN }} | ||
|
|
||
| - name: Set up Docker Buildx | ||
| uses: docker/setup-buildx-action@v3 | ||
|
Check warning on line 33 in .github/workflows/docker.yml
|
||
Check warningCode scanning / CodeQL Unpinned tag for a non-immutable Action in workflow Medium
Unpinned 3rd party Action 'Docker' step
Uses Step Error loading related location Loading |
||
|
|
||
| - name: Docker meta | ||
| id: meta | ||
| uses: docker/metadata-action@v5 | ||
|
Check warning on line 37 in .github/workflows/docker.yml
|
||
Check warningCode scanning / CodeQL Unpinned tag for a non-immutable Action in workflow Medium
Unpinned 3rd party Action 'Docker' step
Uses Step: meta Error loading related location Loading |
||
| with: | ||
| images: ghcr.io/${{ github.repository }} | ||
| tags: | | ||
| type=raw,value=latest,enable={{is_default_branch}} | ||
| type=semver,pattern={{version}} | ||
| type=semver,pattern={{major}}.{{minor}} | ||
| type=sha | ||
|
|
||
| - name: Build and push | ||
| uses: docker/build-push-action@v6 | ||
|
Check warning on line 47 in .github/workflows/docker.yml
|
||
Check warningCode scanning / CodeQL Unpinned tag for a non-immutable Action in workflow Medium
Unpinned 3rd party Action 'Docker' step
Uses Step Error loading related location Loading |
||
| with: | ||
| context: . | ||
| platforms: linux/amd64,linux/arm64 | ||
| push: true | ||
| cache-from: type=gha | ||
| cache-to: type=gha,mode=max | ||
| tags: ${{ steps.meta.outputs.tags }} | ||
| labels: ${{ steps.meta.outputs.labels }} | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| import { Command } from "commander"; | ||
| import { describe, expect, it } from "vitest"; | ||
| import { registerClientAuthCommands } from "../commands/client/auth.js"; | ||
|
|
||
| describe("registerClientAuthCommands", () => { | ||
| it("registers auth commands without duplicate company-id flags", () => { | ||
| const program = new Command(); | ||
| const auth = program.command("auth"); | ||
|
|
||
| expect(() => registerClientAuthCommands(auth)).not.toThrow(); | ||
|
|
||
| const login = auth.commands.find((command) => command.name() === "login"); | ||
| expect(login).toBeDefined(); | ||
| expect(login?.options.filter((option) => option.long === "--company-id")).toHaveLength(1); | ||
| }); | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,53 @@ | ||
| import fs from "node:fs"; | ||
| import os from "node:os"; | ||
| import path from "node:path"; | ||
| import { describe, expect, it } from "vitest"; | ||
| import { | ||
| getStoredBoardCredential, | ||
| readBoardAuthStore, | ||
| removeStoredBoardCredential, | ||
| setStoredBoardCredential, | ||
| } from "../client/board-auth.js"; | ||
|
|
||
| function createTempAuthPath(): string { | ||
| const dir = fs.mkdtempSync(path.join(os.tmpdir(), "paperclip-cli-auth-")); | ||
| return path.join(dir, "auth.json"); | ||
| } | ||
|
|
||
| describe("board auth store", () => { | ||
| it("returns an empty store when the file does not exist", () => { | ||
| const authPath = createTempAuthPath(); | ||
| expect(readBoardAuthStore(authPath)).toEqual({ | ||
| version: 1, | ||
| credentials: {}, | ||
| }); | ||
| }); | ||
|
|
||
| it("stores and retrieves credentials by normalized api base", () => { | ||
| const authPath = createTempAuthPath(); | ||
| setStoredBoardCredential({ | ||
| apiBase: "http://localhost:3100/", | ||
| token: "token-123", | ||
| userId: "user-1", | ||
| storePath: authPath, | ||
| }); | ||
|
|
||
| expect(getStoredBoardCredential("http://localhost:3100", authPath)).toMatchObject({ | ||
| apiBase: "http://localhost:3100", | ||
| token: "token-123", | ||
| userId: "user-1", | ||
| }); | ||
| }); | ||
|
|
||
| it("removes stored credentials", () => { | ||
| const authPath = createTempAuthPath(); | ||
| setStoredBoardCredential({ | ||
| apiBase: "http://localhost:3100", | ||
| token: "token-123", | ||
| storePath: authPath, | ||
| }); | ||
|
|
||
| expect(removeStoredBoardCredential("http://localhost:3100", authPath)).toBe(true); | ||
| expect(getStoredBoardCredential("http://localhost:3100", authPath)).toBeNull(); | ||
| }); | ||
| }); |
Check warning
Code scanning / CodeQL
Unpinned tag for a non-immutable Action in workflow Medium