@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.
Files changed (52) hide show
  1. package/README.md +44 -19
  2. package/dist/commands/create-academy.d.ts +3 -0
  3. package/dist/commands/create-academy.d.ts.map +1 -0
  4. package/dist/commands/create-academy.js +73 -0
  5. package/dist/commands/create-academy.js.map +1 -0
  6. package/dist/commands/create-brand.d.ts +0 -5
  7. package/dist/commands/create-brand.d.ts.map +1 -1
  8. package/dist/commands/create-brand.js +5 -64
  9. package/dist/commands/create-brand.js.map +1 -1
  10. package/dist/commands/create-course.d.ts +0 -4
  11. package/dist/commands/create-course.d.ts.map +1 -1
  12. package/dist/commands/create-course.js +3 -32
  13. package/dist/commands/create-course.js.map +1 -1
  14. package/dist/commands/describe.d.ts.map +1 -1
  15. package/dist/commands/describe.js +9 -86
  16. package/dist/commands/describe.js.map +1 -1
  17. package/dist/commands/fill-concept.d.ts.map +1 -1
  18. package/dist/commands/fill-concept.js +12 -47
  19. package/dist/commands/fill-concept.js.map +1 -1
  20. package/dist/commands/import.d.ts.map +1 -1
  21. package/dist/commands/import.js +79 -14
  22. package/dist/commands/import.js.map +1 -1
  23. package/dist/commands/init.d.ts.map +1 -1
  24. package/dist/commands/init.js +13 -7
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/login.d.ts.map +1 -1
  27. package/dist/commands/login.js +27 -1
  28. package/dist/commands/login.js.map +1 -1
  29. package/dist/commands/register.d.ts.map +1 -1
  30. package/dist/commands/register.js +3 -0
  31. package/dist/commands/register.js.map +1 -1
  32. package/dist/commands/review.d.ts.map +1 -1
  33. package/dist/commands/review.js +12 -1
  34. package/dist/commands/review.js.map +1 -1
  35. package/dist/commands/validate.d.ts.map +1 -1
  36. package/dist/commands/validate.js +5 -92
  37. package/dist/commands/validate.js.map +1 -1
  38. package/dist/index.js +3 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/lib/analytics.d.ts +2 -0
  41. package/dist/lib/analytics.d.ts.map +1 -1
  42. package/dist/lib/analytics.js +92 -4
  43. package/dist/lib/analytics.js.map +1 -1
  44. package/dist/lib/auth.d.ts +2 -1
  45. package/dist/lib/auth.d.ts.map +1 -1
  46. package/dist/lib/auth.js +13 -5
  47. package/dist/lib/auth.js.map +1 -1
  48. package/dist/lib/browser-auth.d.ts +1 -0
  49. package/dist/lib/browser-auth.d.ts.map +1 -1
  50. package/dist/lib/browser-auth.js +2 -1
  51. package/dist/lib/browser-auth.js.map +1 -1
  52. package/package.json +5 -4
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@graspful/cli)](https://www.npmjs.com/package/@graspful/cli)
4
4
  [![license](https://img.shields.io/npm/l/@graspful/cli)](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. Two YAML files in, live course product out -- with adaptive learning, spaced repetition, and Stripe billing.
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 a course
15
- npx @graspful/cli create course --topic "CKA Exam" -o cka.yaml
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 two YAML files into a live learning product:
49
+ Graspful turns an academy manifest, course YAMLs, and a brand YAML into a live learning product:
49
50
 
50
51
  ```
51
- course.yaml ──┐
52
- ├──▶ graspful import ──▶ Live adaptive course
52
+ academy.yaml ──┐
53
+ course.yaml ──┼──▶ graspful import ──▶ Live adaptive academy
53
54
  brand.yaml ──┘ with billing, analytics,
54
- and spaced repetition
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 "DevOps Academy" --org devops-co
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 | `2` |
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 | `cross_concept_coverage` | No single term dominates too many concepts |
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. **Scaffold** -- `graspful create course --topic "X"` to generate the graph skeleton
216
- 2. **Edit** -- modify the YAML to add concepts, adjust prerequisites and difficulty levels
217
- 3. **Fill** -- `graspful fill concept` for each concept to add KP/problem stubs
218
- 4. **Author** -- replace TODO placeholders with real instructions, worked examples, and problems
219
- 5. **Validate** -- `graspful validate` after each edit (offline, fast)
220
- 6. **Review** -- `graspful review` to run all 10 quality checks
221
- 7. **Import** -- `graspful import --org <org> --publish` when review passes 10/10
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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCreateAcademyCommand(createCmd: Command): void;
3
+ //# sourceMappingURL=create-academy.d.ts.map
@@ -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;AAepC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAsDlH;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,OAAO,QA2B5D"}
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 yamlContent = scaffoldBrand(opts.niche, {
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":"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"}
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;AAMpC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA4BlG;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,WAkC3D"}
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 yamlContent = scaffoldCourse(opts.topic, {
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":"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"}
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;AAyCpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QA8GvD"}
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 data = result.data;
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: "${data.course.name}" (v${data.course.version})`,
145
- `Concepts: ${concepts.length} (${authoredConcepts.length} authored, ${stubConcepts.length} stubs)`,
146
- `KPs: ${kpCount}, Problems: ${problemCount}`,
147
- `Graph depth: ${graphDepth}`,
148
- `Missing: ${conceptsWithoutKps.length} concepts need KPs, ${kpsWithoutProblems.length} KPs need problems`,
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 (sectionBreakdown.length > 0) {
73
+ if (stats.sections.length > 0) {
151
74
  humanLines.push('');
152
75
  humanLines.push('Sections:');
153
- for (const s of sectionBreakdown) {
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.length, kp_count: kpCount, problem_count: problemCount });
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":"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"}
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,WA4F1D"}
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"}