@thiagodiogo/pastelsdd 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +3 -0
- package/bin/pastelsdd.js +5 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.js +526 -0
- package/dist/commands/change.d.ts +35 -0
- package/dist/commands/change.js +277 -0
- package/dist/commands/completion.d.ts +72 -0
- package/dist/commands/completion.js +264 -0
- package/dist/commands/config.d.ts +36 -0
- package/dist/commands/config.js +611 -0
- package/dist/commands/context-store.d.ts +3 -0
- package/dist/commands/context-store.js +282 -0
- package/dist/commands/feedback.d.ts +9 -0
- package/dist/commands/feedback.js +183 -0
- package/dist/commands/initiative.d.ts +13 -0
- package/dist/commands/initiative.js +318 -0
- package/dist/commands/schema.d.ts +6 -0
- package/dist/commands/schema.js +869 -0
- package/dist/commands/show.d.ts +14 -0
- package/dist/commands/show.js +132 -0
- package/dist/commands/spec.d.ts +15 -0
- package/dist/commands/spec.js +225 -0
- package/dist/commands/validate.d.ts +24 -0
- package/dist/commands/validate.js +294 -0
- package/dist/commands/workflow/index.d.ts +19 -0
- package/dist/commands/workflow/index.js +13 -0
- package/dist/commands/workflow/initiative-link.d.ts +24 -0
- package/dist/commands/workflow/initiative-link.js +47 -0
- package/dist/commands/workflow/instructions.d.ts +29 -0
- package/dist/commands/workflow/instructions.js +344 -0
- package/dist/commands/workflow/new-change.d.ts +17 -0
- package/dist/commands/workflow/new-change.js +141 -0
- package/dist/commands/workflow/schemas.d.ts +10 -0
- package/dist/commands/workflow/schemas.js +34 -0
- package/dist/commands/workflow/set-change.d.ts +13 -0
- package/dist/commands/workflow/set-change.js +87 -0
- package/dist/commands/workflow/shared.d.ts +59 -0
- package/dist/commands/workflow/shared.js +116 -0
- package/dist/commands/workflow/status.d.ts +14 -0
- package/dist/commands/workflow/status.js +90 -0
- package/dist/commands/workflow/templates.d.ts +16 -0
- package/dist/commands/workflow/templates.js +69 -0
- package/dist/commands/workspace/context-status.d.ts +4 -0
- package/dist/commands/workspace/context-status.js +59 -0
- package/dist/commands/workspace/open-view.d.ts +62 -0
- package/dist/commands/workspace/open-view.js +228 -0
- package/dist/commands/workspace/open.d.ts +37 -0
- package/dist/commands/workspace/open.js +102 -0
- package/dist/commands/workspace/opener-selection.d.ts +11 -0
- package/dist/commands/workspace/opener-selection.js +93 -0
- package/dist/commands/workspace/operations.d.ts +28 -0
- package/dist/commands/workspace/operations.js +543 -0
- package/dist/commands/workspace/prompt-theme.d.ts +29 -0
- package/dist/commands/workspace/prompt-theme.js +24 -0
- package/dist/commands/workspace/registration.d.ts +13 -0
- package/dist/commands/workspace/registration.js +84 -0
- package/dist/commands/workspace/selection.d.ts +6 -0
- package/dist/commands/workspace/selection.js +122 -0
- package/dist/commands/workspace/types.d.ts +103 -0
- package/dist/commands/workspace/types.js +36 -0
- package/dist/commands/workspace.d.ts +6 -0
- package/dist/commands/workspace.js +678 -0
- package/dist/core/archive.d.ts +11 -0
- package/dist/core/archive.js +318 -0
- package/dist/core/artifact-graph/graph.d.ts +56 -0
- package/dist/core/artifact-graph/graph.js +141 -0
- package/dist/core/artifact-graph/index.d.ts +9 -0
- package/dist/core/artifact-graph/index.js +14 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +183 -0
- package/dist/core/artifact-graph/instruction-loader.js +256 -0
- package/dist/core/artifact-graph/outputs.d.ts +14 -0
- package/dist/core/artifact-graph/outputs.js +39 -0
- package/dist/core/artifact-graph/resolver.d.ts +81 -0
- package/dist/core/artifact-graph/resolver.js +257 -0
- package/dist/core/artifact-graph/schema.d.ts +13 -0
- package/dist/core/artifact-graph/schema.js +108 -0
- package/dist/core/artifact-graph/state.d.ts +12 -0
- package/dist/core/artifact-graph/state.js +31 -0
- package/dist/core/artifact-graph/types.d.ts +40 -0
- package/dist/core/artifact-graph/types.js +29 -0
- package/dist/core/available-tools.d.ts +17 -0
- package/dist/core/available-tools.js +43 -0
- package/dist/core/change-metadata/index.d.ts +2 -0
- package/dist/core/change-metadata/index.js +2 -0
- package/dist/core/change-metadata/schema.d.ts +18 -0
- package/dist/core/change-metadata/schema.js +28 -0
- package/dist/core/change-status-policy.d.ts +50 -0
- package/dist/core/change-status-policy.js +70 -0
- package/dist/core/collections/index.d.ts +3 -0
- package/dist/core/collections/index.js +3 -0
- package/dist/core/collections/initiatives/collection.d.ts +4 -0
- package/dist/core/collections/initiatives/collection.js +17 -0
- package/dist/core/collections/initiatives/index.d.ts +6 -0
- package/dist/core/collections/initiatives/index.js +6 -0
- package/dist/core/collections/initiatives/operations.d.ts +49 -0
- package/dist/core/collections/initiatives/operations.js +175 -0
- package/dist/core/collections/initiatives/resolution.d.ts +87 -0
- package/dist/core/collections/initiatives/resolution.js +374 -0
- package/dist/core/collections/initiatives/schema.d.ts +41 -0
- package/dist/core/collections/initiatives/schema.js +134 -0
- package/dist/core/collections/initiatives/templates.d.ts +12 -0
- package/dist/core/collections/initiatives/templates.js +90 -0
- package/dist/core/collections/runtime.d.ts +46 -0
- package/dist/core/collections/runtime.js +194 -0
- package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
- package/dist/core/command-generation/adapters/amazon-q.js +26 -0
- package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
- package/dist/core/command-generation/adapters/antigravity.js +26 -0
- package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
- package/dist/core/command-generation/adapters/auggie.js +27 -0
- package/dist/core/command-generation/adapters/bob.d.ts +14 -0
- package/dist/core/command-generation/adapters/bob.js +45 -0
- package/dist/core/command-generation/adapters/claude.d.ts +13 -0
- package/dist/core/command-generation/adapters/claude.js +50 -0
- package/dist/core/command-generation/adapters/cline.d.ts +14 -0
- package/dist/core/command-generation/adapters/cline.js +27 -0
- package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
- package/dist/core/command-generation/adapters/codebuddy.js +28 -0
- package/dist/core/command-generation/adapters/codex.d.ts +16 -0
- package/dist/core/command-generation/adapters/codex.js +39 -0
- package/dist/core/command-generation/adapters/continue.d.ts +13 -0
- package/dist/core/command-generation/adapters/continue.js +28 -0
- package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
- package/dist/core/command-generation/adapters/costrict.js +27 -0
- package/dist/core/command-generation/adapters/crush.d.ts +13 -0
- package/dist/core/command-generation/adapters/crush.js +30 -0
- package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
- package/dist/core/command-generation/adapters/cursor.js +44 -0
- package/dist/core/command-generation/adapters/factory.d.ts +13 -0
- package/dist/core/command-generation/adapters/factory.js +27 -0
- package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
- package/dist/core/command-generation/adapters/gemini.js +26 -0
- package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
- package/dist/core/command-generation/adapters/github-copilot.js +26 -0
- package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
- package/dist/core/command-generation/adapters/iflow.js +29 -0
- package/dist/core/command-generation/adapters/index.d.ts +32 -0
- package/dist/core/command-generation/adapters/index.js +32 -0
- package/dist/core/command-generation/adapters/junie.d.ts +13 -0
- package/dist/core/command-generation/adapters/junie.js +26 -0
- package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/kilocode.js +23 -0
- package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
- package/dist/core/command-generation/adapters/kiro.js +26 -0
- package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
- package/dist/core/command-generation/adapters/lingma.js +30 -0
- package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
- package/dist/core/command-generation/adapters/opencode.js +29 -0
- package/dist/core/command-generation/adapters/pi.d.ts +18 -0
- package/dist/core/command-generation/adapters/pi.js +55 -0
- package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
- package/dist/core/command-generation/adapters/qoder.js +30 -0
- package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
- package/dist/core/command-generation/adapters/qwen.js +26 -0
- package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/roocode.js +27 -0
- package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
- package/dist/core/command-generation/adapters/windsurf.js +51 -0
- package/dist/core/command-generation/generator.d.ts +21 -0
- package/dist/core/command-generation/generator.js +27 -0
- package/dist/core/command-generation/index.d.ts +22 -0
- package/dist/core/command-generation/index.js +24 -0
- package/dist/core/command-generation/registry.d.ts +36 -0
- package/dist/core/command-generation/registry.js +98 -0
- package/dist/core/command-generation/types.d.ts +56 -0
- package/dist/core/command-generation/types.js +8 -0
- package/dist/core/completions/command-registry.d.ts +3 -0
- package/dist/core/completions/command-registry.js +939 -0
- package/dist/core/completions/completion-provider.d.ts +71 -0
- package/dist/core/completions/completion-provider.js +129 -0
- package/dist/core/completions/factory.d.ts +64 -0
- package/dist/core/completions/factory.js +75 -0
- package/dist/core/completions/generators/bash-generator.d.ts +35 -0
- package/dist/core/completions/generators/bash-generator.js +230 -0
- package/dist/core/completions/generators/fish-generator.d.ts +32 -0
- package/dist/core/completions/generators/fish-generator.js +160 -0
- package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
- package/dist/core/completions/generators/powershell-generator.js +266 -0
- package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
- package/dist/core/completions/generators/zsh-generator.js +274 -0
- package/dist/core/completions/installers/bash-installer.d.ts +87 -0
- package/dist/core/completions/installers/bash-installer.js +318 -0
- package/dist/core/completions/installers/fish-installer.d.ts +43 -0
- package/dist/core/completions/installers/fish-installer.js +143 -0
- package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
- package/dist/core/completions/installers/powershell-installer.js +387 -0
- package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
- package/dist/core/completions/installers/zsh-installer.js +421 -0
- package/dist/core/completions/shared-flags.d.ts +12 -0
- package/dist/core/completions/shared-flags.js +28 -0
- package/dist/core/completions/templates/bash-templates.d.ts +6 -0
- package/dist/core/completions/templates/bash-templates.js +30 -0
- package/dist/core/completions/templates/fish-templates.d.ts +7 -0
- package/dist/core/completions/templates/fish-templates.js +45 -0
- package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
- package/dist/core/completions/templates/powershell-templates.js +34 -0
- package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
- package/dist/core/completions/templates/zsh-templates.js +45 -0
- package/dist/core/completions/types.d.ts +101 -0
- package/dist/core/completions/types.js +2 -0
- package/dist/core/config-prompts.d.ts +9 -0
- package/dist/core/config-prompts.js +34 -0
- package/dist/core/config-schema.d.ts +86 -0
- package/dist/core/config-schema.js +213 -0
- package/dist/core/config.d.ts +18 -0
- package/dist/core/config.js +38 -0
- package/dist/core/context-store/binding.d.ts +53 -0
- package/dist/core/context-store/binding.js +197 -0
- package/dist/core/context-store/errors.d.ts +20 -0
- package/dist/core/context-store/errors.js +22 -0
- package/dist/core/context-store/foundation.d.ts +54 -0
- package/dist/core/context-store/foundation.js +318 -0
- package/dist/core/context-store/index.d.ts +6 -0
- package/dist/core/context-store/index.js +6 -0
- package/dist/core/context-store/operations.d.ts +62 -0
- package/dist/core/context-store/operations.js +352 -0
- package/dist/core/context-store/registry.d.ts +35 -0
- package/dist/core/context-store/registry.js +158 -0
- package/dist/core/converters/json-converter.d.ts +6 -0
- package/dist/core/converters/json-converter.js +51 -0
- package/dist/core/global-config.d.ts +49 -0
- package/dist/core/global-config.js +124 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.js +7 -0
- package/dist/core/init.d.ts +37 -0
- package/dist/core/init.js +593 -0
- package/dist/core/legacy-cleanup.d.ts +162 -0
- package/dist/core/legacy-cleanup.js +514 -0
- package/dist/core/list.d.ts +9 -0
- package/dist/core/list.js +171 -0
- package/dist/core/migration.d.ts +23 -0
- package/dist/core/migration.js +108 -0
- package/dist/core/parsers/change-parser.d.ts +13 -0
- package/dist/core/parsers/change-parser.js +197 -0
- package/dist/core/parsers/markdown-parser.d.ts +26 -0
- package/dist/core/parsers/markdown-parser.js +227 -0
- package/dist/core/parsers/requirement-blocks.d.ts +37 -0
- package/dist/core/parsers/requirement-blocks.js +201 -0
- package/dist/core/parsers/spec-structure.d.ts +9 -0
- package/dist/core/parsers/spec-structure.js +88 -0
- package/dist/core/planning-home.d.ts +21 -0
- package/dist/core/planning-home.js +108 -0
- package/dist/core/profile-sync-drift.d.ts +38 -0
- package/dist/core/profile-sync-drift.js +200 -0
- package/dist/core/profiles.d.ts +26 -0
- package/dist/core/profiles.js +40 -0
- package/dist/core/project-config.d.ts +64 -0
- package/dist/core/project-config.js +223 -0
- package/dist/core/schemas/base.schema.d.ts +13 -0
- package/dist/core/schemas/base.schema.js +13 -0
- package/dist/core/schemas/change.schema.d.ts +73 -0
- package/dist/core/schemas/change.schema.js +31 -0
- package/dist/core/schemas/index.d.ts +4 -0
- package/dist/core/schemas/index.js +4 -0
- package/dist/core/schemas/spec.schema.d.ts +18 -0
- package/dist/core/schemas/spec.schema.js +15 -0
- package/dist/core/shared/index.d.ts +8 -0
- package/dist/core/shared/index.js +8 -0
- package/dist/core/shared/skill-generation.d.ts +49 -0
- package/dist/core/shared/skill-generation.js +96 -0
- package/dist/core/shared/tool-detection.d.ts +71 -0
- package/dist/core/shared/tool-detection.js +158 -0
- package/dist/core/specs-apply.d.ts +73 -0
- package/dist/core/specs-apply.js +392 -0
- package/dist/core/styles/palette.d.ts +7 -0
- package/dist/core/styles/palette.js +8 -0
- package/dist/core/templates/index.d.ts +8 -0
- package/dist/core/templates/index.js +9 -0
- package/dist/core/templates/skill-templates.d.ts +19 -0
- package/dist/core/templates/skill-templates.js +18 -0
- package/dist/core/templates/types.d.ts +19 -0
- package/dist/core/templates/types.js +5 -0
- package/dist/core/templates/workflows/apply-change.d.ts +10 -0
- package/dist/core/templates/workflows/apply-change.js +314 -0
- package/dist/core/templates/workflows/archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/archive-change.js +277 -0
- package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
- package/dist/core/templates/workflows/continue-change.d.ts +10 -0
- package/dist/core/templates/workflows/continue-change.js +234 -0
- package/dist/core/templates/workflows/explore.d.ts +10 -0
- package/dist/core/templates/workflows/explore.js +459 -0
- package/dist/core/templates/workflows/feedback.d.ts +9 -0
- package/dist/core/templates/workflows/feedback.js +108 -0
- package/dist/core/templates/workflows/ff-change.d.ts +10 -0
- package/dist/core/templates/workflows/ff-change.js +200 -0
- package/dist/core/templates/workflows/new-change.d.ts +10 -0
- package/dist/core/templates/workflows/new-change.js +143 -0
- package/dist/core/templates/workflows/onboard.d.ts +10 -0
- package/dist/core/templates/workflows/onboard.js +563 -0
- package/dist/core/templates/workflows/propose.d.ts +10 -0
- package/dist/core/templates/workflows/propose.js +218 -0
- package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
- package/dist/core/templates/workflows/sync-specs.js +290 -0
- package/dist/core/templates/workflows/verify-change.d.ts +10 -0
- package/dist/core/templates/workflows/verify-change.js +338 -0
- package/dist/core/update.d.ts +82 -0
- package/dist/core/update.js +557 -0
- package/dist/core/validation/constants.d.ts +34 -0
- package/dist/core/validation/constants.js +40 -0
- package/dist/core/validation/types.d.ts +18 -0
- package/dist/core/validation/types.js +2 -0
- package/dist/core/validation/validator.d.ts +33 -0
- package/dist/core/validation/validator.js +418 -0
- package/dist/core/view.d.ts +8 -0
- package/dist/core/view.js +168 -0
- package/dist/core/workspace/foundation.d.ts +62 -0
- package/dist/core/workspace/foundation.js +274 -0
- package/dist/core/workspace/index.d.ts +8 -0
- package/dist/core/workspace/index.js +8 -0
- package/dist/core/workspace/legacy-state.d.ts +28 -0
- package/dist/core/workspace/legacy-state.js +200 -0
- package/dist/core/workspace/link-input.d.ts +9 -0
- package/dist/core/workspace/link-input.js +32 -0
- package/dist/core/workspace/open-surface.d.ts +43 -0
- package/dist/core/workspace/open-surface.js +214 -0
- package/dist/core/workspace/openers.d.ts +21 -0
- package/dist/core/workspace/openers.js +119 -0
- package/dist/core/workspace/registry.d.ts +24 -0
- package/dist/core/workspace/registry.js +146 -0
- package/dist/core/workspace/skills.d.ts +57 -0
- package/dist/core/workspace/skills.js +334 -0
- package/dist/core/workspace/state-io.d.ts +10 -0
- package/dist/core/workspace/state-io.js +119 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/prompts/searchable-multi-select.d.ts +28 -0
- package/dist/prompts/searchable-multi-select.js +159 -0
- package/dist/telemetry/config.d.ts +38 -0
- package/dist/telemetry/config.js +136 -0
- package/dist/telemetry/index.d.ts +31 -0
- package/dist/telemetry/index.js +164 -0
- package/dist/ui/ascii-patterns.d.ts +16 -0
- package/dist/ui/ascii-patterns.js +133 -0
- package/dist/ui/welcome-screen.d.ts +10 -0
- package/dist/ui/welcome-screen.js +146 -0
- package/dist/utils/change-metadata.d.ts +54 -0
- package/dist/utils/change-metadata.js +141 -0
- package/dist/utils/change-utils.d.ts +71 -0
- package/dist/utils/change-utils.js +123 -0
- package/dist/utils/command-references.d.ts +18 -0
- package/dist/utils/command-references.js +20 -0
- package/dist/utils/file-system.d.ts +41 -0
- package/dist/utils/file-system.js +301 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/interactive.d.ts +18 -0
- package/dist/utils/interactive.js +21 -0
- package/dist/utils/item-discovery.d.ts +4 -0
- package/dist/utils/item-discovery.js +72 -0
- package/dist/utils/match.d.ts +3 -0
- package/dist/utils/match.js +22 -0
- package/dist/utils/shell-detection.d.ts +20 -0
- package/dist/utils/shell-detection.js +41 -0
- package/dist/utils/task-progress.d.ts +8 -0
- package/dist/utils/task-progress.js +36 -0
- package/package.json +84 -0
- package/schemas/spec-driven/schema.yaml +153 -0
- package/schemas/spec-driven/templates/design.md +19 -0
- package/schemas/spec-driven/templates/proposal.md +23 -0
- package/schemas/spec-driven/templates/spec.md +8 -0
- package/schemas/spec-driven/templates/tasks.md +9 -0
- package/schemas/workspace-planning/schema.yaml +72 -0
- package/schemas/workspace-planning/templates/design.md +33 -0
- package/schemas/workspace-planning/templates/proposal.md +28 -0
- package/schemas/workspace-planning/templates/spec.md +9 -0
- package/schemas/workspace-planning/templates/tasks.md +15 -0
- package/scripts/postinstall.js +83 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const CONFIG_DIR_NAME = "pastelsdd";
|
|
2
|
+
export declare const CONFIG_FILE_NAME = "config.json";
|
|
3
|
+
export interface TelemetryConfig {
|
|
4
|
+
anonymousId?: string;
|
|
5
|
+
noticeSeen?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface GlobalConfig {
|
|
8
|
+
telemetry?: TelemetryConfig;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get the path to the global config file.
|
|
13
|
+
* Follows XDG Base Directory Specification and platform conventions.
|
|
14
|
+
*
|
|
15
|
+
* - All platforms: $XDG_CONFIG_HOME/pastelsdd/ if XDG_CONFIG_HOME is set
|
|
16
|
+
* - Unix/macOS fallback: ~/.config/pastelsdd/
|
|
17
|
+
* - Windows fallback: %APPDATA%/pastelsdd/
|
|
18
|
+
*/
|
|
19
|
+
export declare function getConfigPath(): string;
|
|
20
|
+
/**
|
|
21
|
+
* Read the global config file.
|
|
22
|
+
* Returns an empty object if the file doesn't exist.
|
|
23
|
+
*/
|
|
24
|
+
export declare function readConfig(): Promise<GlobalConfig>;
|
|
25
|
+
/**
|
|
26
|
+
* Write to the global config file.
|
|
27
|
+
* Preserves existing fields and merges in new values.
|
|
28
|
+
*/
|
|
29
|
+
export declare function writeConfig(updates: Partial<GlobalConfig>): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Get the telemetry config section.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getTelemetryConfig(): Promise<TelemetryConfig>;
|
|
34
|
+
/**
|
|
35
|
+
* Update the telemetry config section.
|
|
36
|
+
*/
|
|
37
|
+
export declare function updateTelemetryConfig(updates: Partial<TelemetryConfig>): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global configuration for telemetry state.
|
|
3
|
+
* Stores anonymous ID and notice-seen flag in the platform-appropriate config directory.
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fs } from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
import { GLOBAL_CONFIG_DIR_NAME, GLOBAL_CONFIG_FILE_NAME, getGlobalConfigDir, } from '../core/global-config.js';
|
|
9
|
+
// Constants
|
|
10
|
+
export const CONFIG_DIR_NAME = GLOBAL_CONFIG_DIR_NAME;
|
|
11
|
+
export const CONFIG_FILE_NAME = GLOBAL_CONFIG_FILE_NAME;
|
|
12
|
+
function getConfigDir() {
|
|
13
|
+
return getGlobalConfigDir();
|
|
14
|
+
}
|
|
15
|
+
function getLegacyConfigPath() {
|
|
16
|
+
return path.join(os.homedir(), '.config', CONFIG_DIR_NAME, CONFIG_FILE_NAME);
|
|
17
|
+
}
|
|
18
|
+
async function readConfigFile(configPath) {
|
|
19
|
+
try {
|
|
20
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
21
|
+
return { status: 'ok', config: JSON.parse(content) };
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error.code === 'ENOENT') {
|
|
25
|
+
return { status: 'missing' };
|
|
26
|
+
}
|
|
27
|
+
// If parse fails or another read error occurs, ignore the file.
|
|
28
|
+
return { status: 'invalid', config: {} };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function writeConfigFile(configPath, config) {
|
|
32
|
+
await fs.mkdir(path.dirname(configPath), { recursive: true });
|
|
33
|
+
await fs.writeFile(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
34
|
+
}
|
|
35
|
+
function hasMissingTelemetryFields(config) {
|
|
36
|
+
const telemetry = config.telemetry;
|
|
37
|
+
return (!telemetry ||
|
|
38
|
+
telemetry.anonymousId === undefined ||
|
|
39
|
+
telemetry.noticeSeen === undefined);
|
|
40
|
+
}
|
|
41
|
+
function mergeLegacyTelemetry(config, legacyConfig) {
|
|
42
|
+
const legacyTelemetry = legacyConfig.telemetry;
|
|
43
|
+
if (!legacyTelemetry) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const currentTelemetry = config.telemetry ?? {};
|
|
47
|
+
const shouldMigrate = (currentTelemetry.anonymousId === undefined && legacyTelemetry.anonymousId !== undefined) ||
|
|
48
|
+
(currentTelemetry.noticeSeen === undefined && legacyTelemetry.noticeSeen !== undefined);
|
|
49
|
+
if (!shouldMigrate) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
...config,
|
|
54
|
+
telemetry: {
|
|
55
|
+
...legacyTelemetry,
|
|
56
|
+
...currentTelemetry,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async function migrateLegacyTelemetryConfig(configPath, config, persist) {
|
|
61
|
+
const legacyConfigPath = getLegacyConfigPath();
|
|
62
|
+
if (path.resolve(configPath) === path.resolve(legacyConfigPath) || !hasMissingTelemetryFields(config)) {
|
|
63
|
+
return config;
|
|
64
|
+
}
|
|
65
|
+
const legacyRead = await readConfigFile(legacyConfigPath);
|
|
66
|
+
if (legacyRead.status !== 'ok') {
|
|
67
|
+
return config;
|
|
68
|
+
}
|
|
69
|
+
const migrated = mergeLegacyTelemetry(config, legacyRead.config);
|
|
70
|
+
if (!migrated) {
|
|
71
|
+
return config;
|
|
72
|
+
}
|
|
73
|
+
if (persist) {
|
|
74
|
+
try {
|
|
75
|
+
await writeConfigFile(configPath, migrated);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Preserve telemetry for this run even if the one-time migration cannot be persisted.
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return migrated;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get the path to the global config file.
|
|
85
|
+
* Follows XDG Base Directory Specification and platform conventions.
|
|
86
|
+
*
|
|
87
|
+
* - All platforms: $XDG_CONFIG_HOME/pastelsdd/ if XDG_CONFIG_HOME is set
|
|
88
|
+
* - Unix/macOS fallback: ~/.config/pastelsdd/
|
|
89
|
+
* - Windows fallback: %APPDATA%/pastelsdd/
|
|
90
|
+
*/
|
|
91
|
+
export function getConfigPath() {
|
|
92
|
+
const configDir = getConfigDir();
|
|
93
|
+
return path.join(configDir, CONFIG_FILE_NAME);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Read the global config file.
|
|
97
|
+
* Returns an empty object if the file doesn't exist.
|
|
98
|
+
*/
|
|
99
|
+
export async function readConfig() {
|
|
100
|
+
const configPath = getConfigPath();
|
|
101
|
+
const read = await readConfigFile(configPath);
|
|
102
|
+
const config = read.status === 'ok' ? read.config : {};
|
|
103
|
+
return migrateLegacyTelemetryConfig(configPath, config, read.status !== 'invalid');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Write to the global config file.
|
|
107
|
+
* Preserves existing fields and merges in new values.
|
|
108
|
+
*/
|
|
109
|
+
export async function writeConfig(updates) {
|
|
110
|
+
const configPath = getConfigPath();
|
|
111
|
+
// Read existing config and merge
|
|
112
|
+
const existing = await readConfig();
|
|
113
|
+
const merged = { ...existing, ...updates };
|
|
114
|
+
// Deep merge for telemetry object
|
|
115
|
+
if (updates.telemetry && existing.telemetry) {
|
|
116
|
+
merged.telemetry = { ...existing.telemetry, ...updates.telemetry };
|
|
117
|
+
}
|
|
118
|
+
await writeConfigFile(configPath, merged);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get the telemetry config section.
|
|
122
|
+
*/
|
|
123
|
+
export async function getTelemetryConfig() {
|
|
124
|
+
const config = await readConfig();
|
|
125
|
+
return config.telemetry ?? {};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Update the telemetry config section.
|
|
129
|
+
*/
|
|
130
|
+
export async function updateTelemetryConfig(updates) {
|
|
131
|
+
const existing = await getTelemetryConfig();
|
|
132
|
+
await writeConfig({
|
|
133
|
+
telemetry: { ...existing, ...updates },
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if telemetry is enabled.
|
|
3
|
+
*
|
|
4
|
+
* Disabled when:
|
|
5
|
+
* - PASTELSDD_TELEMETRY=0
|
|
6
|
+
* - DO_NOT_TRACK=1
|
|
7
|
+
* - CI=true (any CI environment)
|
|
8
|
+
*/
|
|
9
|
+
export declare function isTelemetryEnabled(): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Get or create the anonymous user ID.
|
|
12
|
+
* Lazily generates a UUID on first call and persists it.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getOrCreateAnonymousId(): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Track a command execution.
|
|
17
|
+
*
|
|
18
|
+
* @param commandName - The command name (e.g., 'init', 'change:apply')
|
|
19
|
+
* @param version - The Pastelsdd version
|
|
20
|
+
*/
|
|
21
|
+
export declare function trackCommand(commandName: string, version: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Show first-run telemetry notice if not already seen.
|
|
24
|
+
*/
|
|
25
|
+
export declare function maybeShowTelemetryNotice(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Shutdown the PostHog client and flush pending events.
|
|
28
|
+
* Call this before CLI exit.
|
|
29
|
+
*/
|
|
30
|
+
export declare function shutdown(): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry module for anonymous usage analytics.
|
|
3
|
+
*
|
|
4
|
+
* Privacy-first design:
|
|
5
|
+
* - Only tracks command name and version
|
|
6
|
+
* - No arguments, file paths, or content
|
|
7
|
+
* - Opt-out via PASTELSDD_TELEMETRY=0 or DO_NOT_TRACK=1
|
|
8
|
+
* - Auto-disabled in CI environments
|
|
9
|
+
* - Anonymous ID is a random UUID with no relation to the user
|
|
10
|
+
*/
|
|
11
|
+
import { PostHog } from 'posthog-node';
|
|
12
|
+
import { randomUUID } from 'crypto';
|
|
13
|
+
import { getTelemetryConfig, updateTelemetryConfig } from './config.js';
|
|
14
|
+
// PostHog API key - public key for client-side analytics
|
|
15
|
+
// This is safe to embed as it only allows sending events, not reading data
|
|
16
|
+
const POSTHOG_API_KEY = 'phc_Hthu8YvaIJ9QaFKyTG4TbVwkbd5ktcAFzVTKeMmoW2g';
|
|
17
|
+
// Using reverse proxy to avoid ad blockers and keep traffic on our domain
|
|
18
|
+
const POSTHOG_HOST = 'https://edge.pastelsdd.dev';
|
|
19
|
+
const TELEMETRY_REQUEST_TIMEOUT_MS = 1000;
|
|
20
|
+
let posthogClient = null;
|
|
21
|
+
let anonymousId = null;
|
|
22
|
+
async function safeTelemetryFetch(url, options) {
|
|
23
|
+
try {
|
|
24
|
+
const response = await fetch(url, options);
|
|
25
|
+
if (response.ok) {
|
|
26
|
+
return response;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Silent failure - telemetry should never surface network noise
|
|
31
|
+
}
|
|
32
|
+
return new Response(null, { status: 204 });
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if telemetry is enabled.
|
|
36
|
+
*
|
|
37
|
+
* Disabled when:
|
|
38
|
+
* - PASTELSDD_TELEMETRY=0
|
|
39
|
+
* - DO_NOT_TRACK=1
|
|
40
|
+
* - CI=true (any CI environment)
|
|
41
|
+
*/
|
|
42
|
+
export function isTelemetryEnabled() {
|
|
43
|
+
// Check explicit opt-out
|
|
44
|
+
if (process.env.PASTELSDD_TELEMETRY === '0') {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
// Respect DO_NOT_TRACK standard
|
|
48
|
+
if (process.env.DO_NOT_TRACK === '1') {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
// Auto-disable in CI environments
|
|
52
|
+
if (process.env.CI === 'true') {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get or create the anonymous user ID.
|
|
59
|
+
* Lazily generates a UUID on first call and persists it.
|
|
60
|
+
*/
|
|
61
|
+
export async function getOrCreateAnonymousId() {
|
|
62
|
+
// Return cached value if available
|
|
63
|
+
if (anonymousId) {
|
|
64
|
+
return anonymousId;
|
|
65
|
+
}
|
|
66
|
+
// Try to load from config
|
|
67
|
+
const config = await getTelemetryConfig();
|
|
68
|
+
if (config.anonymousId) {
|
|
69
|
+
anonymousId = config.anonymousId;
|
|
70
|
+
return anonymousId;
|
|
71
|
+
}
|
|
72
|
+
// Generate new UUID and persist
|
|
73
|
+
anonymousId = randomUUID();
|
|
74
|
+
await updateTelemetryConfig({ anonymousId });
|
|
75
|
+
return anonymousId;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the PostHog client instance.
|
|
79
|
+
* Creates it on first call with CLI-optimized settings.
|
|
80
|
+
*/
|
|
81
|
+
function getClient() {
|
|
82
|
+
if (!posthogClient) {
|
|
83
|
+
posthogClient = new PostHog(POSTHOG_API_KEY, {
|
|
84
|
+
host: POSTHOG_HOST,
|
|
85
|
+
flushAt: 1, // Send immediately, don't batch
|
|
86
|
+
flushInterval: 0, // No timer-based flushing
|
|
87
|
+
fetchRetryCount: 0,
|
|
88
|
+
requestTimeout: TELEMETRY_REQUEST_TIMEOUT_MS,
|
|
89
|
+
preloadFeatureFlags: false,
|
|
90
|
+
disableRemoteConfig: true,
|
|
91
|
+
disableSurveys: true,
|
|
92
|
+
fetch: safeTelemetryFetch,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return posthogClient;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Track a command execution.
|
|
99
|
+
*
|
|
100
|
+
* @param commandName - The command name (e.g., 'init', 'change:apply')
|
|
101
|
+
* @param version - The Pastelsdd version
|
|
102
|
+
*/
|
|
103
|
+
export async function trackCommand(commandName, version) {
|
|
104
|
+
if (!isTelemetryEnabled()) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const userId = await getOrCreateAnonymousId();
|
|
109
|
+
const client = getClient();
|
|
110
|
+
client.capture({
|
|
111
|
+
distinctId: userId,
|
|
112
|
+
event: 'command_executed',
|
|
113
|
+
properties: {
|
|
114
|
+
command: commandName,
|
|
115
|
+
version: version,
|
|
116
|
+
surface: 'cli',
|
|
117
|
+
$ip: null, // Explicitly disable IP tracking
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Silent failure - telemetry should never break CLI
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Show first-run telemetry notice if not already seen.
|
|
127
|
+
*/
|
|
128
|
+
export async function maybeShowTelemetryNotice() {
|
|
129
|
+
if (!isTelemetryEnabled()) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
const config = await getTelemetryConfig();
|
|
134
|
+
if (config.noticeSeen) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Display notice
|
|
138
|
+
console.log('Note: Pastelsdd collects anonymous usage stats. Opt out: PASTELSDD_TELEMETRY=0');
|
|
139
|
+
// Mark as seen
|
|
140
|
+
await updateTelemetryConfig({ noticeSeen: true });
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Silent failure - telemetry should never break CLI
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Shutdown the PostHog client and flush pending events.
|
|
148
|
+
* Call this before CLI exit.
|
|
149
|
+
*/
|
|
150
|
+
export async function shutdown() {
|
|
151
|
+
if (!posthogClient) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
await posthogClient.shutdown();
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Silent failure - telemetry should never break CLI exit
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
posthogClient = null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ASCII art animation patterns for the welcome screen.
|
|
3
|
+
* Pastelsdd logo animation - diamond/rhombus shape with hollow center "O".
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Welcome animation frames - Pastelsdd logo building from center
|
|
7
|
+
* 7 rows × 6 columns diamond with hollow center "O"
|
|
8
|
+
* Center bar is 2 cols × 3 rows (rows 3,4,5 cols 3,4)
|
|
9
|
+
* Each frame is an array of strings (lines of ASCII art)
|
|
10
|
+
* Grid: 6 cols × 2 chars = 12 chars wide
|
|
11
|
+
*/
|
|
12
|
+
export declare const WELCOME_ANIMATION: {
|
|
13
|
+
interval: number;
|
|
14
|
+
frames: string[][];
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=ascii-patterns.d.ts.map
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ASCII art animation patterns for the welcome screen.
|
|
3
|
+
* Pastelsdd logo animation - diamond/rhombus shape with hollow center "O".
|
|
4
|
+
*/
|
|
5
|
+
// Detect if full Unicode is supported
|
|
6
|
+
const supportsUnicode = process.platform !== 'win32' ||
|
|
7
|
+
!!process.env.WT_SESSION || // Windows Terminal
|
|
8
|
+
!!process.env.TERM_PROGRAM; // Modern terminal
|
|
9
|
+
// Character set based on Unicode support
|
|
10
|
+
// Block characters for pixel-art aesthetic
|
|
11
|
+
const CHARS = supportsUnicode
|
|
12
|
+
? { full: '██', dim: '░░', empty: ' ' }
|
|
13
|
+
: { full: '##', dim: '++', empty: ' ' };
|
|
14
|
+
const _ = CHARS.empty;
|
|
15
|
+
const F = CHARS.full;
|
|
16
|
+
const D = CHARS.dim;
|
|
17
|
+
/**
|
|
18
|
+
* Welcome animation frames - Pastelsdd logo building from center
|
|
19
|
+
* 7 rows × 6 columns diamond with hollow center "O"
|
|
20
|
+
* Center bar is 2 cols × 3 rows (rows 3,4,5 cols 3,4)
|
|
21
|
+
* Each frame is an array of strings (lines of ASCII art)
|
|
22
|
+
* Grid: 6 cols × 2 chars = 12 chars wide
|
|
23
|
+
*/
|
|
24
|
+
export const WELCOME_ANIMATION = {
|
|
25
|
+
interval: 120,
|
|
26
|
+
frames: [
|
|
27
|
+
// Frame 1: Empty
|
|
28
|
+
[
|
|
29
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 1
|
|
30
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 2
|
|
31
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 3
|
|
32
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
33
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
34
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
35
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
36
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
37
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
38
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
39
|
+
],
|
|
40
|
+
// Frame 2: Center blocks appear (dim) - 2x3 center bar
|
|
41
|
+
[
|
|
42
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 1
|
|
43
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 2
|
|
44
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 3
|
|
45
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
46
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
47
|
+
`${_}${_}${_}${_}${D}${D}${_}${_}`,
|
|
48
|
+
`${_}${_}${_}${_}${D}${D}${_}${_}`,
|
|
49
|
+
`${_}${_}${_}${_}${D}${D}${_}${_}`,
|
|
50
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
51
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
52
|
+
],
|
|
53
|
+
// Frame 3: Center blocks solidify
|
|
54
|
+
[
|
|
55
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 1
|
|
56
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 2
|
|
57
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 3
|
|
58
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
59
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
60
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
61
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
62
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
63
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
64
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
65
|
+
],
|
|
66
|
+
// Frame 4: Top and bottom points appear
|
|
67
|
+
[
|
|
68
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 1
|
|
69
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 2
|
|
70
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 3
|
|
71
|
+
`${_}${_}${_}${_}${D}${D}${_}${_}`,
|
|
72
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
73
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
74
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
75
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
76
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`,
|
|
77
|
+
`${_}${_}${_}${_}${D}${D}${_}${_}`,
|
|
78
|
+
],
|
|
79
|
+
// Frame 5: Inner ring forming
|
|
80
|
+
[
|
|
81
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 1
|
|
82
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 2
|
|
83
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 3
|
|
84
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
85
|
+
`${_}${_}${_}${D}${_}${_}${D}${_}`,
|
|
86
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
87
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
88
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
89
|
+
`${_}${_}${_}${D}${_}${_}${D}${_}`,
|
|
90
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
91
|
+
],
|
|
92
|
+
// Frame 6: Outer ring appearing
|
|
93
|
+
[
|
|
94
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 1
|
|
95
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 2
|
|
96
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 3
|
|
97
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
98
|
+
`${_}${_}${_}${F}${_}${_}${F}${_}`,
|
|
99
|
+
`${_}${_}${D}${_}${F}${F}${_}${D}`,
|
|
100
|
+
`${_}${_}${D}${_}${F}${F}${_}${D}`,
|
|
101
|
+
`${_}${_}${D}${_}${F}${F}${_}${D}`,
|
|
102
|
+
`${_}${_}${_}${F}${_}${_}${F}${_}`,
|
|
103
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
104
|
+
],
|
|
105
|
+
// Frame 7: Full logo
|
|
106
|
+
[
|
|
107
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 1
|
|
108
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 2
|
|
109
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 3
|
|
110
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
111
|
+
`${_}${_}${_}${F}${_}${_}${F}${_}`,
|
|
112
|
+
`${_}${_}${F}${_}${F}${F}${_}${F}`,
|
|
113
|
+
`${_}${_}${F}${_}${F}${F}${_}${F}`,
|
|
114
|
+
`${_}${_}${F}${_}${F}${F}${_}${F}`,
|
|
115
|
+
`${_}${_}${_}${F}${_}${_}${F}${_}`,
|
|
116
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
117
|
+
],
|
|
118
|
+
// Frame 8: Hold complete logo
|
|
119
|
+
[
|
|
120
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 1
|
|
121
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 2
|
|
122
|
+
`${_}${_}${_}${_}${_}${_}${_}${_}`, // padding row 3
|
|
123
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
124
|
+
`${_}${_}${_}${F}${_}${_}${F}${_}`,
|
|
125
|
+
`${_}${_}${F}${_}${F}${F}${_}${F}`,
|
|
126
|
+
`${_}${_}${F}${_}${F}${F}${_}${F}`,
|
|
127
|
+
`${_}${_}${F}${_}${F}${F}${_}${F}`,
|
|
128
|
+
`${_}${_}${_}${F}${_}${_}${F}${_}`,
|
|
129
|
+
`${_}${_}${_}${_}${F}${F}${_}${_}`,
|
|
130
|
+
],
|
|
131
|
+
],
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=ascii-patterns.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Animated welcome screen for the experimental artifact workflow setup.
|
|
3
|
+
* Shows side-by-side layout with animated ASCII art on left and welcome text on right.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Shows the animated welcome screen.
|
|
7
|
+
* Returns when user presses Enter.
|
|
8
|
+
*/
|
|
9
|
+
export declare function showWelcomeScreen(): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=welcome-screen.d.ts.map
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Animated welcome screen for the experimental artifact workflow setup.
|
|
3
|
+
* Shows side-by-side layout with animated ASCII art on left and welcome text on right.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { WELCOME_ANIMATION } from './ascii-patterns.js';
|
|
7
|
+
// Minimum terminal width for side-by-side layout
|
|
8
|
+
const MIN_WIDTH = 60;
|
|
9
|
+
// Width of the ASCII art column (with padding)
|
|
10
|
+
const ART_COLUMN_WIDTH = 24;
|
|
11
|
+
/**
|
|
12
|
+
* Welcome text content (right column)
|
|
13
|
+
*/
|
|
14
|
+
function getWelcomeText() {
|
|
15
|
+
return [
|
|
16
|
+
chalk.white.bold('Welcome to Pastelsdd'),
|
|
17
|
+
chalk.dim('A lightweight spec-driven framework'),
|
|
18
|
+
'',
|
|
19
|
+
chalk.white('This setup will configure:'),
|
|
20
|
+
chalk.dim(' • Agent Skills for AI tools'),
|
|
21
|
+
chalk.dim(' • /pastel:* slash commands'),
|
|
22
|
+
'',
|
|
23
|
+
chalk.white('Quick start after setup:'),
|
|
24
|
+
` ${chalk.yellow('/pastel:new')} ${chalk.dim('Create a change')}`,
|
|
25
|
+
` ${chalk.yellow('/pastel:continue')} ${chalk.dim('Next artifact')}`,
|
|
26
|
+
` ${chalk.yellow('/pastel:apply')} ${chalk.dim('Implement tasks')}`,
|
|
27
|
+
'',
|
|
28
|
+
chalk.cyan('Press Enter to select tools...'),
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Renders a single frame with side-by-side layout
|
|
33
|
+
*/
|
|
34
|
+
function renderFrame(artLines, textLines) {
|
|
35
|
+
const maxLines = Math.max(artLines.length, textLines.length);
|
|
36
|
+
const lines = [];
|
|
37
|
+
for (let i = 0; i < maxLines; i++) {
|
|
38
|
+
const artLine = artLines[i] || '';
|
|
39
|
+
const textLine = textLines[i] || '';
|
|
40
|
+
// Pad the art column to fixed width
|
|
41
|
+
const paddedArt = artLine.padEnd(ART_COLUMN_WIDTH);
|
|
42
|
+
// Color the ASCII art with cyan for visual appeal
|
|
43
|
+
const coloredArt = chalk.cyan(paddedArt);
|
|
44
|
+
// Clear line before writing to prevent residual characters
|
|
45
|
+
lines.push(`\x1b[2K${coloredArt}${textLine}`);
|
|
46
|
+
}
|
|
47
|
+
return lines.join('\n');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Checks if the terminal supports animation
|
|
51
|
+
*/
|
|
52
|
+
function canAnimate() {
|
|
53
|
+
// Must be TTY
|
|
54
|
+
if (!process.stdout.isTTY)
|
|
55
|
+
return false;
|
|
56
|
+
// Respect NO_COLOR
|
|
57
|
+
if (process.env.NO_COLOR)
|
|
58
|
+
return false;
|
|
59
|
+
// Check terminal width
|
|
60
|
+
const columns = process.stdout.columns || 80;
|
|
61
|
+
if (columns < MIN_WIDTH)
|
|
62
|
+
return false;
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Wait for Enter key press
|
|
67
|
+
*/
|
|
68
|
+
function waitForEnter() {
|
|
69
|
+
return new Promise((resolve) => {
|
|
70
|
+
const { stdin } = process;
|
|
71
|
+
// Handle non-TTY gracefully
|
|
72
|
+
if (!stdin.isTTY) {
|
|
73
|
+
resolve();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const wasRaw = stdin.isRaw;
|
|
77
|
+
stdin.setRawMode(true);
|
|
78
|
+
stdin.resume();
|
|
79
|
+
const onData = (data) => {
|
|
80
|
+
const char = data.toString();
|
|
81
|
+
// Enter key or Ctrl+C
|
|
82
|
+
if (char === '\r' || char === '\n' || char === '\u0003') {
|
|
83
|
+
stdin.removeListener('data', onData);
|
|
84
|
+
stdin.setRawMode(wasRaw);
|
|
85
|
+
stdin.pause();
|
|
86
|
+
// Handle Ctrl+C
|
|
87
|
+
if (char === '\u0003') {
|
|
88
|
+
process.stdout.write('\n');
|
|
89
|
+
process.exit(0);
|
|
90
|
+
}
|
|
91
|
+
resolve();
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
stdin.on('data', onData);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Shows the animated welcome screen.
|
|
99
|
+
* Returns when user presses Enter.
|
|
100
|
+
*/
|
|
101
|
+
export async function showWelcomeScreen() {
|
|
102
|
+
const textLines = getWelcomeText();
|
|
103
|
+
if (!canAnimate()) {
|
|
104
|
+
// Fallback: show static welcome
|
|
105
|
+
const frame = WELCOME_ANIMATION.frames[3]; // Peak frame
|
|
106
|
+
process.stdout.write('\n' + renderFrame(frame, textLines) + '\n\n');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
let frameIndex = 0;
|
|
110
|
+
let running = true;
|
|
111
|
+
let isFirstRender = true;
|
|
112
|
+
// Content height for cursor movement between frames
|
|
113
|
+
const numContentLines = Math.max(WELCOME_ANIMATION.frames[0].length, textLines.length);
|
|
114
|
+
const frameHeight = numContentLines + 1; // internal newlines (11) + trailing newlines (2) = 13
|
|
115
|
+
// Total height including initial newline (for cleanup)
|
|
116
|
+
const totalHeight = frameHeight + 1; // 14
|
|
117
|
+
// Initial render
|
|
118
|
+
process.stdout.write('\n');
|
|
119
|
+
// Animation loop
|
|
120
|
+
const interval = setInterval(() => {
|
|
121
|
+
if (!running)
|
|
122
|
+
return;
|
|
123
|
+
const frame = WELCOME_ANIMATION.frames[frameIndex];
|
|
124
|
+
// Move cursor up to overwrite previous frame (always after first render)
|
|
125
|
+
if (!isFirstRender) {
|
|
126
|
+
process.stdout.write(`\x1b[${frameHeight}A`);
|
|
127
|
+
}
|
|
128
|
+
isFirstRender = false;
|
|
129
|
+
// Render current frame
|
|
130
|
+
process.stdout.write(renderFrame(frame, textLines) + '\n\n');
|
|
131
|
+
// Advance to next frame
|
|
132
|
+
frameIndex = (frameIndex + 1) % WELCOME_ANIMATION.frames.length;
|
|
133
|
+
}, WELCOME_ANIMATION.interval);
|
|
134
|
+
// Wait for Enter
|
|
135
|
+
await waitForEnter();
|
|
136
|
+
// Stop animation
|
|
137
|
+
running = false;
|
|
138
|
+
clearInterval(interval);
|
|
139
|
+
// Clear the welcome screen and move on
|
|
140
|
+
process.stdout.write(`\x1b[${totalHeight}A`);
|
|
141
|
+
for (let i = 0; i < totalHeight; i++) {
|
|
142
|
+
process.stdout.write('\x1b[2K\n'); // Clear line
|
|
143
|
+
}
|
|
144
|
+
process.stdout.write(`\x1b[${totalHeight}A`); // Move back up
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=welcome-screen.js.map
|