@graspful/cli 0.1.0 → 0.2.1

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 (48) hide show
  1. package/README.md +315 -0
  2. package/dist/commands/describe.js +2 -2
  3. package/dist/commands/describe.js.map +1 -1
  4. package/dist/commands/fill-concept.js +2 -2
  5. package/dist/commands/fill-concept.js.map +1 -1
  6. package/dist/commands/init.d.ts +3 -0
  7. package/dist/commands/init.d.ts.map +1 -0
  8. package/dist/commands/init.js +216 -0
  9. package/dist/commands/init.js.map +1 -0
  10. package/dist/commands/login.d.ts.map +1 -1
  11. package/dist/commands/login.js +3 -2
  12. package/dist/commands/login.js.map +1 -1
  13. package/dist/commands/register.d.ts +3 -0
  14. package/dist/commands/register.d.ts.map +1 -0
  15. package/dist/commands/register.js +52 -0
  16. package/dist/commands/register.js.map +1 -0
  17. package/dist/commands/review.d.ts.map +1 -1
  18. package/dist/commands/review.js +3 -3
  19. package/dist/commands/review.js.map +1 -1
  20. package/dist/commands/validate.js +4 -4
  21. package/dist/commands/validate.js.map +1 -1
  22. package/dist/index.js +4 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/lib/auth.d.ts +1 -0
  25. package/dist/lib/auth.d.ts.map +1 -1
  26. package/dist/lib/auth.js +13 -2
  27. package/dist/lib/auth.js.map +1 -1
  28. package/package.json +9 -2
  29. package/dist/quality-gate.d.ts +0 -21
  30. package/dist/quality-gate.d.ts.map +0 -1
  31. package/dist/quality-gate.js +0 -16
  32. package/dist/quality-gate.js.map +0 -1
  33. package/dist/schemas/academy-manifest.schema.d.ts +0 -164
  34. package/dist/schemas/academy-manifest.schema.d.ts.map +0 -1
  35. package/dist/schemas/academy-manifest.schema.js +0 -70
  36. package/dist/schemas/academy-manifest.schema.js.map +0 -1
  37. package/dist/schemas/brand-yaml.schema.d.ts +0 -652
  38. package/dist/schemas/brand-yaml.schema.d.ts.map +0 -1
  39. package/dist/schemas/brand-yaml.schema.js +0 -97
  40. package/dist/schemas/brand-yaml.schema.js.map +0 -1
  41. package/dist/schemas/course-yaml.schema.d.ts +0 -1794
  42. package/dist/schemas/course-yaml.schema.d.ts.map +0 -1
  43. package/dist/schemas/course-yaml.schema.js +0 -161
  44. package/dist/schemas/course-yaml.schema.js.map +0 -1
  45. package/dist/schemas/index.d.ts +0 -4
  46. package/dist/schemas/index.d.ts.map +0 -1
  47. package/dist/schemas/index.js +0 -20
  48. package/dist/schemas/index.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,315 @@
