@graspful/cli 0.2.5 → 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 +0 -5
- package/dist/commands/create-brand.d.ts.map +1 -1
- package/dist/commands/create-brand.js +5 -64
- package/dist/commands/create-brand.js.map +1 -1
- package/dist/commands/create-course.d.ts +0 -4
- package/dist/commands/create-course.d.ts.map +1 -1
- package/dist/commands/create-course.js +3 -32
- package/dist/commands/create-course.js.map +1 -1
- package/dist/commands/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +9 -86
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/fill-concept.d.ts.map +1 -1
- package/dist/commands/fill-concept.js +12 -47
- 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/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +5 -92
- package/dist/commands/validate.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 +5 -4
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,8 +1,3 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
export declare function scaffoldBrand(niche: string, options: {
|
|
3
|
-
name?: string;
|
|
4
|
-
domain?: string;
|
|
5
|
-
orgSlug?: string;
|
|
6
|
-
}): string;
|
|
7
2
|
export declare function registerCreateBrandCommand(createCmd: Command): void;
|
|
8
3
|
//# sourceMappingURL=create-brand.d.ts.map
|
|
@@ -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;
|
|
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"}
|
|
@@ -33,89 +33,30 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.scaffoldBrand = scaffoldBrand;
|
|
37
36
|
exports.registerCreateBrandCommand = registerCreateBrandCommand;
|
|
38
37
|
const fs = __importStar(require("fs"));
|
|
39
38
|
const yaml = __importStar(require("js-yaml"));
|
|
39
|
+
const shared_1 = require("@graspful/shared");
|
|
40
40
|
const output_1 = require("../lib/output");
|
|
41
41
|
const analytics_1 = require("../lib/analytics");
|
|
42
|
-
const NICHE_PRESETS = {
|
|
43
|
-
education: { preset: 'blue', tagline: 'Learn smarter, not harder', headline: 'Master any subject with adaptive learning' },
|
|
44
|
-
healthcare: { preset: 'emerald', tagline: 'Training that saves lives', headline: 'Adaptive healthcare education for professionals' },
|
|
45
|
-
finance: { preset: 'slate', tagline: 'Build financial expertise', headline: 'Master finance with adaptive learning' },
|
|
46
|
-
tech: { preset: 'indigo', tagline: 'Level up your skills', headline: 'Adaptive tech training that meets you where you are' },
|
|
47
|
-
legal: { preset: 'amber', tagline: 'Know the law, pass the exam', headline: 'Adaptive legal education for exam success' },
|
|
48
|
-
default: { preset: 'blue', tagline: 'Learn adaptively', headline: 'Personalized learning that works' },
|
|
49
|
-
};
|
|
50
|
-
function scaffoldBrand(niche, options) {
|
|
51
|
-
const config = NICHE_PRESETS[niche] || NICHE_PRESETS['default'];
|
|
52
|
-
const slug = (options.name || niche).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
53
|
-
const name = options.name || `${niche.charAt(0).toUpperCase() + niche.slice(1)} Academy`;
|
|
54
|
-
const domain = options.domain || `${slug}.graspful.ai`;
|
|
55
|
-
return yaml.dump({
|
|
56
|
-
brand: {
|
|
57
|
-
id: slug,
|
|
58
|
-
name,
|
|
59
|
-
domain,
|
|
60
|
-
tagline: config.tagline,
|
|
61
|
-
logoUrl: '/icon.svg',
|
|
62
|
-
orgSlug: options.orgSlug || 'TODO: your-org-slug',
|
|
63
|
-
},
|
|
64
|
-
theme: {
|
|
65
|
-
preset: config.preset,
|
|
66
|
-
radius: '0.5rem',
|
|
67
|
-
},
|
|
68
|
-
landing: {
|
|
69
|
-
hero: {
|
|
70
|
-
headline: config.headline,
|
|
71
|
-
subheadline: `${name} uses adaptive learning to help you master concepts faster.`,
|
|
72
|
-
ctaText: 'Start Learning',
|
|
73
|
-
},
|
|
74
|
-
features: {
|
|
75
|
-
heading: 'Why choose us?',
|
|
76
|
-
items: [
|
|
77
|
-
{ title: 'Adaptive Learning', description: 'Content adapts to your knowledge level', icon: 'brain' },
|
|
78
|
-
{ title: 'Spaced Repetition', description: 'Review at optimal intervals for lasting memory', icon: 'clock' },
|
|
79
|
-
{ title: 'Progress Tracking', description: 'See exactly where you stand', icon: 'chart' },
|
|
80
|
-
],
|
|
81
|
-
},
|
|
82
|
-
howItWorks: {
|
|
83
|
-
heading: 'How it works',
|
|
84
|
-
items: [
|
|
85
|
-
{ title: 'Take a diagnostic', description: 'We assess what you already know' },
|
|
86
|
-
{ title: 'Learn adaptively', description: 'Focus on gaps, skip what you know' },
|
|
87
|
-
{ title: 'Master the material', description: 'Prove mastery through progressive challenges' },
|
|
88
|
-
],
|
|
89
|
-
},
|
|
90
|
-
faq: [],
|
|
91
|
-
},
|
|
92
|
-
pricing: {
|
|
93
|
-
monthly: 0,
|
|
94
|
-
currency: 'usd',
|
|
95
|
-
trialDays: 0,
|
|
96
|
-
},
|
|
97
|
-
seo: {
|
|
98
|
-
title: `${name} — Adaptive Learning`,
|
|
99
|
-
description: config.tagline,
|
|
100
|
-
keywords: [niche, 'learning', 'adaptive', 'education'],
|
|
101
|
-
},
|
|
102
|
-
}, { lineWidth: 120, noRefs: true });
|
|
103
|
-
}
|
|
104
42
|
function registerCreateBrandCommand(createCmd) {
|
|
105
43
|
createCmd
|
|
106
44
|
.command('brand')
|
|
107
45
|
.description('Generate a brand YAML scaffold')
|
|
108
46
|
.requiredOption('--niche <niche>', 'Brand niche (education, healthcare, finance, tech, legal)')
|
|
109
47
|
.option('--name <name>', 'Brand name')
|
|
48
|
+
.option('--topic <topic>', 'Academy topic for more specific landing-page copy')
|
|
110
49
|
.option('--domain <domain>', 'Custom domain')
|
|
111
50
|
.option('--org <slug>', 'Organization slug')
|
|
112
51
|
.option('-o, --output <file>', 'Output file path (defaults to stdout)')
|
|
113
52
|
.action(async (opts) => {
|
|
114
|
-
const
|
|
53
|
+
const obj = (0, shared_1.scaffoldBrandObject)(opts.niche, {
|
|
115
54
|
name: opts.name,
|
|
55
|
+
topic: opts.topic,
|
|
116
56
|
domain: opts.domain,
|
|
117
57
|
orgSlug: opts.org,
|
|
118
58
|
});
|
|
59
|
+
const yamlContent = yaml.dump(obj, { lineWidth: 120, noRefs: true });
|
|
119
60
|
(0, analytics_1.cliCapture)('brand scaffolded', { niche: opts.niche });
|
|
120
61
|
if (opts.output) {
|
|
121
62
|
fs.writeFileSync(opts.output, yamlContent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-brand.js","sourceRoot":"","sources":["../../src/commands/create-brand.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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"}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
export declare function scaffoldCourse(topic: string, options: {
|
|
3
|
-
hours?: number;
|
|
4
|
-
source?: string;
|
|
5
|
-
}): string;
|
|
6
2
|
export declare function registerCreateCourseCommand(program: Command): Command;
|
|
7
3
|
//# sourceMappingURL=create-course.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-course.d.ts","sourceRoot":"","sources":["../../src/commands/create-course.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"create-course.d.ts","sourceRoot":"","sources":["../../src/commands/create-course.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,WAkC3D"}
|
|
@@ -33,41 +33,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.scaffoldCourse = scaffoldCourse;
|
|
37
36
|
exports.registerCreateCourseCommand = registerCreateCourseCommand;
|
|
38
37
|
const fs = __importStar(require("fs"));
|
|
39
38
|
const yaml = __importStar(require("js-yaml"));
|
|
39
|
+
const shared_1 = require("@graspful/shared");
|
|
40
40
|
const output_1 = require("../lib/output");
|
|
41
41
|
const analytics_1 = require("../lib/analytics");
|
|
42
|
-
function scaffoldCourse(topic, options) {
|
|
43
|
-
const slug = topic.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
44
|
-
return yaml.dump({
|
|
45
|
-
course: {
|
|
46
|
-
id: slug,
|
|
47
|
-
name: topic,
|
|
48
|
-
description: `Adaptive course on ${topic}`,
|
|
49
|
-
estimatedHours: options.hours || 10,
|
|
50
|
-
version: '2026.1',
|
|
51
|
-
sourceDocument: options.source || 'TODO: Add source document',
|
|
52
|
-
},
|
|
53
|
-
sections: [
|
|
54
|
-
{ id: 'foundations', name: 'Foundations', description: 'Core concepts' },
|
|
55
|
-
{ id: 'application', name: 'Application', description: 'Applied concepts' },
|
|
56
|
-
],
|
|
57
|
-
concepts: [
|
|
58
|
-
{
|
|
59
|
-
id: `${slug}-intro`,
|
|
60
|
-
name: `Introduction to ${topic}`,
|
|
61
|
-
section: 'foundations',
|
|
62
|
-
difficulty: 2,
|
|
63
|
-
estimatedMinutes: 15,
|
|
64
|
-
tags: ['foundational'],
|
|
65
|
-
prerequisites: [],
|
|
66
|
-
knowledgePoints: [],
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
}, { lineWidth: 120, noRefs: true });
|
|
70
|
-
}
|
|
71
42
|
function registerCreateCourseCommand(program) {
|
|
72
43
|
const create = program
|
|
73
44
|
.command('create')
|
|
@@ -81,17 +52,17 @@ function registerCreateCourseCommand(program) {
|
|
|
81
52
|
.option('-o, --output <file>', 'Output file path (defaults to stdout)')
|
|
82
53
|
.option('--scaffold-only', 'Generate scaffold without AI enrichment', true)
|
|
83
54
|
.action(async (opts) => {
|
|
84
|
-
const
|
|
55
|
+
const obj = (0, shared_1.scaffoldCourseObject)(opts.topic, {
|
|
85
56
|
hours: parseInt(opts.hours, 10),
|
|
86
57
|
source: opts.source,
|
|
87
58
|
});
|
|
59
|
+
const yamlContent = yaml.dump(obj, { lineWidth: 120, noRefs: true });
|
|
88
60
|
(0, analytics_1.cliCapture)('course scaffolded', { topic: opts.topic, estimated_hours: parseInt(opts.hours, 10) });
|
|
89
61
|
if (opts.output) {
|
|
90
62
|
fs.writeFileSync(opts.output, yamlContent);
|
|
91
63
|
(0, output_1.output)({ file: opts.output, topic: opts.topic }, `Scaffold written to ${opts.output}`);
|
|
92
64
|
}
|
|
93
65
|
else {
|
|
94
|
-
// Output raw YAML to stdout (not wrapped in JSON even in json mode for piping)
|
|
95
66
|
console.log(yamlContent);
|
|
96
67
|
}
|
|
97
68
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-course.js","sourceRoot":"","sources":["../../src/commands/create-course.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"create-course.js","sourceRoot":"","sources":["../../src/commands/create-course.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,kEAkCC;AAxCD,uCAAyB;AACzB,8CAAgC;AAChC,6CAAwD;AACxD,0CAAuC;AACvC,gDAA8C;AAE9C,SAAgB,2BAA2B,CAAC,OAAgB;IAC1D,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE1C,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,cAAc,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,EAAE,IAAI,CAAC;SACzD,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;SACtE,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,EAAE,IAAI,CAAC;SAC1E,MAAM,CAAC,KAAK,EAAE,IAA+F,EAAE,EAAE;QAChH,MAAM,GAAG,GAAG,IAAA,6BAAoB,EAAC,IAAI,CAAC,KAAK,EAAE;YAC3C,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,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,mBAAmB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAElG,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,uBAAuB,IAAI,CAAC,MAAM,EAAE,CACrC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QA8CvD"}
|
|
@@ -39,35 +39,6 @@ const yaml = __importStar(require("js-yaml"));
|
|
|
39
39
|
const shared_1 = require("@graspful/shared");
|
|
40
40
|
const output_1 = require("../lib/output");
|
|
41
41
|
const analytics_1 = require("../lib/analytics");
|
|
42
|
-
function computeGraphDepth(concepts) {
|
|
43
|
-
const graph = new Map();
|
|
44
|
-
for (const c of concepts) {
|
|
45
|
-
graph.set(c.id, c.prerequisites);
|
|
46
|
-
}
|
|
47
|
-
const memo = new Map();
|
|
48
|
-
function depth(id, visited) {
|
|
49
|
-
if (memo.has(id))
|
|
50
|
-
return memo.get(id);
|
|
51
|
-
if (visited.has(id))
|
|
52
|
-
return 0; // cycle, avoid infinite loop
|
|
53
|
-
visited.add(id);
|
|
54
|
-
const prereqs = graph.get(id) ?? [];
|
|
55
|
-
let maxPrereqDepth = 0;
|
|
56
|
-
for (const prereq of prereqs) {
|
|
57
|
-
if (graph.has(prereq)) {
|
|
58
|
-
maxPrereqDepth = Math.max(maxPrereqDepth, depth(prereq, visited));
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
const d = maxPrereqDepth + 1;
|
|
62
|
-
memo.set(id, d);
|
|
63
|
-
return d;
|
|
64
|
-
}
|
|
65
|
-
let maxDepth = 0;
|
|
66
|
-
for (const c of concepts) {
|
|
67
|
-
maxDepth = Math.max(maxDepth, depth(c.id, new Set()));
|
|
68
|
-
}
|
|
69
|
-
return maxDepth;
|
|
70
|
-
}
|
|
71
42
|
function registerDescribeCommand(program) {
|
|
72
43
|
program
|
|
73
44
|
.command('describe <file>')
|
|
@@ -91,70 +62,22 @@ function registerDescribeCommand(program) {
|
|
|
91
62
|
(0, output_1.outputError)(`Invalid course YAML: ${result.error.issues[0]?.message ?? 'unknown error'}`);
|
|
92
63
|
process.exit(1);
|
|
93
64
|
}
|
|
94
|
-
const
|
|
95
|
-
const concepts = data.concepts;
|
|
96
|
-
const sections = data.sections;
|
|
97
|
-
const authoredConcepts = concepts.filter((c) => c.knowledgePoints.length > 0);
|
|
98
|
-
const stubConcepts = concepts.filter((c) => c.knowledgePoints.length === 0);
|
|
99
|
-
const kpCount = concepts.reduce((sum, c) => sum + c.knowledgePoints.length, 0);
|
|
100
|
-
const problemCount = concepts.reduce((sum, c) => sum + c.knowledgePoints.reduce((s, kp) => s + kp.problems.length, 0), 0);
|
|
101
|
-
const graphDepth = computeGraphDepth(concepts);
|
|
102
|
-
const conceptsWithoutKps = stubConcepts.map((c) => c.id);
|
|
103
|
-
const kpsWithoutProblems = [];
|
|
104
|
-
for (const c of concepts) {
|
|
105
|
-
for (const kp of c.knowledgePoints) {
|
|
106
|
-
if (kp.problems.length === 0) {
|
|
107
|
-
kpsWithoutProblems.push(`${c.id}/${kp.id}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
// Section breakdown
|
|
112
|
-
const sectionBreakdown = [];
|
|
113
|
-
if (sections.length > 0) {
|
|
114
|
-
for (const section of sections) {
|
|
115
|
-
const sectionConcepts = concepts.filter((c) => c.section === section.id);
|
|
116
|
-
const sKps = sectionConcepts.reduce((sum, c) => sum + c.knowledgePoints.length, 0);
|
|
117
|
-
const sProblems = sectionConcepts.reduce((sum, c) => sum + c.knowledgePoints.reduce((s, kp) => s + kp.problems.length, 0), 0);
|
|
118
|
-
sectionBreakdown.push({ section: section.id, concepts: sectionConcepts.length, kps: sKps, problems: sProblems });
|
|
119
|
-
}
|
|
120
|
-
// Concepts without a section
|
|
121
|
-
const unsectioned = concepts.filter((c) => !c.section);
|
|
122
|
-
if (unsectioned.length > 0) {
|
|
123
|
-
const uKps = unsectioned.reduce((sum, c) => sum + c.knowledgePoints.length, 0);
|
|
124
|
-
const uProblems = unsectioned.reduce((sum, c) => sum + c.knowledgePoints.reduce((s, kp) => s + kp.problems.length, 0), 0);
|
|
125
|
-
sectionBreakdown.push({ section: '(unsectioned)', concepts: unsectioned.length, kps: uKps, problems: uProblems });
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
const stats = {
|
|
129
|
-
courseName: data.course.name,
|
|
130
|
-
courseId: data.course.id,
|
|
131
|
-
version: data.course.version,
|
|
132
|
-
estimatedHours: data.course.estimatedHours,
|
|
133
|
-
concepts: concepts.length,
|
|
134
|
-
authoredConcepts: authoredConcepts.length,
|
|
135
|
-
stubConcepts: stubConcepts.length,
|
|
136
|
-
knowledgePoints: kpCount,
|
|
137
|
-
problems: problemCount,
|
|
138
|
-
graphDepth,
|
|
139
|
-
conceptsWithoutKps: conceptsWithoutKps.length,
|
|
140
|
-
kpsWithoutProblems: kpsWithoutProblems.length,
|
|
141
|
-
sections: sectionBreakdown,
|
|
142
|
-
};
|
|
65
|
+
const stats = (0, shared_1.describeCourse)(result.data);
|
|
143
66
|
const humanLines = [
|
|
144
|
-
`Course: "${
|
|
145
|
-
`Concepts: ${concepts
|
|
146
|
-
`KPs: ${
|
|
147
|
-
`Graph depth: ${graphDepth}`,
|
|
148
|
-
`Missing: ${conceptsWithoutKps
|
|
67
|
+
`Course: "${stats.courseName}" (v${stats.version})`,
|
|
68
|
+
`Concepts: ${stats.concepts} (${stats.authoredConcepts} authored, ${stats.stubConcepts} stubs)`,
|
|
69
|
+
`KPs: ${stats.knowledgePoints}, Problems: ${stats.problems}`,
|
|
70
|
+
`Graph depth: ${stats.graphDepth}`,
|
|
71
|
+
`Missing: ${stats.conceptsWithoutKps} concepts need KPs, ${stats.kpsWithoutProblems} KPs need problems`,
|
|
149
72
|
];
|
|
150
|
-
if (
|
|
73
|
+
if (stats.sections.length > 0) {
|
|
151
74
|
humanLines.push('');
|
|
152
75
|
humanLines.push('Sections:');
|
|
153
|
-
for (const s of
|
|
76
|
+
for (const s of stats.sections) {
|
|
154
77
|
humanLines.push(` ${s.section}: ${s.concepts} concepts, ${s.kps} KPs, ${s.problems} problems`);
|
|
155
78
|
}
|
|
156
79
|
}
|
|
157
|
-
(0, analytics_1.cliCapture)('course described', { concept_count: concepts
|
|
80
|
+
(0, analytics_1.cliCapture)('course described', { concept_count: stats.concepts, kp_count: stats.knowledgePoints, problem_count: stats.problems });
|
|
158
81
|
(0, output_1.output)(stats, humanLines.join('\n'));
|
|
159
82
|
});
|
|
160
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,0DA8CC;AApDD,uCAAyB;AACzB,8CAAgC;AAChC,6CAAoE;AACpE,0CAAoD;AACpD,gDAA8C;AAE9C,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,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,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAClD,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,MAAM,MAAM,GAAG,yBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAA,oBAAW,EAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,IAAA,uBAAc,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,UAAU,GAAG;YACjB,YAAY,KAAK,CAAC,UAAU,OAAO,KAAK,CAAC,OAAO,GAAG;YACnD,aAAa,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,gBAAgB,cAAc,KAAK,CAAC,YAAY,SAAS;YAC/F,QAAQ,KAAK,CAAC,eAAe,eAAe,KAAK,CAAC,QAAQ,EAAE;YAC5D,gBAAgB,KAAK,CAAC,UAAU,EAAE;YAClC,YAAY,KAAK,CAAC,kBAAkB,uBAAuB,KAAK,CAAC,kBAAkB,oBAAoB;SACxG,CAAC;QAEF,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC/B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,QAAQ,WAAW,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;QAED,IAAA,sBAAU,EAAC,kBAAkB,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,eAAe,EAAE,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClI,IAAA,eAAM,EAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-concept.d.ts","sourceRoot":"","sources":["../../src/commands/fill-concept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"fill-concept.d.ts","sourceRoot":"","sources":["../../src/commands/fill-concept.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,WA+C1D"}
|