@compilr-dev/cli 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -12
- package/dist/agent.d.ts +74 -1
- package/dist/agent.js +259 -76
- package/dist/anchors/index.d.ts +9 -0
- package/dist/anchors/index.js +9 -0
- package/dist/anchors/project-anchors.d.ts +79 -0
- package/dist/anchors/project-anchors.js +202 -0
- package/dist/commands/handler-types.d.ts +68 -0
- package/dist/commands/handler-types.js +8 -0
- package/dist/commands/handlers/agent-commands.d.ts +13 -0
- package/dist/commands/handlers/agent-commands.js +305 -0
- package/dist/commands/handlers/design-commands.d.ts +15 -0
- package/dist/commands/handlers/design-commands.js +334 -0
- package/dist/commands/handlers/index.d.ts +20 -0
- package/dist/commands/handlers/index.js +43 -0
- package/dist/commands/handlers/overlay-commands.d.ts +21 -0
- package/dist/commands/handlers/overlay-commands.js +287 -0
- package/dist/commands/handlers/project-commands.d.ts +11 -0
- package/dist/commands/handlers/project-commands.js +167 -0
- package/dist/commands/handlers/simple-commands.d.ts +19 -0
- package/dist/commands/handlers/simple-commands.js +144 -0
- package/dist/commands/index.d.ts +2 -1
- package/dist/commands/registry.d.ts +50 -0
- package/dist/commands/registry.js +75 -0
- package/dist/commands-v2/handlers/context.d.ts +13 -0
- package/dist/commands-v2/handlers/context.js +348 -0
- package/dist/commands-v2/handlers/core.d.ts +13 -0
- package/dist/commands-v2/handlers/core.js +165 -0
- package/dist/commands-v2/handlers/debug.d.ts +11 -0
- package/dist/commands-v2/handlers/debug.js +159 -0
- package/dist/commands-v2/handlers/index.d.ts +12 -0
- package/dist/commands-v2/handlers/index.js +24 -0
- package/dist/commands-v2/handlers/project.d.ts +22 -0
- package/dist/commands-v2/handlers/project.js +814 -0
- package/dist/commands-v2/handlers/settings.d.ts +15 -0
- package/dist/commands-v2/handlers/settings.js +235 -0
- package/dist/commands-v2/index.d.ts +13 -0
- package/dist/commands-v2/index.js +15 -0
- package/dist/commands-v2/registry.d.ts +37 -0
- package/dist/commands-v2/registry.js +80 -0
- package/dist/commands-v2/types.d.ts +75 -0
- package/dist/commands-v2/types.js +7 -0
- package/dist/commands.js +110 -7
- package/dist/index.js +288 -29
- package/dist/input-handlers/index.d.ts +7 -0
- package/dist/input-handlers/index.js +7 -0
- package/dist/input-handlers/memory-handler.d.ts +26 -0
- package/dist/input-handlers/memory-handler.js +68 -0
- package/dist/repl-helpers.d.ts +63 -0
- package/dist/repl-helpers.js +318 -0
- package/dist/repl-v2.d.ts +155 -0
- package/dist/repl-v2.js +774 -0
- package/dist/repl.d.ts +32 -4
- package/dist/repl.js +250 -977
- package/dist/settings/index.d.ts +23 -0
- package/dist/settings/index.js +48 -0
- package/dist/settings/paths.d.ts +110 -0
- package/dist/settings/paths.js +264 -0
- package/dist/templates/compilr-md.js +7 -4
- package/dist/templates/index.js +3 -4
- package/dist/themes/colors.js +3 -1
- package/dist/themes/registry.d.ts +5 -36
- package/dist/themes/registry.js +11 -95
- package/dist/themes/types.d.ts +3 -38
- package/dist/themes/types.js +2 -2
- package/dist/tools/anchor-tools.d.ts +31 -0
- package/dist/tools/anchor-tools.js +255 -0
- package/dist/tools/backlog-wrappers.d.ts +54 -0
- package/dist/tools/backlog-wrappers.js +338 -0
- package/dist/tools/backlog.js +1 -1
- package/dist/tools/db-tools.d.ts +65 -0
- package/dist/tools/db-tools.js +19 -0
- package/dist/tools/document-db.d.ts +43 -0
- package/dist/tools/document-db.js +220 -0
- package/dist/tools/project-db.d.ts +102 -0
- package/dist/tools/project-db.js +370 -0
- package/dist/tools/workitem-db.d.ts +103 -0
- package/dist/tools/workitem-db.js +549 -0
- package/dist/tools.js +13 -3
- package/dist/ui/agents-overlay-v2.d.ts +43 -0
- package/dist/ui/agents-overlay-v2.js +809 -0
- package/dist/ui/agents-overlay.d.ts +5 -5
- package/dist/ui/agents-overlay.js +782 -420
- package/dist/ui/anchors-overlay.d.ts +12 -0
- package/dist/ui/anchors-overlay.js +775 -0
- package/dist/ui/arch-type-overlay.d.ts +1 -6
- package/dist/ui/arch-type-overlay.js +175 -203
- package/dist/ui/ask-user-overlay-v2.d.ts +26 -0
- package/dist/ui/ask-user-overlay-v2.js +555 -0
- package/dist/ui/ask-user-overlay.d.ts +2 -2
- package/dist/ui/ask-user-overlay.js +443 -535
- package/dist/ui/ask-user-simple-overlay-v2.d.ts +25 -0
- package/dist/ui/ask-user-simple-overlay-v2.js +215 -0
- package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
- package/dist/ui/ask-user-simple-overlay.js +182 -209
- package/dist/ui/backlog-overlay.d.ts +16 -1
- package/dist/ui/backlog-overlay.js +525 -659
- package/dist/ui/base/index.d.ts +26 -0
- package/dist/ui/base/index.js +33 -0
- package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
- package/dist/ui/base/inline-overlay-utils.js +320 -0
- package/dist/ui/base/inline-overlay.d.ts +159 -0
- package/dist/ui/base/inline-overlay.js +257 -0
- package/dist/ui/base/key-utils.d.ts +15 -0
- package/dist/ui/base/key-utils.js +30 -0
- package/dist/ui/base/overlay-base-v2.d.ts +193 -0
- package/dist/ui/base/overlay-base-v2.js +246 -0
- package/dist/ui/base/overlay-base.d.ts +156 -0
- package/dist/ui/base/overlay-base.js +238 -0
- package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
- package/dist/ui/base/overlay-lifecycle.js +159 -0
- package/dist/ui/base/overlay-types.d.ts +185 -0
- package/dist/ui/base/overlay-types.js +7 -0
- package/dist/ui/base/render-utils.d.ts +8 -0
- package/dist/ui/base/render-utils.js +11 -0
- package/dist/ui/base/screen-stack.d.ts +148 -0
- package/dist/ui/base/screen-stack.js +184 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +103 -0
- package/dist/ui/base/tabbed-list-overlay-v2.js +317 -0
- package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
- package/dist/ui/base/tabbed-list-overlay.js +369 -0
- package/dist/ui/commands-overlay-v2.d.ts +33 -0
- package/dist/ui/commands-overlay-v2.js +441 -0
- package/dist/ui/commands-overlay.d.ts +7 -2
- package/dist/ui/commands-overlay.js +384 -355
- package/dist/ui/config-overlay.d.ts +5 -4
- package/dist/ui/config-overlay.js +243 -513
- package/dist/ui/conversation.d.ts +75 -4
- package/dist/ui/conversation.js +374 -161
- package/dist/ui/docs-overlay.d.ts +17 -0
- package/dist/ui/docs-overlay.js +303 -0
- package/dist/ui/ephemeral.d.ts +1 -1
- package/dist/ui/ephemeral.js +1 -1
- package/dist/ui/features/index.d.ts +34 -0
- package/dist/ui/features/index.js +34 -0
- package/dist/ui/features/input-feature.d.ts +85 -0
- package/dist/ui/features/input-feature.js +238 -0
- package/dist/ui/features/list-feature.d.ts +155 -0
- package/dist/ui/features/list-feature.js +244 -0
- package/dist/ui/features/pagination-feature.d.ts +154 -0
- package/dist/ui/features/pagination-feature.js +238 -0
- package/dist/ui/features/search-feature.d.ts +148 -0
- package/dist/ui/features/search-feature.js +185 -0
- package/dist/ui/features/tab-feature.d.ts +194 -0
- package/dist/ui/features/tab-feature.js +307 -0
- package/dist/ui/footer-v2.d.ts +222 -0
- package/dist/ui/footer-v2.js +1349 -0
- package/dist/ui/footer.d.ts +107 -0
- package/dist/ui/footer.js +359 -67
- package/dist/ui/guardrail-overlay.d.ts +29 -0
- package/dist/ui/guardrail-overlay.js +145 -0
- package/dist/ui/help-overlay-v2.d.ts +34 -0
- package/dist/ui/help-overlay-v2.js +309 -0
- package/dist/ui/help-overlay.d.ts +16 -0
- package/dist/ui/help-overlay.js +316 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -3
- package/dist/ui/init-overlay-v2.d.ts +34 -0
- package/dist/ui/init-overlay-v2.js +600 -0
- package/dist/ui/init-overlay.d.ts +12 -2
- package/dist/ui/init-overlay.js +349 -270
- package/dist/ui/input-prompt-v2.d.ts +1 -0
- package/dist/ui/input-prompt-v2.js +14 -6
- package/dist/ui/input-prompt.d.ts +116 -33
- package/dist/ui/input-prompt.js +536 -337
- package/dist/ui/iteration-limit-overlay-v2.d.ts +21 -0
- package/dist/ui/iteration-limit-overlay-v2.js +114 -0
- package/dist/ui/iteration-limit-overlay.d.ts +2 -2
- package/dist/ui/iteration-limit-overlay.js +92 -128
- package/dist/ui/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/keys-overlay-v2.js +248 -0
- package/dist/ui/keys-overlay.d.ts +1 -0
- package/dist/ui/keys-overlay.js +203 -141
- package/dist/ui/line-utils.d.ts +88 -0
- package/dist/ui/line-utils.js +150 -0
- package/dist/ui/live-region.d.ts +161 -0
- package/dist/ui/live-region.js +387 -0
- package/dist/ui/mascot/expressions.d.ts +32 -0
- package/dist/ui/mascot/expressions.js +213 -0
- package/dist/ui/mascot/index.d.ts +8 -0
- package/dist/ui/mascot/index.js +8 -0
- package/dist/ui/mascot/renderer.d.ts +19 -0
- package/dist/ui/mascot/renderer.js +97 -0
- package/dist/ui/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/mascot-overlay-v2.js +138 -0
- package/dist/ui/mascot-overlay.d.ts +21 -0
- package/dist/ui/mascot-overlay.js +146 -0
- package/dist/ui/model-overlay-v2.d.ts +49 -0
- package/dist/ui/model-overlay-v2.js +118 -0
- package/dist/ui/model-overlay.d.ts +27 -0
- package/dist/ui/model-overlay.js +221 -0
- package/dist/ui/model-warning-overlay.js +3 -5
- package/dist/ui/new-overlay.d.ts +34 -0
- package/dist/ui/new-overlay.js +604 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.js +825 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +783 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.js +584 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +642 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.js +441 -0
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +100 -0
- package/dist/ui/overlay/impl/config-overlay-v2.js +654 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +55 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +359 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +77 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1071 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/help-overlay-v2.d.ts +34 -0
- package/dist/ui/overlay/impl/help-overlay-v2.js +309 -0
- package/dist/ui/overlay/impl/init-overlay-v2.d.ts +77 -0
- package/dist/ui/overlay/impl/init-overlay-v2.js +593 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
- package/dist/ui/overlay/impl/model-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/model-overlay-v2.js +118 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +77 -0
- package/dist/ui/overlay/impl/new-overlay-v2.js +593 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +499 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.js +218 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +31 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +1035 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +637 -0
- package/dist/ui/overlay/index.d.ts +33 -0
- package/dist/ui/overlay/index.js +35 -0
- package/dist/ui/overlay/key-utils.d.ts +6 -0
- package/dist/ui/overlay/key-utils.js +6 -0
- package/dist/ui/overlay/overlay-types.d.ts +128 -0
- package/dist/ui/overlay/overlay-types.js +22 -0
- package/dist/ui/overlay/types.d.ts +135 -0
- package/dist/ui/overlay/types.js +22 -0
- package/dist/ui/overlays/help-overlay-v2.d.ts +28 -0
- package/dist/ui/overlays/help-overlay-v2.js +198 -0
- package/dist/ui/overlays/index.d.ts +11 -0
- package/dist/ui/overlays/index.js +11 -0
- package/dist/ui/overlays.d.ts +0 -4
- package/dist/ui/overlays.js +0 -444
- package/dist/ui/permission-overlay-v2.d.ts +36 -0
- package/dist/ui/permission-overlay-v2.js +380 -0
- package/dist/ui/permission-overlay.d.ts +1 -1
- package/dist/ui/permission-overlay.js +186 -298
- package/dist/ui/projects-overlay.d.ts +19 -0
- package/dist/ui/projects-overlay.js +484 -0
- package/dist/ui/providers/types.d.ts +178 -0
- package/dist/ui/providers/types.js +9 -0
- package/dist/ui/render-modes.d.ts +36 -0
- package/dist/ui/render-modes.js +44 -0
- package/dist/ui/startup-menu.d.ts +36 -0
- package/dist/ui/startup-menu.js +236 -0
- package/dist/ui/subagent-renderer.d.ts +117 -0
- package/dist/ui/subagent-renderer.js +334 -0
- package/dist/ui/terminal-codes.d.ts +94 -0
- package/dist/ui/terminal-codes.js +124 -0
- package/dist/ui/terminal-renderer.d.ts +221 -0
- package/dist/ui/terminal-renderer.js +751 -0
- package/dist/ui/terminal-ui.d.ts +463 -0
- package/dist/ui/terminal-ui.js +2296 -0
- package/dist/ui/terminal.d.ts +20 -0
- package/dist/ui/terminal.js +72 -0
- package/dist/ui/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/theme-overlay-v2.js +135 -0
- package/dist/ui/theme-overlay.d.ts +24 -0
- package/dist/ui/theme-overlay.js +127 -0
- package/dist/ui/todo-zone.js +53 -25
- package/dist/ui/tool-formatters.d.ts +16 -0
- package/dist/ui/tool-formatters.js +516 -0
- package/dist/ui/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/tools-overlay-v2.js +218 -0
- package/dist/ui/tools-overlay.d.ts +10 -2
- package/dist/ui/tools-overlay.js +172 -220
- package/dist/ui/tutorial-overlay-v2.d.ts +31 -0
- package/dist/ui/tutorial-overlay-v2.js +1035 -0
- package/dist/ui/tutorial-overlay.d.ts +1 -0
- package/dist/ui/tutorial-overlay.js +400 -302
- package/dist/ui/workflow-overlay.d.ts +22 -0
- package/dist/ui/workflow-overlay.js +636 -0
- package/dist/utils/debug-log.d.ts +28 -0
- package/dist/utils/debug-log.js +57 -0
- package/dist/utils/model-tiers.js +1 -1
- package/dist/utils/path-safety.d.ts +56 -0
- package/dist/utils/path-safety.js +239 -0
- package/dist/workflow/guided-mode-injector.d.ts +42 -0
- package/dist/workflow/guided-mode-injector.js +191 -0
- package/dist/workflow/index.d.ts +8 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/step-criteria.d.ts +62 -0
- package/dist/workflow/step-criteria.js +150 -0
- package/dist/workflow/step-tracker.d.ts +92 -0
- package/dist/workflow/step-tracker.js +141 -0
- package/package.json +12 -5
|
@@ -0,0 +1,1035 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tutorial Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Interactive tutorial using the new Overlay interface.
|
|
5
|
+
* Supports guided sequential tour and topic-based navigation.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseOverlayV2, BaseScreen, ScreenStack, stay, pushScreen, popScreen, closeOverlay, isEscape, isEnter, isCtrlC, isClose, isNavigateUp, isNavigateDown, isLeftArrow, isRightArrow, isVimLeft, isVimRight, isBackspace, renderBorder, } from '../../base/index.js';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// Helper
|
|
10
|
+
// =============================================================================
|
|
11
|
+
function stripAnsi(str) {
|
|
12
|
+
// eslint-disable-next-line no-control-regex
|
|
13
|
+
return str.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '');
|
|
14
|
+
}
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// Content
|
|
17
|
+
// =============================================================================
|
|
18
|
+
function buildTopics(s) {
|
|
19
|
+
return [
|
|
20
|
+
// =========================================================================
|
|
21
|
+
// Topic 1: Workflow Overview
|
|
22
|
+
// =========================================================================
|
|
23
|
+
{
|
|
24
|
+
id: 'overview',
|
|
25
|
+
name: 'Workflow Overview',
|
|
26
|
+
description: 'The philosophy and stages',
|
|
27
|
+
pages: [
|
|
28
|
+
{
|
|
29
|
+
title: 'Philosophy',
|
|
30
|
+
lines: [
|
|
31
|
+
'',
|
|
32
|
+
` ${s.primaryBold('compilr.dev')} is built on five core principles:`,
|
|
33
|
+
'',
|
|
34
|
+
` ${s.primary('1. Structured')}`,
|
|
35
|
+
` Follow an organized workflow instead of ad-hoc coding.`,
|
|
36
|
+
` Every project has clear phases and documentation.`,
|
|
37
|
+
'',
|
|
38
|
+
` ${s.primary('2. Disciplined')}`,
|
|
39
|
+
` Move through clear phases from design to delivery.`,
|
|
40
|
+
` Don't skip steps - each builds on the previous.`,
|
|
41
|
+
'',
|
|
42
|
+
` ${s.primary('3. Intentional')}`,
|
|
43
|
+
` Every feature starts with requirements, not code.`,
|
|
44
|
+
` Know what you're building before you build it.`,
|
|
45
|
+
'',
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
title: 'Philosophy (continued)',
|
|
50
|
+
lines: [
|
|
51
|
+
'',
|
|
52
|
+
` ${s.primary('4. Engineering-First')}`,
|
|
53
|
+
` Follow best practices: testing, documentation, code review.`,
|
|
54
|
+
` Build software that's maintainable long-term.`,
|
|
55
|
+
'',
|
|
56
|
+
` ${s.primary('5. Flexible')}`,
|
|
57
|
+
` Adapt the workflow to your needs.`,
|
|
58
|
+
` Use what works, skip what doesn't.`,
|
|
59
|
+
'',
|
|
60
|
+
` The AI assistant guides you through each stage, helping you build`,
|
|
61
|
+
` projects with ${s.primary('structure')} and ${s.primary('discipline')} - not just generating random code.`,
|
|
62
|
+
'',
|
|
63
|
+
` ${s.muted('The goal: sustainable development with AI assistance.')}`,
|
|
64
|
+
'',
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
title: 'The Workflow Stages',
|
|
69
|
+
lines: [
|
|
70
|
+
'',
|
|
71
|
+
` The development workflow has five main stages:`,
|
|
72
|
+
'',
|
|
73
|
+
` ${s.primary('/new')} Set up your project structure`,
|
|
74
|
+
` Creates project in database with configuration`,
|
|
75
|
+
'',
|
|
76
|
+
` ${s.primary('/design')} Gather requirements and create a PRD`,
|
|
77
|
+
` Documents stored in database for persistence`,
|
|
78
|
+
'',
|
|
79
|
+
` ${s.primary('/backlog')} Manage your work items`,
|
|
80
|
+
` Track status, prioritize, break down tasks`,
|
|
81
|
+
'',
|
|
82
|
+
` ${s.primary('/build')} Implement features from the backlog`,
|
|
83
|
+
` AI-assisted coding with your approval`,
|
|
84
|
+
'',
|
|
85
|
+
` ${s.primary('/workflow')} Check progress and next steps`,
|
|
86
|
+
` See where you are and what's next`,
|
|
87
|
+
'',
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
title: 'Project Management',
|
|
92
|
+
lines: [
|
|
93
|
+
'',
|
|
94
|
+
` ${s.secondary('Track Your Progress')}`,
|
|
95
|
+
'',
|
|
96
|
+
` ${s.primaryBold('/projects')}`,
|
|
97
|
+
` View all your projects in one place.`,
|
|
98
|
+
` Filter by status: Active, Paused, Completed, Archived.`,
|
|
99
|
+
` Switch between projects or open project directories.`,
|
|
100
|
+
'',
|
|
101
|
+
` ${s.primaryBold('/workflow')}`,
|
|
102
|
+
` See your current project's workflow status.`,
|
|
103
|
+
` Shows which phases are complete and what's next.`,
|
|
104
|
+
` Quick actions to jump to the right command.`,
|
|
105
|
+
'',
|
|
106
|
+
` ${s.primaryBold('/docs')}`,
|
|
107
|
+
` Browse documents created during design.`,
|
|
108
|
+
` View PRDs, architecture docs, and notes.`,
|
|
109
|
+
'',
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
// =========================================================================
|
|
115
|
+
// Topic 2: Initialize
|
|
116
|
+
// =========================================================================
|
|
117
|
+
{
|
|
118
|
+
id: 'init',
|
|
119
|
+
name: 'Initialize',
|
|
120
|
+
description: 'Setting up a new project',
|
|
121
|
+
pages: [
|
|
122
|
+
{
|
|
123
|
+
title: '/new Command',
|
|
124
|
+
lines: [
|
|
125
|
+
'',
|
|
126
|
+
` ${s.primaryBold('/new')} creates your project foundation through an 8-step wizard.`,
|
|
127
|
+
'',
|
|
128
|
+
` ${s.secondary('What it creates:')}`,
|
|
129
|
+
'',
|
|
130
|
+
` ${s.success('+')} ${s.primary('Project in database')} - Tracked for easy management`,
|
|
131
|
+
` ${s.success('+')} ${s.primary('COMPILR.md')} - Context file for the AI assistant`,
|
|
132
|
+
` ${s.success('+')} ${s.primary('.compilr/config.json')} - Project configuration`,
|
|
133
|
+
` ${s.success('+')} Tech stack setup based on your choices`,
|
|
134
|
+
'',
|
|
135
|
+
` ${s.secondary('The wizard asks about:')}`,
|
|
136
|
+
` - Project name and description`,
|
|
137
|
+
` - Project type (web, api, cli, fullstack)`,
|
|
138
|
+
` - Tech stack preferences`,
|
|
139
|
+
` - Workflow mode (flexible or guided)`,
|
|
140
|
+
'',
|
|
141
|
+
],
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
title: '/new - Database Tracking',
|
|
145
|
+
lines: [
|
|
146
|
+
'',
|
|
147
|
+
` ${s.secondary('Project Database')}`,
|
|
148
|
+
` All projects are tracked in a local SQLite database.`,
|
|
149
|
+
` This enables: multi-project switching, progress tracking,`,
|
|
150
|
+
` and persistent work item management.`,
|
|
151
|
+
'',
|
|
152
|
+
` ${s.secondary('View Your Projects')}`,
|
|
153
|
+
` Use ${s.primary('/projects')} to see all your projects.`,
|
|
154
|
+
` Use ${s.primary('/workflow')} to see current project status.`,
|
|
155
|
+
'',
|
|
156
|
+
` ${s.muted('Tip: Run /new in an empty directory to start fresh.')}`,
|
|
157
|
+
'',
|
|
158
|
+
` After /new completes, the AI reads your COMPILR.md to understand`,
|
|
159
|
+
` your project context. You're ready for the next step: ${s.primary('/design')}`,
|
|
160
|
+
'',
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
// =========================================================================
|
|
166
|
+
// Topic 3: Design
|
|
167
|
+
// =========================================================================
|
|
168
|
+
{
|
|
169
|
+
id: 'design',
|
|
170
|
+
name: 'Design Your Project',
|
|
171
|
+
description: 'Requirements gathering',
|
|
172
|
+
pages: [
|
|
173
|
+
{
|
|
174
|
+
title: '/design Command',
|
|
175
|
+
lines: [
|
|
176
|
+
'',
|
|
177
|
+
` ${s.primaryBold('/design')} is comprehensive requirements gathering through conversation.`,
|
|
178
|
+
'',
|
|
179
|
+
` The AI guides you through three phases:`,
|
|
180
|
+
'',
|
|
181
|
+
` ${s.primary('Phase 1: Vision & Goals')}`,
|
|
182
|
+
` - What problem are you solving?`,
|
|
183
|
+
` - Who is your target user?`,
|
|
184
|
+
` - What does success look like?`,
|
|
185
|
+
'',
|
|
186
|
+
` ${s.primary('Phase 2: Features & Scope')}`,
|
|
187
|
+
` - What are the core features?`,
|
|
188
|
+
` - What's nice-to-have vs essential?`,
|
|
189
|
+
` - What's explicitly out of scope?`,
|
|
190
|
+
'',
|
|
191
|
+
` ${s.primary('Phase 3: Technical Context')}`,
|
|
192
|
+
` - What constraints exist?`,
|
|
193
|
+
` - What integrations are needed?`,
|
|
194
|
+
` - What are your preferences?`,
|
|
195
|
+
'',
|
|
196
|
+
],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
title: '/design - Output',
|
|
200
|
+
lines: [
|
|
201
|
+
'',
|
|
202
|
+
` ${s.secondary('What /design creates:')}`,
|
|
203
|
+
'',
|
|
204
|
+
` ${s.success('+')} ${s.primary('Product Requirements Document (PRD)')}`,
|
|
205
|
+
` Stored in the database for persistence.`,
|
|
206
|
+
` Use ${s.primary('/docs')} to view it anytime.`,
|
|
207
|
+
'',
|
|
208
|
+
` ${s.success('+')} ${s.primary('5-15 Backlog Items')}`,
|
|
209
|
+
` Stored in database with status tracking.`,
|
|
210
|
+
` Use ${s.primary('/backlog')} to manage them.`,
|
|
211
|
+
'',
|
|
212
|
+
` ${s.success('+')} ${s.primary('Clear Acceptance Criteria')}`,
|
|
213
|
+
` Each backlog item has defined done criteria`,
|
|
214
|
+
` so you know when it's complete.`,
|
|
215
|
+
'',
|
|
216
|
+
` ${s.muted('Best for: serious projects that need thorough planning upfront.')}`,
|
|
217
|
+
'',
|
|
218
|
+
],
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
title: '/sketch Command',
|
|
222
|
+
lines: [
|
|
223
|
+
'',
|
|
224
|
+
` ${s.primaryBold('/sketch')} is a quick alternative to /design.`,
|
|
225
|
+
'',
|
|
226
|
+
` Instead of a long conversation, it asks 6 simple questions:`,
|
|
227
|
+
'',
|
|
228
|
+
` ${s.muted('1.')} What are you building?`,
|
|
229
|
+
` ${s.muted('2.')} Who is it for?`,
|
|
230
|
+
` ${s.muted('3.')} What are the 3-5 main features?`,
|
|
231
|
+
` ${s.muted('4.')} What tech stack?`,
|
|
232
|
+
` ${s.muted('5.')} Any constraints or requirements?`,
|
|
233
|
+
` ${s.muted('6.')} What's the MVP scope?`,
|
|
234
|
+
'',
|
|
235
|
+
` ${s.secondary('Output:')} 3-8 backlog items, ready to build.`,
|
|
236
|
+
'',
|
|
237
|
+
` ${s.muted('Best for: small projects, prototypes, or when you just')}`,
|
|
238
|
+
` ${s.muted('want to get started quickly without detailed planning.')}`,
|
|
239
|
+
'',
|
|
240
|
+
],
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
title: '/refine Command',
|
|
244
|
+
lines: [
|
|
245
|
+
'',
|
|
246
|
+
` ${s.primaryBold('/refine')} improves existing backlog items.`,
|
|
247
|
+
'',
|
|
248
|
+
` ${s.secondary('Use it to:')}`,
|
|
249
|
+
'',
|
|
250
|
+
` ${s.muted('+')} Break down large items into smaller, actionable tasks`,
|
|
251
|
+
` ${s.muted('+')} Add acceptance criteria to vague items`,
|
|
252
|
+
` ${s.muted('+')} Clarify ambiguous requirements`,
|
|
253
|
+
` ${s.muted('+')} Add technical details discovered during work`,
|
|
254
|
+
'',
|
|
255
|
+
` ${s.secondary('Usage:')}`,
|
|
256
|
+
` ${s.primary('/refine')} Let the AI suggest what to refine`,
|
|
257
|
+
` ${s.primary('/refine REQ-003')} Refine a specific item`,
|
|
258
|
+
'',
|
|
259
|
+
` ${s.muted('Best for: after initial design when you discover items')}`,
|
|
260
|
+
` ${s.muted('are too big or need more detail before building.')}`,
|
|
261
|
+
'',
|
|
262
|
+
],
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
title: '/arch Command',
|
|
266
|
+
lines: [
|
|
267
|
+
'',
|
|
268
|
+
` ${s.primaryBold('/arch')} creates architecture documentation.`,
|
|
269
|
+
'',
|
|
270
|
+
` ${s.secondary('Document types you can create:')}`,
|
|
271
|
+
'',
|
|
272
|
+
` ${s.muted('1.')} ${s.primary('ADR')} - Architecture Decision Record`,
|
|
273
|
+
` Document key technical decisions and their rationale`,
|
|
274
|
+
'',
|
|
275
|
+
` ${s.muted('2.')} ${s.primary('System Diagram')} - Visual system overview`,
|
|
276
|
+
` Components, connections, data flow`,
|
|
277
|
+
'',
|
|
278
|
+
` ${s.muted('3.')} ${s.primary('Data Model')} - Database/entity design`,
|
|
279
|
+
` Tables, relationships, constraints`,
|
|
280
|
+
'',
|
|
281
|
+
` ${s.muted('4.')} ${s.primary('API Design')} - Endpoint documentation`,
|
|
282
|
+
` Routes, methods, request/response formats`,
|
|
283
|
+
'',
|
|
284
|
+
` ${s.muted('5.')} ${s.primary('Component Overview')} - Module documentation`,
|
|
285
|
+
` How pieces fit together`,
|
|
286
|
+
'',
|
|
287
|
+
],
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
title: '/prd Command',
|
|
291
|
+
lines: [
|
|
292
|
+
'',
|
|
293
|
+
` ${s.primaryBold('/prd')} lets you update your Product Requirements Document.`,
|
|
294
|
+
'',
|
|
295
|
+
` After /design creates your PRD, use /prd to amend it as`,
|
|
296
|
+
` your understanding evolves.`,
|
|
297
|
+
'',
|
|
298
|
+
` ${s.secondary('Usage:')}`,
|
|
299
|
+
` ${s.primary('/prd')} Interactive section selection`,
|
|
300
|
+
` ${s.primary('/prd vision')} Update vision section directly`,
|
|
301
|
+
` ${s.primary('/prd scope')} Update scope section directly`,
|
|
302
|
+
` ${s.primary('/prd features')} Update features section directly`,
|
|
303
|
+
'',
|
|
304
|
+
` ${s.secondary('Sections you can update:')}`,
|
|
305
|
+
` - Vision and goals`,
|
|
306
|
+
` - Features and scope`,
|
|
307
|
+
` - Technical context`,
|
|
308
|
+
` - Non-functional requirements`,
|
|
309
|
+
'',
|
|
310
|
+
],
|
|
311
|
+
},
|
|
312
|
+
],
|
|
313
|
+
},
|
|
314
|
+
// =========================================================================
|
|
315
|
+
// Topic 4: Backlog
|
|
316
|
+
// =========================================================================
|
|
317
|
+
{
|
|
318
|
+
id: 'backlog',
|
|
319
|
+
name: 'Manage Backlog',
|
|
320
|
+
description: 'Track and prioritize work',
|
|
321
|
+
pages: [
|
|
322
|
+
{
|
|
323
|
+
title: '/backlog Command',
|
|
324
|
+
lines: [
|
|
325
|
+
'',
|
|
326
|
+
` ${s.primaryBold('/backlog')} opens an interactive overlay to manage your work items.`,
|
|
327
|
+
'',
|
|
328
|
+
` ${s.secondary('Navigation:')}`,
|
|
329
|
+
` ${s.primary('↑/↓')} Navigate through items`,
|
|
330
|
+
` ${s.primary('←/→')} Navigate pages (if many items)`,
|
|
331
|
+
` ${s.primary('Tab')} Switch filter (All, Feature, Bug, etc.)`,
|
|
332
|
+
` ${s.primary('/')} Search items`,
|
|
333
|
+
` ${s.primary('Enter')} View/edit item details`,
|
|
334
|
+
'',
|
|
335
|
+
` ${s.secondary('Actions:')}`,
|
|
336
|
+
` ${s.primary('n')} Create new item`,
|
|
337
|
+
` ${s.primary('Space')} Toggle item status`,
|
|
338
|
+
` ${s.primary('p')} Change priority`,
|
|
339
|
+
` ${s.primary('Esc')} Close overlay`,
|
|
340
|
+
'',
|
|
341
|
+
],
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
title: '/backlog - Status Workflow',
|
|
345
|
+
lines: [
|
|
346
|
+
'',
|
|
347
|
+
` Items move through three statuses:`,
|
|
348
|
+
'',
|
|
349
|
+
` ${s.warning('backlog')} Not started yet`,
|
|
350
|
+
` ${s.muted('↓')}`,
|
|
351
|
+
` ${s.primary('in-progress')} Currently being worked on`,
|
|
352
|
+
` ${s.muted('↓')}`,
|
|
353
|
+
` ${s.success('completed')} Done!`,
|
|
354
|
+
'',
|
|
355
|
+
` ${s.secondary('Item Types:')}`,
|
|
356
|
+
` ${s.muted('Feature')} New functionality to build`,
|
|
357
|
+
` ${s.muted('Bug')} Something broken to fix`,
|
|
358
|
+
` ${s.muted('Tech-Debt')} Code improvements needed`,
|
|
359
|
+
` ${s.muted('Chore')} Maintenance tasks`,
|
|
360
|
+
'',
|
|
361
|
+
` Items are stored in the ${s.primary('database')} and persist across sessions.`,
|
|
362
|
+
'',
|
|
363
|
+
],
|
|
364
|
+
},
|
|
365
|
+
],
|
|
366
|
+
},
|
|
367
|
+
// =========================================================================
|
|
368
|
+
// Topic 5: Build
|
|
369
|
+
// =========================================================================
|
|
370
|
+
{
|
|
371
|
+
id: 'build',
|
|
372
|
+
name: 'Build',
|
|
373
|
+
description: 'Scaffold and implement',
|
|
374
|
+
pages: [
|
|
375
|
+
{
|
|
376
|
+
title: '/scaffold Command',
|
|
377
|
+
lines: [
|
|
378
|
+
'',
|
|
379
|
+
` ${s.primaryBold('/scaffold')} creates your project's foundation structure.`,
|
|
380
|
+
'',
|
|
381
|
+
` ${s.secondary('What it creates:')}`,
|
|
382
|
+
'',
|
|
383
|
+
` ${s.success('+')} Directory structure (src/, tests/, etc.)`,
|
|
384
|
+
` ${s.success('+')} Configuration files (package.json, tsconfig, etc.)`,
|
|
385
|
+
` ${s.success('+')} Dependencies installation`,
|
|
386
|
+
` ${s.success('+')} Basic boilerplate code`,
|
|
387
|
+
` ${s.success('+')} Development scripts`,
|
|
388
|
+
'',
|
|
389
|
+
` The agent reads your ${s.primary('COMPILR.md')} to understand your tech stack`,
|
|
390
|
+
` and creates an appropriate project structure.`,
|
|
391
|
+
'',
|
|
392
|
+
` ${s.muted('When to use: before implementing features, when starting')}`,
|
|
393
|
+
` ${s.muted('from an empty project directory.')}`,
|
|
394
|
+
'',
|
|
395
|
+
],
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
title: '/build Command',
|
|
399
|
+
lines: [
|
|
400
|
+
'',
|
|
401
|
+
` ${s.primaryBold('/build')} implements backlog items.`,
|
|
402
|
+
'',
|
|
403
|
+
` ${s.secondary('Usage:')}`,
|
|
404
|
+
` ${s.primary('/build')} Pick the highest priority pending item`,
|
|
405
|
+
` ${s.primary('/build REQ-003')} Build a specific item by ID`,
|
|
406
|
+
` ${s.primary('/build scaffold')} Same as /scaffold`,
|
|
407
|
+
'',
|
|
408
|
+
` ${s.secondary('The agent will:')}`,
|
|
409
|
+
` ${s.muted('1.')} Read and analyze the requirement`,
|
|
410
|
+
` ${s.muted('2.')} Plan the implementation approach`,
|
|
411
|
+
` ${s.muted('3.')} Write the code (with your approval)`,
|
|
412
|
+
` ${s.muted('4.')} Run tests if available`,
|
|
413
|
+
` ${s.muted('5.')} Update the backlog status to done`,
|
|
414
|
+
'',
|
|
415
|
+
],
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
title: '/build - Permissions',
|
|
419
|
+
lines: [
|
|
420
|
+
'',
|
|
421
|
+
` During /build, you'll see permission prompts for:`,
|
|
422
|
+
'',
|
|
423
|
+
` ${s.warning('File changes')}`,
|
|
424
|
+
` The AI shows exactly what will be changed`,
|
|
425
|
+
` with a diff view before you approve.`,
|
|
426
|
+
'',
|
|
427
|
+
` ${s.warning('Shell commands')}`,
|
|
428
|
+
` Commands like npm install or running tests`,
|
|
429
|
+
` require your explicit approval.`,
|
|
430
|
+
'',
|
|
431
|
+
` ${s.secondary('Review carefully before approving!')}`,
|
|
432
|
+
` The AI shows exactly what will happen so you stay in control.`,
|
|
433
|
+
'',
|
|
434
|
+
` ${s.muted('Tip: If /build detects an empty project, it will')}`,
|
|
435
|
+
` ${s.muted('suggest running /scaffold first.')}`,
|
|
436
|
+
'',
|
|
437
|
+
],
|
|
438
|
+
},
|
|
439
|
+
],
|
|
440
|
+
},
|
|
441
|
+
// =========================================================================
|
|
442
|
+
// Topic 6: Configuration
|
|
443
|
+
// =========================================================================
|
|
444
|
+
{
|
|
445
|
+
id: 'config',
|
|
446
|
+
name: 'Configuration',
|
|
447
|
+
description: 'Settings, keys, and themes',
|
|
448
|
+
pages: [
|
|
449
|
+
{
|
|
450
|
+
title: '/config Command',
|
|
451
|
+
lines: [
|
|
452
|
+
'',
|
|
453
|
+
` ${s.primaryBold('/config')} opens the settings panel.`,
|
|
454
|
+
'',
|
|
455
|
+
` ${s.secondary('Tabs:')}`,
|
|
456
|
+
` ${s.primary('Status')} Version, model, session info`,
|
|
457
|
+
` ${s.primary('Config')} Interactive settings`,
|
|
458
|
+
` ${s.primary('Usage')} Token usage statistics`,
|
|
459
|
+
'',
|
|
460
|
+
` ${s.secondary('Settings you can change:')}`,
|
|
461
|
+
` ${s.muted('Model')} Switch AI model/provider`,
|
|
462
|
+
` ${s.muted('Theme')} Choose from 400+ terminal themes`,
|
|
463
|
+
` ${s.muted('Permissions')} Control approval prompts`,
|
|
464
|
+
` ${s.muted('Output')} Verbose or minimal mode`,
|
|
465
|
+
` ${s.muted('Auto-compact')} Automatic context management`,
|
|
466
|
+
'',
|
|
467
|
+
],
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
title: '/keys Command',
|
|
471
|
+
lines: [
|
|
472
|
+
'',
|
|
473
|
+
` ${s.primaryBold('/keys')} manages your API keys for LLM providers.`,
|
|
474
|
+
'',
|
|
475
|
+
` ${s.secondary('Supported providers:')}`,
|
|
476
|
+
` ${s.primary('Claude')} Anthropic's models (best reasoning)`,
|
|
477
|
+
` ${s.primary('OpenAI')} GPT-4o and other models`,
|
|
478
|
+
` ${s.primary('Gemini')} Google AI models`,
|
|
479
|
+
` ${s.primary('Ollama')} Local models (no API key needed)`,
|
|
480
|
+
'',
|
|
481
|
+
` Keys are encrypted and stored locally in:`,
|
|
482
|
+
` ${s.muted('~/.compilr-dev/credentials.enc')}`,
|
|
483
|
+
'',
|
|
484
|
+
` ${s.muted('The CLI automatically opens /keys on first run')}`,
|
|
485
|
+
` ${s.muted('if no API key is configured.')}`,
|
|
486
|
+
'',
|
|
487
|
+
],
|
|
488
|
+
},
|
|
489
|
+
],
|
|
490
|
+
},
|
|
491
|
+
// =========================================================================
|
|
492
|
+
// Topic 7: Working with the Agent
|
|
493
|
+
// =========================================================================
|
|
494
|
+
{
|
|
495
|
+
id: 'agent',
|
|
496
|
+
name: 'Working with the Agent',
|
|
497
|
+
description: 'Chat, permissions, tips',
|
|
498
|
+
pages: [
|
|
499
|
+
{
|
|
500
|
+
title: 'Chatting with the AI',
|
|
501
|
+
lines: [
|
|
502
|
+
'',
|
|
503
|
+
` Just type naturally. The AI understands context and can help with:`,
|
|
504
|
+
'',
|
|
505
|
+
` ${s.muted('+')} Answering questions about your code`,
|
|
506
|
+
` ${s.muted('+')} Explaining how something works`,
|
|
507
|
+
` ${s.muted('+')} Writing new code or features`,
|
|
508
|
+
` ${s.muted('+')} Debugging issues`,
|
|
509
|
+
` ${s.muted('+')} Refactoring existing code`,
|
|
510
|
+
` ${s.muted('+')} Running commands and tests`,
|
|
511
|
+
'',
|
|
512
|
+
` ${s.secondary('File References')}`,
|
|
513
|
+
` Type ${s.primary('@')} to autocomplete file paths.`,
|
|
514
|
+
` Example: ${s.muted('"Fix the bug in @src/utils.ts"')}`,
|
|
515
|
+
'',
|
|
516
|
+
` The AI will read the file and understand the context.`,
|
|
517
|
+
'',
|
|
518
|
+
],
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
title: 'Permissions',
|
|
522
|
+
lines: [
|
|
523
|
+
'',
|
|
524
|
+
` The agent asks permission before:`,
|
|
525
|
+
'',
|
|
526
|
+
` ${s.warning('+')} Modifying or creating files`,
|
|
527
|
+
` ${s.warning('+')} Running shell commands`,
|
|
528
|
+
` ${s.warning('+')} Making git commits`,
|
|
529
|
+
'',
|
|
530
|
+
` ${s.secondary('For each action, you can:')}`,
|
|
531
|
+
` ${s.primary('Allow')} Approve this specific action`,
|
|
532
|
+
` ${s.primary('Allow Always')} Auto-approve this tool for the session`,
|
|
533
|
+
` ${s.primary('Deny')} Reject this action`,
|
|
534
|
+
'',
|
|
535
|
+
` For file edits, you'll see a diff showing exactly what changes.`,
|
|
536
|
+
` Review carefully - you're always in control.`,
|
|
537
|
+
'',
|
|
538
|
+
],
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
title: 'Suggestions',
|
|
542
|
+
lines: [
|
|
543
|
+
'',
|
|
544
|
+
` After completing tasks, the AI suggests next actions.`,
|
|
545
|
+
'',
|
|
546
|
+
` ${s.secondary('How it works:')}`,
|
|
547
|
+
` Suggestions appear as ${s.muted('ghost text')} in your input prompt.`,
|
|
548
|
+
` Press ${s.primary('Tab')} to accept the suggestion.`,
|
|
549
|
+
` Or just keep typing to ignore it.`,
|
|
550
|
+
'',
|
|
551
|
+
` ${s.secondary('Common suggestions:')}`,
|
|
552
|
+
` ${s.muted('"run the tests"')}`,
|
|
553
|
+
` ${s.muted('"commit the changes"')}`,
|
|
554
|
+
` ${s.muted('"build the next item"')}`,
|
|
555
|
+
'',
|
|
556
|
+
` Suggestions help maintain workflow momentum.`,
|
|
557
|
+
'',
|
|
558
|
+
],
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
title: 'Context Management',
|
|
562
|
+
lines: [
|
|
563
|
+
'',
|
|
564
|
+
` The AI has a limited context window. When it fills up:`,
|
|
565
|
+
'',
|
|
566
|
+
` ${s.primaryBold('/compact')}`,
|
|
567
|
+
` Summarizes old messages to free up space.`,
|
|
568
|
+
` The AI creates a summary and removes old messages.`,
|
|
569
|
+
'',
|
|
570
|
+
` ${s.primaryBold('/context')}`,
|
|
571
|
+
` Shows current context usage (tokens used / available).`,
|
|
572
|
+
'',
|
|
573
|
+
` ${s.primaryBold('/tokens')}`,
|
|
574
|
+
` Shows token usage statistics for the session.`,
|
|
575
|
+
'',
|
|
576
|
+
` ${s.muted('Tip: Auto-compact is enabled by default in settings.')}`,
|
|
577
|
+
` ${s.muted('The AI will automatically summarize when needed.')}`,
|
|
578
|
+
'',
|
|
579
|
+
],
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
title: 'Anchors - Persistent Context',
|
|
583
|
+
lines: [
|
|
584
|
+
'',
|
|
585
|
+
` ${s.secondary('Anchors')} are critical pieces of information that survive`,
|
|
586
|
+
` context compaction. They're always included at the top of context.`,
|
|
587
|
+
'',
|
|
588
|
+
` ${s.primaryBold('/anchors')}`,
|
|
589
|
+
` View and manage your anchors.`,
|
|
590
|
+
` Add, edit, or remove persistent context.`,
|
|
591
|
+
'',
|
|
592
|
+
` ${s.secondary('When to use anchors:')}`,
|
|
593
|
+
` ${s.muted('+')} Project context that must never be forgotten`,
|
|
594
|
+
` ${s.muted('+')} Key architectural decisions`,
|
|
595
|
+
` ${s.muted('+')} User preferences for code style`,
|
|
596
|
+
` ${s.muted('+')} Important constraints or requirements`,
|
|
597
|
+
'',
|
|
598
|
+
` ${s.secondary('Scope:')}`,
|
|
599
|
+
` ${s.primary('Global')} - Persists across all projects`,
|
|
600
|
+
` ${s.primary('Project')} - Specific to current project`,
|
|
601
|
+
'',
|
|
602
|
+
],
|
|
603
|
+
},
|
|
604
|
+
],
|
|
605
|
+
},
|
|
606
|
+
// =========================================================================
|
|
607
|
+
// Topic 8: Tips & Tricks
|
|
608
|
+
// =========================================================================
|
|
609
|
+
{
|
|
610
|
+
id: 'tips',
|
|
611
|
+
name: 'Tips & Tricks',
|
|
612
|
+
description: 'Shortcuts and best practices',
|
|
613
|
+
pages: [
|
|
614
|
+
{
|
|
615
|
+
title: 'Keyboard Shortcuts',
|
|
616
|
+
lines: [
|
|
617
|
+
'',
|
|
618
|
+
` ${s.secondary('Input:')}`,
|
|
619
|
+
` ${s.primary('Tab')} Accept suggestion or autocomplete`,
|
|
620
|
+
` ${s.primary('Esc')} Cancel current operation`,
|
|
621
|
+
` ${s.primary('Ctrl+C')} Stop the agent or exit`,
|
|
622
|
+
'',
|
|
623
|
+
` ${s.secondary('In Overlays:')}`,
|
|
624
|
+
` ${s.primary('↑/↓')} Navigate options`,
|
|
625
|
+
` ${s.primary('←/→')} Navigate pages or tabs`,
|
|
626
|
+
` ${s.primary('Tab')} Switch tabs (where applicable)`,
|
|
627
|
+
` ${s.primary('Enter')} Confirm selection`,
|
|
628
|
+
` ${s.primary('Esc')} Go back or close`,
|
|
629
|
+
'',
|
|
630
|
+
` ${s.secondary('Special:')}`,
|
|
631
|
+
` ${s.primary('@')} Start file autocomplete`,
|
|
632
|
+
` ${s.primary('/')} Start command autocomplete`,
|
|
633
|
+
'',
|
|
634
|
+
],
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
title: 'Useful Commands',
|
|
638
|
+
lines: [
|
|
639
|
+
'',
|
|
640
|
+
` ${s.secondary('Information:')}`,
|
|
641
|
+
` ${s.primary('/help')} Full command reference`,
|
|
642
|
+
` ${s.primary('/status')} Version, model, mode info`,
|
|
643
|
+
` ${s.primary('/tools')} List available tools`,
|
|
644
|
+
'',
|
|
645
|
+
` ${s.secondary('Session:')}`,
|
|
646
|
+
` ${s.primary('/note')} Create session documentation`,
|
|
647
|
+
` ${s.primary('/export')} Export conversation`,
|
|
648
|
+
` ${s.primary('/clear')} Clear the screen`,
|
|
649
|
+
'',
|
|
650
|
+
` ${s.secondary('Mode:')}`,
|
|
651
|
+
` ${s.primary('/plan')} Switch to planning mode`,
|
|
652
|
+
` (focus on design, not implementation)`,
|
|
653
|
+
'',
|
|
654
|
+
],
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
title: 'Best Practices',
|
|
658
|
+
lines: [
|
|
659
|
+
'',
|
|
660
|
+
` ${s.primary('1.')} Start with ${s.primaryBold('/new')}, then ${s.primaryBold('/design')} or ${s.primaryBold('/sketch')}`,
|
|
661
|
+
` Don't skip planning - it pays off later.`,
|
|
662
|
+
'',
|
|
663
|
+
` ${s.primary('2.')} Keep backlog items small and focused`,
|
|
664
|
+
` Break large features into smaller tasks.`,
|
|
665
|
+
'',
|
|
666
|
+
` ${s.primary('3.')} Review AI suggestions before approving`,
|
|
667
|
+
` You're in control - understand what's changing.`,
|
|
668
|
+
'',
|
|
669
|
+
` ${s.primary('4.')} Use ${s.primaryBold('/arch')} to document key decisions`,
|
|
670
|
+
` Future you will thank present you.`,
|
|
671
|
+
'',
|
|
672
|
+
` ${s.primary('5.')} Try ${s.primaryBold('Ollama')} for offline development`,
|
|
673
|
+
` No API key needed, runs locally.`,
|
|
674
|
+
'',
|
|
675
|
+
],
|
|
676
|
+
},
|
|
677
|
+
],
|
|
678
|
+
},
|
|
679
|
+
];
|
|
680
|
+
}
|
|
681
|
+
// =============================================================================
|
|
682
|
+
// Screens
|
|
683
|
+
// =============================================================================
|
|
684
|
+
/**
|
|
685
|
+
* Welcome screen - shows entry options (guided tour or topic list)
|
|
686
|
+
*/
|
|
687
|
+
class WelcomeScreen extends BaseScreen {
|
|
688
|
+
state;
|
|
689
|
+
styles;
|
|
690
|
+
topics;
|
|
691
|
+
getWidth;
|
|
692
|
+
selectedIndex = 0;
|
|
693
|
+
constructor(state, styles, topics, getWidth) {
|
|
694
|
+
super();
|
|
695
|
+
this.state = state;
|
|
696
|
+
this.styles = styles;
|
|
697
|
+
this.topics = topics;
|
|
698
|
+
this.getWidth = getWidth;
|
|
699
|
+
}
|
|
700
|
+
render() {
|
|
701
|
+
const s = this.styles;
|
|
702
|
+
const cols = this.getWidth();
|
|
703
|
+
const border = renderBorder(cols, s);
|
|
704
|
+
const lines = [];
|
|
705
|
+
lines.push(border);
|
|
706
|
+
lines.push(` ${s.primaryBold('compilr.dev Tutorial')}`);
|
|
707
|
+
lines.push('');
|
|
708
|
+
lines.push(` Learn the AI-powered development workflow that takes you`);
|
|
709
|
+
lines.push(` from idea to implementation with structure and discipline.`);
|
|
710
|
+
lines.push('');
|
|
711
|
+
lines.push(` This tutorial covers: initialization, design, backlog`);
|
|
712
|
+
lines.push(` management, building, configuration, and best practices.`);
|
|
713
|
+
lines.push('');
|
|
714
|
+
lines.push(` ${s.muted('How would you like to explore?')}`);
|
|
715
|
+
lines.push('');
|
|
716
|
+
const options = [
|
|
717
|
+
{ label: 'Start Guided Tour', desc: 'Step-by-step walkthrough (recommended)' },
|
|
718
|
+
{ label: 'Jump to Topic', desc: 'Go directly to a specific topic' },
|
|
719
|
+
];
|
|
720
|
+
for (let i = 0; i < options.length; i++) {
|
|
721
|
+
const opt = options[i];
|
|
722
|
+
const selected = i === this.selectedIndex;
|
|
723
|
+
const prefix = selected ? s.primary(' > ') : ' ';
|
|
724
|
+
const label = selected ? s.primary(opt.label) : opt.label;
|
|
725
|
+
const desc = s.muted(opt.desc);
|
|
726
|
+
lines.push(`${prefix}${label.padEnd(22)} ${desc}`);
|
|
727
|
+
}
|
|
728
|
+
lines.push('');
|
|
729
|
+
lines.push(border);
|
|
730
|
+
lines.push(s.muted(' ↑↓/jk Navigate · Enter Select · q/Esc Exit'));
|
|
731
|
+
return lines;
|
|
732
|
+
}
|
|
733
|
+
handleKey(data) {
|
|
734
|
+
// Close keys
|
|
735
|
+
if (isCtrlC(data) || isClose(data)) {
|
|
736
|
+
return closeOverlay({ completed: false });
|
|
737
|
+
}
|
|
738
|
+
// Navigation
|
|
739
|
+
if (isNavigateUp(data) && this.selectedIndex > 0) {
|
|
740
|
+
this.selectedIndex--;
|
|
741
|
+
return stay();
|
|
742
|
+
}
|
|
743
|
+
if (isNavigateDown(data) && this.selectedIndex < 1) {
|
|
744
|
+
this.selectedIndex++;
|
|
745
|
+
return stay();
|
|
746
|
+
}
|
|
747
|
+
// Enter - select option
|
|
748
|
+
if (isEnter(data)) {
|
|
749
|
+
if (this.selectedIndex === 0) {
|
|
750
|
+
// Guided mode
|
|
751
|
+
this.state.isGuidedMode = true;
|
|
752
|
+
this.state.currentTopicIndex = 0;
|
|
753
|
+
this.state.currentPageIndex = 0;
|
|
754
|
+
return pushScreen(new ViewingScreen(this.state, this.styles, this.topics, this.getWidth));
|
|
755
|
+
}
|
|
756
|
+
else {
|
|
757
|
+
// Topic list mode
|
|
758
|
+
return pushScreen(new TopicListScreen(this.state, this.styles, this.topics, this.getWidth));
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
return stay(false);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
/**
|
|
765
|
+
* Topic list screen - shows all topics to choose from
|
|
766
|
+
*/
|
|
767
|
+
class TopicListScreen extends BaseScreen {
|
|
768
|
+
state;
|
|
769
|
+
styles;
|
|
770
|
+
topics;
|
|
771
|
+
getWidth;
|
|
772
|
+
constructor(state, styles, topics, getWidth) {
|
|
773
|
+
super();
|
|
774
|
+
this.state = state;
|
|
775
|
+
this.styles = styles;
|
|
776
|
+
this.topics = topics;
|
|
777
|
+
this.getWidth = getWidth;
|
|
778
|
+
}
|
|
779
|
+
render() {
|
|
780
|
+
const s = this.styles;
|
|
781
|
+
const cols = this.getWidth();
|
|
782
|
+
const border = renderBorder(cols, s);
|
|
783
|
+
const lines = [];
|
|
784
|
+
lines.push(border);
|
|
785
|
+
lines.push(` ${s.primaryBold('Tutorial Topics')}`);
|
|
786
|
+
lines.push('');
|
|
787
|
+
for (let i = 0; i < this.topics.length; i++) {
|
|
788
|
+
const topic = this.topics[i];
|
|
789
|
+
const selected = i === this.state.topicListIndex;
|
|
790
|
+
const prefix = selected ? s.primary(' > ') : ' ';
|
|
791
|
+
const name = selected ? s.primary(topic.name) : topic.name;
|
|
792
|
+
const desc = s.muted(topic.description);
|
|
793
|
+
const pages = s.muted(`(${String(topic.pages.length)} ${topic.pages.length === 1 ? 'page' : 'pages'})`);
|
|
794
|
+
lines.push(`${prefix}${name.padEnd(26)} ${desc.padEnd(30)} ${pages}`);
|
|
795
|
+
}
|
|
796
|
+
lines.push('');
|
|
797
|
+
lines.push(border);
|
|
798
|
+
lines.push(s.muted(' ↑↓/jk Navigate · Enter View · q/Esc Close'));
|
|
799
|
+
return lines;
|
|
800
|
+
}
|
|
801
|
+
handleKey(data) {
|
|
802
|
+
// Ctrl+C or q closes overlay
|
|
803
|
+
if (isCtrlC(data)) {
|
|
804
|
+
return closeOverlay({ completed: false });
|
|
805
|
+
}
|
|
806
|
+
// Escape goes back to welcome
|
|
807
|
+
if (isEscape(data)) {
|
|
808
|
+
return popScreen();
|
|
809
|
+
}
|
|
810
|
+
// Navigation
|
|
811
|
+
if (isNavigateUp(data) && this.state.topicListIndex > 0) {
|
|
812
|
+
this.state.topicListIndex--;
|
|
813
|
+
return stay();
|
|
814
|
+
}
|
|
815
|
+
if (isNavigateDown(data) && this.state.topicListIndex < this.topics.length - 1) {
|
|
816
|
+
this.state.topicListIndex++;
|
|
817
|
+
return stay();
|
|
818
|
+
}
|
|
819
|
+
// Enter - view topic
|
|
820
|
+
if (isEnter(data)) {
|
|
821
|
+
this.state.isGuidedMode = false;
|
|
822
|
+
this.state.currentTopicIndex = this.state.topicListIndex;
|
|
823
|
+
this.state.currentPageIndex = 0;
|
|
824
|
+
return pushScreen(new ViewingScreen(this.state, this.styles, this.topics, this.getWidth));
|
|
825
|
+
}
|
|
826
|
+
return stay(false);
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
/**
|
|
830
|
+
* Viewing screen - shows a page from a topic with navigation
|
|
831
|
+
*/
|
|
832
|
+
class ViewingScreen extends BaseScreen {
|
|
833
|
+
state;
|
|
834
|
+
styles;
|
|
835
|
+
topics;
|
|
836
|
+
getWidth;
|
|
837
|
+
constructor(state, styles, topics, getWidth) {
|
|
838
|
+
super();
|
|
839
|
+
this.state = state;
|
|
840
|
+
this.styles = styles;
|
|
841
|
+
this.topics = topics;
|
|
842
|
+
this.getWidth = getWidth;
|
|
843
|
+
}
|
|
844
|
+
render() {
|
|
845
|
+
const s = this.styles;
|
|
846
|
+
const cols = this.getWidth();
|
|
847
|
+
const border = renderBorder(cols, s);
|
|
848
|
+
const lines = [];
|
|
849
|
+
const topic = this.topics[this.state.currentTopicIndex];
|
|
850
|
+
const page = topic.pages[this.state.currentPageIndex];
|
|
851
|
+
const totalPages = topic.pages.length;
|
|
852
|
+
// Calculate overall progress for guided mode
|
|
853
|
+
let progressText = `[${String(this.state.currentPageIndex + 1)}/${String(totalPages)}]`;
|
|
854
|
+
if (this.state.isGuidedMode) {
|
|
855
|
+
let totalPagesAll = 0;
|
|
856
|
+
let currentPageAll = 0;
|
|
857
|
+
for (let i = 0; i < this.topics.length; i++) {
|
|
858
|
+
if (i < this.state.currentTopicIndex) {
|
|
859
|
+
currentPageAll += this.topics[i].pages.length;
|
|
860
|
+
}
|
|
861
|
+
else if (i === this.state.currentTopicIndex) {
|
|
862
|
+
currentPageAll += this.state.currentPageIndex + 1;
|
|
863
|
+
}
|
|
864
|
+
totalPagesAll += this.topics[i].pages.length;
|
|
865
|
+
}
|
|
866
|
+
progressText = `[${String(currentPageAll)}/${String(totalPagesAll)}]`;
|
|
867
|
+
}
|
|
868
|
+
// Header - calculate padding to right-align progress indicator
|
|
869
|
+
const titleStyled = s.primaryBold(page.title);
|
|
870
|
+
const progressStyled = s.muted(progressText);
|
|
871
|
+
const titleLen = stripAnsi(titleStyled).length + 1; // +1 for leading space
|
|
872
|
+
const progressLen = stripAnsi(progressStyled).length;
|
|
873
|
+
const padding = Math.max(1, cols - titleLen - progressLen - 2); // -2 for margins
|
|
874
|
+
lines.push(border);
|
|
875
|
+
lines.push(` ${titleStyled}${' '.repeat(padding)}${progressStyled}`);
|
|
876
|
+
lines.push('');
|
|
877
|
+
// Content
|
|
878
|
+
for (const line of page.lines) {
|
|
879
|
+
lines.push(line);
|
|
880
|
+
}
|
|
881
|
+
// Pad to consistent height
|
|
882
|
+
while (lines.length < 20) {
|
|
883
|
+
lines.push('');
|
|
884
|
+
}
|
|
885
|
+
// Navigation footer
|
|
886
|
+
lines.push(border);
|
|
887
|
+
if (this.state.isGuidedMode) {
|
|
888
|
+
lines.push(s.muted(' ←/→/hl Navigate · Esc Exit Tour'));
|
|
889
|
+
}
|
|
890
|
+
else {
|
|
891
|
+
lines.push(s.muted(' ←/→/hl Navigate · Esc Back to Topics'));
|
|
892
|
+
}
|
|
893
|
+
return lines;
|
|
894
|
+
}
|
|
895
|
+
handleKey(data) {
|
|
896
|
+
// Ctrl+C closes overlay
|
|
897
|
+
if (isCtrlC(data)) {
|
|
898
|
+
return closeOverlay({ completed: false });
|
|
899
|
+
}
|
|
900
|
+
const topic = this.topics[this.state.currentTopicIndex];
|
|
901
|
+
const totalPages = topic.pages.length;
|
|
902
|
+
// Escape goes back
|
|
903
|
+
if (isEscape(data)) {
|
|
904
|
+
return popScreen();
|
|
905
|
+
}
|
|
906
|
+
// Previous page (left arrow, h, or backspace)
|
|
907
|
+
if (isLeftArrow(data) || isVimLeft(data) || isBackspace(data)) {
|
|
908
|
+
if (this.state.currentPageIndex > 0) {
|
|
909
|
+
this.state.currentPageIndex--;
|
|
910
|
+
return stay();
|
|
911
|
+
}
|
|
912
|
+
else if (this.state.isGuidedMode && this.state.currentTopicIndex > 0) {
|
|
913
|
+
this.state.currentTopicIndex--;
|
|
914
|
+
this.state.currentPageIndex = this.topics[this.state.currentTopicIndex].pages.length - 1;
|
|
915
|
+
return stay();
|
|
916
|
+
}
|
|
917
|
+
return stay(false);
|
|
918
|
+
}
|
|
919
|
+
// Next page (right arrow, l, or enter)
|
|
920
|
+
if (isRightArrow(data) || isVimRight(data) || isEnter(data)) {
|
|
921
|
+
if (this.state.currentPageIndex < totalPages - 1) {
|
|
922
|
+
this.state.currentPageIndex++;
|
|
923
|
+
return stay();
|
|
924
|
+
}
|
|
925
|
+
else if (this.state.isGuidedMode) {
|
|
926
|
+
if (this.state.currentTopicIndex < this.topics.length - 1) {
|
|
927
|
+
this.state.currentTopicIndex++;
|
|
928
|
+
this.state.currentPageIndex = 0;
|
|
929
|
+
return stay();
|
|
930
|
+
}
|
|
931
|
+
else {
|
|
932
|
+
// End of guided tour - show complete screen
|
|
933
|
+
return pushScreen(new CompleteScreen(this.styles, this.getWidth));
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
return stay(false);
|
|
937
|
+
}
|
|
938
|
+
return stay(false);
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
/**
|
|
942
|
+
* Complete screen - shows completion message
|
|
943
|
+
*/
|
|
944
|
+
class CompleteScreen extends BaseScreen {
|
|
945
|
+
styles;
|
|
946
|
+
getWidth;
|
|
947
|
+
constructor(styles, getWidth) {
|
|
948
|
+
super();
|
|
949
|
+
this.styles = styles;
|
|
950
|
+
this.getWidth = getWidth;
|
|
951
|
+
}
|
|
952
|
+
render() {
|
|
953
|
+
const s = this.styles;
|
|
954
|
+
const cols = this.getWidth();
|
|
955
|
+
const border = renderBorder(cols, s);
|
|
956
|
+
const lines = [];
|
|
957
|
+
lines.push(border);
|
|
958
|
+
lines.push(` ${s.success('Tutorial Complete!')}`);
|
|
959
|
+
lines.push('');
|
|
960
|
+
lines.push(` You've learned the compilr.dev workflow!`);
|
|
961
|
+
lines.push('');
|
|
962
|
+
lines.push(` ${s.secondary('Key commands to remember:')}`);
|
|
963
|
+
lines.push('');
|
|
964
|
+
lines.push(` ${s.primary('/new')} Start a new project`);
|
|
965
|
+
lines.push(` ${s.primary('/design')} Plan your requirements`);
|
|
966
|
+
lines.push(` ${s.primary('/backlog')} Manage your work items`);
|
|
967
|
+
lines.push(` ${s.primary('/build')} Implement features`);
|
|
968
|
+
lines.push(` ${s.primary('/help')} See all commands`);
|
|
969
|
+
lines.push('');
|
|
970
|
+
lines.push(` ${s.secondary('Ready to start?')}`);
|
|
971
|
+
lines.push(` Try ${s.primary('/new')} in a new directory!`);
|
|
972
|
+
lines.push('');
|
|
973
|
+
lines.push(border);
|
|
974
|
+
lines.push(s.muted(' Press any key to exit...'));
|
|
975
|
+
return lines;
|
|
976
|
+
}
|
|
977
|
+
handleKey(_data) {
|
|
978
|
+
// Any key closes the overlay with completed = true
|
|
979
|
+
return closeOverlay({ completed: true });
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
// =============================================================================
|
|
983
|
+
// Tutorial Overlay V2 Class
|
|
984
|
+
// =============================================================================
|
|
985
|
+
/**
|
|
986
|
+
* Tutorial overlay using the new Overlay interface.
|
|
987
|
+
* Multi-screen overlay for interactive tutorial.
|
|
988
|
+
*/
|
|
989
|
+
export class TutorialOverlayV2 extends BaseOverlayV2 {
|
|
990
|
+
type = 'inline';
|
|
991
|
+
id = 'tutorial-overlay-v2';
|
|
992
|
+
screenStack;
|
|
993
|
+
topics = [];
|
|
994
|
+
constructor() {
|
|
995
|
+
const initialState = {
|
|
996
|
+
topicListIndex: 0,
|
|
997
|
+
currentTopicIndex: 0,
|
|
998
|
+
currentPageIndex: 0,
|
|
999
|
+
isGuidedMode: false,
|
|
1000
|
+
};
|
|
1001
|
+
super(initialState);
|
|
1002
|
+
this.minHeight = 24;
|
|
1003
|
+
this.screenStack = new ScreenStack();
|
|
1004
|
+
// Topics will be built on first render when we have styles
|
|
1005
|
+
}
|
|
1006
|
+
renderContent(context) {
|
|
1007
|
+
// Build topics on first render (needs styles)
|
|
1008
|
+
if (this.topics.length === 0) {
|
|
1009
|
+
this.topics = buildTopics(context.styles);
|
|
1010
|
+
this.screenStack.push(new WelcomeScreen(this.state, context.styles, this.topics, () => this.termWidth));
|
|
1011
|
+
}
|
|
1012
|
+
const screen = this.screenStack.current();
|
|
1013
|
+
return screen?.render() ?? [];
|
|
1014
|
+
}
|
|
1015
|
+
handleKey(key) {
|
|
1016
|
+
const data = key.raw;
|
|
1017
|
+
const screen = this.screenStack.current();
|
|
1018
|
+
if (!screen) {
|
|
1019
|
+
return this.close({ completed: false });
|
|
1020
|
+
}
|
|
1021
|
+
const result = screen.handleKey(data);
|
|
1022
|
+
switch (result.action) {
|
|
1023
|
+
case 'stay':
|
|
1024
|
+
return result.render ? this.rerender() : this.noAction();
|
|
1025
|
+
case 'push':
|
|
1026
|
+
this.screenStack.push(result.screen);
|
|
1027
|
+
return this.rerender();
|
|
1028
|
+
case 'pop':
|
|
1029
|
+
this.screenStack.pop();
|
|
1030
|
+
return this.rerender();
|
|
1031
|
+
case 'close':
|
|
1032
|
+
return this.close(result.result);
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
}
|