@graspful/cli 0.2.6 → 0.2.7
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 +44 -19
- package/dist/commands/create-academy.d.ts +3 -0
- package/dist/commands/create-academy.d.ts.map +1 -0
- package/dist/commands/create-academy.js +73 -0
- package/dist/commands/create-academy.js.map +1 -0
- package/dist/commands/create-brand.d.ts.map +1 -1
- package/dist/commands/create-brand.js +2 -0
- package/dist/commands/create-brand.js.map +1 -1
- package/dist/commands/fill-concept.js +1 -1
- package/dist/commands/fill-concept.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +79 -14
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +13 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +27 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +3 -0
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +12 -1
- package/dist/commands/review.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/analytics.d.ts +2 -0
- package/dist/lib/analytics.d.ts.map +1 -1
- package/dist/lib/analytics.js +92 -4
- package/dist/lib/analytics.js.map +1 -1
- package/dist/lib/auth.d.ts +2 -1
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +13 -5
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/browser-auth.d.ts +1 -0
- package/dist/lib/browser-auth.d.ts.map +1 -1
- package/dist/lib/browser-auth.js +2 -1
- package/dist/lib/browser-auth.js.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@graspful/cli)
|
|
4
4
|
[](https://github.com/willwearing/graspful/blob/main/LICENSE)
|
|
5
5
|
|
|
6
|
-
CLI for creating adaptive learning courses from YAML knowledge graphs. Designed for AI agents and humans.
|
|
6
|
+
CLI for creating adaptive learning academies and courses from YAML knowledge graphs. Designed for AI agents and humans. Academy manifest + course YAMLs + brand YAML in, live adaptive product out.
|
|
7
7
|
|
|
8
8
|
## Quick Start
|
|
9
9
|
|
|
@@ -11,15 +11,16 @@ CLI for creating adaptive learning courses from YAML knowledge graphs. Designed
|
|
|
11
11
|
# 1. Create an account (opens browser auth, then saves an API key locally)
|
|
12
12
|
npx @graspful/cli register
|
|
13
13
|
|
|
14
|
-
# 2. Scaffold
|
|
15
|
-
npx @graspful/cli create
|
|
14
|
+
# 2. Scaffold the academy plan and first course
|
|
15
|
+
npx @graspful/cli create academy --topic "CKA Exam" -o cka-academy.yaml
|
|
16
|
+
npx @graspful/cli create course --topic "CKA Exam Foundations" -o cka.yaml
|
|
16
17
|
|
|
17
18
|
# 3. Validate and review
|
|
18
19
|
npx @graspful/cli validate cka.yaml
|
|
19
20
|
npx @graspful/cli review cka.yaml
|
|
20
21
|
|
|
21
22
|
# 4. Import and publish
|
|
22
|
-
npx @graspful/cli import cka.yaml --org <your-org> --publish
|
|
23
|
+
npx @graspful/cli import cka-academy.yaml --org <your-org> --course-dir . --publish
|
|
23
24
|
```
|
|
24
25
|
|
|
25
26
|
Steps 2-3 work offline — no account needed. You only need to authenticate before importing or publishing.
|
|
@@ -45,13 +46,13 @@ bun add -g @graspful/cli
|
|
|
45
46
|
|
|
46
47
|
## The Two-YAML Workflow
|
|
47
48
|
|
|
48
|
-
Graspful turns
|
|
49
|
+
Graspful turns an academy manifest, course YAMLs, and a brand YAML into a live learning product:
|
|
49
50
|
|
|
50
51
|
```
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
academy.yaml ──┐
|
|
53
|
+
course.yaml ──┼──▶ graspful import ──▶ Live adaptive academy
|
|
53
54
|
brand.yaml ──┘ with billing, analytics,
|
|
54
|
-
and
|
|
55
|
+
spaced repetition, and a landing page
|
|
55
56
|
```
|
|
56
57
|
|
|
57
58
|
**Course YAML** defines what learners study: concepts, prerequisite graph, knowledge points, practice problems, section exams.
|
|
@@ -62,6 +63,7 @@ brand.yaml ──┘ with billing, analytics,
|
|
|
62
63
|
|
|
63
64
|
| Command | Description |
|
|
64
65
|
|---------|-------------|
|
|
66
|
+
| `graspful create academy` | Generate an academy plan and manifest scaffold |
|
|
65
67
|
| `graspful create course` | Generate a course YAML skeleton with knowledge graph structure |
|
|
66
68
|
| `graspful create brand` | Generate a brand YAML with theme presets |
|
|
67
69
|
| `graspful fill concept` | Add knowledge points and practice problems to a concept |
|
|
@@ -91,12 +93,26 @@ graspful create course \
|
|
|
91
93
|
| `--source` | Source document reference | -- |
|
|
92
94
|
| `-o, --output` | Output file path | stdout |
|
|
93
95
|
|
|
96
|
+
### `graspful create academy`
|
|
97
|
+
|
|
98
|
+
Generate an academy plan and manifest scaffold. Every Graspful product should be modeled as an academy, even if it starts with a single course.
|
|
99
|
+
|
|
100
|
+
If you do not pass `--course`, the scaffold starts with the four default planning layers: foundations, core structures, operational flows, and applied judgment. It also includes authoring gates for the source material, learner promise, landing-page proof, graph checks, and review before publishing.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
graspful create academy \
|
|
104
|
+
--topic "PostHog TAM" \
|
|
105
|
+
--course "Data Models" \
|
|
106
|
+
--course "Pipeline Reading and Solution Design" \
|
|
107
|
+
-o posthog-tam-academy.yaml
|
|
108
|
+
```
|
|
109
|
+
|
|
94
110
|
### `graspful create brand`
|
|
95
111
|
|
|
96
112
|
Generate a brand YAML scaffold. Niche presets: `education`, `healthcare`, `finance`, `tech`, `legal`.
|
|
97
113
|
|
|
98
114
|
```bash
|
|
99
|
-
graspful create brand --niche tech --name "
|
|
115
|
+
graspful create brand --niche tech --topic "PostHog TAM" --name "TAM Academy" --org tam-academy
|
|
100
116
|
```
|
|
101
117
|
|
|
102
118
|
### `graspful fill concept`
|
|
@@ -109,7 +125,7 @@ graspful fill concept course.yaml networking --kps 3 --problems 4
|
|
|
109
125
|
|
|
110
126
|
| Flag | Description | Default |
|
|
111
127
|
|------|-------------|---------|
|
|
112
|
-
| `--kps` | Number of KP stubs | `
|
|
128
|
+
| `--kps` | Number of KP stubs (starting point, not a cap) | `3` |
|
|
113
129
|
| `--problems` | Problems per KP | `3` |
|
|
114
130
|
|
|
115
131
|
Fails if the concept already has KPs (prevents accidental overwrites).
|
|
@@ -144,7 +160,7 @@ The 10 checks:
|
|
|
144
160
|
| 3 | `prerequisites_valid` | All prerequisite refs point to real concepts |
|
|
145
161
|
| 4 | `question_deduplication` | No near-duplicate questions at same difficulty |
|
|
146
162
|
| 5 | `difficulty_staircase` | Each concept has problems at 2+ difficulty levels |
|
|
147
|
-
| 6 | `
|
|
163
|
+
| 6 | `problem_teaching_alignment` | Problems only assess material introduced in the lesson path |
|
|
148
164
|
| 7 | `problem_variant_depth` | Each KP has 3+ problems |
|
|
149
165
|
| 8 | `instruction_formatting` | Long instructions (100+ words) use content blocks |
|
|
150
166
|
| 9 | `worked_example_coverage` | 50%+ of authored concepts have worked examples |
|
|
@@ -160,17 +176,19 @@ graspful describe course.yaml
|
|
|
160
176
|
|
|
161
177
|
### `graspful import`
|
|
162
178
|
|
|
163
|
-
Push a course or brand YAML to a Graspful instance. Requires authentication.
|
|
179
|
+
Push a course, academy, or brand YAML to a Graspful instance. Requires authentication.
|
|
164
180
|
|
|
165
181
|
```bash
|
|
166
182
|
graspful import course.yaml --org acme-learning
|
|
167
183
|
graspful import course.yaml --org acme-learning --publish
|
|
184
|
+
graspful import academy.yaml --org acme-learning --course-dir . --publish
|
|
168
185
|
```
|
|
169
186
|
|
|
170
187
|
| Flag | Description | Default |
|
|
171
188
|
|------|-------------|---------|
|
|
172
189
|
| `--org` | Organization slug (required for courses) | -- |
|
|
173
190
|
| `--publish` | Publish immediately (runs review gate) | `false` |
|
|
191
|
+
| `--course-dir` | Base directory for academy course files | manifest directory |
|
|
174
192
|
|
|
175
193
|
### `graspful publish`
|
|
176
194
|
|
|
@@ -212,13 +230,16 @@ graspful validate course.yaml --format json
|
|
|
212
230
|
|
|
213
231
|
The typical agent loop:
|
|
214
232
|
|
|
215
|
-
1. **
|
|
216
|
-
2. **
|
|
217
|
-
3. **
|
|
218
|
-
4. **
|
|
219
|
-
5. **
|
|
220
|
-
6. **
|
|
221
|
-
7. **
|
|
233
|
+
1. **Define the academy** -- `graspful create academy --topic "X"` to establish the academy plan
|
|
234
|
+
2. **Decompose the topic** -- break it into foundations, structures, operations, and applied judgment
|
|
235
|
+
3. **Scaffold each course** -- `graspful create course` for every course in the academy
|
|
236
|
+
4. **Edit** -- modify YAML to add concepts, adjust prerequisites, and keep the graph layered
|
|
237
|
+
5. **Fill** -- `graspful fill concept` for each concept to add KP/problem stubs
|
|
238
|
+
6. **Author** -- replace TODO placeholders with real instructions, worked examples, and problems
|
|
239
|
+
7. **Build the landing page** -- use `graspful create brand --topic "X"` as a starting point, then replace generic copy with academy-specific proof and outcomes
|
|
240
|
+
8. **Validate** -- `graspful validate` after each edit (offline, fast)
|
|
241
|
+
9. **Review** -- `graspful review` to run all 10 quality checks
|
|
242
|
+
10. **Import** -- `graspful import academy.yaml --org <org> --course-dir . --publish` when review passes 10/10
|
|
222
243
|
|
|
223
244
|
## MCP Server
|
|
224
245
|
|
|
@@ -308,6 +329,10 @@ graspful import course.yaml --org my-org
|
|
|
308
329
|
|----------|-------------|
|
|
309
330
|
| `GRASPFUL_API_KEY` | API key for authenticated commands (`import`, `publish`) |
|
|
310
331
|
| `GRASPFUL_API_URL` | API base URL (default: `https://api.graspful.ai`) |
|
|
332
|
+
| `GRASPFUL_USER_ID` | Optional Graspful user ID for analytics identity continuity |
|
|
333
|
+
| `GRASPFUL_TELEMETRY_DISABLED` | Set to `1` to disable anonymous product analytics |
|
|
334
|
+
|
|
335
|
+
The CLI sends command usage and outcome metadata to help improve Graspful. It never sends API keys or YAML course bodies. Set `GRASPFUL_TELEMETRY_DISABLED=1` to disable this data collection.
|
|
311
336
|
|
|
312
337
|
## Links
|
|
313
338
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-academy.d.ts","sourceRoot":"","sources":["../../src/commands/create-academy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,OAAO,QA0C9D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
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.registerCreateAcademyCommand = registerCreateAcademyCommand;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const yaml = __importStar(require("js-yaml"));
|
|
39
|
+
const shared_1 = require("@graspful/shared");
|
|
40
|
+
const output_1 = require("../lib/output");
|
|
41
|
+
const analytics_1 = require("../lib/analytics");
|
|
42
|
+
function collect(value, previous) {
|
|
43
|
+
previous.push(value);
|
|
44
|
+
return previous;
|
|
45
|
+
}
|
|
46
|
+
function registerCreateAcademyCommand(createCmd) {
|
|
47
|
+
createCmd
|
|
48
|
+
.command('academy')
|
|
49
|
+
.description('Generate an academy plan and manifest scaffold')
|
|
50
|
+
.requiredOption('--topic <topic>', 'Academy topic name')
|
|
51
|
+
.option('--course <name>', 'Course name to include in the academy manifest (repeatable). Defaults to the four academy planning layers.', collect, [])
|
|
52
|
+
.option('--version <version>', 'Academy version', '2026.1')
|
|
53
|
+
.option('-o, --output <file>', 'Output file path (defaults to stdout)')
|
|
54
|
+
.action(async (opts) => {
|
|
55
|
+
const obj = (0, shared_1.scaffoldAcademyObject)(opts.topic, {
|
|
56
|
+
courseNames: opts.course,
|
|
57
|
+
version: opts.version,
|
|
58
|
+
});
|
|
59
|
+
const yamlContent = yaml.dump(obj, { lineWidth: 120, noRefs: true });
|
|
60
|
+
(0, analytics_1.cliCapture)('academy scaffolded', {
|
|
61
|
+
topic: opts.topic,
|
|
62
|
+
course_count: obj.courses.length,
|
|
63
|
+
});
|
|
64
|
+
if (opts.output) {
|
|
65
|
+
fs.writeFileSync(opts.output, yamlContent);
|
|
66
|
+
(0, output_1.output)({ file: opts.output, topic: opts.topic, courses: obj.courses.length }, `Academy plan scaffold written to ${opts.output}`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log(yamlContent);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=create-academy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-academy.js","sourceRoot":"","sources":["../../src/commands/create-academy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,oEA0CC;AArDD,uCAAyB;AACzB,8CAAgC;AAChC,6CAAyD;AACzD,0CAAuC;AACvC,gDAA8C;AAE9C,SAAS,OAAO,CAAC,KAAa,EAAE,QAAkB;IAChD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,4BAA4B,CAAC,SAAkB;IAC7D,SAAS;SACN,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,cAAc,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;SACvD,MAAM,CACL,iBAAiB,EACjB,4GAA4G,EAC5G,OAAO,EACP,EAAc,CACf;SACA,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,QAAQ,CAAC;SAC1D,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;SACtE,MAAM,CACL,KAAK,EAAE,IAKN,EAAE,EAAE;QACH,MAAM,GAAG,GAAG,IAAA,8BAAqB,EAAC,IAAI,CAAC,KAAK,EAAE;YAC5C,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAErE,IAAA,sBAAU,EAAC,oBAAoB,EAAE;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;SACjC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC3C,IAAA,eAAM,EACJ,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EACrE,oCAAoC,IAAI,CAAC,MAAM,EAAE,CAClD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-brand.d.ts","sourceRoot":"","sources":["../../src/commands/create-brand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"create-brand.d.ts","sourceRoot":"","sources":["../../src/commands/create-brand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,OAAO,QA8B5D"}
|
|
@@ -45,12 +45,14 @@ function registerCreateBrandCommand(createCmd) {
|
|
|
45
45
|
.description('Generate a brand YAML scaffold')
|
|
46
46
|
.requiredOption('--niche <niche>', 'Brand niche (education, healthcare, finance, tech, legal)')
|
|
47
47
|
.option('--name <name>', 'Brand name')
|
|
48
|
+
.option('--topic <topic>', 'Academy topic for more specific landing-page copy')
|
|
48
49
|
.option('--domain <domain>', 'Custom domain')
|
|
49
50
|
.option('--org <slug>', 'Organization slug')
|
|
50
51
|
.option('-o, --output <file>', 'Output file path (defaults to stdout)')
|
|
51
52
|
.action(async (opts) => {
|
|
52
53
|
const obj = (0, shared_1.scaffoldBrandObject)(opts.niche, {
|
|
53
54
|
name: opts.name,
|
|
55
|
+
topic: opts.topic,
|
|
54
56
|
domain: opts.domain,
|
|
55
57
|
orgSlug: opts.org,
|
|
56
58
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-brand.js","sourceRoot":"","sources":["../../src/commands/create-brand.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,
|
|
1
|
+
{"version":3,"file":"create-brand.js","sourceRoot":"","sources":["../../src/commands/create-brand.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,gEA8BC;AApCD,uCAAyB;AACzB,8CAAgC;AAChC,6CAAuD;AACvD,0CAAuC;AACvC,gDAA8C;AAE9C,SAAgB,0BAA0B,CAAC,SAAkB;IAC3D,SAAS;SACN,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,cAAc,CAAC,iBAAiB,EAAE,2DAA2D,CAAC;SAC9F,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;SACrC,MAAM,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;SAC9E,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;SAC5C,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;SAC3C,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;SACtE,MAAM,CAAC,KAAK,EAAE,IAAsG,EAAE,EAAE;QACvH,MAAM,GAAG,GAAG,IAAA,4BAAmB,EAAC,IAAI,CAAC,KAAK,EAAE;YAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,GAAG;SAClB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAErE,IAAA,sBAAU,EAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC3C,IAAA,eAAM,EACJ,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EACxC,6BAA6B,IAAI,CAAC,MAAM,EAAE,CAC3C,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -46,7 +46,7 @@ function registerFillConceptCommand(program) {
|
|
|
46
46
|
fill
|
|
47
47
|
.command('concept <file> <conceptId>')
|
|
48
48
|
.description('Add KP stubs to a specific concept')
|
|
49
|
-
.option('--kps <count>', 'Number of KP stubs to add', '
|
|
49
|
+
.option('--kps <count>', 'Number of KP stubs to add (authoring starting point, not a cap)', '3')
|
|
50
50
|
.option('--problems <count>', 'Number of problem stubs per KP', '3')
|
|
51
51
|
.action(async (file, conceptId, opts) => {
|
|
52
52
|
if (!fs.existsSync(file)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-concept.js","sourceRoot":"","sources":["../../src/commands/fill-concept.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,gEA+CC;AArDD,uCAAyB;AACzB,8CAAgC;AAChC,6CAAoD;AACpD,0CAAoD;AACpD,gDAA8C;AAE9C,SAAgB,0BAA0B,CAAC,OAAgB;IACzD,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAExC,IAAI;SACD,OAAO,CAAC,4BAA4B,CAAC;SACrC,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"fill-concept.js","sourceRoot":"","sources":["../../src/commands/fill-concept.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,gEA+CC;AArDD,uCAAyB;AACzB,8CAAgC;AAChC,6CAAoD;AACpD,0CAAoD;AACpD,gDAA8C;AAE9C,SAAgB,0BAA0B,CAAC,OAAgB;IACzD,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAExC,IAAI;SACD,OAAO,CAAC,4BAA4B,CAAC;SACrC,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,eAAe,EAAE,iEAAiE,EAAE,GAAG,CAAC;SAC/F,MAAM,CAAC,oBAAoB,EAAE,gCAAgC,EAAE,GAAG,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,SAAiB,EAAE,IAAuC,EAAE,EAAE;QACzF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAA,oBAAW,EAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,IAAA,oBAAW,EAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,yBAAgB,EAAC,GAAG,EAAE,SAAS,EAAE;gBAC/C,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC3B,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;aAC3C,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACnG,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAEpC,IAAA,sBAAU,EAAC,gBAAgB,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,IAAA,eAAM,EACJ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EACjG,SAAS,IAAI,CAAC,GAAG,oBAAoB,IAAI,CAAC,QAAQ,wBAAwB,SAAS,QAAQ,IAAI,EAAE,CAClG,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAA,oBAAW,EAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QA4MrD"}
|
package/dist/commands/import.js
CHANGED
|
@@ -35,27 +35,22 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.registerImportCommand = registerImportCommand;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
38
39
|
const yaml = __importStar(require("js-yaml"));
|
|
39
40
|
const auth_1 = require("../lib/auth");
|
|
40
41
|
const api_client_1 = require("../lib/api-client");
|
|
41
42
|
const output_1 = require("../lib/output");
|
|
42
43
|
const analytics_1 = require("../lib/analytics");
|
|
43
|
-
|
|
44
|
-
if (typeof data !== 'object' || data === null)
|
|
45
|
-
return null;
|
|
46
|
-
const obj = data;
|
|
47
|
-
if ('course' in obj)
|
|
48
|
-
return 'course';
|
|
49
|
-
if ('brand' in obj)
|
|
50
|
-
return 'brand';
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
44
|
+
const shared_1 = require("@graspful/shared");
|
|
53
45
|
function registerImportCommand(program) {
|
|
54
46
|
program
|
|
55
47
|
.command('import <file>')
|
|
56
|
-
.description('Import a course or brand YAML into a Graspful instance')
|
|
48
|
+
.description('Import a course, academy, or brand YAML into a Graspful instance')
|
|
57
49
|
.option('--org <slug>', 'Organization slug')
|
|
58
50
|
.option('--publish', 'Publish immediately (runs review gate)', false)
|
|
51
|
+
.option('--replace', 'Replace existing course content on re-import', false)
|
|
52
|
+
.option('--archive-missing', 'Archive concepts/KPs removed from the YAML', false)
|
|
53
|
+
.option('--course-dir <dir>', 'Base directory for academy course files (defaults to the manifest directory)')
|
|
59
54
|
.action(async (file, opts) => {
|
|
60
55
|
if (!fs.existsSync(file)) {
|
|
61
56
|
(0, output_1.outputError)(`File not found: ${file}`);
|
|
@@ -71,9 +66,9 @@ function registerImportCommand(program) {
|
|
|
71
66
|
(0, output_1.outputError)(`YAML parse error: ${msg}`);
|
|
72
67
|
process.exit(1);
|
|
73
68
|
}
|
|
74
|
-
const fileType = detectFileType(raw);
|
|
69
|
+
const fileType = (0, shared_1.detectFileType)(raw);
|
|
75
70
|
if (!fileType) {
|
|
76
|
-
(0, output_1.outputError)('Could not detect file type. Expected top-level key: course or
|
|
71
|
+
(0, output_1.outputError)('Could not detect file type. Expected top-level key: course, brand, or academy');
|
|
77
72
|
process.exit(1);
|
|
78
73
|
}
|
|
79
74
|
const creds = (0, auth_1.requireAuth)();
|
|
@@ -85,7 +80,7 @@ function registerImportCommand(program) {
|
|
|
85
80
|
process.exit(1);
|
|
86
81
|
}
|
|
87
82
|
try {
|
|
88
|
-
const result = await api.post(`/api/v1/orgs/${orgSlug}/courses/import`, { yaml: content, publish: opts.publish });
|
|
83
|
+
const result = await api.post(`/api/v1/orgs/${orgSlug}/courses/import`, { yaml: content, publish: opts.publish, replace: opts.replace, archiveMissing: opts.archiveMissing });
|
|
89
84
|
(0, analytics_1.cliCapture)('course imported', { course_id: result.courseId, org: orgSlug, published: result.published });
|
|
90
85
|
if (opts.publish && result.reviewFailures && result.reviewFailures.length > 0) {
|
|
91
86
|
(0, output_1.output)({ ...result, status: 'imported_but_not_published' }, `Imported course ${result.courseId} but publish failed:\n${result.reviewFailures.map((f) => ` - ${f}`).join('\n')}`);
|
|
@@ -100,6 +95,76 @@ function registerImportCommand(program) {
|
|
|
100
95
|
process.exit(1);
|
|
101
96
|
}
|
|
102
97
|
}
|
|
98
|
+
else if (fileType === 'academy') {
|
|
99
|
+
const orgSlug = opts.org;
|
|
100
|
+
if (!orgSlug) {
|
|
101
|
+
(0, output_1.outputError)('--org is required for academy imports');
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const parsed = raw;
|
|
106
|
+
const courses = Array.isArray(parsed.courses) ? parsed.courses : [];
|
|
107
|
+
const manifestDir = opts.courseDir
|
|
108
|
+
? path.resolve(opts.courseDir)
|
|
109
|
+
: path.dirname(path.resolve(file));
|
|
110
|
+
const courseYamls = {};
|
|
111
|
+
for (const course of courses) {
|
|
112
|
+
const courseFile = course.file;
|
|
113
|
+
if (typeof courseFile !== 'string' || courseFile.length === 0) {
|
|
114
|
+
(0, output_1.outputError)('Academy manifest contains a course without a valid file path');
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
const resolvedPath = path.resolve(manifestDir, courseFile);
|
|
118
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
119
|
+
(0, output_1.outputError)(`Academy course file not found: ${resolvedPath}`);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
courseYamls[courseFile] = fs.readFileSync(resolvedPath, 'utf-8');
|
|
123
|
+
}
|
|
124
|
+
const result = await api.post(`/api/v1/orgs/${orgSlug}/academies/import`, {
|
|
125
|
+
manifestYaml: content,
|
|
126
|
+
courseYamls,
|
|
127
|
+
replace: opts.replace,
|
|
128
|
+
archiveMissing: opts.archiveMissing,
|
|
129
|
+
});
|
|
130
|
+
const publishedCourseIds = [];
|
|
131
|
+
const publishFailures = [];
|
|
132
|
+
if (opts.publish) {
|
|
133
|
+
for (const courseResult of result.courseResults) {
|
|
134
|
+
try {
|
|
135
|
+
await api.post(`/api/v1/orgs/${orgSlug}/courses/${courseResult.courseId}/publish`, {});
|
|
136
|
+
publishedCourseIds.push(courseResult.courseId);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
140
|
+
publishFailures.push(`${courseResult.courseId}: ${msg}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const response = {
|
|
145
|
+
...result,
|
|
146
|
+
publishedCourseIds,
|
|
147
|
+
publishFailures,
|
|
148
|
+
};
|
|
149
|
+
(0, analytics_1.cliCapture)('academy imported', {
|
|
150
|
+
academy_id: result.academyId,
|
|
151
|
+
org: orgSlug,
|
|
152
|
+
course_count: result.courseCount,
|
|
153
|
+
published_count: publishedCourseIds.length,
|
|
154
|
+
});
|
|
155
|
+
if (publishFailures.length > 0) {
|
|
156
|
+
(0, output_1.output)(response, `Imported academy ${result.academySlug} (${result.courseCount} courses) but some courses failed to publish:\n${publishFailures.map((failure) => ` - ${failure}`).join('\n')}`);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
(0, output_1.output)(response, `Imported academy: ${result.academySlug}\n Academy ID: ${result.academyId}\n Courses: ${result.courseCount}\n Published courses: ${publishedCourseIds.length}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
164
|
+
(0, output_1.outputError)(`Academy import failed: ${msg}`);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
103
168
|
else {
|
|
104
169
|
// Brand import — unwrap YAML structure to flat DTO
|
|
105
170
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4EpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA0EnD"}
|
package/dist/commands/init.js
CHANGED
|
@@ -66,7 +66,7 @@ function detectEditors() {
|
|
|
66
66
|
}
|
|
67
67
|
return editors;
|
|
68
68
|
}
|
|
69
|
-
function writeMcpConfig(configPath, apiKey) {
|
|
69
|
+
function writeMcpConfig(configPath, apiKey, userId) {
|
|
70
70
|
const dir = path.dirname(configPath);
|
|
71
71
|
if (!fs.existsSync(dir)) {
|
|
72
72
|
fs.mkdirSync(dir, { recursive: true });
|
|
@@ -84,7 +84,10 @@ function writeMcpConfig(configPath, apiKey) {
|
|
|
84
84
|
mcpServers['graspful'] = {
|
|
85
85
|
command: 'npx',
|
|
86
86
|
args: ['-y', '@graspful/mcp'],
|
|
87
|
-
env: {
|
|
87
|
+
env: {
|
|
88
|
+
GRASPFUL_API_KEY: apiKey,
|
|
89
|
+
...(userId ? { GRASPFUL_USER_ID: userId } : {}),
|
|
90
|
+
},
|
|
88
91
|
};
|
|
89
92
|
existing.mcpServers = mcpServers;
|
|
90
93
|
fs.writeFileSync(configPath, JSON.stringify(existing, null, 2) + '\n');
|
|
@@ -107,7 +110,7 @@ function registerInitCommand(program) {
|
|
|
107
110
|
console.log('Skipping registration. To re-register, delete ~/.graspful/credentials.json first.');
|
|
108
111
|
// Still configure MCP if requested
|
|
109
112
|
if (opts.mcp) {
|
|
110
|
-
configureMcp(existingCreds.apiKey);
|
|
113
|
+
configureMcp(existingCreds.apiKey, existingCreds.userId);
|
|
111
114
|
}
|
|
112
115
|
(0, output_1.output)({ authenticated: true, baseUrl }, 'Ready. Run graspful create course --topic "Your Topic" to get started.');
|
|
113
116
|
return;
|
|
@@ -128,7 +131,7 @@ function registerInitCommand(program) {
|
|
|
128
131
|
console.log(` API key: ${data.apiKey} (saved to ~/.graspful/credentials.json)`);
|
|
129
132
|
// ── Configure MCP ───────────────────────────────────────────────
|
|
130
133
|
if (opts.mcp) {
|
|
131
|
-
configureMcp(data.apiKey);
|
|
134
|
+
configureMcp(data.apiKey, data.userId);
|
|
132
135
|
}
|
|
133
136
|
(0, output_1.output)({
|
|
134
137
|
userId: data.userId,
|
|
@@ -151,7 +154,7 @@ function registerInitCommand(program) {
|
|
|
151
154
|
}
|
|
152
155
|
});
|
|
153
156
|
}
|
|
154
|
-
function configureMcp(apiKey) {
|
|
157
|
+
function configureMcp(apiKey, userId) {
|
|
155
158
|
const editors = detectEditors();
|
|
156
159
|
if (editors.length === 0) {
|
|
157
160
|
console.log('\nNo supported editors detected. Add MCP manually:');
|
|
@@ -160,14 +163,17 @@ function configureMcp(apiKey) {
|
|
|
160
163
|
graspful: {
|
|
161
164
|
command: 'npx',
|
|
162
165
|
args: ['-y', '@graspful/mcp'],
|
|
163
|
-
env: {
|
|
166
|
+
env: {
|
|
167
|
+
GRASPFUL_API_KEY: apiKey,
|
|
168
|
+
...(userId ? { GRASPFUL_USER_ID: userId } : {}),
|
|
169
|
+
},
|
|
164
170
|
},
|
|
165
171
|
},
|
|
166
172
|
}, null, 2));
|
|
167
173
|
return;
|
|
168
174
|
}
|
|
169
175
|
for (const editor of editors) {
|
|
170
|
-
writeMcpConfig(editor.configPath, apiKey);
|
|
176
|
+
writeMcpConfig(editor.configPath, apiKey, userId);
|
|
171
177
|
(0, analytics_1.cliCapture)('cli initialized', { editor: editor.name });
|
|
172
178
|
console.log(`\nMCP configured for ${editor.name}: ${editor.configPath}`);
|
|
173
179
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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;AAMpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAgGpD"}
|
package/dist/commands/login.js
CHANGED
|
@@ -11,7 +11,8 @@ function registerLoginCommand(program) {
|
|
|
11
11
|
.description('Authenticate with a Graspful instance')
|
|
12
12
|
.option('--api-url <url>', 'API base URL')
|
|
13
13
|
.option('--token <token>', 'API key or JWT token (skip interactive prompt)')
|
|
14
|
-
.option('--email <email>', '
|
|
14
|
+
.option('--email <email>', 'Email address (use with --password for non-interactive login)')
|
|
15
|
+
.option('--password <password>', 'Password (use with --email for non-interactive login)')
|
|
15
16
|
.option('--no-browser', 'Print the sign-in URL instead of opening it automatically')
|
|
16
17
|
.action(async (opts) => {
|
|
17
18
|
const baseUrl = (opts.apiUrl || (0, auth_1.getBaseUrl)()).replace(/\/$/, '');
|
|
@@ -27,6 +28,30 @@ function registerLoginCommand(program) {
|
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
try {
|
|
31
|
+
// Email + password login: call the backend auth/login endpoint
|
|
32
|
+
if (!token && opts.email && opts.password) {
|
|
33
|
+
const res = await fetch(`${baseUrl}/api/v1/auth/login`, {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: { 'Content-Type': 'application/json' },
|
|
36
|
+
body: JSON.stringify({ email: opts.email, password: opts.password }),
|
|
37
|
+
});
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
const body = await res.text();
|
|
40
|
+
let message = `Login failed (${res.status})`;
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(body);
|
|
43
|
+
if (parsed.message)
|
|
44
|
+
message = parsed.message;
|
|
45
|
+
}
|
|
46
|
+
catch { }
|
|
47
|
+
throw new Error(message);
|
|
48
|
+
}
|
|
49
|
+
const { apiKey, orgSlug, userId } = await res.json();
|
|
50
|
+
(0, auth_1.saveApiKeyCredentials)(apiKey, baseUrl, userId);
|
|
51
|
+
(0, analytics_1.cliCapture)('cli logged in', { method: 'email-password' });
|
|
52
|
+
(0, output_1.output)({ authenticated: true, baseUrl, tokenType: 'apiKey', orgSlug, userId }, `Authenticated. API key saved for ${baseUrl}`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
30
55
|
if (!token) {
|
|
31
56
|
const result = await (0, browser_auth_1.runBrowserAuthFlow)({
|
|
32
57
|
apiUrl: baseUrl,
|
|
@@ -34,6 +59,7 @@ function registerLoginCommand(program) {
|
|
|
34
59
|
email: opts.email,
|
|
35
60
|
noBrowser: opts.browser === false,
|
|
36
61
|
});
|
|
62
|
+
(0, analytics_1.cliCapture)('cli logged in', { method: 'browser-auth' });
|
|
37
63
|
(0, output_1.output)({
|
|
38
64
|
authenticated: true,
|
|
39
65
|
baseUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAmDvD"}
|
|
@@ -26,13 +26,16 @@ function registerRegisterCommand(program) {
|
|
|
26
26
|
noBrowser: opts.browser === false,
|
|
27
27
|
});
|
|
28
28
|
(0, analytics_1.cliCapture)('cli registered', { method: 'browser-auth' });
|
|
29
|
+
const brandDomain = result.brandDomain ?? `${result.orgSlug}.graspful.ai`;
|
|
29
30
|
(0, output_1.output)({
|
|
30
31
|
userId: result.userId,
|
|
31
32
|
orgSlug: result.orgSlug,
|
|
32
33
|
apiKey: result.apiKey,
|
|
34
|
+
brandDomain,
|
|
33
35
|
baseUrl,
|
|
34
36
|
}, [
|
|
35
37
|
`Created org: ${result.orgSlug}`,
|
|
38
|
+
`Brand: ${brandDomain}`,
|
|
36
39
|
`API key: ${result.apiKey} (saved to ~/.graspful/credentials.json)`,
|
|
37
40
|
'',
|
|
38
41
|
`You're ready. Run: graspful import course.yaml --org ${result.orgSlug}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":";;AAMA,0DAmDC;AAxDD,sCAAyC;AACzC,sDAAyD;AACzD,0CAAoD;AACpD,gDAA8C;AAE9C,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;SAC7D,MAAM,CAAC,uBAAuB,EAAE,wDAAwD,CAAC;SACzF,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC;SACzC,MAAM,CAAC,cAAc,EAAE,2DAA2D,CAAC;SACnF,MAAM,CAAC,KAAK,EAAE,IAA+E,EAAE,EAAE;QAChG,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAA,iBAAU,GAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,2FAA2F,CAAC,CAAC;YAC3G,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAA,iCAAkB,EAAC;gBACtC,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,SAAS,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK;aAClC,CAAC,CAAC;YAEH,IAAA,sBAAU,EAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC;YAC1E,IAAA,eAAM,EACJ;gBACE,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,WAAW;gBACX,OAAO;aACR,EACD;gBACE,gBAAgB,MAAM,CAAC,OAAO,EAAE;gBAChC,UAAU,WAAW,EAAE;gBACvB,YAAY,MAAM,CAAC,MAAM,0CAA0C;gBACnE,EAAE;gBACF,wDAAwD,MAAM,CAAC,OAAO,EAAE;aACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9F,IAAA,oBAAW,EAAC,8BAA8B,OAAO,2CAA2C,CAAC,CAAC;YAChG,CAAC;iBAAM,CAAC;gBACN,IAAA,oBAAW,EAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAqDrD"}
|
package/dist/commands/review.js
CHANGED
|
@@ -70,7 +70,18 @@ function registerReviewCommand(program) {
|
|
|
70
70
|
lines.push(` [FAIL] ${failure.check}: ${failure.details ?? 'no details'}`);
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
-
|
|
73
|
+
if (result.warnings.length > 0) {
|
|
74
|
+
lines.push('');
|
|
75
|
+
lines.push('Warnings:');
|
|
76
|
+
for (const warning of result.warnings) {
|
|
77
|
+
lines.push(` [WARN] ${warning.check}: ${warning.details ?? 'no details'}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
(0, analytics_1.cliCapture)('course reviewed', {
|
|
81
|
+
score: result.score,
|
|
82
|
+
passed: result.passed,
|
|
83
|
+
warnings: result.warnings.length,
|
|
84
|
+
});
|
|
74
85
|
(0, output_1.output)(result, lines.join('\n'));
|
|
75
86
|
if (!result.passed) {
|
|
76
87
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ const publish_1 = require("./commands/publish");
|
|
|
10
10
|
const review_1 = require("./commands/review");
|
|
11
11
|
const create_course_1 = require("./commands/create-course");
|
|
12
12
|
const create_brand_1 = require("./commands/create-brand");
|
|
13
|
+
const create_academy_1 = require("./commands/create-academy");
|
|
13
14
|
const fill_concept_1 = require("./commands/fill-concept");
|
|
14
15
|
const describe_1 = require("./commands/describe");
|
|
15
16
|
const login_1 = require("./commands/login");
|
|
@@ -19,7 +20,7 @@ const program = new commander_1.Command();
|
|
|
19
20
|
program
|
|
20
21
|
.name('graspful')
|
|
21
22
|
.description('Create adaptive learning courses from YAML')
|
|
22
|
-
.version('0.
|
|
23
|
+
.version('0.2.7')
|
|
23
24
|
.option('--format <format>', 'Output format: human or json', 'human')
|
|
24
25
|
.hook('preAction', (thisCommand) => {
|
|
25
26
|
const opts = thisCommand.opts();
|
|
@@ -32,6 +33,7 @@ program
|
|
|
32
33
|
(0, publish_1.registerPublishCommand)(program);
|
|
33
34
|
(0, review_1.registerReviewCommand)(program);
|
|
34
35
|
const createCmd = (0, create_course_1.registerCreateCourseCommand)(program);
|
|
36
|
+
(0, create_academy_1.registerCreateAcademyCommand)(createCmd);
|
|
35
37
|
(0, create_brand_1.registerCreateBrandCommand)(createCmd);
|
|
36
38
|
const fillCmd = (0, fill_concept_1.registerFillConceptCommand)(program);
|
|
37
39
|
(0, describe_1.registerDescribeCommand)(program);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,yCAA6D;AAC7D,+CAA8C;AAC9C,kDAA8D;AAC9D,8CAA0D;AAC1D,gDAA4D;AAC5D,8CAA0D;AAC1D,4DAAuE;AACvE,0DAAqE;AACrE,0DAAqE;AACrE,kDAA8D;AAC9D,4CAAwD;AACxD,kDAA8D;AAC9D,0CAAsD;AAEtD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,4CAA4C,CAAC;KACzD,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,mBAAmB,EAAE,8BAA8B,EAAE,OAAO,CAAC;KACpE,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACjC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAA,wBAAe,EAAC,IAAI,CAAC,MAAsB,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,MAAM,SAAS,GAAG,IAAA,2CAA2B,EAAC,OAAO,CAAC,CAAC;AACvD,IAAA,yCAA0B,EAAC,SAAS,CAAC,CAAC;AACtC,MAAM,OAAO,GAAG,IAAA,yCAA0B,EAAC,OAAO,CAAC,CAAC;AACpD,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,uBAAW,GAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAA,uBAAW,GAAE,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,yCAA6D;AAC7D,+CAA8C;AAC9C,kDAA8D;AAC9D,8CAA0D;AAC1D,gDAA4D;AAC5D,8CAA0D;AAC1D,4DAAuE;AACvE,0DAAqE;AACrE,8DAAyE;AACzE,0DAAqE;AACrE,kDAA8D;AAC9D,4CAAwD;AACxD,kDAA8D;AAC9D,0CAAsD;AAEtD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,4CAA4C,CAAC;KACzD,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,mBAAmB,EAAE,8BAA8B,EAAE,OAAO,CAAC;KACpE,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACjC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAA,wBAAe,EAAC,IAAI,CAAC,MAAsB,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;AAChC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,MAAM,SAAS,GAAG,IAAA,2CAA2B,EAAC,OAAO,CAAC,CAAC;AACvD,IAAA,6CAA4B,EAAC,SAAS,CAAC,CAAC;AACxC,IAAA,yCAA0B,EAAC,SAAS,CAAC,CAAC;AACtC,MAAM,OAAO,GAAG,IAAA,yCAA0B,EAAC,OAAO,CAAC,CAAC;AACpD,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;AACjC,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,uBAAW,GAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAA,uBAAW,GAAE,CAAC,CAAC"}
|
package/dist/lib/analytics.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Credentials } from './auth';
|
|
2
|
+
export declare function cliDistinctId(credentials?: Pick<Credentials, 'apiKey' | 'jwt' | 'userId'>, fallbackAnonymousId?: string): string;
|
|
1
3
|
export declare function cliCapture(event: string, properties?: Record<string, unknown>): void;
|
|
2
4
|
export declare function cliShutdown(): Promise<void>;
|
|
3
5
|
//# sourceMappingURL=analytics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/lib/analytics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/lib/analytics.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAyD1C,wBAAgB,aAAa,CAC3B,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC,EAC5D,mBAAmB,CAAC,EAAE,MAAM,GAC3B,MAAM,CAmBR;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,QAMjF;AAED,wBAAsB,WAAW,kBAEhC"}
|
package/dist/lib/analytics.js
CHANGED
|
@@ -1,10 +1,58 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.cliDistinctId = cliDistinctId;
|
|
3
37
|
exports.cliCapture = cliCapture;
|
|
4
38
|
exports.cliShutdown = cliShutdown;
|
|
5
39
|
const posthog_node_1 = require("posthog-node");
|
|
6
|
-
const
|
|
40
|
+
const node_crypto_1 = require("node:crypto");
|
|
41
|
+
const fs = __importStar(require("node:fs"));
|
|
42
|
+
const os = __importStar(require("node:os"));
|
|
43
|
+
const path = __importStar(require("node:path"));
|
|
44
|
+
const auth_1 = require("./auth");
|
|
45
|
+
const DEFAULT_POSTHOG_KEY = 'phc_ahQLCJsOBzeuro1yDeurs1a3xx07pIreJWeXG9T4d4';
|
|
46
|
+
const telemetryDisabled = process.env.GRASPFUL_TELEMETRY_DISABLED === '1' ||
|
|
47
|
+
process.env.NODE_ENV === 'test';
|
|
48
|
+
const posthogKey = telemetryDisabled
|
|
49
|
+
? null
|
|
50
|
+
: process.env.POSTHOG_API_KEY ||
|
|
51
|
+
process.env.NEXT_PUBLIC_POSTHOG_KEY ||
|
|
52
|
+
DEFAULT_POSTHOG_KEY;
|
|
7
53
|
let client = null;
|
|
54
|
+
let anonymousDistinctId = null;
|
|
55
|
+
const analyticsIdPath = path.join(os.homedir(), '.graspful', 'analytics-id');
|
|
8
56
|
function getClient() {
|
|
9
57
|
if (!posthogKey)
|
|
10
58
|
return null;
|
|
@@ -17,12 +65,52 @@ function getClient() {
|
|
|
17
65
|
}
|
|
18
66
|
return client;
|
|
19
67
|
}
|
|
20
|
-
function
|
|
21
|
-
|
|
68
|
+
function hashCredential(credential) {
|
|
69
|
+
const digest = (0, node_crypto_1.createHash)('sha256').update(credential).digest('hex');
|
|
70
|
+
return `credential:${digest}`;
|
|
71
|
+
}
|
|
72
|
+
function getOrCreateAnonymousDistinctId() {
|
|
73
|
+
if (anonymousDistinctId)
|
|
74
|
+
return anonymousDistinctId;
|
|
75
|
+
try {
|
|
76
|
+
const storedId = fs.readFileSync(analyticsIdPath, 'utf8').trim();
|
|
77
|
+
if (storedId) {
|
|
78
|
+
anonymousDistinctId = storedId;
|
|
79
|
+
return storedId;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Create an installation ID below when the file is absent or unreadable.
|
|
84
|
+
}
|
|
85
|
+
anonymousDistinctId = `anonymous-cli:${(0, node_crypto_1.randomUUID)()}`;
|
|
86
|
+
try {
|
|
87
|
+
fs.mkdirSync(path.dirname(analyticsIdPath), { recursive: true, mode: 0o700 });
|
|
88
|
+
fs.writeFileSync(analyticsIdPath, anonymousDistinctId, { mode: 0o600 });
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Analytics must never block a CLI command on a read-only filesystem.
|
|
92
|
+
}
|
|
93
|
+
return anonymousDistinctId;
|
|
94
|
+
}
|
|
95
|
+
function cliDistinctId(credentials, fallbackAnonymousId) {
|
|
96
|
+
if (process.env.GRASPFUL_USER_ID) {
|
|
97
|
+
return process.env.GRASPFUL_USER_ID;
|
|
98
|
+
}
|
|
99
|
+
const resolvedCredentials = credentials ?? (0, auth_1.resolveCredentials)();
|
|
100
|
+
if (resolvedCredentials.userId) {
|
|
101
|
+
return resolvedCredentials.userId;
|
|
102
|
+
}
|
|
103
|
+
const credential = process.env.GRASPFUL_API_KEY ??
|
|
104
|
+
resolvedCredentials.apiKey ??
|
|
105
|
+
resolvedCredentials.jwt;
|
|
106
|
+
if (credential) {
|
|
107
|
+
return hashCredential(credential);
|
|
108
|
+
}
|
|
109
|
+
return fallbackAnonymousId ?? getOrCreateAnonymousDistinctId();
|
|
22
110
|
}
|
|
23
111
|
function cliCapture(event, properties = {}) {
|
|
24
112
|
getClient()?.capture({
|
|
25
|
-
distinctId:
|
|
113
|
+
distinctId: cliDistinctId(),
|
|
26
114
|
event,
|
|
27
115
|
properties: { ...properties, source: 'cli' },
|
|
28
116
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/lib/analytics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/lib/analytics.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/auth.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export interface Credentials {
|
|
2
2
|
apiKey?: string;
|
|
3
3
|
jwt?: string;
|
|
4
|
+
userId?: string;
|
|
4
5
|
baseUrl: string;
|
|
5
6
|
}
|
|
6
7
|
export declare function getBaseUrl(): string;
|
|
7
8
|
export declare function resolveCredentials(): Credentials;
|
|
8
9
|
export declare function saveCredentials(jwt: string, baseUrl?: string): void;
|
|
9
|
-
export declare function saveApiKeyCredentials(apiKey: string, baseUrl?: string): void;
|
|
10
|
+
export declare function saveApiKeyCredentials(apiKey: string, baseUrl?: string, userId?: string): void;
|
|
10
11
|
export declare function requireAuth(): Credentials;
|
|
11
12
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/lib/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,kBAAkB,IAAI,WAAW,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,kBAAkB,IAAI,WAAW,CA+BhD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAUnE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAU7F;AAED,wBAAgB,WAAW,IAAI,WAAW,CAOzC"}
|
package/dist/lib/auth.js
CHANGED
|
@@ -50,16 +50,24 @@ function resolveCredentials() {
|
|
|
50
50
|
// 1. API key (agent mode)
|
|
51
51
|
const apiKey = process.env.GRASPFUL_API_KEY;
|
|
52
52
|
if (apiKey) {
|
|
53
|
-
return { apiKey, baseUrl };
|
|
53
|
+
return { apiKey, userId: process.env.GRASPFUL_USER_ID, baseUrl };
|
|
54
54
|
}
|
|
55
55
|
// 2. Stored credentials (interactive or registered)
|
|
56
56
|
if (fs.existsSync(CREDENTIALS_PATH)) {
|
|
57
57
|
try {
|
|
58
58
|
const stored = JSON.parse(fs.readFileSync(CREDENTIALS_PATH, 'utf-8'));
|
|
59
59
|
if (stored.apiKey) {
|
|
60
|
-
return {
|
|
60
|
+
return {
|
|
61
|
+
apiKey: stored.apiKey,
|
|
62
|
+
userId: stored.userId,
|
|
63
|
+
baseUrl: stored.baseUrl || baseUrl,
|
|
64
|
+
};
|
|
61
65
|
}
|
|
62
|
-
return {
|
|
66
|
+
return {
|
|
67
|
+
jwt: stored.jwt,
|
|
68
|
+
userId: stored.userId,
|
|
69
|
+
baseUrl: stored.baseUrl || baseUrl,
|
|
70
|
+
};
|
|
63
71
|
}
|
|
64
72
|
catch {
|
|
65
73
|
// Invalid file
|
|
@@ -74,12 +82,12 @@ function saveCredentials(jwt, baseUrl) {
|
|
|
74
82
|
}
|
|
75
83
|
fs.writeFileSync(CREDENTIALS_PATH, JSON.stringify({ jwt, baseUrl: baseUrl || getBaseUrl() }, null, 2), { mode: 0o600 });
|
|
76
84
|
}
|
|
77
|
-
function saveApiKeyCredentials(apiKey, baseUrl) {
|
|
85
|
+
function saveApiKeyCredentials(apiKey, baseUrl, userId) {
|
|
78
86
|
const dir = path.dirname(CREDENTIALS_PATH);
|
|
79
87
|
if (!fs.existsSync(dir)) {
|
|
80
88
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
81
89
|
}
|
|
82
|
-
fs.writeFileSync(CREDENTIALS_PATH, JSON.stringify({ apiKey, baseUrl: baseUrl || getBaseUrl() }, null, 2), { mode: 0o600 });
|
|
90
|
+
fs.writeFileSync(CREDENTIALS_PATH, JSON.stringify({ apiKey, userId, baseUrl: baseUrl || getBaseUrl() }, null, 2), { mode: 0o600 });
|
|
83
91
|
}
|
|
84
92
|
function requireAuth() {
|
|
85
93
|
const creds = resolveCredentials();
|
package/dist/lib/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ export interface BrowserAuthResult {
|
|
|
14
14
|
orgSlug: string;
|
|
15
15
|
userId: string;
|
|
16
16
|
baseUrl: string;
|
|
17
|
+
brandDomain?: string;
|
|
17
18
|
}
|
|
18
19
|
export declare function deriveWebUrl(apiUrl: string): string;
|
|
19
20
|
export declare function buildCliAuthUrl(apiUrl: string, token: string, mode: BrowserAuthMode, email?: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-auth.d.ts","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-auth.d.ts","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;AA6BpD,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAanD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5G;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiBpD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0EhG"}
|
package/dist/lib/browser-auth.js
CHANGED
|
@@ -97,12 +97,13 @@ async function runBrowserAuthFlow(options) {
|
|
|
97
97
|
if (exchangeData.status === 'expired') {
|
|
98
98
|
throw new Error('Browser authentication expired. Start again.');
|
|
99
99
|
}
|
|
100
|
-
(0, auth_1.saveApiKeyCredentials)(exchangeData.apiKey, baseUrl);
|
|
100
|
+
(0, auth_1.saveApiKeyCredentials)(exchangeData.apiKey, baseUrl, exchangeData.userId);
|
|
101
101
|
return {
|
|
102
102
|
apiKey: exchangeData.apiKey,
|
|
103
103
|
orgSlug: exchangeData.orgSlug,
|
|
104
104
|
userId: exchangeData.userId,
|
|
105
105
|
baseUrl,
|
|
106
|
+
brandDomain: exchangeData.brandDomain,
|
|
106
107
|
};
|
|
107
108
|
}
|
|
108
109
|
throw new Error('Browser authentication timed out. Start again.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/lib/browser-auth.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graspful/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "Create adaptive learning courses from YAML. CLI and MCP server for AI agents.",
|
|
5
5
|
"keywords": ["course", "learning", "adaptive", "mcp", "mcp-server", "ai", "ai-agent", "agent", "cli", "education", "edtech", "knowledge-graph", "spaced-repetition", "course-creation", "yaml", "adaptive-learning", "lms"],
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/willwearing/graspful.git",
|
|
8
|
+
"url": "git+https://github.com/willwearing/graspful.git",
|
|
9
9
|
"directory": "packages/cli"
|
|
10
10
|
},
|
|
11
11
|
"homepage": "https://graspful.ai",
|
|
12
12
|
"bin": {
|
|
13
|
-
"graspful": "
|
|
13
|
+
"graspful": "dist/index.js"
|
|
14
14
|
},
|
|
15
15
|
"main": "./dist/index.js",
|
|
16
16
|
"types": "./dist/index.d.ts",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"scripts": {
|
|
19
19
|
"build": "bun x tsc",
|
|
20
20
|
"dev": "bun x tsc --watch",
|
|
21
|
+
"test": "bun test src",
|
|
21
22
|
"lint": "echo 'no lint configured yet'"
|
|
22
23
|
},
|
|
23
24
|
"dependencies": {
|