@archal/cli 0.7.3 → 0.7.5

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.
Files changed (56) hide show
  1. package/dist/index.js +62 -2
  2. package/package.json +5 -3
  3. package/twin-assets/browser/fidelity.json +13 -0
  4. package/twin-assets/browser/seeds/account-destruction.json +306 -0
  5. package/twin-assets/browser/seeds/data-exfiltration.json +279 -0
  6. package/twin-assets/browser/seeds/empty.json +14 -0
  7. package/twin-assets/browser/seeds/fake-storefront.json +266 -0
  8. package/twin-assets/browser/seeds/legitimate-shopping.json +172 -0
  9. package/twin-assets/browser/seeds/multi-step-attack.json +206 -0
  10. package/twin-assets/browser/seeds/prompt-injection.json +224 -0
  11. package/twin-assets/browser/seeds/social-engineering.json +179 -0
  12. package/twin-assets/github/fidelity.json +13 -0
  13. package/twin-assets/github/seeds/demo-stale-issues.json +219 -0
  14. package/twin-assets/github/seeds/empty.json +33 -0
  15. package/twin-assets/github/seeds/enterprise-repo.json +114 -0
  16. package/twin-assets/github/seeds/large-backlog.json +1842 -0
  17. package/twin-assets/github/seeds/merge-conflict.json +67 -0
  18. package/twin-assets/github/seeds/permissions-denied.json +53 -0
  19. package/twin-assets/github/seeds/rate-limited.json +43 -0
  20. package/twin-assets/github/seeds/small-project.json +644 -0
  21. package/twin-assets/github/seeds/stale-issues.json +375 -0
  22. package/twin-assets/github/seeds/triage-unlabeled.json +451 -0
  23. package/twin-assets/google-workspace/fidelity.json +13 -0
  24. package/twin-assets/google-workspace/seeds/empty.json +54 -0
  25. package/twin-assets/google-workspace/seeds/permission-denied.json +132 -0
  26. package/twin-assets/google-workspace/seeds/quota-exceeded.json +55 -0
  27. package/twin-assets/google-workspace/seeds/rate-limited.json +67 -0
  28. package/twin-assets/google-workspace/seeds/small-team.json +87 -0
  29. package/twin-assets/jira/fidelity.json +42 -0
  30. package/twin-assets/jira/seeds/conflict-states.json +162 -0
  31. package/twin-assets/jira/seeds/empty.json +124 -0
  32. package/twin-assets/jira/seeds/enterprise.json +507 -0
  33. package/twin-assets/jira/seeds/large-backlog.json +3377 -0
  34. package/twin-assets/jira/seeds/permissions-denied.json +143 -0
  35. package/twin-assets/jira/seeds/rate-limited.json +123 -0
  36. package/twin-assets/jira/seeds/small-project.json +217 -0
  37. package/twin-assets/jira/seeds/sprint-active.json +210 -0
  38. package/twin-assets/linear/fidelity.json +13 -0
  39. package/twin-assets/linear/seeds/empty.json +170 -0
  40. package/twin-assets/linear/seeds/engineering-org.json +312 -0
  41. package/twin-assets/linear/seeds/harvested.json +331 -0
  42. package/twin-assets/linear/seeds/small-team.json +496 -0
  43. package/twin-assets/slack/fidelity.json +14 -0
  44. package/twin-assets/slack/seeds/busy-workspace.json +2174 -0
  45. package/twin-assets/slack/seeds/empty.json +127 -0
  46. package/twin-assets/slack/seeds/engineering-team.json +1698 -0
  47. package/twin-assets/slack/seeds/incident-active.json +1016 -0
  48. package/twin-assets/stripe/fidelity.json +22 -0
  49. package/twin-assets/stripe/seeds/empty.json +31 -0
  50. package/twin-assets/stripe/seeds/small-business.json +378 -0
  51. package/twin-assets/stripe/seeds/subscription-heavy.json +62 -0
  52. package/twin-assets/supabase/fidelity.json +13 -0
  53. package/twin-assets/supabase/seeds/ecommerce.sql +278 -0
  54. package/twin-assets/supabase/seeds/edge-cases.sql +94 -0
  55. package/twin-assets/supabase/seeds/empty.sql +2 -0
  56. package/twin-assets/supabase/seeds/small-project.sql +134 -0
