memoir-cli 3.1.1 → 3.2.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/GAMEPLAN.md ADDED
@@ -0,0 +1,235 @@
1
+ # Memoir Business Game Plan
2
+ **Date:** March 25, 2026 | **Status:** Pre-revenue | **Author:** Boardroom consensus + CEO directive
3
+
4
+ ---
5
+
6
+ ## Current State
7
+
8
+ | Metric | Value |
9
+ |--------|-------|
10
+ | Version | 3.1.2 (npm) |
11
+ | Revenue | $0 |
12
+ | Users | ~50 npm downloads |
13
+ | AI Tools Supported | 11 (Claude, Gemini, Cursor, Copilot, Windsurf, Zed, Cline, Continue, Aider, Codex, ChatGPT) |
14
+ | Cloud Backend | Supabase (auth + storage + PostgreSQL) |
15
+ | Landing Page | memoir.sh (Vercel, 13 blog posts, no email capture) |
16
+ | Blog Posts | 13 SEO-targeted articles |
17
+ | Analytics | None (CLI or website) |
18
+ | Payment Processing | None |
19
+ | Team Features | None |
20
+ | Shareable Links | None |
21
+
22
+ ---
23
+
24
+ ## What's Already Built (Don't Rebuild)
25
+
26
+ - **CLI core** — push, restore, snapshot, resume, migrate, diff, profiles, doctor
27
+ - **Cloud sync** — Supabase auth (email/password), gzipped bundles in Storage, PostgreSQL metadata
28
+ - **Free/Pro tiers** — enforced in code (Free: 3 backups, Pro: 50) — but no way to pay for Pro
29
+ - **Version history** — cloud backups versioned, restore from any version
30
+ - **E2E encryption** — AES-256-GCM, async scrypt (just fixed), client-side before upload
31
+ - **Workspace sync** — clones git repos, bundles non-git projects, applies uncommitted patches
32
+ - **Session handoff** — snapshot current session, resume on another machine
33
+ - **Landing page** — memoir.sh with animated terminal demo, tool marquee, FAQ, competitor comparison
34
+ - **13 SEO blog posts** — sync guides for each tool, comparisons, setup guides
35
+
36
+ ---
37
+
38
+ ## The Plan: 4 Phases
39
+
40
+ ### Phase 1: Monetization Foundation (Week 1-2)
41
+ > **Goal:** Accept money. Capture emails. Track usage.
42
+
43
+ | Task | Priority | Effort | Details |
44
+ |------|----------|--------|---------|
45
+ | Add Stripe integration | P0 | 1 day | Connect to Pro tier ($15/mo individual, already priced in competitor comparison) |
46
+ | `memoir upgrade` command | P0 | 0.5 day | Opens Stripe checkout from CLI, activates Pro |
47
+ | Add pricing page to memoir.sh | P0 | 0.5 day | Free vs Pro vs Teams (coming soon) |
48
+ | Add email capture / waitlist | P0 | 0.5 day | "Get notified for Teams" — collect emails on memoir.sh |
49
+ | Add PostHog analytics to CLI | P1 | 0.5 day | Anonymous: commands used, tool count, machine OS, cloud vs local |
50
+ | Add PostHog to memoir.sh | P1 | 0.5 day | Page views, blog reads, install clicks |
51
+ | `memoir doctor` completion | P2 | 0.5 day | Finish the stubbed diagnostics command |
52
+
53
+ **Phase 1 deliverable:** People can pay. We know who's using what.
54
+
55
+ ---
56
+
57
+ ### Phase 2: Viral Loop + Shareability (Week 3-4)
58
+ > **Goal:** Every user brings one more user.
59
+
60
+ | Task | Priority | Effort | Details |
61
+ |------|----------|--------|---------|
62
+ | Shareable context links | P0 | 2 days | `memoir share` → generates encrypted link (Supabase signed URL, 24hr expiry). Recipient runs `memoir restore --from <link>` |
63
+ | Share landing page | P0 | 0.5 day | When link is opened in browser (not CLI), show "Install memoir to restore this context" with one-click copy |
64
+ | Team invite flow | P1 | 1 day | `memoir team create`, `memoir team invite <email>` — shared backup namespace in Supabase |
65
+ | Onboarding context | P1 | 0.5 day | `memoir push --share` generates a restore link printed to terminal. Copy-paste to Slack |
66
+ | "Synced with memoir" badge | P2 | 0.5 day | Auto-append to CLAUDE.md / .cursorrules when synced — passive discovery |
67
+
68
+ **Phase 2 deliverable:** Sharing is the viral loop. Every shared link = a new install prompt.
69
+
70
+ ---
71
+
72
+ ### Phase 3: Teams Tier (Week 5-8)
73
+ > **Goal:** $29/seat/month revenue from dev teams.
74
+
75
+ | Task | Priority | Effort | Details |
76
+ |------|----------|--------|---------|
77
+ | Organizations in Supabase | P0 | 2 days | `organizations` table, `org_members` table, role-based (admin/member) |
78
+ | Shared team backups | P0 | 2 days | `memoir push --team` syncs to org namespace. All members can restore team context |
79
+ | Team dashboard (web) | P1 | 3 days | memoir.sh/dashboard — see team members, backup history, storage usage |
80
+ | Seat-based billing | P0 | 1 day | Stripe per-seat subscription, enforce in CLI |
81
+ | Context inheritance | P1 | 1 day | `memoir restore --from <teammate>` — pull specific teammate's context with permission |
82
+ | Audit log | P2 | 1 day | Who pushed, who restored, when — enterprise compliance checkbox |
83
+ | SSO (Google/GitHub) | P2 | 1 day | Enterprise teams expect OAuth, not email/password |
84
+
85
+ **Phase 3 deliverable:** Teams can buy seats, share context, see a dashboard.
86
+
87
+ ---
88
+
89
+ ### Phase 4: Enterprise + Moat (Week 9-12)
90
+ > **Goal:** First $5k MRR. Lock-in through history depth.
91
+
92
+ | Task | Priority | Effort | Details |
93
+ |------|----------|--------|---------|
94
+ | Context time-travel | P1 | 3 days | `memoir restore --version 5 --tool claude` — restore any tool to any point in history |
95
+ | Diff between versions | P1 | 1 day | `memoir diff v3 v7` — show what changed in AI context between versions |
96
+ | Context quality scoring | P2 | 2 days | Auto-tag backups: files changed, decisions made, session length. Surface "important" snapshots |
97
+ | Enterprise pricing page | P1 | 0.5 day | $99/seat/month with SLA, priority support, SSO, audit logs |
98
+ | SOC2 narrative | P2 | 1 day | Document E2E encryption, zero-knowledge architecture, audit trail for compliance conversations |
99
+ | API for integrations | P2 | 3 days | REST API: programmatic backup/restore for CI/CD pipelines, onboarding scripts |
100
+
101
+ **Phase 4 deliverable:** Enterprise-ready product with deep history moat.
102
+
103
+ ---
104
+
105
+ ## Pricing Structure
106
+
107
+ | Tier | Price | Limits | Target |
108
+ |------|-------|--------|--------|
109
+ | **Free** | $0/forever | 3 cloud backups, local unlimited, 1 machine | Solo devs trying it out |
110
+ | **Pro** | $15/month | 50 cloud backups, unlimited machines, version history | Power users, multi-machine devs |
111
+ | **Teams** | $29/seat/month | Shared team context, dashboard, audit log, 200 backups/team | Dev teams (5-20 people) |
112
+ | **Enterprise** | $99/seat/month | SSO, SLA, API access, compliance docs, unlimited backups | Companies (20+) |
113
+
114
+ ---
115
+
116
+ ## Positioning
117
+
118
+ | Audience | Message |
119
+ |----------|---------|
120
+ | Individual dev | "Never lose your AI context again" |
121
+ | Dev team lead | "Onboard devs in 60 seconds with full AI context" |
122
+ | Enterprise buyer | "SOC2-ready AI workflow continuity" |
123
+ | SEO / content | "Git for your AI setup" |
124
+
125
+ **One-liner:** memoir syncs your AI memory across every machine and every teammate.
126
+
127
+ **Anti-positioning (what we're NOT):** Not a dotfiles manager. Not VS Code Sync. Not a cloud IDE. We sync the AI layer — the conversations, decisions, and context that make your tools smart.
128
+
129
+ ---
130
+
131
+ ## First 100 Users Plan
132
+
133
+ | Week | Action | Target |
134
+ |------|--------|--------|
135
+ | 1 | Ship Stripe + pricing page | Accept payments |
136
+ | 2 | Post on r/programming, r/neovim, r/cursor, Hacker News | 500 page views |
137
+ | 3 | Cold DM 50 developers who tweet about Claude/Cursor context loss | 10 installs |
138
+ | 4 | Ship shareable links, post demo video on X/Twitter | 20 shares |
139
+ | 5-6 | Reach out to 10 companies using Cursor (check their GitHub for .cursorrules) | 3 team pilots |
140
+ | 7-8 | Ship Teams tier, convert pilots to paid | First $290 MRR |
141
+ | 9-12 | Content marketing: "How Company X onboards devs in 60s" case study | 100 users, $1k+ MRR |
142
+
143
+ ---
144
+
145
+ ## Supabase Schema Changes Needed
146
+
147
+ ```sql
148
+ -- Organizations
149
+ CREATE TABLE organizations (
150
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
151
+ name TEXT NOT NULL,
152
+ slug TEXT UNIQUE NOT NULL,
153
+ owner_id UUID REFERENCES auth.users(id),
154
+ plan TEXT DEFAULT 'teams',
155
+ stripe_customer_id TEXT,
156
+ stripe_subscription_id TEXT,
157
+ created_at TIMESTAMPTZ DEFAULT now()
158
+ );
159
+
160
+ -- Org members
161
+ CREATE TABLE org_members (
162
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
163
+ org_id UUID REFERENCES organizations(id) ON DELETE CASCADE,
164
+ user_id UUID REFERENCES auth.users(id),
165
+ role TEXT DEFAULT 'member' CHECK (role IN ('admin', 'member')),
166
+ invited_by UUID REFERENCES auth.users(id),
167
+ joined_at TIMESTAMPTZ DEFAULT now(),
168
+ UNIQUE(org_id, user_id)
169
+ );
170
+
171
+ -- Shared links
172
+ CREATE TABLE shared_links (
173
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
174
+ backup_id UUID REFERENCES backups(id),
175
+ created_by UUID REFERENCES auth.users(id),
176
+ token TEXT UNIQUE NOT NULL,
177
+ expires_at TIMESTAMPTZ NOT NULL,
178
+ max_uses INT DEFAULT 1,
179
+ use_count INT DEFAULT 0,
180
+ created_at TIMESTAMPTZ DEFAULT now()
181
+ );
182
+
183
+ -- Add org_id to backups for team backups
184
+ ALTER TABLE backups ADD COLUMN org_id UUID REFERENCES organizations(id);
185
+
186
+ -- Add stripe fields to subscriptions
187
+ ALTER TABLE subscriptions ADD COLUMN stripe_customer_id TEXT;
188
+ ALTER TABLE subscriptions ADD COLUMN stripe_subscription_id TEXT;
189
+ ALTER TABLE subscriptions ADD COLUMN seats INT DEFAULT 1;
190
+ ```
191
+
192
+ ---
193
+
194
+ ## New CLI Commands Summary
195
+
196
+ ```
197
+ memoir upgrade # Open Stripe checkout, activate Pro
198
+ memoir share # Generate encrypted shareable link
199
+ memoir team create # Create a team organization
200
+ memoir team invite # Invite teammate by email
201
+ memoir team list # List team members
202
+ memoir push --team # Push to team namespace
203
+ memoir restore --from # Restore from shared link or teammate
204
+ memoir history --diff # Diff between backup versions
205
+ memoir analytics # Show your usage stats (local)
206
+ ```
207
+
208
+ ---
209
+
210
+ ## Risk Register
211
+
212
+ | Risk | Likelihood | Impact | Mitigation |
213
+ |------|-----------|--------|------------|
214
+ | AI tools change config paths | High | Medium | Version-gated path detection, community PRs for new tools |
215
+ | Supabase costs spike with users | Medium | Medium | Gzip compression (already done), enforce tier limits, monitor |
216
+ | Nobody pays for Pro | High | High | Validate with shareable links first (free viral), watch conversion |
217
+ | Enterprise competitor (JetBrains, GitHub) builds this | Medium | High | Move fast, own the CLI mindshare, community moat |
218
+ | ToS violations syncing AI configs | Low | High | Only sync user-owned files (configs, not conversations). Document clearly |
219
+ | Data breach of cloud backups | Low | Critical | E2E encryption means we literally can't read user data. Zero-knowledge by design |
220
+
221
+ ---
222
+
223
+ ## This Week's Checklist
224
+
225
+ - [ ] Stripe account setup + integration in CLI
226
+ - [ ] `memoir upgrade` command
227
+ - [ ] Pricing page on memoir.sh
228
+ - [ ] Email capture for Teams waitlist on memoir.sh
229
+ - [ ] PostHog analytics on CLI (anonymous, opt-out available)
230
+ - [ ] PostHog analytics on memoir.sh
231
+ - [ ] Post in 3 subreddits about memoir
232
+
233
+ ---
234
+
235
+ *"The CLI is the funnel. Cloud is the product. Teams is the business."*
package/README.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  # memoir
4
4
 
5
- **Your AI remembers everything. On every machine.**
5
+ **AI tools forget you. memoir doesn't.**
6
6
 
7
7
  [![npm version](https://img.shields.io/npm/v/memoir-cli.svg?style=flat-square&color=7c6ef0)](https://npmjs.org/package/memoir-cli)
8
8
  [![npm downloads](https://img.shields.io/npm/dm/memoir-cli.svg?style=flat-square&color=7c6ef0)](https://npmjs.org/package/memoir-cli)
9
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
10
10
  [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen?style=flat-square)](https://nodejs.org)
11
11
 
12
- Close your laptop. Open another one. **Your AI picks up exactly where you left off.**
12
+ Sync memory across 11 AI tools. Search it all from your editor via MCP. One CLI, every device.
13
13
 
14
14
  [Website](https://memoir.sh) &bull; [npm](https://npmjs.org/package/memoir-cli) &bull; [Blog](https://memoir.sh/blog)
15
15
 
@@ -111,6 +111,35 @@ memoir push
111
111
  memoir restore
112
112
  ```
113
113
 
114
+ ## MCP Server (NEW in v3.2)
115
+
116
+ memoir ships an MCP server so your AI tools can search, read, and save memories without leaving the conversation.
117
+
118
+ ```bash
119
+ # Start the server
120
+ memoir mcp
121
+ ```
122
+
123
+ **Claude Code** — add to `~/.mcp.json`:
124
+ ```json
125
+ {
126
+ "mcpServers": {
127
+ "memoir": { "command": "memoir-mcp" }
128
+ }
129
+ }
130
+ ```
131
+
132
+ **Cursor** — add to `.cursor/mcp.json`:
133
+ ```json
134
+ {
135
+ "mcpServers": {
136
+ "memoir": { "command": "memoir-mcp" }
137
+ }
138
+ }
139
+ ```
140
+
141
+ Your editor gets 6 tools: `memoir_recall` (search all memories), `memoir_remember` (save context), `memoir_list`, `memoir_read`, `memoir_status`, and `memoir_profiles`. Zero cost — runs locally.
142
+
114
143
  ## Key Features
115
144
 
116
145
  ### Workspace sync
@@ -195,6 +224,7 @@ Claude's memory paths are automatically remapped between platforms. Projects are
195
224
  | `memoir cloud restore` | Restore from memoir cloud |
196
225
  | `memoir history` | View cloud backup versions |
197
226
  | `memoir login` | Sign in to memoir cloud |
227
+ | `memoir mcp` | Start MCP server for editor integration |
198
228
  | `memoir update` | Self-update to latest version |
199
229
 
200
230
  ## How memoir compares
@@ -211,6 +241,7 @@ Claude's memory paths are automatically remapped between platforms. Projects are
211
241
  | Uncommitted work patches | **Yes** | No | No | No |
212
242
  | Cloud backup | **Yes** | No | No | Yes ($15/mo) |
213
243
  | Profiles | **Yes** | No | No | No |
244
+ | MCP server | **Yes** | No | No | No |
214
245
  | Free & open source | **Yes** | Yes | Yes | No |
215
246
 
216
247
  ## Common Workflows
package/bin/memoir.js CHANGED
@@ -16,7 +16,10 @@ import { resumeCommand } from '../src/commands/resume.js';
16
16
  import { profileListCommand, profileCreateCommand, profileSwitchCommand, profileDeleteCommand } from '../src/commands/profile.js';
17
17
  import { loginCommand, logoutCommand } from '../src/commands/login.js';
18
18
  import { cloudPushCommand, cloudRestoreCommand } from '../src/commands/cloud.js';
19
+ import { shareCommand } from '../src/commands/share.js';
19
20
  import { historyCommand } from '../src/commands/history.js';
21
+ import { projectsListCommand, projectsTodoCommand } from '../src/commands/projects.js';
22
+ import { upgradeCommand } from '../src/commands/upgrade.js';
20
23
  import { createRequire } from 'module';
21
24
 
22
25
  const require = createRequire(import.meta.url);
@@ -62,12 +65,15 @@ if (process.argv.length <= 2) {
62
65
  chalk.cyan(' memoir resume ') + chalk.gray('— pick up where you left off') + '\n' +
63
66
  chalk.cyan(' memoir status ') + chalk.gray('— see detected AI tools') + '\n' +
64
67
  chalk.cyan(' memoir profile ') + chalk.gray('— manage profiles (personal/work)') + '\n' +
68
+ chalk.cyan(' memoir projects ') + chalk.gray('— see all your projects at a glance') + '\n' +
65
69
  chalk.cyan(' memoir encrypt ') + chalk.gray('— toggle E2E encryption') + '\n' +
66
- chalk.cyan(' memoir update ') + chalk.gray('— update to latest version') + '\n\n' +
70
+ chalk.cyan(' memoir update ') + chalk.gray('— update to latest version') + '\n' +
71
+ chalk.cyan(' memoir upgrade ') + chalk.gray('— view plans & upgrade') + '\n\n' +
67
72
  chalk.white.bold('Cloud (Pro):') + '\n' +
68
73
  chalk.cyan(' memoir login ') + chalk.gray('— sign in to memoir cloud') + '\n' +
69
74
  chalk.cyan(' memoir cloud push ') + chalk.gray('— back up to the cloud') + '\n' +
70
75
  chalk.cyan(' memoir cloud restore ') + chalk.gray('— restore from cloud') + '\n' +
76
+ chalk.cyan(' memoir share ') + chalk.gray('— share memory via secure link') + '\n' +
71
77
  chalk.cyan(' memoir history ') + chalk.gray('— view backup versions') + '\n\n' +
72
78
  chalk.gray(' Tip: use --profile work to sync a specific profile') + '\n\n' +
73
79
  chalk.gray(`v${VERSION}`),
@@ -120,8 +126,9 @@ program
120
126
  .alias('pull')
121
127
  .description('Restore your AI memory on this machine')
122
128
  .option('--only <tools>', 'Only restore specific tools (comma-separated)')
123
- .option('-y, --yes', 'Skip confirmation prompts (restore all)')
129
+ .option('-i, --interactive', 'Confirm each tool before restoring')
124
130
  .option('-p, --profile <name>', 'Use a specific profile')
131
+ .option('--from <token>', 'Restore from a share link token')
125
132
  .action(async (options) => {
126
133
  try {
127
134
  await restoreCommand(options);
@@ -131,6 +138,21 @@ program
131
138
  }
132
139
  });
133
140
 
141
+ program
142
+ .command('share')
143
+ .description('Share your AI memory via a secure link')
144
+ .option('--only <tools>', 'Only share specific tools (comma-separated)')
145
+ .option('--expires <hours>', 'Link expiry in hours (default: 24)')
146
+ .option('--uses <number>', 'Max number of uses (default: 5)')
147
+ .action(async (options) => {
148
+ try {
149
+ await shareCommand(options);
150
+ } catch (err) {
151
+ console.error(chalk.red('\n✖ Error during share:'), err.message);
152
+ process.exit(1);
153
+ }
154
+ });
155
+
134
156
  program
135
157
  .command('status')
136
158
  .description('See what AI tools are on this machine')
@@ -219,7 +241,6 @@ program
219
241
 
220
242
  program
221
243
  .command('update')
222
- .alias('upgrade')
223
244
  .description('Update memoir to the latest version')
224
245
  .action(async () => {
225
246
  try {
@@ -257,6 +278,19 @@ program
257
278
  }
258
279
  });
259
280
 
281
+ program
282
+ .command('upgrade')
283
+ .alias('pro')
284
+ .description('View plans and upgrade your memoir subscription')
285
+ .action(async () => {
286
+ try {
287
+ await upgradeCommand();
288
+ } catch (err) {
289
+ console.error(chalk.red('\n✖ Error:'), err.message);
290
+ process.exit(1);
291
+ }
292
+ });
293
+
260
294
  program
261
295
  .command('encrypt')
262
296
  .description('Toggle E2E encryption for your backups')
@@ -432,6 +466,47 @@ profile
432
466
  }
433
467
  });
434
468
 
469
+ // Project tracker
470
+ const projects = program.command('projects').alias('p').description('Track and manage your projects');
471
+
472
+ projects
473
+ .command('list', { isDefault: true })
474
+ .alias('ls')
475
+ .description('List all projects with recent activity')
476
+ .option('--all', 'Show all projects (default: top 15)')
477
+ .option('-v, --verbose', 'Show more commits and todos')
478
+ .option('--json', 'Output as JSON')
479
+ .action(async (options) => {
480
+ try {
481
+ await projectsListCommand(options);
482
+ } catch (err) {
483
+ console.error(chalk.red('\n✖ Error:'), err.message);
484
+ process.exit(1);
485
+ }
486
+ });
487
+
488
+ projects
489
+ .command('todo <project> [text]')
490
+ .description('Add or manage todos for a project')
491
+ .option('--done <index>', 'Mark a todo as done by number')
492
+ .option('--clear', 'Clear all todos for this project')
493
+ .action(async (project, text, options) => {
494
+ try {
495
+ await projectsTodoCommand(project, text, options);
496
+ } catch (err) {
497
+ console.error(chalk.red('\n✖ Error:'), err.message);
498
+ process.exit(1);
499
+ }
500
+ });
501
+
502
+ program
503
+ .command('mcp')
504
+ .description('Start the MCP server (for Claude Code, Cursor, VS Code integration)')
505
+ .action(async () => {
506
+ // Import and run the MCP server directly
507
+ await import('../src/mcp.js');
508
+ });
509
+
435
510
  program.hook('postAction', async () => {
436
511
  await checkForUpdate();
437
512
  });
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "memoir-cli",
3
- "version": "3.1.1",
3
+ "version": "3.2.0",
4
4
  "description": "Sync AI memory across devices. Back up and restore Claude, Gemini, Codex, Cursor, Copilot, Windsurf configs. Snapshot coding sessions and resume on another machine. Migrate instructions between AI assistants.",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
7
7
  "bin": {
8
- "memoir": "bin/memoir.js"
8
+ "memoir": "bin/memoir.js",
9
+ "memoir-mcp": "src/mcp.js"
9
10
  },
10
11
  "repository": {
11
12
  "type": "git",
@@ -52,17 +53,21 @@
52
53
  "context-sync",
53
54
  "session-handoff",
54
55
  "snapshot",
55
- "resume"
56
+ "resume",
57
+ "mcp",
58
+ "mcp-server",
59
+ "model-context-protocol"
56
60
  ],
57
61
  "author": "camgitt",
58
62
  "license": "MIT",
59
63
  "dependencies": {
64
+ "@modelcontextprotocol/sdk": "^1.28.0",
60
65
  "boxen": "^7.1.1",
61
66
  "chalk": "^5.3.0",
62
67
  "commander": "^12.0.0",
63
68
  "fs-extra": "^11.2.0",
64
69
  "gradient-string": "^3.0.0",
65
70
  "inquirer": "^9.2.15",
66
- "ora": "^7.0.1"
71
+ "ora": "^7.0.1"
67
72
  }
68
73
  }