1
+ # @graspful/cli
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@graspful/cli)](https://www.npmjs.com/package/@graspful/cli)
4
+ [![license](https://img.shields.io/npm/l/@graspful/cli)](https://github.com/willwearing/graspful/blob/main/LICENSE)
5
+
6
+ CLI for creating adaptive learning courses from YAML knowledge graphs. Designed for AI agents and humans. Two YAML files in, live course product out -- with adaptive learning, spaced repetition, and Stripe billing.
7
+
8
+ ## Quick Start
9
+
10
+ ```bash
11
+ # 1. Create an account (gets you an org + API key)
12
+ npx @graspful/cli register --email you@example.com --password your-password
13
+
14
+ # 2. Scaffold a course
15
+ npx @graspful/cli create course --topic "CKA Exam" -o cka.yaml
16
+
17
+ # 3. Validate and review
18
+ npx @graspful/cli validate cka.yaml
19
+ npx @graspful/cli review cka.yaml
20
+
21
+ # 4. Import and publish
22
+ npx @graspful/cli import cka.yaml --org <your-org> --publish
23
+ ```
24
+
25
+ Steps 2-3 work offline — no account needed. You only need to register before importing or publishing.
26
+
27
+ ## Install
28
+
29
+ ```bash
30
+ # Zero-config (recommended)
31
+ npx @graspful/cli <command>
32
+
33
+ # Or install globally
34
+ bun add -g @graspful/cli
35
+ # npm install -g @graspful/cli
36
+ ```
37
+
38
+ ## Why Graspful
39
+
40
+ - **Agent-first.** CLI + MCP server. AI agents create courses as well as humans -- faster.
41
+ - **YAML-native.** Course content is a YAML knowledge graph. Version it, diff it, review it, generate it.
42
+ - **Adaptive learning.** Bayesian Knowledge Tracing, spaced repetition (FIRe algorithm), mastery-based progression. Built in, not bolted on.
43
+ - **White-label.** Brand YAML defines theme, landing page, domain, and Stripe config. Each brand is its own product.
44
+ - **Revenue share.** Creators keep revenue. Graspful handles infrastructure.
45
+
46
+ ## The Two-YAML Workflow
47
+
48
+ Graspful turns two YAML files into a live learning product:
49
+
50
+ ```
51
+ course.yaml ──┐
52
+ ├──▶ graspful import ──▶ Live adaptive course
53
+ brand.yaml ──┘ with billing, analytics,
54
+ and spaced repetition
55
+ ```
56
+
57
+ **Course YAML** defines what learners study: concepts, prerequisite graph, knowledge points, practice problems, section exams.
58
+
59
+ **Brand YAML** defines how the product looks: name, domain, theme, landing page, pricing, Stripe config.
60
+
61
+ ## Commands
62
+
63
+ | Command | Description |
64
+ |---------|-------------|
65
+ | `graspful create course` | Generate a course YAML skeleton with knowledge graph structure |
66
+ | `graspful create brand` | Generate a brand YAML with theme presets |
67
+ | `graspful fill concept` | Add knowledge points and practice problems to a concept |
68
+ | `graspful validate` | Offline schema + DAG validation (no API needed) |
69
+ | `graspful review` | Run 10 mechanical quality checks, returns score X/10 |
70
+ | `graspful describe` | Course statistics (concepts, KPs, problems, depth, gaps) |
71
+ | `graspful import` | Push YAML to a Graspful instance |
72
+ | `graspful publish` | Publish a draft course (must pass quality gate) |
73
+ | `graspful login` | Authenticate via API key or JWT |
74
+
75
+ ### `graspful create course`
76
+
77
+ Generate a course YAML scaffold with sections, concepts, and prerequisite edges. The scaffold has no learning content -- just the graph structure with TODO placeholders.
78
+
79
+ ```bash
80
+ graspful create course \
81
+ --topic "AWS Solutions Architect" \
82
+ --hours 40 \
83
+ --source "AWS SAA-C03 Exam Guide" \
84
+ -o aws-saa.yaml
85
+ ```
86
+
87
+ | Flag | Description | Default |
88
+ |------|-------------|---------|
89
+ | `--topic` | Course topic (required) | -- |
90
+ | `--hours` | Estimated total hours | `10` |
91
+ | `--source` | Source document reference | -- |
92
+ | `-o, --output` | Output file path | stdout |
93
+
94
+ ### `graspful create brand`
95
+
96
+ Generate a brand YAML scaffold. Niche presets: `education`, `healthcare`, `finance`, `tech`, `legal`.
97
+
98
+ ```bash
99
+ graspful create brand --niche tech --name "DevOps Academy" --org devops-co
100
+ ```
101
+
102
+ ### `graspful fill concept`
103
+
104
+ Add knowledge point and problem stubs to a concept. Each stub includes instruction, worked example, and problem placeholders with a difficulty staircase.
105
+
106
+ ```bash
107
+ graspful fill concept course.yaml networking --kps 3 --problems 4
108
+ ```
109
+
110
+ | Flag | Description | Default |
111
+ |------|-------------|---------|
112
+ | `--kps` | Number of KP stubs | `2` |
113
+ | `--problems` | Problems per KP | `3` |
114
+
115
+ Fails if the concept already has KPs (prevents accidental overwrites).
116
+
117
+ ### `graspful validate`
118
+
119
+ Validate course, brand, or academy YAML against its Zod schema. Auto-detects file type. For courses, also checks that all prerequisite references resolve and the graph is acyclic (DAG).
120
+
121
+ **Runs offline -- no API needed.** Agents should validate after every edit.
122
+
123
+ ```bash
124
+ graspful validate course.yaml
125
+ graspful validate brand.yaml
126
+ ```
127
+
128
+ ### `graspful review`
129
+
130
+ Run 10 mechanical quality checks. All 10 must pass to publish.
131
+
132
+ ```bash
133
+ graspful review course.yaml
134
+ # Score: 10/10
135
+ # Stats: 42 concepts (12 authored, 30 stubs), 24 KPs, 89 problems
136
+ ```
137
+
138
+ The 10 checks:
139
+
140
+ | # | Check | What it verifies |
141
+ |---|-------|-----------------|
142
+ | 1 | `yaml_parses` | Valid Zod schema |
143
+ | 2 | `unique_problem_ids` | No duplicate problem IDs |
144
+ | 3 | `prerequisites_valid` | All prerequisite refs point to real concepts |
145
+ | 4 | `question_deduplication` | No near-duplicate questions at same difficulty |
146
+ | 5 | `difficulty_staircase` | Each concept has problems at 2+ difficulty levels |
147
+ | 6 | `cross_concept_coverage` | No single term dominates too many concepts |
148
+ | 7 | `problem_variant_depth` | Each KP has 3+ problems |
149
+ | 8 | `instruction_formatting` | Long instructions (100+ words) use content blocks |
150
+ | 9 | `worked_example_coverage` | 50%+ of authored concepts have worked examples |
151
+ | 10 | `import_dry_run` | DAG is valid (no cycles, valid refs) |
152
+
153
+ ### `graspful describe`
154
+
155
+ Show course statistics: concept counts, KP counts, problem counts, graph depth, section breakdown, and missing content.
156
+
157
+ ```bash
158
+ graspful describe course.yaml
159
+ ```
160
+
161
+ ### `graspful import`
162
+
163
+ Push a course or brand YAML to a Graspful instance. Requires authentication.
164
+
165
+ ```bash
166
+ graspful import course.yaml --org acme-learning
167
+ graspful import course.yaml --org acme-learning --publish
168
+ ```
169
+
170
+ | Flag | Description | Default |
171
+ |------|-------------|---------|
172
+ | `--org` | Organization slug (required for courses) | -- |
173
+ | `--publish` | Publish immediately (runs review gate) | `false` |
174
+
175
+ ### `graspful publish`
176
+
177
+ Publish a draft course. Server runs the review gate -- all 10 quality checks must pass.
178
+
179
+ ```bash
180
+ graspful publish <courseId> --org acme-learning
181
+ ```
182
+
183
+ ### `graspful login`
184
+
185
+ Authenticate with a Graspful instance.
186
+
187
+ ```bash
188
+ graspful login # Interactive prompt
189
+ graspful login --token gsk_abc123 # Non-interactive (for CI)
190
+ ```
191
+
192
+ ## Output Formats
193
+
194
+ Human-readable by default. Pass `--format json` for machine-readable output (useful for agents and CI).
195
+
196
+ ```bash
197
+ # Human-readable (default)
198
+ graspful validate course.yaml
199
+ # PASS course validation
200
+ # concepts: 42
201
+ # knowledgePoints: 89
202
+ # problems: 267
203
+
204
+ # JSON for agents
205
+ graspful validate course.yaml --format json
206
+ # {"valid":true,"fileType":"course","errors":[],"stats":{"concepts":42,"knowledgePoints":89,"problems":267}}
207
+ ```
208
+
209
+ ## Agent Workflow
210
+
211
+ The typical agent loop:
212
+
213
+ 1. **Scaffold** -- `graspful create course --topic "X"` to generate the graph skeleton
214
+ 2. **Edit** -- modify the YAML to add concepts, adjust prerequisites and difficulty levels
215
+ 3. **Fill** -- `graspful fill concept` for each concept to add KP/problem stubs
216
+ 4. **Author** -- replace TODO placeholders with real instructions, worked examples, and problems
217
+ 5. **Validate** -- `graspful validate` after each edit (offline, fast)
218
+ 6. **Review** -- `graspful review` to run all 10 quality checks
219
+ 7. **Import** -- `graspful import --org <org> --publish` when review passes 10/10
220
+
221
+ ## MCP Server
222
+
223
+ For deeper AI agent integration, use the companion MCP server [`@graspful/mcp`](https://www.npmjs.com/package/@graspful/mcp). It exposes all CLI functionality as MCP tools for Claude Code, Cursor, Codex, Windsurf, and any MCP-compatible client.
224
+
225
+ ```json
226
+ {
227
+ "mcpServers": {
228
+ "graspful": {
229
+ "command": "npx",
230
+ "args": ["@graspful/mcp"]
231
+ }
232
+ }
233
+ }
234
+ ```
235
+
236
+ ## Course YAML Structure
237
+
238
+ A course YAML defines a knowledge graph: concepts connected by prerequisite edges, each containing knowledge points with practice problems.
239
+
240
+ ```yaml
241
+ course:
242
+ id: javascript-fundamentals
243
+ name: "JavaScript Fundamentals"
244
+ description: "Core JS concepts from variables through async patterns."
245
+ estimatedHours: 30
246
+ version: "2024.1"
247
+ sourceDocument: "ECMA-262"
248
+
249
+ concepts:
250
+ - id: variables-and-declarations
251
+ name: "Variables and Declarations"
252
+ difficulty: 1
253
+ estimatedMinutes: 15
254
+ tags: [s01-basics, foundational]
255
+ prerequisites: []
256
+ knowledgePoints:
257
+ - id: let-const-var-differences
258
+ instruction: "JavaScript has three ways to declare variables..."
259
+ workedExample: "Consider: const obj = {a: 1}; obj.a = 2; ..."
260
+ problems:
261
+ - id: var-decl-p1
262
+ type: multiple_choice
263
+ question: "What happens when you access a let variable before its declaration?"
264
+ options: ["Returns undefined", "ReferenceError", "Returns null", "Creates global"]
265
+ correct: 1
266
+ explanation: "let/const have a temporal dead zone..."
267
+
268
+ - id: closures
269
+ name: "Closures"
270
+ difficulty: 4
271
+ estimatedMinutes: 25
272
+ tags: [s02-functions]
273
+ prerequisites: [variables-and-declarations]
274
+ knowledgePoints: [] # TODO: fill with graspful fill concept
275
+
276
+ sections:
277
+ - id: s01-basics
278
+ name: "Language Basics"
279
+ concepts: [variables-and-declarations]
280
+ - id: s02-functions
281
+ name: "Functions"
282
+ concepts: [closures]
283
+ ```
284
+
285
+ ## Authentication
286
+
287
+ Two modes:
288
+
289
+ **API key (agents/CI)** -- set `GRASPFUL_API_KEY` as an environment variable.
290
+
291
+ **Interactive (humans)** -- run `graspful login`.
292
+
293
+ ```bash
294
+ # Agent mode
295
+ export GRASPFUL_API_KEY=gsk_...
296
+ graspful import course.yaml --org my-org
297
+
298
+ # Human mode
299
+ graspful login
300
+ graspful import course.yaml --org my-org
301
+ ```
302
+
303
+ ## Environment Variables
304
+
305
+ | Variable | Description |
306
+ |----------|-------------|
307
+ | `GRASPFUL_API_KEY` | API key for authenticated commands (`import`, `publish`) |
308
+ | `GRASPFUL_API_URL` | API base URL (default: `https://api.graspful.ai`) |
309
+
310
+ ## Links
311
+
312
+ - [Website](https://graspful.ai)
313
+ - [GitHub](https://github.com/willwearing/graspful)
314
+ - [MCP Server (`@graspful/mcp`)](https://www.npmjs.com/package/@graspful/mcp)
315
+ - [Content Authoring Guide](https://github.com/willwearing/graspful/tree/main/content)
@@ -36,7 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.registerDescribeCommand = registerDescribeCommand;
37
37
  const fs = __importStar(require("fs"));
38
38
  const yaml = __importStar(require("js-yaml"));
39
- const schemas_1 = require("../schemas");
39
+ const shared_1 = require("@graspful/shared");
40
40
  const output_1 = require("../lib/output");
41
41
  function computeGraphDepth(concepts) {
42
42
  const graph = new Map();
@@ -85,7 +85,7 @@ function registerDescribeCommand(program) {
85
85
  (0, output_1.outputError)(`YAML parse error: ${msg}`);
86
86
  process.exit(1);
87
87
  }
88
- const result = schemas_1.CourseYamlSchema.safeParse(raw);
88
+ const result = shared_1.CourseYamlSchema.safeParse(raw);
89
89
  if (!result.success) {
90
90
  (0, output_1.outputError)(`Invalid course YAML: ${result.error.issues[0]?.message ?? 'unknown error'}`);
91
91
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.registerFillConceptCommand = registerFillConceptCommand;
37
37
  const fs = __importStar(require("fs"));
38
38
  const yaml = __importStar(require("js-yaml"));
39
- const schemas_1 = require("../schemas");
39
+ const shared_1 = require("@graspful/shared");
40
40
  const output_1 = require("../lib/output");
41
41
  function registerFillConceptCommand(program) {
42
42
  const fill = program
@@ -62,7 +62,7 @@ function registerFillConceptCommand(program) {
62
62
  (0, output_1.outputError)(`YAML parse error: ${msg}`);
63
63
  process.exit(1);
64
64
  }
65
- const parsed = schemas_1.CourseYamlSchema.safeParse(raw);
65
+ const parsed = shared_1.CourseYamlSchema.safeParse(raw);
66
66
  if (!parsed.success) {
67
67
  (0, output_1.outputError)(`Invalid course YAML: ${parsed.error.issues[0]?.message ?? 'unknown error'}`);
68
68
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"fill-concept.js","sourceRoot":"","sources":["../../src/commands/fill-concept.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fill-concept.js","sourceRoot":"","sources":["../../src/commands/fill-concept.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4FpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA+GnD"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerInitCommand = registerInitCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const readline = __importStar(require("readline"));
41
+ const auth_1 = require("../lib/auth");
42
+ const output_1 = require("../lib/output");
43
+ function detectEditors() {
44
+ const home = os.homedir();
45
+ const editors = [];
46
+ // Claude Code
47
+ const claudeConfig = path.join(home, '.claude.json');
48
+ if (fs.existsSync(path.join(home, '.claude'))) {
49
+ editors.push({ name: 'Claude Code', configPath: claudeConfig });
50
+ }
51
+ // Cursor
52
+ const cursorConfig = path.join(process.cwd(), '.cursor', 'mcp.json');
53
+ if (fs.existsSync(path.join(process.cwd(), '.cursor'))) {
54
+ editors.push({ name: 'Cursor', configPath: cursorConfig });
55
+ }
56
+ // VS Code Copilot (agent mode)
57
+ const vscodeConfig = path.join(process.cwd(), '.vscode', 'mcp.json');
58
+ if (fs.existsSync(path.join(process.cwd(), '.vscode'))) {
59
+ editors.push({ name: 'VS Code', configPath: vscodeConfig });
60
+ }
61
+ // Windsurf
62
+ const windsurfConfig = path.join(home, '.windsurf', 'mcp.json');
63
+ if (fs.existsSync(path.join(home, '.windsurf'))) {
64
+ editors.push({ name: 'Windsurf', configPath: windsurfConfig });
65
+ }
66
+ return editors;
67
+ }
68
+ function writeMcpConfig(configPath, apiKey) {
69
+ const dir = path.dirname(configPath);
70
+ if (!fs.existsSync(dir)) {
71
+ fs.mkdirSync(dir, { recursive: true });
72
+ }
73
+ let existing = {};
74
+ if (fs.existsSync(configPath)) {
75
+ try {
76
+ existing = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
77
+ }
78
+ catch {
79
+ // Start fresh if invalid
80
+ }
81
+ }
82
+ const mcpServers = (existing.mcpServers || {});
83
+ mcpServers['graspful'] = {
84
+ command: 'npx',
85
+ args: ['-y', '@graspful/mcp'],
86
+ env: { GRASPFUL_API_KEY: apiKey },
87
+ };
88
+ existing.mcpServers = mcpServers;
89
+ fs.writeFileSync(configPath, JSON.stringify(existing, null, 2) + '\n');
90
+ }
91
+ // ─── Interactive prompt ──────────────────────────────────────────────────────
92
+ function prompt(question) {
93
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
94
+ return new Promise((resolve) => {
95
+ rl.question(question, (answer) => {
96
+ rl.close();
97
+ resolve(answer.trim());
98
+ });
99
+ });
100
+ }
101
+ function registerInitCommand(program) {
102
+ program
103
+ .command('init')
104
+ .description('Set up Graspful: register, save credentials, configure MCP for your editor')
105
+ .option('--email <email>', 'Email address (skip interactive prompt)')
106
+ .option('--password <password>', 'Password (skip interactive prompt)')
107
+ .option('--api-url <url>', 'API base URL')
108
+ .option('--no-mcp', 'Skip MCP configuration')
109
+ .action(async (opts) => {
110
+ const baseUrl = (opts.apiUrl || (0, auth_1.getBaseUrl)()).replace(/\/$/, '');
111
+ // ── Check if already authenticated ──────────────────────────────────
112
+ const existingCreds = (0, auth_1.resolveCredentials)();
113
+ if (existingCreds.apiKey) {
114
+ console.log('Already authenticated (credentials found).');
115
+ console.log('Skipping registration. To re-register, delete ~/.graspful/credentials.json first.');
116
+ // Still configure MCP if requested
117
+ if (opts.mcp) {
118
+ configureMcp(existingCreds.apiKey);
119
+ }
120
+ (0, output_1.output)({ authenticated: true, baseUrl }, 'Ready. Run graspful create course --topic "Your Topic" to get started.');
121
+ return;
122
+ }
123
+ // ── Get email and password ──────────────────────────────────────────
124
+ let email = opts.email;
125
+ let password = opts.password;
126
+ if (!email || !password) {
127
+ if (!process.stdin.isTTY) {
128
+ (0, output_1.outputError)('Non-interactive mode requires --email and --password flags.');
129
+ process.exit(1);
130
+ }
131
+ console.log('Welcome to Graspful! Let\'s get you set up.\n');
132
+ if (!email) {
133
+ email = await prompt('Email: ');
134
+ }
135
+ if (!password) {
136
+ password = await prompt('Password: ');
137
+ }
138
+ }
139
+ if (!email || !password) {
140
+ (0, output_1.outputError)('Email and password are required.');
141
+ process.exit(1);
142
+ }
143
+ // ── Register ────────────────────────────────────────────────────────
144
+ try {
145
+ const res = await fetch(`${baseUrl}/api/v1/auth/register`, {
146
+ method: 'POST',
147
+ headers: { 'Content-Type': 'application/json' },
148
+ body: JSON.stringify({ email, password }),
149
+ });
150
+ if (!res.ok) {
151
+ const body = await res.text();
152
+ let message = `Registration failed (${res.status})`;
153
+ try {
154
+ const parsed = JSON.parse(body);
155
+ if (parsed.message)
156
+ message = parsed.message;
157
+ }
158
+ catch {
159
+ if (body)
160
+ message = body;
161
+ }
162
+ (0, output_1.outputError)(message);
163
+ process.exit(1);
164
+ }
165
+ const data = (await res.json());
166
+ // Save credentials
167
+ (0, auth_1.saveApiKeyCredentials)(data.apiKey, baseUrl);
168
+ console.log(`\nAccount created!`);
169
+ console.log(` Org: ${data.orgSlug}`);
170
+ console.log(` API key: ${data.apiKey} (saved to ~/.graspful/credentials.json)`);
171
+ // ── Configure MCP ───────────────────────────────────────────────
172
+ if (opts.mcp) {
173
+ configureMcp(data.apiKey);
174
+ }
175
+ (0, output_1.output)({
176
+ userId: data.userId,
177
+ orgSlug: data.orgSlug,
178
+ apiKey: data.apiKey,
179
+ baseUrl,
180
+ }, [
181
+ '',
182
+ 'You\'re ready. Next steps:',
183
+ ` graspful create course --topic "Your Topic" -o course.yaml`,
184
+ ` graspful fill concept course.yaml <concept-id>`,
185
+ ` graspful review course.yaml`,
186
+ ` graspful import course.yaml --org ${data.orgSlug} --publish`,
187
+ ].join('\n'));
188
+ }
189
+ catch (e) {
190
+ const msg = e instanceof Error ? e.message : String(e);
191
+ (0, output_1.outputError)(`Registration failed: ${msg}`);
192
+ process.exit(1);
193
+ }
194
+ });
195
+ }
196
+ function configureMcp(apiKey) {
197
+ const editors = detectEditors();
198
+ if (editors.length === 0) {
199
+ console.log('\nNo supported editors detected. Add MCP manually:');
200
+ console.log(JSON.stringify({
201
+ mcpServers: {
202
+ graspful: {
203
+ command: 'npx',
204
+ args: ['-y', '@graspful/mcp'],
205
+ env: { GRASPFUL_API_KEY: apiKey },
206
+ },
207
+ },
208
+ }, null, 2));
209
+ return;
210
+ }
211
+ for (const editor of editors) {
212
+ writeMcpConfig(editor.configPath, apiKey);
213
+ console.log(`\nMCP configured for ${editor.name}: ${editor.configPath}`);
214
+ }
215
+ }
216
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAqCpD"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAsCpD"}
@@ -49,11 +49,11 @@ function prompt(question) {
49
49
  function registerLoginCommand(program) {
50
50
  program
51
51
  .command('login')
52
- .description('Authenticate with a Graspful instance')
52
+ .description('Authenticate with a Graspful instance (use "graspful register" for new accounts)')
53
53
  .option('--api-url <url>', 'API base URL')
54
54
  .option('--token <token>', 'API key or JWT token (skip interactive prompt)')
55
55
  .action(async (opts) => {
56
- const baseUrl = opts.apiUrl || (0, auth_1.getBaseUrl)();
56
+ const baseUrl = (opts.apiUrl || (0, auth_1.getBaseUrl)()).replace(/\/$/, '');
57
57
  let token = opts.token;
58
58
  if (!token) {
59
59
  if (!process.stdin.isTTY) {
@@ -67,6 +67,7 @@ function registerLoginCommand(program) {
67
67
  else {
68
68
  console.log(`Authenticating with ${baseUrl}`);
69
69
  console.log('Enter your API key or JWT token:');
70
+ console.log('(New user? Run "graspful register" instead.)');
70
71
  token = await prompt('> ');
71
72
  }
72
73
  }