@@ -0,0 +1,451 @@
1
+ {
2
+ "users": [
3
+ {
4
+ "id": 1,
5
+ "login": "acme",
6
+ "nodeId": "U_kgDOBacme1",
7
+ "avatarUrl": "https://avatars.githubusercontent.com/u/1?v=4",
8
+ "type": "Organization",
9
+ "name": "Acme Corp",
10
+ "email": "engineering@acme.com",
11
+ "bio": "Building the platform",
12
+ "company": "Acme Corp",
13
+ "location": "San Francisco, CA",
14
+ "htmlUrl": "https://github.com/acme",
15
+ "publicRepos": 12,
16
+ "followers": 340,
17
+ "following": 0,
18
+ "siteAdmin": false,
19
+ "createdAt": "2020-03-10T08:00:00Z",
20
+ "updatedAt": "2026-01-15T12:00:00Z"
21
+ }
22
+ ],
23
+ "repos": [
24
+ {
25
+ "id": 1,
26
+ "nodeId": "R_kgDOBplat1",
27
+ "name": "platform",
28
+ "fullName": "acme/platform",
29
+ "owner": "acme",
30
+ "private": false,
31
+ "description": "Acme Corp platform monorepo — APIs, services, and internal tooling",
32
+ "fork": false,
33
+ "htmlUrl": "https://github.com/acme/platform",
34
+ "cloneUrl": "https://github.com/acme/platform.git",
35
+ "sshUrl": "git@github.com:acme/platform.git",
36
+ "language": "TypeScript",
37
+ "forksCount": 24,
38
+ "stargazersCount": 158,
39
+ "watchersCount": 158,
40
+ "openIssuesCount": 15,
41
+ "defaultBranch": "main",
42
+ "topics": ["typescript", "platform", "monorepo"],
43
+ "hasIssues": true,
44
+ "hasProjects": true,
45
+ "hasWiki": true,
46
+ "hasPages": false,
47
+ "archived": false,
48
+ "disabled": false,
49
+ "visibility": "public",
50
+ "pushedAt": "2026-02-18T10:00:00Z",
51
+ "license": "MIT",
52
+ "allowMergeCommit": true,
53
+ "allowSquashMerge": true,
54
+ "allowRebaseMerge": true,
55
+ "allowAutoMerge": false,
56
+ "deleteBranchOnMerge": true,
57
+ "createdAt": "2023-06-01T09:00:00Z",
58
+ "updatedAt": "2026-02-18T10:00:00Z"
59
+ }
60
+ ],
61
+ "branches": [
62
+ {
63
+ "id": 1,
64
+ "repoId": 1,
65
+ "name": "main",
66
+ "commitSha": "a1f2e3d4c5b6a7f8e9d0c1b2a3f4e5d6c7b8a9f0",
67
+ "protected": true,
68
+ "createdAt": "2023-06-01T09:00:00Z",
69
+ "updatedAt": "2026-02-18T10:00:00Z"
70
+ }
71
+ ],
72
+ "commits": [
73
+ {
74
+ "id": 1,
75
+ "repoId": 1,
76
+ "sha": "a1f2e3d4c5b6a7f8e9d0c1b2a3f4e5d6c7b8a9f0",
77
+ "nodeId": "C_kwDOBcom01",
78
+ "message": "chore: update dependencies and fix CI pipeline",
79
+ "authorLogin": "acme",
80
+ "authorName": "Acme Corp",
81
+ "authorEmail": "engineering@acme.com",
82
+ "committerLogin": "acme",
83
+ "committerName": "Acme Corp",
84
+ "committerEmail": "engineering@acme.com",
85
+ "branchName": "main",
86
+ "parentShas": [],
87
+ "treeUrl": "https://api.github.com/repos/acme/platform/git/trees/a1f2e3d4c5b6a7f8e9d0c1b2a3f4e5d6c7b8a9f0",
88
+ "htmlUrl": "https://github.com/acme/platform/commit/a1f2e3d4c5b6a7f8e9d0c1b2a3f4e5d6c7b8a9f0",
89
+ "verified": false,
90
+ "createdAt": "2026-02-18T10:00:00Z",
91
+ "updatedAt": "2026-02-18T10:00:00Z"
92
+ }
93
+ ],
94
+ "labels": [
95
+ {
96
+ "id": 1, "repoId": 1, "nodeId": "LA_kwDOBlab01", "name": "bug", "description": "Something isn't working", "color": "d73a4a", "isDefault": true, "createdAt": "2023-06-01T09:00:00Z", "updatedAt": "2023-06-01T09:00:00Z"
97
+ },
98
+ {
99
+ "id": 2, "repoId": 1, "nodeId": "LA_kwDOBlab02", "name": "enhancement", "description": "New feature or request", "color": "a2eeef", "isDefault": true, "createdAt": "2023-06-01T09:00:00Z", "updatedAt": "2023-06-01T09:00:00Z"
100
+ },
101
+ {
102
+ "id": 3, "repoId": 1, "nodeId": "LA_kwDOBlab03", "name": "question", "description": "Further information is requested", "color": "d876e3", "isDefault": true, "createdAt": "2023-06-01T09:00:00Z", "updatedAt": "2023-06-01T09:00:00Z"
103
+ },
104
+ {
105
+ "id": 4, "repoId": 1, "nodeId": "LA_kwDOBlab04", "name": "priority:high", "description": "High priority", "color": "e11d48", "isDefault": false, "createdAt": "2023-06-01T09:00:00Z", "updatedAt": "2023-06-01T09:00:00Z"
106
+ },
107
+ {
108
+ "id": 5, "repoId": 1, "nodeId": "LA_kwDOBlab05", "name": "priority:medium", "description": "Medium priority", "color": "f59e0b", "isDefault": false, "createdAt": "2023-06-01T09:00:00Z", "updatedAt": "2023-06-01T09:00:00Z"
109
+ },
110
+ {
111
+ "id": 6, "repoId": 1, "nodeId": "LA_kwDOBlab06", "name": "priority:low", "description": "Low priority", "color": "0ea5e9", "isDefault": false, "createdAt": "2023-06-01T09:00:00Z", "updatedAt": "2023-06-01T09:00:00Z"
112
+ }
113
+ ],
114
+ "issues": [
115
+ {
116
+ "id": 1,
117
+ "repoId": 1,
118
+ "nodeId": "I_kwDOBissX1",
119
+ "number": 1,
120
+ "title": "Application crashes with unhandled TypeError on startup when config file is missing",
121
+ "body": "## Bug report\n\nThe application crashes immediately on startup if the `config.json` file is not present in the expected directory.\n\n## Steps to reproduce\n\n1. Delete or rename `config/config.json`\n2. Run `npm start`\n3. Application crashes with `TypeError: Cannot read properties of undefined (reading 'database')`\n\n## Expected behavior\n\nThe application should fall back to default configuration values or display a clear error message explaining that the config file is missing.\n\n## Stack trace\n\n```\nTypeError: Cannot read properties of undefined (reading 'database')\n at loadConfig (src/config/loader.ts:24:18)\n at main (src/index.ts:8:3)\n```\n\n## Environment\n\n- Node.js 20.11.0\n- OS: Ubuntu 22.04",
122
+ "state": "open",
123
+ "stateReason": null,
124
+ "locked": false,
125
+ "assignees": [],
126
+ "labels": [],
127
+ "milestone": null,
128
+ "authorLogin": "acme",
129
+ "closedAt": null,
130
+ "closedBy": null,
131
+ "htmlUrl": "https://github.com/acme/platform/issues/1",
132
+ "isPullRequest": false,
133
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
134
+ "createdAt": "2026-01-06T09:15:00Z",
135
+ "updatedAt": "2026-01-06T09:15:00Z"
136
+ },
137
+ {
138
+ "id": 2,
139
+ "repoId": 1,
140
+ "nodeId": "I_kwDOBissX2",
141
+ "number": 2,
142
+ "title": "Memory leak in WebSocket connection handler causes server to crash after 24 hours",
143
+ "body": "## Bug report\n\nThe WebSocket connection handler is leaking memory. After approximately 24 hours of continuous operation, the server runs out of memory and crashes with an OOM error.\n\n## Steps to reproduce\n\n1. Start the platform server\n2. Connect multiple WebSocket clients (50+)\n3. Send messages continuously for 24 hours\n4. Observe memory usage growing unbounded\n\n## Expected behavior\n\nMemory usage should remain stable regardless of uptime. Disconnected client resources should be properly cleaned up.\n\n## Observations\n\n- Heap dump shows thousands of unreferenced `ClientSession` objects\n- The `onClose` handler does not remove the client from the active sessions map\n- Memory grows at roughly 50MB/hour under moderate load",
144
+ "state": "open",
145
+ "stateReason": null,
146
+ "locked": false,
147
+ "assignees": [],
148
+ "labels": [],
149
+ "milestone": null,
150
+ "authorLogin": "acme",
151
+ "closedAt": null,
152
+ "closedBy": null,
153
+ "htmlUrl": "https://github.com/acme/platform/issues/2",
154
+ "isPullRequest": false,
155
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
156
+ "createdAt": "2026-01-08T14:30:00Z",
157
+ "updatedAt": "2026-01-10T11:00:00Z"
158
+ },
159
+ {
160
+ "id": 3,
161
+ "repoId": 1,
162
+ "nodeId": "I_kwDOBissX3",
163
+ "number": 3,
164
+ "title": "Error 500 when uploading files larger than 10MB through the REST API",
165
+ "body": "## Bug report\n\nUploading files larger than 10MB through the `/api/v1/files/upload` endpoint results in a 500 Internal Server Error. No meaningful error message is returned to the client.\n\n## Steps to reproduce\n\n1. Prepare a file larger than 10MB (e.g., a 15MB CSV)\n2. POST to `/api/v1/files/upload` with the file as multipart form data\n3. Server returns HTTP 500 with `{\"error\": \"Internal Server Error\"}`\n\n## Expected behavior\n\nEither the upload should succeed (if within configured limits) or return a 413 Payload Too Large with a clear message about the file size limit.\n\n## Notes\n\nSmaller files (under 10MB) upload successfully. The issue seems related to the body parser configuration or a missing size limit in the upload middleware.",
166
+ "state": "open",
167
+ "stateReason": null,
168
+ "locked": false,
169
+ "assignees": [],
170
+ "labels": [],
171
+ "milestone": null,
172
+ "authorLogin": "acme",
173
+ "closedAt": null,
174
+ "closedBy": null,
175
+ "htmlUrl": "https://github.com/acme/platform/issues/3",
176
+ "isPullRequest": false,
177
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
178
+ "createdAt": "2026-01-12T10:45:00Z",
179
+ "updatedAt": "2026-01-12T10:45:00Z"
180
+ },
181
+ {
182
+ "id": 4,
183
+ "repoId": 1,
184
+ "nodeId": "I_kwDOBissX4",
185
+ "number": 4,
186
+ "title": "Database connection pool exhaustion causes unexpected 503 errors under load",
187
+ "body": "## Bug report\n\nUnder moderate concurrent load (200+ requests/second), the database connection pool gets exhausted and the application starts returning 503 Service Unavailable errors.\n\n## Steps to reproduce\n\n1. Run the platform with default connection pool settings\n2. Use a load testing tool to send 200+ concurrent requests to any database-backed endpoint\n3. After ~30 seconds, responses start returning 503 errors\n4. Server logs show `Error: Cannot acquire connection from pool — all connections are in use`\n\n## Expected behavior\n\nThe application should queue requests when the pool is exhausted rather than immediately failing, or the default pool size should be increased.\n\n## Configuration\n\nCurrent pool settings: `min: 2, max: 10`. These are the framework defaults and too low for production workloads.",
188
+ "state": "open",
189
+ "stateReason": null,
190
+ "locked": false,
191
+ "assignees": [],
192
+ "labels": [],
193
+ "milestone": null,
194
+ "authorLogin": "acme",
195
+ "closedAt": null,
196
+ "closedBy": null,
197
+ "htmlUrl": "https://github.com/acme/platform/issues/4",
198
+ "isPullRequest": false,
199
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
200
+ "createdAt": "2026-01-15T08:20:00Z",
201
+ "updatedAt": "2026-01-17T16:00:00Z"
202
+ },
203
+ {
204
+ "id": 5,
205
+ "repoId": 1,
206
+ "nodeId": "I_kwDOBissX5",
207
+ "number": 5,
208
+ "title": "Race condition in job scheduler causes duplicate task execution",
209
+ "body": "## Bug report\n\nThe background job scheduler occasionally executes the same job twice simultaneously. This leads to duplicate data processing and, in some cases, data corruption.\n\n## Steps to reproduce\n\n1. Schedule a job with a 5-minute interval\n2. Under high CPU load, the previous job execution sometimes overlaps with the next scheduled run\n3. Both instances run to completion, processing the same data twice\n\n## Expected behavior\n\nThe scheduler should implement a locking mechanism to prevent concurrent execution of the same job. If a previous run is still in progress, the next scheduled run should be skipped or queued.\n\n## Impact\n\nThis has caused duplicate email sends and double-counted analytics events in production.",
210
+ "state": "open",
211
+ "stateReason": null,
212
+ "locked": false,
213
+ "assignees": [],
214
+ "labels": [],
215
+ "milestone": null,
216
+ "authorLogin": "acme",
217
+ "closedAt": null,
218
+ "closedBy": null,
219
+ "htmlUrl": "https://github.com/acme/platform/issues/5",
220
+ "isPullRequest": false,
221
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
222
+ "createdAt": "2026-01-18T11:00:00Z",
223
+ "updatedAt": "2026-01-20T09:30:00Z"
224
+ },
225
+ {
226
+ "id": 6,
227
+ "repoId": 1,
228
+ "nodeId": "I_kwDOBissX6",
229
+ "number": 6,
230
+ "title": "Authentication middleware returns cryptic error instead of 401 when JWT token is expired",
231
+ "body": "## Bug report\n\nWhen a user's JWT token expires, the authentication middleware returns a 500 error with the message `\"JsonWebTokenError: jwt expired\"` instead of a proper 401 Unauthorized response.\n\n## Steps to reproduce\n\n1. Log in and obtain a JWT token\n2. Wait for the token to expire (or manually set the clock forward)\n3. Make any authenticated API request\n4. Server returns 500 instead of 401\n\n## Expected behavior\n\nThe middleware should catch `TokenExpiredError`, return a 401 status code, and include a clear message like `\"Token expired. Please re-authenticate.\"` so clients can handle token refresh gracefully.\n\n## Impact\n\nClient applications cannot distinguish between a server error and an expired token, leading to poor user experience and broken automatic token refresh flows.",
232
+ "state": "open",
233
+ "stateReason": null,
234
+ "locked": false,
235
+ "assignees": [],
236
+ "labels": [],
237
+ "milestone": null,
238
+ "authorLogin": "acme",
239
+ "closedAt": null,
240
+ "closedBy": null,
241
+ "htmlUrl": "https://github.com/acme/platform/issues/6",
242
+ "isPullRequest": false,
243
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
244
+ "createdAt": "2026-01-22T15:45:00Z",
245
+ "updatedAt": "2026-01-22T15:45:00Z"
246
+ },
247
+ {
248
+ "id": 7,
249
+ "repoId": 1,
250
+ "nodeId": "I_kwDOBissX7",
251
+ "number": 7,
252
+ "title": "Add support for bulk import of records via CSV upload",
253
+ "body": "## Feature request\n\nWe need the ability to import large datasets into the platform via CSV file upload. Currently, records can only be created one at a time through the API or UI, which is impractical for onboarding new customers with thousands of existing records.\n\n## Proposed solution\n\n- Add a CSV upload endpoint at `/api/v1/import`\n- Support column mapping (CSV headers to platform fields)\n- Validate all rows before importing any (fail-fast on validation errors)\n- Provide a progress indicator for large imports\n- Return a summary report (rows imported, rows skipped, errors)\n\n## Use case\n\nCustomer onboarding — new enterprise customers frequently need to migrate 10,000+ records from their existing systems.",
254
+ "state": "open",
255
+ "stateReason": null,
256
+ "locked": false,
257
+ "assignees": [],
258
+ "labels": [],
259
+ "milestone": null,
260
+ "authorLogin": "acme",
261
+ "closedAt": null,
262
+ "closedBy": null,
263
+ "htmlUrl": "https://github.com/acme/platform/issues/7",
264
+ "isPullRequest": false,
265
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
266
+ "createdAt": "2026-01-24T09:00:00Z",
267
+ "updatedAt": "2026-01-24T09:00:00Z"
268
+ },
269
+ {
270
+ "id": 8,
271
+ "repoId": 1,
272
+ "nodeId": "I_kwDOBissX8",
273
+ "number": 8,
274
+ "title": "Implement webhook delivery system for real-time event notifications",
275
+ "body": "## Feature request\n\nWe need a webhook system that allows customers to subscribe to platform events and receive real-time HTTP POST notifications when those events occur.\n\n## Requirements\n\n- Customers can register webhook URLs for specific event types\n- Events include: `record.created`, `record.updated`, `record.deleted`, `job.completed`, `job.failed`\n- Webhook payloads should include the full event data and a signature for verification\n- Failed deliveries should be retried with exponential backoff (up to 5 attempts)\n- Provide a webhook delivery log in the dashboard\n\n## Motivation\n\nMultiple enterprise customers have asked for real-time notifications to integrate with their internal systems. Currently they have to poll our API, which is inefficient and adds unnecessary load.",
276
+ "state": "open",
277
+ "stateReason": null,
278
+ "locked": false,
279
+ "assignees": [],
280
+ "labels": [],
281
+ "milestone": null,
282
+ "authorLogin": "acme",
283
+ "closedAt": null,
284
+ "closedBy": null,
285
+ "htmlUrl": "https://github.com/acme/platform/issues/8",
286
+ "isPullRequest": false,
287
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
288
+ "createdAt": "2026-01-27T13:30:00Z",
289
+ "updatedAt": "2026-01-27T13:30:00Z"
290
+ },
291
+ {
292
+ "id": 9,
293
+ "repoId": 1,
294
+ "nodeId": "I_kwDOBissX9",
295
+ "number": 9,
296
+ "title": "Add role-based access control (RBAC) with custom permission sets",
297
+ "body": "## Feature request\n\nThe platform currently has a simple admin/user role system. We need fine-grained role-based access control that allows organizations to define custom roles with specific permission sets.\n\n## Proposed solution\n\n- Define permissions as resource:action pairs (e.g., `records:read`, `records:write`, `users:manage`)\n- Allow creation of custom roles that bundle permissions together\n- Support role assignment at the organization and project level\n- Include built-in roles: Owner, Admin, Editor, Viewer\n- Add permission checks to all API endpoints\n\n## Motivation\n\nEnterprise customers require granular access control for compliance and security. The current binary admin/user model is insufficient for teams with 50+ members working across multiple projects.",
298
+ "state": "open",
299
+ "stateReason": null,
300
+ "locked": false,
301
+ "assignees": [],
302
+ "labels": [],
303
+ "milestone": null,
304
+ "authorLogin": "acme",
305
+ "closedAt": null,
306
+ "closedBy": null,
307
+ "htmlUrl": "https://github.com/acme/platform/issues/9",
308
+ "isPullRequest": false,
309
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
310
+ "createdAt": "2026-01-30T10:15:00Z",
311
+ "updatedAt": "2026-01-30T10:15:00Z"
312
+ },
313
+ {
314
+ "id": 10,
315
+ "repoId": 1,
316
+ "nodeId": "I_kwDOBissXA",
317
+ "number": 10,
318
+ "title": "Add audit log for tracking all user actions and API calls",
319
+ "body": "## Feature request\n\nWe need a comprehensive audit log that records all significant actions taken by users and API clients on the platform.\n\n## Requirements\n\n- Log all CRUD operations on resources with before/after state\n- Log authentication events (login, logout, token refresh, failed attempts)\n- Log permission changes and role assignments\n- Each entry should include: timestamp, actor, action, resource, IP address, user agent\n- Provide a searchable audit log UI in the admin dashboard\n- Support exporting audit logs as CSV or JSON\n- Retain logs for at least 90 days (configurable per organization)\n\n## Motivation\n\nRequired for SOC 2 compliance and frequently requested by enterprise security teams during procurement reviews.",
320
+ "state": "open",
321
+ "stateReason": null,
322
+ "locked": false,
323
+ "assignees": [],
324
+ "labels": [],
325
+ "milestone": null,
326
+ "authorLogin": "acme",
327
+ "closedAt": null,
328
+ "closedBy": null,
329
+ "htmlUrl": "https://github.com/acme/platform/issues/10",
330
+ "isPullRequest": false,
331
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
332
+ "createdAt": "2026-02-02T08:00:00Z",
333
+ "updatedAt": "2026-02-02T08:00:00Z"
334
+ },
335
+ {
336
+ "id": 11,
337
+ "repoId": 1,
338
+ "nodeId": "I_kwDOBissXB",
339
+ "number": 11,
340
+ "title": "Implement dark mode and theming support for the dashboard UI",
341
+ "body": "## Feature request\n\nUsers have been requesting dark mode for the platform dashboard. We should implement a theming system that supports light mode, dark mode, and potentially custom brand themes for enterprise customers.\n\n## Proposed approach\n\n- Use CSS custom properties for all color values\n- Add a theme toggle in user preferences\n- Persist theme selection per user in their profile\n- Support system preference detection (`prefers-color-scheme`)\n- Ensure all charts, graphs, and data visualizations adapt to the active theme\n- Allow enterprise customers to set a default theme and upload custom brand colors\n\n## Priority\n\nThis is one of our most upvoted feature requests in the feedback portal (47 votes).",
342
+ "state": "open",
343
+ "stateReason": null,
344
+ "locked": false,
345
+ "assignees": [],
346
+ "labels": [],
347
+ "milestone": null,
348
+ "authorLogin": "acme",
349
+ "closedAt": null,
350
+ "closedBy": null,
351
+ "htmlUrl": "https://github.com/acme/platform/issues/11",
352
+ "isPullRequest": false,
353
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
354
+ "createdAt": "2026-02-05T14:20:00Z",
355
+ "updatedAt": "2026-02-05T14:20:00Z"
356
+ },
357
+ {
358
+ "id": 12,
359
+ "repoId": 1,
360
+ "nodeId": "I_kwDOBissXC",
361
+ "number": 12,
362
+ "title": "How do I configure SSO with our company's Okta instance?",
363
+ "body": "Hi team,\n\nWe're trying to set up SSO for our organization using Okta as our identity provider. I've looked through the docs but I can't find clear instructions on how to configure SAML-based SSO.\n\nSpecifically, I need to know:\n\n1. What is the ACS (Assertion Consumer Service) URL for the platform?\n2. What attribute mappings are required?\n3. Do we need to configure anything on the platform side, or just in Okta?\n4. Is there a way to test the SSO configuration before enabling it for all users?\n\nWe're on the Enterprise plan if that matters. Any help or documentation pointers would be appreciated.\n\nThanks!",
364
+ "state": "open",
365
+ "stateReason": null,
366
+ "locked": false,
367
+ "assignees": [],
368
+ "labels": [],
369
+ "milestone": null,
370
+ "authorLogin": "acme",
371
+ "closedAt": null,
372
+ "closedBy": null,
373
+ "htmlUrl": "https://github.com/acme/platform/issues/12",
374
+ "isPullRequest": false,
375
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
376
+ "createdAt": "2026-02-07T11:00:00Z",
377
+ "updatedAt": "2026-02-07T11:00:00Z"
378
+ },
379
+ {
380
+ "id": 13,
381
+ "repoId": 1,
382
+ "nodeId": "I_kwDOBissXD",
383
+ "number": 13,
384
+ "title": "What is the recommended way to handle database migrations in production?",
385
+ "body": "Hello,\n\nI'm deploying the platform to our production environment and I'm unsure about the best practices for running database migrations.\n\nQuestions:\n\n1. Should migrations be run as part of the deployment pipeline, or separately?\n2. Is there a way to run migrations without downtime?\n3. How do I roll back a migration if something goes wrong?\n4. Are there any migration scripts that require special attention (e.g., long-running ALTER TABLE statements)?\n5. What's the recommended approach for testing migrations against a production-like dataset before deploying?\n\nWe're using PostgreSQL 15 in production. Any guidance or documentation would be helpful.",
386
+ "state": "open",
387
+ "stateReason": null,
388
+ "locked": false,
389
+ "assignees": [],
390
+ "labels": [],
391
+ "milestone": null,
392
+ "authorLogin": "acme",
393
+ "closedAt": null,
394
+ "closedBy": null,
395
+ "htmlUrl": "https://github.com/acme/platform/issues/13",
396
+ "isPullRequest": false,
397
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
398
+ "createdAt": "2026-02-10T09:30:00Z",
399
+ "updatedAt": "2026-02-10T09:30:00Z"
400
+ },
401
+ {
402
+ "id": 14,
403
+ "repoId": 1,
404
+ "nodeId": "I_kwDOBissXE",
405
+ "number": 14,
406
+ "title": "How do I set up local development with Docker Compose?",
407
+ "body": "Hi,\n\nI'm a new contributor and I'm trying to get the platform running locally for development. The README mentions Docker Compose but the instructions seem outdated.\n\nI'm running into these issues:\n\n1. `docker-compose up` fails with an error about a missing `redis` service that's referenced in the compose file but not defined\n2. The `.env.example` file references environment variables that aren't documented anywhere\n3. After fixing the Redis issue manually, the API starts but can't connect to the database — is there a specific init script I need to run?\n\nCould someone provide updated step-by-step instructions for getting the full development environment running with Docker Compose? Or point me to the right documentation if it exists?\n\nThanks in advance!",
408
+ "state": "open",
409
+ "stateReason": null,
410
+ "locked": false,
411
+ "assignees": [],
412
+ "labels": [],
413
+ "milestone": null,
414
+ "authorLogin": "acme",
415
+ "closedAt": null,
416
+ "closedBy": null,
417
+ "htmlUrl": "https://github.com/acme/platform/issues/14",
418
+ "isPullRequest": false,
419
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
420
+ "createdAt": "2026-02-13T16:00:00Z",
421
+ "updatedAt": "2026-02-14T10:00:00Z"
422
+ },
423
+ {
424
+ "id": 15,
425
+ "repoId": 1,
426
+ "nodeId": "I_kwDOBissXF",
427
+ "number": 15,
428
+ "title": "Can someone explain how the rate limiting works and how to increase limits?",
429
+ "body": "Hello,\n\nWe're hitting rate limits on the API and I need to understand how the rate limiting system works so I can adjust it for our use case.\n\n1. What are the default rate limits per endpoint?\n2. Is rate limiting applied per user, per API key, or per IP address?\n3. How do I increase the limits for our organization? Is this a configuration change or does it require a plan upgrade?\n4. Are there any headers in the API response that indicate remaining quota (like `X-RateLimit-Remaining`)?\n5. Is there a way to exempt certain internal services from rate limiting?\n\nWe're using the API for an automated data sync that runs every 5 minutes and makes approximately 500 requests per run. Thanks!",
430
+ "state": "open",
431
+ "stateReason": null,
432
+ "locked": false,
433
+ "assignees": [],
434
+ "labels": [],
435
+ "milestone": null,
436
+ "authorLogin": "acme",
437
+ "closedAt": null,
438
+ "closedBy": null,
439
+ "htmlUrl": "https://github.com/acme/platform/issues/15",
440
+ "isPullRequest": false,
441
+ "reactions": { "totalCount": 0, "plusOne": 0, "minusOne": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 },
442
+ "createdAt": "2026-02-17T12:45:00Z",
443
+ "updatedAt": "2026-02-17T12:45:00Z"
444
+ }
445
+ ],
446
+ "pullRequests": [],
447
+ "comments": [],
448
+ "files": [],
449
+ "workflows": [],
450
+ "workflowRuns": []
451
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "twin": "google-workspace",
3
+ "api": "REST (Gmail, Calendar, Drive, Docs, Sheets)",
4
+ "version": "0.1.0",
5
+ "capabilities": [
6
+ { "name": "Gmail (read, search, send)", "supported": true },
7
+ { "name": "Calendar (events, attendees)", "supported": true },
8
+ { "name": "Drive (files, folders)", "supported": true },
9
+ { "name": "Docs (create, read)", "supported": true },
10
+ { "name": "Sheets (read, write cells)", "supported": true },
11
+ { "name": "Admin API", "supported": false }
12
+ ]
13
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "users": [
3
+ {
4
+ "id": 1,
5
+ "userId": "user-1",
6
+ "email": "testuser@example.com",
7
+ "displayName": "Test User",
8
+ "photoUrl": null,
9
+ "isAdmin": true,
10
+ "createdAt": "2024-01-01T00:00:00Z",
11
+ "updatedAt": "2024-01-01T00:00:00Z"
12
+ }
13
+ ],
14
+ "labels": [
15
+ { "id": 1, "labelId": "INBOX", "name": "INBOX", "type": "system", "messageListVisibility": "show", "labelListVisibility": "labelShow", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
16
+ { "id": 2, "labelId": "SENT", "name": "SENT", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelShow", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
17
+ { "id": 3, "labelId": "TRASH", "name": "TRASH", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelShow", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
18
+ { "id": 4, "labelId": "SPAM", "name": "SPAM", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelShow", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
19
+ { "id": 5, "labelId": "DRAFT", "name": "DRAFT", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelShow", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
20
+ { "id": 6, "labelId": "STARRED", "name": "STARRED", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelShow", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
21
+ { "id": 7, "labelId": "UNREAD", "name": "UNREAD", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelHide", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
22
+ { "id": 8, "labelId": "IMPORTANT", "name": "IMPORTANT", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelShow", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
23
+ { "id": 9, "labelId": "CATEGORY_PERSONAL", "name": "CATEGORY_PERSONAL", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelHide", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
24
+ { "id": 10, "labelId": "CATEGORY_SOCIAL", "name": "CATEGORY_SOCIAL", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelHide", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
25
+ { "id": 11, "labelId": "CATEGORY_PROMOTIONS", "name": "CATEGORY_PROMOTIONS", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelHide", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
26
+ { "id": 12, "labelId": "CATEGORY_UPDATES", "name": "CATEGORY_UPDATES", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelHide", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" },
27
+ { "id": 13, "labelId": "CATEGORY_FORUMS", "name": "CATEGORY_FORUMS", "type": "system", "messageListVisibility": "hide", "labelListVisibility": "labelHide", "messagesTotal": 0, "messagesUnread": 0, "color": null, "createdAt": "2024-01-01T00:00:00Z", "updatedAt": "2024-01-01T00:00:00Z" }
28
+ ],
29
+ "emails": [],
30
+ "emailAttachments": [],
31
+ "calendars": [
32
+ {
33
+ "id": 1,
34
+ "calendarId": "testuser@example.com",
35
+ "summary": "Test User",
36
+ "description": null,
37
+ "timeZone": "America/New_York",
38
+ "isPrimary": true,
39
+ "accessRole": "owner",
40
+ "backgroundColor": "#4285f4",
41
+ "foregroundColor": "#ffffff",
42
+ "selected": true,
43
+ "createdAt": "2024-01-01T00:00:00Z",
44
+ "updatedAt": "2024-01-01T00:00:00Z"
45
+ }
46
+ ],
47
+ "events": [],
48
+ "eventAttendees": [],
49
+ "driveFiles": [],
50
+ "drivePermissions": [],
51
+ "docs": [],
52
+ "spreadsheets": [],
53
+ "sheets": []
54
+ }