@ginkoai/cli 2.2.1 → 2.4.0
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/dist/commands/charter.d.ts.map +1 -1
- package/dist/commands/charter.js +5 -80
- package/dist/commands/charter.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +100 -36
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +4 -9
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/epic/index.js +7 -7
- package/dist/commands/epic/index.js.map +1 -1
- package/dist/commands/epic.d.ts +2 -2
- package/dist/commands/epic.d.ts.map +1 -1
- package/dist/commands/epic.js +7 -276
- package/dist/commands/epic.js.map +1 -1
- package/dist/commands/graph/api-client.d.ts +85 -99
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/graph/api-client.js +27 -56
- package/dist/commands/graph/api-client.js.map +1 -1
- package/dist/commands/graph/cleanup.d.ts +23 -0
- package/dist/commands/graph/cleanup.d.ts.map +1 -0
- package/dist/commands/graph/cleanup.js +241 -0
- package/dist/commands/graph/cleanup.js.map +1 -0
- package/dist/commands/graph/index.d.ts.map +1 -1
- package/dist/commands/graph/index.js +13 -0
- package/dist/commands/graph/index.js.map +1 -1
- package/dist/commands/graph/init.d.ts.map +1 -1
- package/dist/commands/graph/init.js +2 -10
- package/dist/commands/graph/init.js.map +1 -1
- package/dist/commands/graph/load.d.ts +10 -15
- package/dist/commands/graph/load.d.ts.map +1 -1
- package/dist/commands/graph/load.js +13 -280
- package/dist/commands/graph/load.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +19 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +16 -0
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/project/create.d.ts.map +1 -1
- package/dist/commands/project/create.js +3 -0
- package/dist/commands/project/create.js.map +1 -1
- package/dist/commands/push/push-command.d.ts.map +1 -1
- package/dist/commands/push/push-command.js +83 -3
- package/dist/commands/push/push-command.js.map +1 -1
- package/dist/commands/sprint/create.js +1 -1
- package/dist/commands/sprint/create.js.map +1 -1
- package/dist/commands/start/start-reflection.d.ts +8 -0
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +22 -0
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/sync/sync-command.d.ts.map +1 -1
- package/dist/commands/sync/sync-command.js +12 -4
- package/dist/commands/sync/sync-command.js.map +1 -1
- package/dist/commands/task/status.d.ts.map +1 -1
- package/dist/commands/task/status.js +38 -4
- package/dist/commands/task/status.js.map +1 -1
- package/dist/lib/sync-state.d.ts +7 -0
- package/dist/lib/sync-state.d.ts.map +1 -1
- package/dist/lib/sync-state.js +11 -0
- package/dist/lib/sync-state.js.map +1 -1
- package/dist/lib/task-parser.d.ts.map +1 -1
- package/dist/lib/task-parser.js +33 -2
- package/dist/lib/task-parser.js.map +1 -1
- package/dist/lib/write-dispatcher/adapters/graph-adapter.d.ts +14 -5
- package/dist/lib/write-dispatcher/adapters/graph-adapter.d.ts.map +1 -1
- package/dist/lib/write-dispatcher/adapters/graph-adapter.js +43 -8
- package/dist/lib/write-dispatcher/adapters/graph-adapter.js.map +1 -1
- package/dist/templates/epic-template.md +22 -20
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +19 -5
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/identity.d.ts +40 -0
- package/dist/utils/identity.d.ts.map +1 -0
- package/dist/utils/identity.js +92 -0
- package/dist/utils/identity.js.map +1 -0
- package/package.json +1 -1
|
@@ -17,14 +17,14 @@
|
|
|
17
17
|
*
|
|
18
18
|
* Environment Variables:
|
|
19
19
|
* - GINKO_GRAPH_ENABLED: 'true' to enable graph writes
|
|
20
|
-
* - GINKO_GRAPH_API_URL: Graph API endpoint (default: https://
|
|
20
|
+
* - GINKO_GRAPH_API_URL: Graph API endpoint (default: https://app.ginkoai.com)
|
|
21
21
|
* - GINKO_GRAPH_TOKEN: Bearer token for authentication
|
|
22
22
|
* - GINKO_GRAPH_ID: Graph ID for user's namespace
|
|
23
23
|
*
|
|
24
24
|
* Usage:
|
|
25
25
|
* ```typescript
|
|
26
26
|
* const adapter = new GraphAdapter({
|
|
27
|
-
* apiUrl: process.env.GINKO_GRAPH_API_URL || 'https://
|
|
27
|
+
* apiUrl: process.env.GINKO_GRAPH_API_URL || 'https://app.ginkoai.com',
|
|
28
28
|
* bearerToken: process.env.GINKO_GRAPH_TOKEN || '',
|
|
29
29
|
* graphId: process.env.GINKO_GRAPH_ID || ''
|
|
30
30
|
* });
|
|
@@ -39,20 +39,34 @@ export class GraphAdapter {
|
|
|
39
39
|
this.config = {
|
|
40
40
|
apiUrl: config.apiUrl,
|
|
41
41
|
bearerToken: config.bearerToken,
|
|
42
|
+
tokenResolver: config.tokenResolver,
|
|
42
43
|
graphId: config.graphId,
|
|
43
44
|
timeout: config.timeout || 10000,
|
|
44
45
|
};
|
|
45
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the bearer token at call time.
|
|
49
|
+
* Prefers tokenResolver (lazy) over static bearerToken.
|
|
50
|
+
*/
|
|
51
|
+
async resolveToken() {
|
|
52
|
+
if (this.config.tokenResolver) {
|
|
53
|
+
const token = await this.config.tokenResolver();
|
|
54
|
+
if (token)
|
|
55
|
+
return token;
|
|
56
|
+
}
|
|
57
|
+
return this.config.bearerToken || '';
|
|
58
|
+
}
|
|
46
59
|
/**
|
|
47
60
|
* Check if adapter is enabled.
|
|
48
|
-
* Enabled when config has
|
|
61
|
+
* Enabled when config has a token source (static or resolver) + graphId.
|
|
49
62
|
* GINKO_GRAPH_ENABLED=false can explicitly disable (opt-out override).
|
|
50
63
|
*/
|
|
51
64
|
enabled() {
|
|
52
65
|
if (process.env.GINKO_GRAPH_ENABLED === 'false') {
|
|
53
66
|
return false;
|
|
54
67
|
}
|
|
55
|
-
|
|
68
|
+
const hasTokenSource = !!this.config.bearerToken || !!this.config.tokenResolver;
|
|
69
|
+
return hasTokenSource && !!this.config.graphId;
|
|
56
70
|
}
|
|
57
71
|
/**
|
|
58
72
|
* Write knowledge document to graph via REST API
|
|
@@ -77,10 +91,12 @@ export class GraphAdapter {
|
|
|
77
91
|
}
|
|
78
92
|
}
|
|
79
93
|
/**
|
|
80
|
-
* Create node in graph via REST API
|
|
94
|
+
* Create node in graph via REST API.
|
|
95
|
+
* Uses lazy token resolution and retries once on 401/403 with a fresh token.
|
|
81
96
|
*/
|
|
82
|
-
async createNode(label, data) {
|
|
97
|
+
async createNode(label, data, isRetry = false) {
|
|
83
98
|
const url = `${this.config.apiUrl}/api/v1/graph/nodes`;
|
|
99
|
+
const bearerToken = await this.resolveToken();
|
|
84
100
|
const payload = {
|
|
85
101
|
graphId: this.config.graphId,
|
|
86
102
|
label,
|
|
@@ -99,7 +115,7 @@ export class GraphAdapter {
|
|
|
99
115
|
method: 'POST',
|
|
100
116
|
headers: {
|
|
101
117
|
'Content-Type': 'application/json',
|
|
102
|
-
'Authorization': `Bearer ${
|
|
118
|
+
'Authorization': `Bearer ${bearerToken}`,
|
|
103
119
|
},
|
|
104
120
|
body: JSON.stringify(payload),
|
|
105
121
|
signal: controller.signal,
|
|
@@ -108,6 +124,10 @@ export class GraphAdapter {
|
|
|
108
124
|
clearTimeout(timeoutId);
|
|
109
125
|
if (!response.ok) {
|
|
110
126
|
const errorBody = await response.text().catch(() => 'Unknown error');
|
|
127
|
+
// Retry once on 401/403 with a fresh token (token may have been refreshed on disk)
|
|
128
|
+
if ((response.status === 401 || response.status === 403) && !isRetry) {
|
|
129
|
+
return this.createNode(label, data, true);
|
|
130
|
+
}
|
|
111
131
|
throw new Error(`HTTP ${response.status}: ${errorBody}`);
|
|
112
132
|
}
|
|
113
133
|
const result = await response.json();
|
|
@@ -193,10 +213,24 @@ export async function createGraphAdapterFromEnv() {
|
|
|
193
213
|
// Config not available - continue with env vars only
|
|
194
214
|
}
|
|
195
215
|
}
|
|
216
|
+
// Use lazy token resolver instead of loading token once at creation time.
|
|
217
|
+
// This ensures the adapter always uses the freshest token from disk,
|
|
218
|
+
// matching the pattern that works in GraphApiClient.requireAuth().
|
|
219
|
+
let tokenResolver;
|
|
196
220
|
if (!bearerToken) {
|
|
197
221
|
try {
|
|
198
222
|
const { getAccessToken } = await import('../../../utils/auth-storage.js');
|
|
199
|
-
|
|
223
|
+
// Try to load once to validate auth is available
|
|
224
|
+
const initialToken = await getAccessToken();
|
|
225
|
+
if (initialToken) {
|
|
226
|
+
// Set up lazy resolver for future calls
|
|
227
|
+
tokenResolver = async () => {
|
|
228
|
+
const { getAccessToken: getToken } = await import('../../../utils/auth-storage.js');
|
|
229
|
+
return getToken();
|
|
230
|
+
};
|
|
231
|
+
// Also set static token for enabled() check
|
|
232
|
+
bearerToken = initialToken;
|
|
233
|
+
}
|
|
200
234
|
}
|
|
201
235
|
catch {
|
|
202
236
|
// Auth not available - continue without token
|
|
@@ -208,6 +242,7 @@ export async function createGraphAdapterFromEnv() {
|
|
|
208
242
|
return new GraphAdapter({
|
|
209
243
|
apiUrl,
|
|
210
244
|
bearerToken,
|
|
245
|
+
tokenResolver,
|
|
211
246
|
graphId,
|
|
212
247
|
timeout: parseInt(process.env.GINKO_GRAPH_TIMEOUT || '10000', 10),
|
|
213
248
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-adapter.js","sourceRoot":"","sources":["../../../../src/lib/write-dispatcher/adapters/graph-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"graph-adapter.js","sourceRoot":"","sources":["../../../../src/lib/write-dispatcher/adapters/graph-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -93,19 +93,21 @@
|
|
|
93
93
|
**Ask:** "For each sprint, what are the specific tasks? Let's estimate effort."
|
|
94
94
|
|
|
95
95
|
**For each task, capture:**
|
|
96
|
-
- Task ID and title
|
|
96
|
+
- Task ID and title (MUST use canonical format: `eNNN_sNN_tNN`)
|
|
97
97
|
- Effort estimate (hours or t-shirt size)
|
|
98
98
|
- Priority (HIGH/MEDIUM/LOW)
|
|
99
99
|
- Key files to modify
|
|
100
100
|
- Related ADRs/patterns/gotchas
|
|
101
101
|
|
|
102
|
-
**
|
|
103
|
-
|
|
102
|
+
**CRITICAL: Task IDs must be globally unique.** Use the format `eNNN_sNN_tNN` where NNN is the epic number, NN is the sprint number, and NN is the task number. Do NOT use `TASK-1`, `TASK-2` etc. — those collide across sprints.
|
|
103
|
+
|
|
104
|
+
**Example (for EPIC-005, Sprint 1):**
|
|
105
|
+
> **e005_s01_t01: Design Graph Schema (4h)**
|
|
104
106
|
> Priority: HIGH
|
|
105
107
|
> Files: src/graph/schema/patterns.cypher
|
|
106
108
|
> Follow: ADR-002
|
|
107
109
|
>
|
|
108
|
-
> **
|
|
110
|
+
> **e005_s01_t02: Create Pattern API (8h)**
|
|
109
111
|
> Priority: HIGH
|
|
110
112
|
> Files: dashboard/src/app/api/v1/task/[id]/patterns/route.ts
|
|
111
113
|
> Apply: retry-pattern
|
|
@@ -245,14 +247,18 @@ updated: YYYY-MM-DD
|
|
|
245
247
|
- Participants: [user email], Claude
|
|
246
248
|
```
|
|
247
249
|
|
|
248
|
-
### Sprint Files: `docs/sprints/SPRINT-YYYY-MM-
|
|
250
|
+
### Sprint Files: `docs/sprints/SPRINT-YYYY-MM-eNNN-sNN-[title].md`
|
|
251
|
+
|
|
252
|
+
**IMPORTANT: Sprint filenames MUST include the canonical epic and sprint IDs.**
|
|
253
|
+
Example: `SPRINT-2026-02-e005-s01-core-infrastructure.md`
|
|
249
254
|
|
|
250
255
|
```markdown
|
|
251
|
-
# SPRINT: [Epic Name] Sprint [N] - [Sprint Title]
|
|
256
|
+
# SPRINT: [Epic Name] Sprint [N] - [Sprint Title] (EPIC-NNN Sprint N)
|
|
252
257
|
|
|
253
258
|
## Sprint Overview
|
|
254
259
|
|
|
255
260
|
**Sprint Goal**: [What this sprint achieves]
|
|
261
|
+
**ID:** eNNN_sNN
|
|
256
262
|
**Duration**: [X weeks] (YYYY-MM-DD to YYYY-MM-DD)
|
|
257
263
|
**Type**: [Infrastructure|Feature|Polish] sprint
|
|
258
264
|
**Progress:** 0% (0/N tasks complete)
|
|
@@ -265,8 +271,9 @@ updated: YYYY-MM-DD
|
|
|
265
271
|
|
|
266
272
|
## Sprint Tasks
|
|
267
273
|
|
|
268
|
-
###
|
|
274
|
+
### eNNN_sNN_t01: [Task Title] ([Effort])
|
|
269
275
|
**Priority:** HIGH
|
|
276
|
+
**Status:** [ ]
|
|
270
277
|
|
|
271
278
|
**Goal:** [What this task achieves]
|
|
272
279
|
|
|
@@ -282,8 +289,9 @@ Avoid: [gotcha-name]
|
|
|
282
289
|
|
|
283
290
|
---
|
|
284
291
|
|
|
285
|
-
###
|
|
292
|
+
### eNNN_sNN_t02: [Task Title] ([Effort])
|
|
286
293
|
**Priority:** MEDIUM
|
|
294
|
+
**Status:** [ ]
|
|
287
295
|
|
|
288
296
|
...
|
|
289
297
|
|
|
@@ -309,24 +317,18 @@ Avoid: [gotcha-name]
|
|
|
309
317
|
After creating the epic and sprint files, **you must sync them to the graph** so they're available for team collaboration and tracking:
|
|
310
318
|
|
|
311
319
|
```bash
|
|
312
|
-
ginko epic
|
|
320
|
+
ginko push epic
|
|
313
321
|
```
|
|
314
322
|
|
|
315
323
|
This will:
|
|
316
|
-
-
|
|
317
|
-
-
|
|
318
|
-
- Create
|
|
319
|
-
- Establish relationships:
|
|
320
|
-
- `(Epic)-[:CONTAINS]->(Sprint)`
|
|
321
|
-
- `(Sprint)-[:CONTAINS]->(Task)`
|
|
322
|
-
- `(Task)-[:MUST_FOLLOW]->(ADR)`
|
|
323
|
-
- `(Task)-[:APPLIES_PATTERN]->(Pattern)`
|
|
324
|
-
- `(Task)-[:AVOID_GOTCHA]->(Gotcha)`
|
|
324
|
+
- Upload Epic and Sprint documents to the graph
|
|
325
|
+
- Parse tasks from sprint files and create Task nodes
|
|
326
|
+
- Create BELONGS_TO relationships (Task→Sprint→Epic)
|
|
325
327
|
|
|
326
328
|
**Complete workflow:**
|
|
327
329
|
1. Create `docs/epics/EPIC-XXX-name.md` with epic content
|
|
328
|
-
2. Create `docs/sprints/SPRINT
|
|
329
|
-
3. Run `ginko epic
|
|
330
|
+
2. Create `docs/sprints/SPRINT-YYYY-MM-eNNN-sNN-title.md` files for each sprint
|
|
331
|
+
3. Run `ginko push epic` to sync everything to graph
|
|
330
332
|
4. Confirm sync success message
|
|
331
333
|
|
|
332
334
|
---
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAwB,MAAM,oBAAoB,CAAC;AAmBpF;;;;;;GAMG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAwE9D;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAuD5D;
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAwB,MAAM,oBAAoB,CAAC;AAmBpF;;;;;;GAMG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAwE9D;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAuD5D;AAsDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa9E;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAanE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC,CAoCD;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAetD"}
|
|
@@ -138,14 +138,28 @@ export async function loadLocalConfig() {
|
|
|
138
138
|
* @returns LocalConfig object
|
|
139
139
|
*/
|
|
140
140
|
async function createLocalConfig(projectRoot) {
|
|
141
|
-
//
|
|
141
|
+
// Priority: (1) auth email from ~/.ginko/auth.json, (2) git config user.email, (3) default
|
|
142
142
|
let userEmail = 'user@example.com';
|
|
143
|
+
// Try authenticated email first (ensures new projects default to correct identity)
|
|
143
144
|
try {
|
|
144
|
-
const {
|
|
145
|
-
|
|
145
|
+
const { loadAuthSession } = await import('./auth-storage.js');
|
|
146
|
+
const session = await loadAuthSession();
|
|
147
|
+
if (session?.user?.email) {
|
|
148
|
+
userEmail = session.user.email;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Auth not available - fall through to git
|
|
146
153
|
}
|
|
147
|
-
|
|
148
|
-
|
|
154
|
+
// Fall back to git config if auth didn't provide an email
|
|
155
|
+
if (userEmail === 'user@example.com') {
|
|
156
|
+
try {
|
|
157
|
+
const { execSync } = await import('child_process');
|
|
158
|
+
userEmail = execSync('git config user.email', { encoding: 'utf8' }).trim();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Git not configured, use default
|
|
162
|
+
}
|
|
149
163
|
}
|
|
150
164
|
const userSlug = userEmail.replace('@', '-at-').replace(/\./g, '-');
|
|
151
165
|
const localConfig = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAA4B,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;GAGG;AACH,IAAI,WAAW,GAKX,EAAE,CAAC;AAEP;;GAEG;AACH,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,cAAc;IACd,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC;QAC/C,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;YACpB,OAAO,WAAW,CAAC,WAAW,CAAC;QACjC,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,IAAI,WAAW,GAAG,MAAM,aAAa,EAAE,CAAC;IAExC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,uEAAuE;QACvE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE1D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACvC,WAAW,GAAG,UAAU,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAE3D,yBAAyB;IACzB,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAEhD,4BAA4B;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;YACJ,CAAC;YAED,mBAAmB;YACnB,WAAW,CAAC,WAAW,GAAG,MAAM,CAAC;YACjC,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC;YACtC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEnC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAC3E,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,OAAO,CAAC,IAAI,CACV,8DAA8D;QAC9D,iEAAiE,CAClE,CAAC;IAEF,sDAAsD;IACtD,MAAM,aAAa,GAAG,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAClD,aAAa,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAExD,2BAA2B;IAC3B,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;IACxC,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC;IACtC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEnC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,cAAc;IACd,IAAI,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC;QAC/C,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;YACpB,OAAO,WAAW,CAAC,WAAW,CAAC;QACjC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,IAAI,MAAM,aAAa,EAAE,CAAC;IAErE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEvE,yBAAyB;IACzB,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAElD,qBAAqB;YACrB,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACjE,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;YACJ,CAAC;YAED,mBAAmB;YACnB,WAAW,CAAC,WAAW,GAAG,MAAM,CAAC;YACjC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEnC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAC3E,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sCAAsC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC/F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAEzD,uBAAuB;IACvB,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC;IACtC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEnC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IAClD,2FAA2F;IAC3F,IAAI,SAAS,GAAG,kBAAkB,CAAC;IAEnC,mFAAmF;IACnF,IAAI,CAAC;QACH,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;QACxC,IAAI,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzB,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;IAED,0DAA0D;IAC1D,IAAI,SAAS,KAAK,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YACnD,SAAS,GAAG,QAAQ,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7E,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEpE,MAAM,WAAW,GAAgB;QAC/B,WAAW;QACX,SAAS;QACT,QAAQ;QACR,QAAQ,EAAE,aAAa;KACxB,CAAC;IAEF,iCAAiC;IACjC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErD,mBAAmB;IACnB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;IAEhE,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,YAAoB;IAC3D,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrD,eAAe,EAAE;QACjB,iBAAiB,EAAE;KACpB,CAAC,CAAC;IAEH,gDAAgD;IAChD,IAAI,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;IAED,qEAAqE;IACrE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrD,eAAe,EAAE;QACjB,iBAAiB,EAAE;KACpB,CAAC,CAAC;IAEH,MAAM,aAAa,GAA2B,EAAE,CAAC;IAEjD,KAAK,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACtE,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,WAAW,GAAG,EAAE,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IAKzC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,6BAA6B;QAC7B,MAAM,aAAa,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEhD,6BAA6B;QAC7B,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAE9C,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YACpC,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAC/B,WAAW,CAAC,WAAW,EACvB,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAC7B,CAAC;gBAEF,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;oBACzC,QAAQ,CAAC,IAAI,CACX,SAAS,OAAO,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB;wBACtE,mDAAmD,CACpD,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAC,WAAW,CAAC;IACjC,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,aAAa,EAAE,CAAC;IAE1C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC;IACtC,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-02-02
|
|
5
|
+
* @tags: [identity, auth, attribution, BUG-021]
|
|
6
|
+
* @related: [auth-storage.ts, config-loader.ts, config.ts]
|
|
7
|
+
* @priority: critical
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [fs-extra, chalk]
|
|
10
|
+
*/
|
|
11
|
+
import { type AuthSession } from './auth-storage.js';
|
|
12
|
+
/**
|
|
13
|
+
* Confirm the user is authenticated and display who they're logged in as.
|
|
14
|
+
* Used by commands that create or join projects (init, create, join).
|
|
15
|
+
*
|
|
16
|
+
* @returns The authenticated session, or exits the process if not authenticated.
|
|
17
|
+
*/
|
|
18
|
+
export declare function confirmAuthIdentity(commandName: string): Promise<AuthSession>;
|
|
19
|
+
/**
|
|
20
|
+
* Get the authenticated identity if available, without exiting.
|
|
21
|
+
* Returns the auth session if authenticated, null otherwise.
|
|
22
|
+
*
|
|
23
|
+
* Used by commands like `ginko init` that prefer auth identity
|
|
24
|
+
* but can fall back to git config with a warning.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAuthIdentity(): Promise<AuthSession | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Sync .ginko/local.json identity to match the authenticated account.
|
|
29
|
+
*
|
|
30
|
+
* Called on `ginko start` (auto-fix) and `ginko login` (proactive sync).
|
|
31
|
+
* If local.json doesn't exist or the project isn't initialized, this is a no-op.
|
|
32
|
+
*
|
|
33
|
+
* @returns true if local.json was updated, false if already in sync or no local.json
|
|
34
|
+
*/
|
|
35
|
+
export declare function syncLocalIdentity(ginkoDir: string): Promise<{
|
|
36
|
+
updated: boolean;
|
|
37
|
+
oldEmail?: string;
|
|
38
|
+
newEmail?: string;
|
|
39
|
+
}>;
|
|
40
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/utils/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEtE;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAcnF;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAQnE;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgC7H"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-02-02
|
|
5
|
+
* @tags: [identity, auth, attribution, BUG-021]
|
|
6
|
+
* @related: [auth-storage.ts, config-loader.ts, config.ts]
|
|
7
|
+
* @priority: critical
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [fs-extra, chalk]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Identity Utilities (BUG-021)
|
|
13
|
+
*
|
|
14
|
+
* Ginko identity is tied to GitHub auth. Within a project, the git identity
|
|
15
|
+
* and ginko identity must agree to preserve traceability. The ginko
|
|
16
|
+
* authenticated account is authoritative.
|
|
17
|
+
*
|
|
18
|
+
* - ~/.ginko/auth.json → authentication + authoritative identity
|
|
19
|
+
* - .ginko/local.json → project-local attribution (must match auth)
|
|
20
|
+
*
|
|
21
|
+
* A user may use a different account for another project, but within any
|
|
22
|
+
* single project the identities must agree.
|
|
23
|
+
*/
|
|
24
|
+
import fs from 'fs-extra';
|
|
25
|
+
import path from 'path';
|
|
26
|
+
import chalk from 'chalk';
|
|
27
|
+
import { loadAuthSession } from './auth-storage.js';
|
|
28
|
+
/**
|
|
29
|
+
* Confirm the user is authenticated and display who they're logged in as.
|
|
30
|
+
* Used by commands that create or join projects (init, create, join).
|
|
31
|
+
*
|
|
32
|
+
* @returns The authenticated session, or exits the process if not authenticated.
|
|
33
|
+
*/
|
|
34
|
+
export async function confirmAuthIdentity(commandName) {
|
|
35
|
+
const session = await loadAuthSession();
|
|
36
|
+
if (!session?.user?.email) {
|
|
37
|
+
console.log(chalk.red('\n✗ Authentication required'));
|
|
38
|
+
console.log(chalk.dim(` You must be logged in to run \`ginko ${commandName}\``));
|
|
39
|
+
console.log(chalk.dim(' Run `ginko login` to authenticate with GitHub\n'));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const displayName = session.user.full_name || session.user.github_username || session.user.email;
|
|
43
|
+
console.log(chalk.dim(` Authenticated as: ${displayName} (${session.user.email})`));
|
|
44
|
+
return session;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get the authenticated identity if available, without exiting.
|
|
48
|
+
* Returns the auth session if authenticated, null otherwise.
|
|
49
|
+
*
|
|
50
|
+
* Used by commands like `ginko init` that prefer auth identity
|
|
51
|
+
* but can fall back to git config with a warning.
|
|
52
|
+
*/
|
|
53
|
+
export async function getAuthIdentity() {
|
|
54
|
+
const session = await loadAuthSession();
|
|
55
|
+
if (!session?.user?.email) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return session;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Sync .ginko/local.json identity to match the authenticated account.
|
|
62
|
+
*
|
|
63
|
+
* Called on `ginko start` (auto-fix) and `ginko login` (proactive sync).
|
|
64
|
+
* If local.json doesn't exist or the project isn't initialized, this is a no-op.
|
|
65
|
+
*
|
|
66
|
+
* @returns true if local.json was updated, false if already in sync or no local.json
|
|
67
|
+
*/
|
|
68
|
+
export async function syncLocalIdentity(ginkoDir) {
|
|
69
|
+
const localFile = path.join(ginkoDir, 'local.json');
|
|
70
|
+
if (!await fs.pathExists(localFile)) {
|
|
71
|
+
return { updated: false };
|
|
72
|
+
}
|
|
73
|
+
const session = await loadAuthSession();
|
|
74
|
+
if (!session?.user?.email) {
|
|
75
|
+
return { updated: false };
|
|
76
|
+
}
|
|
77
|
+
const localConfig = await fs.readJson(localFile);
|
|
78
|
+
const localEmail = localConfig.userEmail;
|
|
79
|
+
const authEmail = session.user.email;
|
|
80
|
+
if (localEmail && localEmail.toLowerCase() === authEmail.toLowerCase()) {
|
|
81
|
+
return { updated: false };
|
|
82
|
+
}
|
|
83
|
+
const oldEmail = localEmail;
|
|
84
|
+
const newSlug = authEmail.replace('@', '-at-').replace(/\./g, '-');
|
|
85
|
+
localConfig.userEmail = authEmail;
|
|
86
|
+
localConfig.userSlug = newSlug;
|
|
87
|
+
// Clean up the suppress flag — it's no longer relevant
|
|
88
|
+
delete localConfig.suppressIdentityWarning;
|
|
89
|
+
await fs.writeJson(localFile, localConfig, { spaces: 2 });
|
|
90
|
+
return { updated: true, oldEmail, newEmail: authEmail };
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/utils/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;IAExC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,WAAW,IAAI,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAErF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;IAExC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEpD,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;IAErC,IAAI,UAAU,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC;IAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEnE,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC;IAClC,WAAW,CAAC,QAAQ,GAAG,OAAO,CAAC;IAE/B,uDAAuD;IACvD,OAAO,WAAW,CAAC,uBAAuB,CAAC;IAE3C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAE1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC1D,CAAC"}
|
package/package.json
CHANGED