@ginkoai/cli 2.5.1 → 2.6.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/README.md +1 -1
- package/dist/commands/graph/api-client.d.ts +1 -1
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/handoff.d.ts +1 -0
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +55 -9
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/health.js +1 -0
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +42 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pull/pull-command.d.ts.map +1 -1
- package/dist/commands/pull/pull-command.js +10 -0
- package/dist/commands/pull/pull-command.js.map +1 -1
- package/dist/commands/push/push-command.d.ts.map +1 -1
- package/dist/commands/push/push-command.js +10 -0
- package/dist/commands/push/push-command.js.map +1 -1
- package/dist/commands/research/index.d.ts +24 -0
- package/dist/commands/research/index.d.ts.map +1 -0
- package/dist/commands/research/index.js +73 -0
- package/dist/commands/research/index.js.map +1 -0
- package/dist/commands/research.d.ts +26 -0
- package/dist/commands/research.d.ts.map +1 -0
- package/dist/commands/research.js +180 -0
- package/dist/commands/research.js.map +1 -0
- package/dist/commands/sprint/index.d.ts.map +1 -1
- package/dist/commands/sprint/index.js +15 -0
- package/dist/commands/sprint/index.js.map +1 -1
- package/dist/commands/sprint/plan-check.d.ts +16 -0
- package/dist/commands/sprint/plan-check.d.ts.map +1 -0
- package/dist/commands/sprint/plan-check.js +122 -0
- package/dist/commands/sprint/plan-check.js.map +1 -0
- package/dist/commands/sprint/status.d.ts +1 -1
- package/dist/commands/sprint/status.d.ts.map +1 -1
- package/dist/commands/sprint/status.js +23 -1
- package/dist/commands/sprint/status.js.map +1 -1
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +28 -11
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/task/status.d.ts.map +1 -1
- package/dist/commands/task/status.js +228 -0
- package/dist/commands/task/status.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/entity-classifier.d.ts +1 -0
- package/dist/lib/entity-classifier.d.ts.map +1 -1
- package/dist/lib/entity-classifier.js +3 -0
- package/dist/lib/entity-classifier.js.map +1 -1
- package/dist/lib/health-checker.d.ts.map +1 -1
- package/dist/lib/health-checker.js +75 -0
- package/dist/lib/health-checker.js.map +1 -1
- package/dist/lib/integration-warnings.d.ts +72 -0
- package/dist/lib/integration-warnings.d.ts.map +1 -0
- package/dist/lib/integration-warnings.js +273 -0
- package/dist/lib/integration-warnings.js.map +1 -0
- package/dist/lib/output-formatter.d.ts +1 -1
- package/dist/lib/output-formatter.d.ts.map +1 -1
- package/dist/lib/output-formatter.js +47 -1
- package/dist/lib/output-formatter.js.map +1 -1
- package/dist/lib/protected-manifest.d.ts +34 -0
- package/dist/lib/protected-manifest.d.ts.map +1 -0
- package/dist/lib/protected-manifest.js +112 -0
- package/dist/lib/protected-manifest.js.map +1 -0
- package/dist/lib/protection-hook.d.ts +35 -0
- package/dist/lib/protection-hook.d.ts.map +1 -0
- package/dist/lib/protection-hook.js +154 -0
- package/dist/lib/protection-hook.js.map +1 -0
- package/dist/lib/realtime-cursor.js +3 -3
- package/dist/lib/realtime-cursor.js.map +1 -1
- package/dist/lib/session-health.d.ts +75 -0
- package/dist/lib/session-health.d.ts.map +1 -0
- package/dist/lib/session-health.js +252 -0
- package/dist/lib/session-health.js.map +1 -0
- package/dist/lib/sprint-state.d.ts +82 -0
- package/dist/lib/sprint-state.d.ts.map +1 -0
- package/dist/lib/sprint-state.js +338 -0
- package/dist/lib/sprint-state.js.map +1 -0
- package/dist/lib/structural-safeguards.d.ts +26 -0
- package/dist/lib/structural-safeguards.d.ts.map +1 -0
- package/dist/lib/structural-safeguards.js +91 -0
- package/dist/lib/structural-safeguards.js.map +1 -0
- package/dist/lib/task-parser.d.ts +2 -0
- package/dist/lib/task-parser.d.ts.map +1 -1
- package/dist/lib/task-parser.js +30 -0
- package/dist/lib/task-parser.js.map +1 -1
- package/dist/templates/ai-instructions-template.d.ts.map +1 -1
- package/dist/templates/ai-instructions-template.js +8 -1
- package/dist/templates/ai-instructions-template.js.map +1 -1
- package/dist/templates/research-template.md +172 -0
- package/dist/templates/sprint-template.md +52 -0
- package/dist/utils/tier.d.ts +40 -0
- package/dist/utils/tier.d.ts.map +1 -0
- package/dist/utils/tier.js +146 -0
- package/dist/utils/tier.js.map +1 -0
- package/package.json +1 -1
|
@@ -382,7 +382,14 @@ After completing ANY sprint task: \`ginko task complete <task_id>\`
|
|
|
382
382
|
| \`ginko task pause <id>\` | Return to not_started |
|
|
383
383
|
|
|
384
384
|
Last task in a sprint: \`ginko task complete <id> --cascade --yes\`
|
|
385
|
-
Manual sprint completion: \`ginko sprint complete <sprint_id
|
|
385
|
+
Manual sprint completion: \`ginko sprint complete <sprint_id>\`
|
|
386
|
+
|
|
387
|
+
### Verification Discipline (EPIC-025)
|
|
388
|
+
Before running \`ginko task complete\`, execute all Verification steps in the sprint file:
|
|
389
|
+
- **API tasks**: Call deployed endpoints, confirm response shape and status codes
|
|
390
|
+
- **UI tasks**: Use \`/browse\` to navigate to the deployed page, take a screenshot, check console for errors
|
|
391
|
+
- **CLI tasks**: Run the command, confirm expected output
|
|
392
|
+
The CLI will display the verification checklist and prompt for confirmation. Skipping logs a warning.`;
|
|
386
393
|
static LEAN_ENTITY_NAMING = `## Entity Naming Convention (ADR-052)
|
|
387
394
|
|
|
388
395
|
| Entity | Format | Example |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-instructions-template.js","sourceRoot":"","sources":["../../src/templates/ai-instructions-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAyBH,MAAM,OAAO,sBAAsB;IACzB,MAAM,CAAU,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4GnD,CAAC;IAEQ,MAAM,CAAU,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmC/C,CAAC;IAEQ,MAAM,CAAU,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;CAkBhD,CAAC;IAEQ,MAAM,CAAU,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DpD,CAAC;IAEQ,MAAM,CAAU,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuC5C,CAAC;IAEQ,MAAM,CAAU,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoErD,CAAC;IAEA,yEAAyE;IACzE,wEAAwE;IACxE,oEAAoE;IACpE,yEAAyE;IAEjE,MAAM,CAAU,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;OAsBxC,CAAC;IAEE,MAAM,CAAU,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"ai-instructions-template.js","sourceRoot":"","sources":["../../src/templates/ai-instructions-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Research Session Template
|
|
2
|
+
|
|
3
|
+
## AI-Mediated Research Guide
|
|
4
|
+
|
|
5
|
+
**For AI Partners:** Use this template to guide an open-ended research conversation. Your role is to help the human develop structured understanding of an unfamiliar space. You are NOT planning, NOT building, NOT converging on solutions.
|
|
6
|
+
|
|
7
|
+
**Key distinction:** `ginko explore` is for ideation when the problem outlines are partly known. `ginko research` is for when the space is unknown or unfamiliar and the human wants to work through it in a structured way. Research is upstream of explore — it produces understanding, not product artifacts.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Research Conversation Structure
|
|
12
|
+
|
|
13
|
+
### Phase 1: Topic Framing
|
|
14
|
+
**Open with:** "What are you trying to understand? What prompted this research?"
|
|
15
|
+
|
|
16
|
+
**Your goal:** Understand what the human knows, doesn't know, and thinks they know.
|
|
17
|
+
|
|
18
|
+
**Probe:**
|
|
19
|
+
- What triggered this investigation?
|
|
20
|
+
- What's the current mental model? (This is what you'll stress-test later.)
|
|
21
|
+
- What would change if the answer were different than expected?
|
|
22
|
+
|
|
23
|
+
**Synthesize into:** A clear topic statement and initial scope.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
### Phase 2: Context Mapping
|
|
28
|
+
**Ask:** "What do you already know about this space? What assumptions are you carrying?"
|
|
29
|
+
|
|
30
|
+
**Your goal:** Surface the landscape — prior art, existing constraints, adjacent domains.
|
|
31
|
+
|
|
32
|
+
**Probe:**
|
|
33
|
+
- What has been tried before (here or elsewhere)?
|
|
34
|
+
- What constraints are non-negotiable vs. assumed?
|
|
35
|
+
- Who else cares about this topic? What's their perspective?
|
|
36
|
+
- What would an expert in this domain point out that a newcomer would miss?
|
|
37
|
+
|
|
38
|
+
**Synthesize into:** A context section capturing known terrain and assumptions.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
### Phase 3: Active Investigation
|
|
43
|
+
**This is the core of the session.** Follow the human's curiosity but actively contribute.
|
|
44
|
+
|
|
45
|
+
**Your responsibilities:**
|
|
46
|
+
- When the human makes a claim, ask "What evidence supports that?"
|
|
47
|
+
- When a finding emerges, ask "What would disprove this?"
|
|
48
|
+
- When a path is explored deeply, ask "What haven't we looked at?"
|
|
49
|
+
- Suggest adjacent areas the human hasn't mentioned
|
|
50
|
+
- Play devil's advocate on confident assertions
|
|
51
|
+
- Name patterns you recognize from other domains
|
|
52
|
+
- Surface contradictions between earlier statements and new findings
|
|
53
|
+
|
|
54
|
+
**Synthesize into:** Numbered findings with confidence levels and supporting evidence.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### Phase 4: Open Questions
|
|
59
|
+
**Ongoing throughout.** Track questions that emerge but aren't resolved.
|
|
60
|
+
|
|
61
|
+
**Capture:**
|
|
62
|
+
- Questions the human raised but parked
|
|
63
|
+
- Questions YOU raised that the human didn't have answers for
|
|
64
|
+
- "Unasked questions" — gaps in the investigation that neither party addressed
|
|
65
|
+
- Questions that would need external input (user research, data, expert opinion)
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Tone & Behavior Guidelines
|
|
70
|
+
|
|
71
|
+
### Your Stance: Accommodating but Mildly Challenging
|
|
72
|
+
|
|
73
|
+
You are a research partner, not an assistant. Think: smart colleague who's genuinely curious and will push back when something doesn't add up.
|
|
74
|
+
|
|
75
|
+
**Do:**
|
|
76
|
+
- Ask "Why do you believe that?" when the human states something as fact
|
|
77
|
+
- Offer counter-examples and edge cases
|
|
78
|
+
- Say "That's interesting — but have you considered [X]?"
|
|
79
|
+
- Name when the human is making an assumption vs. stating a fact
|
|
80
|
+
- Suggest areas the human hasn't explored (the unasked questions are often the most revealing)
|
|
81
|
+
- Acknowledge genuine uncertainty — "I don't know" is a valid finding
|
|
82
|
+
- Let silences happen; not every pause needs filling
|
|
83
|
+
|
|
84
|
+
**Don't:**
|
|
85
|
+
- Agree with everything — that's not research, that's validation
|
|
86
|
+
- Be adversarial or condescending — challenge ideas, not the person
|
|
87
|
+
- Suggest ending the session ("Should we wrap up?") — NEVER
|
|
88
|
+
- Suggest moving to implementation ("Ready to build?") — NEVER
|
|
89
|
+
- Suggest creating an epic, explore, or plan — NEVER
|
|
90
|
+
- Converge prematurely — breadth before depth
|
|
91
|
+
- Treat findings as conclusions — they're hypotheses until validated
|
|
92
|
+
|
|
93
|
+
### CRITICAL RULES:
|
|
94
|
+
1. **NEVER suggest ending the research.** The human decides when to stop.
|
|
95
|
+
2. **NEVER suggest next steps like "create an epic" or "start building."**
|
|
96
|
+
3. **NEVER use phrases like "Should we wrap up?" or "I think we have enough."**
|
|
97
|
+
4. If the human says "I think we're done," acknowledge it and help them capture final open questions — but don't initiate closure yourself.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Unasked Questions Protocol
|
|
102
|
+
|
|
103
|
+
After every 3-4 exchanges, pause and consider:
|
|
104
|
+
- What topic adjacent to this discussion hasn't been raised?
|
|
105
|
+
- What assumption is everyone (including you) taking for granted?
|
|
106
|
+
- What would a skeptic ask about the strongest finding so far?
|
|
107
|
+
|
|
108
|
+
Surface one of these. Frame it as: "Something we haven't discussed yet: [question]. Is that relevant here, or deliberately out of scope?"
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Output Format
|
|
113
|
+
|
|
114
|
+
When the human decides the session is complete, create the research document:
|
|
115
|
+
|
|
116
|
+
### File: `docs/research/RES-XXX-[slug].md`
|
|
117
|
+
|
|
118
|
+
To determine XXX: Check existing files in `docs/research/` and increment. If no files exist, start at RES-001. If `docs/research/` doesn't exist, create it first.
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
---
|
|
122
|
+
research_id: RES-XXX
|
|
123
|
+
topic: "[Research Topic]"
|
|
124
|
+
status: open
|
|
125
|
+
created: YYYY-MM-DD
|
|
126
|
+
tags: [tag1, tag2]
|
|
127
|
+
related: [ADR-XXX, EPIC-XXX, or other references]
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
# RES-XXX: [Research Topic]
|
|
131
|
+
|
|
132
|
+
## Context
|
|
133
|
+
[What prompted this research. Prior knowledge. Assumptions carried in.
|
|
134
|
+
Constraints — real and assumed.]
|
|
135
|
+
|
|
136
|
+
## Findings
|
|
137
|
+
1. **[Finding title]** (confidence: high|medium|low)
|
|
138
|
+
[Description. Evidence. Counter-evidence considered.]
|
|
139
|
+
|
|
140
|
+
2. **[Finding title]** (confidence: high|medium|low)
|
|
141
|
+
[Description. Evidence. Counter-evidence considered.]
|
|
142
|
+
|
|
143
|
+
## Open Questions
|
|
144
|
+
- [ ] [Question that emerged but wasn't resolved]
|
|
145
|
+
- [ ] [Question that needs external input]
|
|
146
|
+
- [ ] [Unasked question surfaced during review]
|
|
147
|
+
|
|
148
|
+
## Raw Notes
|
|
149
|
+
[Optional: key exchanges or reasoning chains worth preserving]
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Status values:**
|
|
153
|
+
- `open` — Research is ongoing or has unresolved questions (default)
|
|
154
|
+
- `closed` — Research is considered complete (all key questions addressed)
|
|
155
|
+
|
|
156
|
+
Default to `open`. Most research stays open — that's fine.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Graph Sync
|
|
161
|
+
|
|
162
|
+
After creating the research file, sync to the graph:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
ginko push research
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
This uploads the Research document to the graph for semantic search and cross-referencing with other project knowledge.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
**Remember:** The goal is structured understanding, not a build plan. A research session that concludes "the problem isn't what we thought" is a successful outcome. Resist the urge to make it productive in the conventional sense.
|
|
@@ -75,8 +75,30 @@ For each task, generate the full structure:
|
|
|
75
75
|
- [ ] {Specific, testable criterion 1}
|
|
76
76
|
- [ ] {Specific, testable criterion 2}
|
|
77
77
|
- [ ] {Tests pass}
|
|
78
|
+
|
|
79
|
+
**Verification:**
|
|
80
|
+
- [ ] {Concrete check derived from AC — specify method: endpoint call, browser nav, or CLI command}
|
|
81
|
+
- [ ] {For API tasks: Deploy → call [endpoint] → confirm [expected response]}
|
|
82
|
+
- [ ] {For UI tasks: Deploy → navigate to [page] → screenshot → confirm [element] visible}
|
|
83
|
+
- [ ] {For CLI tasks: Run [command] → confirm [expected output]}
|
|
78
84
|
```
|
|
79
85
|
|
|
86
|
+
### Verification Step Generation (EPIC-025)
|
|
87
|
+
|
|
88
|
+
For each acceptance criterion, generate a corresponding **verification step** that specifies the concrete check method:
|
|
89
|
+
|
|
90
|
+
| Task Type | Verification Pattern |
|
|
91
|
+
|-----------|---------------------|
|
|
92
|
+
| **API** | Deploy → `curl [endpoint]` → confirm response shape/status |
|
|
93
|
+
| **UI** | Deploy → navigate to [page] via `/browse` → screenshot → confirm [element] visible → check console |
|
|
94
|
+
| **CLI** | Run `[command]` → confirm [expected output] |
|
|
95
|
+
|
|
96
|
+
**Rules:**
|
|
97
|
+
- Every AC gets a verification step — no "confirm it works" generics
|
|
98
|
+
- UI tasks MUST include browser console check (catches hydration errors, missing props)
|
|
99
|
+
- Verification steps are editable — present them for human review before finalizing
|
|
100
|
+
- If task type is ambiguous, include both API and browser verification
|
|
101
|
+
|
|
80
102
|
### Confidence Scoring (Critical)
|
|
81
103
|
|
|
82
104
|
Be honest about your confidence in each task:
|
|
@@ -156,6 +178,36 @@ Example: `docs/sprints/SPRINT-2026-02-adhoc_260205_s01-dashboard-fixes.md`
|
|
|
156
178
|
|
|
157
179
|
---
|
|
158
180
|
|
|
181
|
+
## Task Dependencies (EPIC-025)
|
|
182
|
+
|
|
183
|
+
{After defining all tasks, derive dependencies from task descriptions and file overlaps.
|
|
184
|
+
Render as ASCII tree. Mark independent tasks explicitly.}
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
t01 ─── t02 (needs t01's types)
|
|
188
|
+
└──── t03 (needs t01's output)
|
|
189
|
+
t04 ──── (independent)
|
|
190
|
+
t05 ──── (independent)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
{Omit this section if all tasks are independent.}
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Integration Warnings (EPIC-025)
|
|
198
|
+
|
|
199
|
+
{Auto-generate from task Scope/Files sections. Identify files referenced by 2+ tasks.}
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
⚠️ t01, t03 both modify `component.tsx` — t03 depends on t01's changes
|
|
203
|
+
⚠️ t02, t04 both modify `api-route.ts` — review recommended
|
|
204
|
+
✅ t05, t06 both modify `utils.ts` — independent changes, safe to parallelize
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
{Omit this section if no file overlaps detected.}
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
159
211
|
## Related Documents
|
|
160
212
|
|
|
161
213
|
- **Epic**: {Epic name or "Ad-Hoc Work"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-03-17
|
|
5
|
+
* @tags: [tier, subscription, billing, cli, epic-026]
|
|
6
|
+
* @related: [api-client.ts, commands/start.ts, commands/status.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [chalk]
|
|
10
|
+
*
|
|
11
|
+
* CLI tier resolution and caching (EPIC-026)
|
|
12
|
+
* Fetches user tier from dashboard API, caches locally with TTL.
|
|
13
|
+
*/
|
|
14
|
+
export interface TierInfo {
|
|
15
|
+
tier: 'free' | 'pro' | 'suspended';
|
|
16
|
+
isPro: boolean;
|
|
17
|
+
isTrial: boolean;
|
|
18
|
+
trialDaysLeft: number | null;
|
|
19
|
+
isSuspended: boolean;
|
|
20
|
+
subscriptionEndsAt: string | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the user's subscription tier.
|
|
24
|
+
* Fetches from API, falls back to cache if offline.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getTier(): Promise<TierInfo | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Format tier for display in CLI output.
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatTierDisplay(tier: TierInfo): string;
|
|
31
|
+
/**
|
|
32
|
+
* Show trial expiry warning if trial ends within 3 days.
|
|
33
|
+
* Call this during `ginko start` to surface urgency.
|
|
34
|
+
*/
|
|
35
|
+
export declare function showTrialWarning(tier: TierInfo): void;
|
|
36
|
+
/**
|
|
37
|
+
* Show upgrade prompt for free/suspended users.
|
|
38
|
+
*/
|
|
39
|
+
export declare function showUpgradePrompt(): Promise<void>;
|
|
40
|
+
//# sourceMappingURL=tier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier.d.ts","sourceRoot":"","sources":["../../src/utils/tier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,CAAC;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAUD;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA6CxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAWxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAUrD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAavD"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-03-17
|
|
5
|
+
* @tags: [tier, subscription, billing, cli, epic-026]
|
|
6
|
+
* @related: [api-client.ts, commands/start.ts, commands/status.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [chalk]
|
|
10
|
+
*
|
|
11
|
+
* CLI tier resolution and caching (EPIC-026)
|
|
12
|
+
* Fetches user tier from dashboard API, caches locally with TTL.
|
|
13
|
+
*/
|
|
14
|
+
import chalk from 'chalk';
|
|
15
|
+
import { api } from './api-client.js';
|
|
16
|
+
import { isAuthenticated } from './auth-storage.js';
|
|
17
|
+
import * as fs from 'fs';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import * as os from 'os';
|
|
20
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
21
|
+
const CACHE_FILE = path.join(os.homedir(), '.ginko', 'tier-cache.json');
|
|
22
|
+
/**
|
|
23
|
+
* Get the user's subscription tier.
|
|
24
|
+
* Fetches from API, falls back to cache if offline.
|
|
25
|
+
*/
|
|
26
|
+
export async function getTier() {
|
|
27
|
+
if (!await isAuthenticated()) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
// Try cache first if fresh
|
|
31
|
+
const cached = readCache();
|
|
32
|
+
if (cached) {
|
|
33
|
+
const age = Date.now() - new Date(cached.fetchedAt).getTime();
|
|
34
|
+
if (age < CACHE_TTL_MS) {
|
|
35
|
+
return cached.data;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Fetch from API
|
|
39
|
+
try {
|
|
40
|
+
const response = await api.get('/api/v1/user/tier');
|
|
41
|
+
if (response.data) {
|
|
42
|
+
const tierInfo = {
|
|
43
|
+
tier: response.data.tier,
|
|
44
|
+
isPro: response.data.isPro,
|
|
45
|
+
isTrial: response.data.isTrial,
|
|
46
|
+
trialDaysLeft: response.data.trialDaysLeft,
|
|
47
|
+
isSuspended: response.data.isSuspended,
|
|
48
|
+
subscriptionEndsAt: response.data.subscriptionEndsAt,
|
|
49
|
+
};
|
|
50
|
+
writeCache(tierInfo);
|
|
51
|
+
return tierInfo;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// API unreachable — fall back to cache (even if stale)
|
|
56
|
+
if (cached) {
|
|
57
|
+
return cached.data;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// No cache, no API — default to free
|
|
61
|
+
return {
|
|
62
|
+
tier: 'free',
|
|
63
|
+
isPro: false,
|
|
64
|
+
isTrial: false,
|
|
65
|
+
trialDaysLeft: null,
|
|
66
|
+
isSuspended: false,
|
|
67
|
+
subscriptionEndsAt: null,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Format tier for display in CLI output.
|
|
72
|
+
*/
|
|
73
|
+
export function formatTierDisplay(tier) {
|
|
74
|
+
if (tier.isTrial) {
|
|
75
|
+
return chalk.cyan(`Pro Trial (${tier.trialDaysLeft} day${tier.trialDaysLeft === 1 ? '' : 's'} left)`);
|
|
76
|
+
}
|
|
77
|
+
if (tier.isPro) {
|
|
78
|
+
return chalk.green('Pro');
|
|
79
|
+
}
|
|
80
|
+
if (tier.isSuspended) {
|
|
81
|
+
return chalk.yellow('Suspended');
|
|
82
|
+
}
|
|
83
|
+
return chalk.dim('Free');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Show trial expiry warning if trial ends within 3 days.
|
|
87
|
+
* Call this during `ginko start` to surface urgency.
|
|
88
|
+
*/
|
|
89
|
+
export function showTrialWarning(tier) {
|
|
90
|
+
if (!tier.isTrial || tier.trialDaysLeft === null)
|
|
91
|
+
return;
|
|
92
|
+
if (tier.trialDaysLeft <= 0) {
|
|
93
|
+
console.log(chalk.yellow('\n ⏰ Your Pro trial has ended. Upgrade to keep Pro features.'));
|
|
94
|
+
console.log(chalk.dim(' Upgrade: https://app.ginkoai.com/pricing'));
|
|
95
|
+
}
|
|
96
|
+
else if (tier.trialDaysLeft <= 3) {
|
|
97
|
+
console.log(chalk.yellow(`\n ⏰ Pro trial ends in ${tier.trialDaysLeft} day${tier.trialDaysLeft === 1 ? '' : 's'}`));
|
|
98
|
+
console.log(chalk.dim(' Upgrade: https://app.ginkoai.com/pricing'));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Show upgrade prompt for free/suspended users.
|
|
103
|
+
*/
|
|
104
|
+
export async function showUpgradePrompt() {
|
|
105
|
+
try {
|
|
106
|
+
const response = await api.get('/api/v1/stripe/promo-status', false);
|
|
107
|
+
if (response.data?.isPromoActive && response.data.currentTier) {
|
|
108
|
+
const t = response.data.currentTier;
|
|
109
|
+
const price = `$${t.annualPrice / 100}/yr ($${t.monthlyEquivalent / 100}/mo)`;
|
|
110
|
+
const seats = `${t.seatsDisplayed} of ${t.seatLimit} ${t.label.toLowerCase()} seats claimed`;
|
|
111
|
+
console.log(chalk.yellow(`\n ⭐ ${t.label} adopter pricing: ${price} — ${seats}`));
|
|
112
|
+
console.log(chalk.dim(' Upgrade: https://app.ginkoai.com/pricing'));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Silently fail — promo display is non-critical
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function readCache() {
|
|
120
|
+
try {
|
|
121
|
+
if (fs.existsSync(CACHE_FILE)) {
|
|
122
|
+
const data = fs.readFileSync(CACHE_FILE, 'utf-8');
|
|
123
|
+
return JSON.parse(data);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Corrupted cache
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
function writeCache(data) {
|
|
132
|
+
try {
|
|
133
|
+
const dir = path.dirname(CACHE_FILE);
|
|
134
|
+
if (!fs.existsSync(dir)) {
|
|
135
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
136
|
+
}
|
|
137
|
+
fs.writeFileSync(CACHE_FILE, JSON.stringify({
|
|
138
|
+
data,
|
|
139
|
+
fetchedAt: new Date().toISOString(),
|
|
140
|
+
}), 'utf-8');
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Non-critical
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=tier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier.js","sourceRoot":"","sources":["../../src/utils/tier.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED