scene-capability-engine 3.0.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/CHANGELOG.md +2513 -0
- package/LICENSE +21 -0
- package/README.md +765 -0
- package/README.zh.md +630 -0
- package/bin/kiro-spec-engine.js +796 -0
- package/bin/kse.js +3 -0
- package/bin/sce.js +3 -0
- package/bin/sco.js +3 -0
- package/docs/331-poc-adaptation-roadmap.md +156 -0
- package/docs/331-poc-dual-track-integration-guide.md +120 -0
- package/docs/331-poc-weekly-delivery-checklist.md +52 -0
- package/docs/OFFLINE_INSTALL.md +96 -0
- package/docs/README.md +279 -0
- package/docs/adopt-migration-guide.md +599 -0
- package/docs/adoption-guide.md +616 -0
- package/docs/agent-hooks-analysis.md +815 -0
- package/docs/architecture.md +733 -0
- package/docs/articles/ai-driven-development-philosophy-and-practice-review.md +208 -0
- package/docs/articles/ai-driven-development-philosophy-and-practice.en.md +459 -0
- package/docs/articles/ai-driven-development-philosophy-and-practice.md +492 -0
- package/docs/autonomous-control-guide.md +851 -0
- package/docs/command-reference.md +1368 -0
- package/docs/community.md +115 -0
- package/docs/cross-tool-guide.md +555 -0
- package/docs/developer-guide.md +619 -0
- package/docs/document-governance.md +865 -0
- package/docs/environment-management-guide.md +526 -0
- package/docs/examples/add-export-command/design.md +194 -0
- package/docs/examples/add-export-command/requirements.md +110 -0
- package/docs/examples/add-export-command/tasks.md +88 -0
- package/docs/examples/add-rest-api/design.md +855 -0
- package/docs/examples/add-rest-api/requirements.md +323 -0
- package/docs/examples/add-rest-api/tasks.md +355 -0
- package/docs/examples/add-user-dashboard/design.md +192 -0
- package/docs/examples/add-user-dashboard/requirements.md +143 -0
- package/docs/examples/add-user-dashboard/tasks.md +91 -0
- package/docs/faq.md +697 -0
- package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.json +156 -0
- package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.md +24 -0
- package/docs/images/wechat-qr.png +0 -0
- package/docs/integration-modes.md +529 -0
- package/docs/integration-philosophy.md +313 -0
- package/docs/knowledge-management-guide.md +263 -0
- package/docs/manual-workflows-guide.md +418 -0
- package/docs/moqui-capability-matrix.md +73 -0
- package/docs/moqui-template-core-library-playbook.md +109 -0
- package/docs/multi-agent-coordination-guide.md +553 -0
- package/docs/multi-repo-management-guide.md +1344 -0
- package/docs/quick-start-with-ai-tools.md +375 -0
- package/docs/quick-start.md +146 -0
- package/docs/release-checklist.md +121 -0
- package/docs/releases/README.md +13 -0
- package/docs/releases/v1.46.2-validation.md +45 -0
- package/docs/releases/v1.46.2.md +50 -0
- package/docs/scene-runtime-guide.md +347 -0
- package/docs/spec-collaboration-guide.md +369 -0
- package/docs/spec-locking-guide.md +225 -0
- package/docs/spec-numbering-guide.md +348 -0
- package/docs/spec-workflow.md +519 -0
- package/docs/steering-strategy-guide.md +196 -0
- package/docs/team-collaboration-guide.md +465 -0
- package/docs/testing-strategy.md +272 -0
- package/docs/tools/claude-guide.md +654 -0
- package/docs/tools/cursor-guide.md +706 -0
- package/docs/tools/generic-guide.md +446 -0
- package/docs/tools/kiro-guide.md +308 -0
- package/docs/tools/vscode-guide.md +445 -0
- package/docs/tools/windsurf-guide.md +391 -0
- package/docs/troubleshooting.md +1135 -0
- package/docs/upgrade-guide.md +639 -0
- package/docs/value-observability-guide.md +127 -0
- package/docs/zh/README.md +341 -0
- package/docs/zh/quick-start.md +764 -0
- package/docs/zh/release-checklist.md +121 -0
- package/docs/zh/releases/README.md +13 -0
- package/docs/zh/releases/v1.46.2-validation.md +45 -0
- package/docs/zh/releases/v1.46.2.md +50 -0
- package/docs/zh/spec-numbering-guide.md +348 -0
- package/docs/zh/tools/claude-guide.md +349 -0
- package/docs/zh/tools/cursor-guide.md +281 -0
- package/docs/zh/tools/generic-guide.md +499 -0
- package/docs/zh/tools/kiro-guide.md +342 -0
- package/docs/zh/tools/vscode-guide.md +449 -0
- package/docs/zh/tools/windsurf-guide.md +378 -0
- package/docs/zh/value-observability-guide.md +127 -0
- package/docs//344/272/244/344/273/230/346/270/205/345/215/225.md +75 -0
- package/lib/adoption/adoption-logger.js +487 -0
- package/lib/adoption/adoption-strategy.js +538 -0
- package/lib/adoption/backup-manager.js +420 -0
- package/lib/adoption/conflict-resolver.js +410 -0
- package/lib/adoption/detection-engine.js +275 -0
- package/lib/adoption/diff-viewer.js +226 -0
- package/lib/adoption/error-formatter.js +509 -0
- package/lib/adoption/file-classifier.js +385 -0
- package/lib/adoption/progress-reporter.js +534 -0
- package/lib/adoption/smart-orchestrator.js +470 -0
- package/lib/adoption/strategy-selector.js +218 -0
- package/lib/adoption/summary-generator.js +493 -0
- package/lib/adoption/template-sync.js +605 -0
- package/lib/auto/autonomous-engine.js +485 -0
- package/lib/auto/checkpoint-manager.js +300 -0
- package/lib/auto/close-loop-runner.js +2476 -0
- package/lib/auto/config-schema.js +176 -0
- package/lib/auto/decision-engine.js +344 -0
- package/lib/auto/error-recovery-manager.js +580 -0
- package/lib/auto/goal-decomposer.js +278 -0
- package/lib/auto/progress-tracker.js +502 -0
- package/lib/auto/safety-manager.js +186 -0
- package/lib/auto/semantic-decomposer.js +137 -0
- package/lib/auto/state-manager.js +126 -0
- package/lib/auto/task-queue-manager.js +340 -0
- package/lib/backup/backup-system.js +372 -0
- package/lib/backup/selective-backup.js +207 -0
- package/lib/collab/agent-registry.js +240 -0
- package/lib/collab/collab-manager.js +285 -0
- package/lib/collab/contract-manager.js +320 -0
- package/lib/collab/coordinator.js +370 -0
- package/lib/collab/dependency-manager.js +280 -0
- package/lib/collab/index.js +20 -0
- package/lib/collab/integration-manager.js +202 -0
- package/lib/collab/merge-coordinator.js +252 -0
- package/lib/collab/metadata-manager.js +233 -0
- package/lib/collab/multi-agent-config.js +120 -0
- package/lib/collab/spec-lifecycle-manager.js +304 -0
- package/lib/collab/sync-barrier.js +88 -0
- package/lib/collab/visualizer.js +208 -0
- package/lib/commands/adopt.js +749 -0
- package/lib/commands/auto.js +19559 -0
- package/lib/commands/collab.js +275 -0
- package/lib/commands/context.js +99 -0
- package/lib/commands/docs.js +808 -0
- package/lib/commands/doctor.js +273 -0
- package/lib/commands/env.js +420 -0
- package/lib/commands/knowledge.js +309 -0
- package/lib/commands/lock.js +235 -0
- package/lib/commands/ops.js +409 -0
- package/lib/commands/orchestrate.js +446 -0
- package/lib/commands/prompt.js +105 -0
- package/lib/commands/repo.js +118 -0
- package/lib/commands/rollback.js +219 -0
- package/lib/commands/scene.js +15549 -0
- package/lib/commands/spec-bootstrap.js +147 -0
- package/lib/commands/spec-gate.js +157 -0
- package/lib/commands/spec-pipeline.js +205 -0
- package/lib/commands/status.js +321 -0
- package/lib/commands/task.js +199 -0
- package/lib/commands/templates.js +654 -0
- package/lib/commands/upgrade.js +231 -0
- package/lib/commands/value.js +569 -0
- package/lib/commands/watch.js +684 -0
- package/lib/commands/workflows.js +240 -0
- package/lib/commands/workspace-multi.js +325 -0
- package/lib/commands/workspace.js +189 -0
- package/lib/context/context-exporter.js +378 -0
- package/lib/context/prompt-generator.js +482 -0
- package/lib/data/moqui-capability-lexicon.json +45 -0
- package/lib/environment/backup-system.js +189 -0
- package/lib/environment/environment-manager.js +379 -0
- package/lib/environment/environment-registry.js +168 -0
- package/lib/gitignore/gitignore-backup.js +229 -0
- package/lib/gitignore/gitignore-detector.js +239 -0
- package/lib/gitignore/gitignore-integration.js +267 -0
- package/lib/gitignore/gitignore-transformer.js +193 -0
- package/lib/gitignore/layered-rules-template.js +42 -0
- package/lib/governance/archive-tool.js +284 -0
- package/lib/governance/cleanup-tool.js +237 -0
- package/lib/governance/config-manager.js +186 -0
- package/lib/governance/diagnostic-engine.js +271 -0
- package/lib/governance/doc-reference-checker.js +200 -0
- package/lib/governance/execution-logger.js +243 -0
- package/lib/governance/file-scanner.js +285 -0
- package/lib/governance/hooks-manager.js +333 -0
- package/lib/governance/reporter.js +337 -0
- package/lib/governance/validation-engine.js +181 -0
- package/lib/i18n.js +79 -0
- package/lib/knowledge/entry-manager.js +208 -0
- package/lib/knowledge/index-manager.js +261 -0
- package/lib/knowledge/knowledge-manager.js +273 -0
- package/lib/knowledge/template-manager.js +191 -0
- package/lib/lock/index.js +21 -0
- package/lib/lock/lock-file.js +192 -0
- package/lib/lock/lock-manager.js +321 -0
- package/lib/lock/machine-identifier.js +135 -0
- package/lib/lock/steering-file-lock.js +207 -0
- package/lib/lock/task-lock-manager.js +345 -0
- package/lib/operations/audit-logger.js +293 -0
- package/lib/operations/feedback-manager.js +1147 -0
- package/lib/operations/index.js +23 -0
- package/lib/operations/models/index.js +170 -0
- package/lib/operations/operations-manager.js +151 -0
- package/lib/operations/operations-validator.js +280 -0
- package/lib/operations/permission-manager.js +354 -0
- package/lib/operations/template-loader.js +143 -0
- package/lib/orchestrator/agent-spawner.js +629 -0
- package/lib/orchestrator/bootstrap-prompt-builder.js +236 -0
- package/lib/orchestrator/index.js +19 -0
- package/lib/orchestrator/orchestration-engine.js +1270 -0
- package/lib/orchestrator/orchestrator-config.js +173 -0
- package/lib/orchestrator/status-monitor.js +591 -0
- package/lib/python-checker.js +209 -0
- package/lib/repo/config-manager.js +580 -0
- package/lib/repo/errors/config-error.js +13 -0
- package/lib/repo/errors/git-error.js +15 -0
- package/lib/repo/errors/repo-error.js +14 -0
- package/lib/repo/git-operations.js +181 -0
- package/lib/repo/handlers/.gitkeep +1 -0
- package/lib/repo/handlers/exec-handler.js +155 -0
- package/lib/repo/handlers/health-handler.js +169 -0
- package/lib/repo/handlers/init-handler.js +197 -0
- package/lib/repo/handlers/status-handler.js +176 -0
- package/lib/repo/output-formatter.js +184 -0
- package/lib/repo/path-resolver.js +178 -0
- package/lib/repo/repo-manager.js +514 -0
- package/lib/scene-runtime/audit-emitter.js +59 -0
- package/lib/scene-runtime/binding-plugin-loader.js +351 -0
- package/lib/scene-runtime/binding-registry.js +349 -0
- package/lib/scene-runtime/eval-bridge.js +44 -0
- package/lib/scene-runtime/index.js +19 -0
- package/lib/scene-runtime/moqui-adapter.js +620 -0
- package/lib/scene-runtime/moqui-client.js +606 -0
- package/lib/scene-runtime/moqui-extractor.js +2029 -0
- package/lib/scene-runtime/plan-compiler.js +208 -0
- package/lib/scene-runtime/policy-gate.js +58 -0
- package/lib/scene-runtime/runtime-executor.js +358 -0
- package/lib/scene-runtime/scene-loader.js +96 -0
- package/lib/scene-runtime/scene-ontology.js +959 -0
- package/lib/scene-runtime/scene-template-linter.js +852 -0
- package/lib/scene-runtime/templates/scene-template-erp-query-v0.1.yaml +28 -0
- package/lib/scene-runtime/templates/scene-template-hybrid-shadow-v0.1.yaml +34 -0
- package/lib/spec/bootstrap/context-collector.js +48 -0
- package/lib/spec/bootstrap/draft-generator.js +158 -0
- package/lib/spec/bootstrap/questionnaire-engine.js +70 -0
- package/lib/spec/bootstrap/trace-emitter.js +59 -0
- package/lib/spec/multi-spec-orchestrate.js +93 -0
- package/lib/spec/pipeline/constants.js +6 -0
- package/lib/spec/pipeline/stage-adapters.js +118 -0
- package/lib/spec/pipeline/stage-runner.js +146 -0
- package/lib/spec/pipeline/state-store.js +119 -0
- package/lib/spec-gate/engine/gate-engine.js +165 -0
- package/lib/spec-gate/policy/default-policy.js +22 -0
- package/lib/spec-gate/policy/policy-loader.js +103 -0
- package/lib/spec-gate/result-emitter.js +81 -0
- package/lib/spec-gate/rules/default-rules.js +156 -0
- package/lib/spec-gate/rules/rule-registry.js +51 -0
- package/lib/steering/adoption-config.js +164 -0
- package/lib/steering/compliance-auto-fixer.js +204 -0
- package/lib/steering/compliance-cache.js +99 -0
- package/lib/steering/compliance-error-reporter.js +70 -0
- package/lib/steering/context-sync-manager.js +273 -0
- package/lib/steering/index.js +92 -0
- package/lib/steering/spec-steering.js +230 -0
- package/lib/steering/steering-compliance-checker.js +73 -0
- package/lib/steering/steering-loader.js +144 -0
- package/lib/steering/steering-manager.js +289 -0
- package/lib/task/index.js +12 -0
- package/lib/task/task-claimer.js +489 -0
- package/lib/task/task-status-store.js +418 -0
- package/lib/templates/cache-manager.js +440 -0
- package/lib/templates/content-generalizer.js +247 -0
- package/lib/templates/frontmatter-generator.js +128 -0
- package/lib/templates/git-handler.js +471 -0
- package/lib/templates/metadata-collector.js +328 -0
- package/lib/templates/path-utils.js +144 -0
- package/lib/templates/registry-parser.js +505 -0
- package/lib/templates/spec-reader.js +216 -0
- package/lib/templates/template-applicator.js +249 -0
- package/lib/templates/template-creator.js +256 -0
- package/lib/templates/template-error.js +143 -0
- package/lib/templates/template-exporter.js +502 -0
- package/lib/templates/template-manager.js +782 -0
- package/lib/templates/template-validator.js +361 -0
- package/lib/upgrade/migration-engine.js +382 -0
- package/lib/upgrade/migrations/.gitkeep +52 -0
- package/lib/upgrade/migrations/1.0.0-to-1.1.0.js +78 -0
- package/lib/utils/file-diff.js +177 -0
- package/lib/utils/fs-utils.js +274 -0
- package/lib/utils/tool-detector.js +383 -0
- package/lib/utils/validation.js +324 -0
- package/lib/value/gate-summary-emitter.js +99 -0
- package/lib/value/metric-contract-loader.js +210 -0
- package/lib/value/risk-evaluator.js +117 -0
- package/lib/value/weekly-snapshot-builder.js +61 -0
- package/lib/version/version-checker.js +156 -0
- package/lib/version/version-manager.js +327 -0
- package/lib/watch/action-executor.js +458 -0
- package/lib/watch/event-debouncer.js +323 -0
- package/lib/watch/execution-logger.js +550 -0
- package/lib/watch/file-watcher.js +499 -0
- package/lib/watch/presets.js +266 -0
- package/lib/watch/watch-manager.js +533 -0
- package/lib/workspace/multi/global-config.js +150 -0
- package/lib/workspace/multi/index.js +22 -0
- package/lib/workspace/multi/path-utils.js +173 -0
- package/lib/workspace/multi/workspace-context-resolver.js +244 -0
- package/lib/workspace/multi/workspace-registry.js +196 -0
- package/lib/workspace/multi/workspace-state-manager.js +537 -0
- package/lib/workspace/multi/workspace.js +90 -0
- package/lib/workspace/workspace-manager.js +370 -0
- package/lib/workspace/workspace-sync.js +356 -0
- package/locales/en.json +114 -0
- package/locales/zh.json +114 -0
- package/package.json +102 -0
- package/template/.kiro/README.md +247 -0
- package/template/.kiro/hooks/check-spec-on-create.kiro.hook +17 -0
- package/template/.kiro/hooks/run-tests-on-save.kiro.hook +13 -0
- package/template/.kiro/hooks/sync-tasks-on-edit.kiro.hook +16 -0
- package/template/.kiro/specs/SPEC_WORKFLOW_GUIDE.md +134 -0
- package/template/.kiro/steering/CORE_PRINCIPLES.md +133 -0
- package/template/.kiro/steering/CURRENT_CONTEXT.md +30 -0
- package/template/.kiro/steering/ENVIRONMENT.md +35 -0
- package/template/.kiro/steering/RULES_GUIDE.md +46 -0
- package/template/.kiro/templates/operations/default/change-impact.md +112 -0
- package/template/.kiro/templates/operations/default/deployment.md +91 -0
- package/template/.kiro/templates/operations/default/feedback-response.md +269 -0
- package/template/.kiro/templates/operations/default/migration-plan.md +172 -0
- package/template/.kiro/templates/operations/default/monitoring.md +135 -0
- package/template/.kiro/templates/operations/default/operations.md +135 -0
- package/template/.kiro/templates/operations/default/rollback.md +143 -0
- package/template/.kiro/templates/operations/default/tools.yaml +364 -0
- package/template/.kiro/templates/operations/default/troubleshooting.md +123 -0
- package/template/.kiro/tools/backup_manager.py +295 -0
- package/template/.kiro/tools/configuration_manager.py +218 -0
- package/template/.kiro/tools/document_evaluator.py +550 -0
- package/template/.kiro/tools/enhancement_logger.py +168 -0
- package/template/.kiro/tools/error_handler.py +335 -0
- package/template/.kiro/tools/improvement_identifier.py +444 -0
- package/template/.kiro/tools/modification_applicator.py +737 -0
- package/template/.kiro/tools/quality_gate_enforcer.py +207 -0
- package/template/.kiro/tools/quality_scorer.py +305 -0
- package/template/.kiro/tools/report_generator.py +154 -0
- package/template/.kiro/tools/ultrawork_enhancer.py +676 -0
- package/template/.kiro/tools/ultrawork_enhancer_refactored.py +0 -0
- package/template/.kiro/tools/ultrawork_enhancer_v2.py +463 -0
- package/template/.kiro/tools/ultrawork_enhancer_v3.py +606 -0
- package/template/.kiro/tools/workflow_quality_gate.py +100 -0
- package/template/README.md +111 -0
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Templates Command
|
|
3
|
+
*
|
|
4
|
+
* Manages Spec templates from official and custom sources
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const chalk = require('chalk');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const fs = require('fs-extra');
|
|
10
|
+
const TemplateManager = require('../templates/template-manager');
|
|
11
|
+
const { TemplateError } = require('../templates/template-error');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Format template list for display
|
|
15
|
+
*
|
|
16
|
+
* @param {Array} templates - Template entries
|
|
17
|
+
* @param {Object} options - Display options
|
|
18
|
+
* @returns {void}
|
|
19
|
+
*/
|
|
20
|
+
function displayTemplateList(templates, options = {}) {
|
|
21
|
+
const { source = null, category = null } = options;
|
|
22
|
+
|
|
23
|
+
if (templates.length === 0) {
|
|
24
|
+
console.log(chalk.yellow('No templates found'));
|
|
25
|
+
|
|
26
|
+
if (source || category) {
|
|
27
|
+
console.log(chalk.gray('Try removing filters or updating templates'));
|
|
28
|
+
} else {
|
|
29
|
+
console.log(chalk.gray('Run'), chalk.cyan('kse templates update'), chalk.gray('to download templates'));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Group by category
|
|
36
|
+
const byCategory = {};
|
|
37
|
+
templates.forEach(template => {
|
|
38
|
+
const cat = template.category || 'uncategorized';
|
|
39
|
+
if (!byCategory[cat]) {
|
|
40
|
+
byCategory[cat] = [];
|
|
41
|
+
}
|
|
42
|
+
byCategory[cat].push(template);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Display each category
|
|
46
|
+
Object.keys(byCategory).sort().forEach(cat => {
|
|
47
|
+
console.log();
|
|
48
|
+
console.log(chalk.blue.bold(`${cat}`));
|
|
49
|
+
console.log();
|
|
50
|
+
|
|
51
|
+
byCategory[cat].forEach(template => {
|
|
52
|
+
const difficultyColor = {
|
|
53
|
+
'beginner': chalk.green,
|
|
54
|
+
'intermediate': chalk.yellow,
|
|
55
|
+
'advanced': chalk.red
|
|
56
|
+
}[template.difficulty] || chalk.gray;
|
|
57
|
+
|
|
58
|
+
const sourcePrefix = template.source && template.source !== 'official'
|
|
59
|
+
? chalk.gray(`[${template.source}] `)
|
|
60
|
+
: '';
|
|
61
|
+
|
|
62
|
+
console.log(` ${sourcePrefix}${chalk.cyan(template.id)}`);
|
|
63
|
+
console.log(` ${template.name}`);
|
|
64
|
+
console.log(` ${chalk.gray(template.description)}`);
|
|
65
|
+
console.log(` ${difficultyColor(template.difficulty)} • ${chalk.gray(template.tags.join(', '))}`);
|
|
66
|
+
console.log();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
console.log(chalk.gray(`Total: ${templates.length} template(s)`));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Format template details for display
|
|
75
|
+
*
|
|
76
|
+
* @param {Object} template - Template entry
|
|
77
|
+
* @returns {void}
|
|
78
|
+
*/
|
|
79
|
+
function displayTemplateDetails(template) {
|
|
80
|
+
console.log();
|
|
81
|
+
console.log(chalk.blue.bold(template.name));
|
|
82
|
+
console.log();
|
|
83
|
+
|
|
84
|
+
console.log(chalk.gray('ID:'), chalk.cyan(template.id));
|
|
85
|
+
console.log(chalk.gray('Category:'), template.category);
|
|
86
|
+
|
|
87
|
+
const difficultyColor = {
|
|
88
|
+
'beginner': chalk.green,
|
|
89
|
+
'intermediate': chalk.yellow,
|
|
90
|
+
'advanced': chalk.red
|
|
91
|
+
}[template.difficulty] || chalk.gray;
|
|
92
|
+
|
|
93
|
+
console.log(chalk.gray('Difficulty:'), difficultyColor(template.difficulty));
|
|
94
|
+
|
|
95
|
+
if (template.source) {
|
|
96
|
+
console.log(chalk.gray('Source:'), template.source);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.log();
|
|
100
|
+
console.log(chalk.gray('Description:'));
|
|
101
|
+
console.log(` ${template.description}`);
|
|
102
|
+
console.log();
|
|
103
|
+
|
|
104
|
+
if (template.tags && template.tags.length > 0) {
|
|
105
|
+
console.log(chalk.gray('Tags:'), template.tags.join(', '));
|
|
106
|
+
console.log();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (template.applicable_scenarios && template.applicable_scenarios.length > 0) {
|
|
110
|
+
console.log(chalk.gray('Applicable Scenarios:'));
|
|
111
|
+
template.applicable_scenarios.forEach(scenario => {
|
|
112
|
+
console.log(` • ${scenario}`);
|
|
113
|
+
});
|
|
114
|
+
console.log();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (template.files && template.files.length > 0) {
|
|
118
|
+
console.log(chalk.gray('Files:'));
|
|
119
|
+
template.files.forEach(file => {
|
|
120
|
+
console.log(` • ${file}`);
|
|
121
|
+
});
|
|
122
|
+
console.log();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (template.author) {
|
|
126
|
+
console.log(chalk.gray('Author:'), template.author);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (template.created_at) {
|
|
130
|
+
console.log(chalk.gray('Created:'), template.created_at);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (template.updated_at) {
|
|
134
|
+
console.log(chalk.gray('Updated:'), template.updated_at);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
console.log();
|
|
138
|
+
console.log(chalk.blue('Usage:'));
|
|
139
|
+
console.log(` ${chalk.cyan(`kse spec create my-feature --template ${template.id}`)}`);
|
|
140
|
+
console.log();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* List templates command
|
|
145
|
+
*
|
|
146
|
+
* @param {Object} options - Command options
|
|
147
|
+
* @returns {Promise<void>}
|
|
148
|
+
*/
|
|
149
|
+
async function listTemplates(options = {}) {
|
|
150
|
+
const { category = null, source = null } = options;
|
|
151
|
+
|
|
152
|
+
console.log(chalk.red('🔥') + ' Spec Templates');
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
const manager = new TemplateManager();
|
|
156
|
+
const templates = await manager.listTemplates({ category, source });
|
|
157
|
+
|
|
158
|
+
displayTemplateList(templates, { category, source });
|
|
159
|
+
|
|
160
|
+
} catch (error) {
|
|
161
|
+
console.log();
|
|
162
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
163
|
+
|
|
164
|
+
if (error instanceof TemplateError) {
|
|
165
|
+
if (error.suggestions && error.suggestions.length > 0) {
|
|
166
|
+
console.log();
|
|
167
|
+
console.log(chalk.yellow('💡 Suggestions:'));
|
|
168
|
+
error.suggestions.forEach(suggestion => {
|
|
169
|
+
console.log(` • ${suggestion}`);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Search templates command
|
|
180
|
+
*
|
|
181
|
+
* @param {string} keyword - Search keyword
|
|
182
|
+
* @param {Object} options - Command options
|
|
183
|
+
* @returns {Promise<void>}
|
|
184
|
+
*/
|
|
185
|
+
async function searchTemplates(keyword, options = {}) {
|
|
186
|
+
const { category = null } = options;
|
|
187
|
+
|
|
188
|
+
console.log(chalk.red('🔥') + ` Searching templates for: ${chalk.cyan(keyword)}`);
|
|
189
|
+
|
|
190
|
+
try {
|
|
191
|
+
const manager = new TemplateManager();
|
|
192
|
+
const templates = await manager.searchTemplates(keyword, { category });
|
|
193
|
+
|
|
194
|
+
displayTemplateList(templates, { category });
|
|
195
|
+
|
|
196
|
+
} catch (error) {
|
|
197
|
+
console.log();
|
|
198
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
199
|
+
|
|
200
|
+
if (error instanceof TemplateError && error.suggestions) {
|
|
201
|
+
console.log();
|
|
202
|
+
console.log(chalk.yellow('💡 Suggestions:'));
|
|
203
|
+
error.suggestions.forEach(suggestion => {
|
|
204
|
+
console.log(` • ${suggestion}`);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Show template details command
|
|
214
|
+
*
|
|
215
|
+
* @param {string} templatePath - Template path (e.g., "web-features/rest-api")
|
|
216
|
+
* @returns {Promise<void>}
|
|
217
|
+
*/
|
|
218
|
+
async function showTemplate(templatePath) {
|
|
219
|
+
console.log(chalk.red('🔥') + ' Template Details');
|
|
220
|
+
|
|
221
|
+
try {
|
|
222
|
+
const manager = new TemplateManager();
|
|
223
|
+
const template = await manager.showTemplate(templatePath);
|
|
224
|
+
|
|
225
|
+
displayTemplateDetails(template);
|
|
226
|
+
|
|
227
|
+
} catch (error) {
|
|
228
|
+
console.log();
|
|
229
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
230
|
+
|
|
231
|
+
if (error instanceof TemplateError && error.suggestions) {
|
|
232
|
+
console.log();
|
|
233
|
+
console.log(chalk.yellow('💡 Suggestions:'));
|
|
234
|
+
error.suggestions.forEach(suggestion => {
|
|
235
|
+
console.log(` • ${suggestion}`);
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Update templates command
|
|
245
|
+
*
|
|
246
|
+
* @param {Object} options - Command options
|
|
247
|
+
* @returns {Promise<void>}
|
|
248
|
+
*/
|
|
249
|
+
async function updateTemplates(options = {}) {
|
|
250
|
+
const { source = null, version = null } = options;
|
|
251
|
+
|
|
252
|
+
const targetDesc = source
|
|
253
|
+
? `source "${source}"`
|
|
254
|
+
: 'all sources';
|
|
255
|
+
|
|
256
|
+
console.log(chalk.red('🔥') + ` Updating templates from ${targetDesc}...`);
|
|
257
|
+
console.log();
|
|
258
|
+
|
|
259
|
+
try {
|
|
260
|
+
const manager = new TemplateManager();
|
|
261
|
+
const result = await manager.updateTemplates(source, version);
|
|
262
|
+
|
|
263
|
+
console.log(chalk.green('✅ Update complete!'));
|
|
264
|
+
console.log();
|
|
265
|
+
|
|
266
|
+
if (result.changes) {
|
|
267
|
+
const { added, modified, deleted } = result.changes;
|
|
268
|
+
|
|
269
|
+
if (added > 0) {
|
|
270
|
+
console.log(chalk.green(` Added: ${added} template(s)`));
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (modified > 0) {
|
|
274
|
+
console.log(chalk.yellow(` Modified: ${modified} template(s)`));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (deleted > 0) {
|
|
278
|
+
console.log(chalk.red(` Deleted: ${deleted} template(s)`));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (added === 0 && modified === 0 && deleted === 0) {
|
|
282
|
+
console.log(chalk.gray(' No changes detected'));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
console.log();
|
|
287
|
+
console.log(chalk.blue('💡 Next steps:'));
|
|
288
|
+
console.log(` ${chalk.cyan('kse templates list')} - View all templates`);
|
|
289
|
+
console.log(` ${chalk.cyan('kse templates search <keyword>')} - Search templates`);
|
|
290
|
+
|
|
291
|
+
} catch (error) {
|
|
292
|
+
console.log();
|
|
293
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
294
|
+
|
|
295
|
+
if (error instanceof TemplateError && error.suggestions) {
|
|
296
|
+
console.log();
|
|
297
|
+
console.log(chalk.yellow('💡 Suggestions:'));
|
|
298
|
+
error.suggestions.forEach(suggestion => {
|
|
299
|
+
console.log(` • ${suggestion}`);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Add template source command
|
|
309
|
+
*
|
|
310
|
+
* @param {string} name - Source name
|
|
311
|
+
* @param {string} gitUrl - Git repository URL
|
|
312
|
+
* @returns {Promise<void>}
|
|
313
|
+
*/
|
|
314
|
+
async function addSource(name, gitUrl) {
|
|
315
|
+
console.log(chalk.red('🔥') + ` Adding template source: ${chalk.cyan(name)}`);
|
|
316
|
+
console.log();
|
|
317
|
+
|
|
318
|
+
try {
|
|
319
|
+
const manager = new TemplateManager();
|
|
320
|
+
await manager.addSource(name, gitUrl);
|
|
321
|
+
|
|
322
|
+
console.log(chalk.green('✅ Source added successfully!'));
|
|
323
|
+
console.log();
|
|
324
|
+
console.log(chalk.blue('💡 Next steps:'));
|
|
325
|
+
console.log(` ${chalk.cyan('kse templates update --source ' + name)} - Download templates from this source`);
|
|
326
|
+
console.log(` ${chalk.cyan('kse templates list --source ' + name)} - View templates from this source`);
|
|
327
|
+
|
|
328
|
+
} catch (error) {
|
|
329
|
+
console.log();
|
|
330
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
331
|
+
|
|
332
|
+
if (error instanceof TemplateError && error.suggestions) {
|
|
333
|
+
console.log();
|
|
334
|
+
console.log(chalk.yellow('💡 Suggestions:'));
|
|
335
|
+
error.suggestions.forEach(suggestion => {
|
|
336
|
+
console.log(` • ${suggestion}`);
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
process.exit(1);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Remove template source command
|
|
346
|
+
*
|
|
347
|
+
* @param {string} name - Source name
|
|
348
|
+
* @returns {Promise<void>}
|
|
349
|
+
*/
|
|
350
|
+
async function removeSource(name) {
|
|
351
|
+
console.log(chalk.red('🔥') + ` Removing template source: ${chalk.cyan(name)}`);
|
|
352
|
+
console.log();
|
|
353
|
+
|
|
354
|
+
try {
|
|
355
|
+
const manager = new TemplateManager();
|
|
356
|
+
await manager.removeSource(name);
|
|
357
|
+
|
|
358
|
+
console.log(chalk.green('✅ Source removed successfully!'));
|
|
359
|
+
console.log();
|
|
360
|
+
console.log(chalk.gray('Note: Cached templates from this source are still available'));
|
|
361
|
+
console.log(chalk.gray('Run'), chalk.cyan('kse templates cache --clear --source ' + name), chalk.gray('to remove them'));
|
|
362
|
+
|
|
363
|
+
} catch (error) {
|
|
364
|
+
console.log();
|
|
365
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
366
|
+
|
|
367
|
+
if (error instanceof TemplateError && error.suggestions) {
|
|
368
|
+
console.log();
|
|
369
|
+
console.log(chalk.yellow('💡 Suggestions:'));
|
|
370
|
+
error.suggestions.forEach(suggestion => {
|
|
371
|
+
console.log(` • ${suggestion}`);
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
process.exit(1);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* List template sources command
|
|
381
|
+
*
|
|
382
|
+
* @returns {Promise<void>}
|
|
383
|
+
*/
|
|
384
|
+
async function listSources() {
|
|
385
|
+
console.log(chalk.red('🔥') + ' Template Sources');
|
|
386
|
+
console.log();
|
|
387
|
+
|
|
388
|
+
try {
|
|
389
|
+
const manager = new TemplateManager();
|
|
390
|
+
const sources = await manager.listSources();
|
|
391
|
+
|
|
392
|
+
if (sources.length === 0) {
|
|
393
|
+
console.log(chalk.yellow('No template sources configured'));
|
|
394
|
+
console.log();
|
|
395
|
+
console.log(chalk.gray('Add a source:'), chalk.cyan('kse templates add-source <name> <git-url>'));
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
sources.forEach(source => {
|
|
400
|
+
const typeLabel = source.type === 'official'
|
|
401
|
+
? chalk.blue('[Official]')
|
|
402
|
+
: chalk.gray('[Custom]');
|
|
403
|
+
|
|
404
|
+
const statusLabel = source.enabled
|
|
405
|
+
? chalk.green('✓ Enabled')
|
|
406
|
+
: chalk.gray('✗ Disabled');
|
|
407
|
+
|
|
408
|
+
console.log(`${typeLabel} ${chalk.cyan(source.name)}`);
|
|
409
|
+
console.log(` URL: ${source.url}`);
|
|
410
|
+
console.log(` Status: ${statusLabel}`);
|
|
411
|
+
|
|
412
|
+
if (source.last_updated) {
|
|
413
|
+
console.log(` Last Updated: ${new Date(source.last_updated).toLocaleString()}`);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (source.version) {
|
|
417
|
+
console.log(` Version: ${source.version}`);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
console.log();
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
console.log(chalk.blue('💡 Commands:'));
|
|
424
|
+
console.log(` ${chalk.cyan('kse templates update')} - Update all sources`);
|
|
425
|
+
console.log(` ${chalk.cyan('kse templates add-source <name> <url>')} - Add custom source`);
|
|
426
|
+
console.log(` ${chalk.cyan('kse templates remove-source <name>')} - Remove source`);
|
|
427
|
+
|
|
428
|
+
} catch (error) {
|
|
429
|
+
console.log();
|
|
430
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
431
|
+
|
|
432
|
+
if (error instanceof TemplateError && error.suggestions) {
|
|
433
|
+
console.log();
|
|
434
|
+
console.log(chalk.yellow('💡 Suggestions:'));
|
|
435
|
+
error.suggestions.forEach(suggestion => {
|
|
436
|
+
console.log(` • ${suggestion}`);
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
process.exit(1);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Cache management command
|
|
446
|
+
*
|
|
447
|
+
* @param {Object} options - Command options
|
|
448
|
+
* @returns {Promise<void>}
|
|
449
|
+
*/
|
|
450
|
+
async function cacheCommand(options = {}) {
|
|
451
|
+
const { clear = false, source = null } = options;
|
|
452
|
+
|
|
453
|
+
console.log(chalk.red('🔥') + ' Template Cache');
|
|
454
|
+
console.log();
|
|
455
|
+
|
|
456
|
+
try {
|
|
457
|
+
const manager = new TemplateManager();
|
|
458
|
+
|
|
459
|
+
if (clear) {
|
|
460
|
+
// Clear cache
|
|
461
|
+
const targetDesc = source
|
|
462
|
+
? `source "${source}"`
|
|
463
|
+
: 'all sources';
|
|
464
|
+
|
|
465
|
+
console.log(chalk.yellow(`Clearing cache for ${targetDesc}...`));
|
|
466
|
+
console.log();
|
|
467
|
+
|
|
468
|
+
await manager.clearCache(source);
|
|
469
|
+
|
|
470
|
+
console.log(chalk.green('✅ Cache cleared successfully!'));
|
|
471
|
+
console.log();
|
|
472
|
+
console.log(chalk.gray('Run'), chalk.cyan('kse templates update'), chalk.gray('to re-download templates'));
|
|
473
|
+
|
|
474
|
+
} else {
|
|
475
|
+
// Show cache status
|
|
476
|
+
const status = await manager.getCacheStatus();
|
|
477
|
+
|
|
478
|
+
if (!status || Object.keys(status.sources || {}).length === 0) {
|
|
479
|
+
console.log(chalk.yellow('Cache is empty'));
|
|
480
|
+
console.log();
|
|
481
|
+
console.log(chalk.gray('Run'), chalk.cyan('kse templates update'), chalk.gray('to download templates'));
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
console.log(chalk.blue('Cache Status:'));
|
|
486
|
+
console.log();
|
|
487
|
+
|
|
488
|
+
Object.entries(status.sources).forEach(([sourceName, sourceInfo]) => {
|
|
489
|
+
console.log(chalk.cyan(sourceName));
|
|
490
|
+
console.log(` Templates: ${sourceInfo.template_count}`);
|
|
491
|
+
console.log(` Size: ${formatBytes(sourceInfo.size_bytes)}`);
|
|
492
|
+
console.log(` Last Updated: ${new Date(sourceInfo.last_updated).toLocaleString()}`);
|
|
493
|
+
|
|
494
|
+
if (sourceInfo.version) {
|
|
495
|
+
console.log(` Version: ${sourceInfo.version}`);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
console.log();
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
if (status.last_check) {
|
|
502
|
+
console.log(chalk.gray(`Last Check: ${new Date(status.last_check).toLocaleString()}`));
|
|
503
|
+
console.log();
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
console.log(chalk.blue('💡 Commands:'));
|
|
507
|
+
console.log(` ${chalk.cyan('kse templates cache --clear')} - Clear all cache`);
|
|
508
|
+
console.log(` ${chalk.cyan('kse templates cache --clear --source <name>')} - Clear specific source`);
|
|
509
|
+
console.log(` ${chalk.cyan('kse templates update')} - Update cached templates`);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
} catch (error) {
|
|
513
|
+
console.log();
|
|
514
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
515
|
+
|
|
516
|
+
if (error instanceof TemplateError && error.suggestions) {
|
|
517
|
+
console.log();
|
|
518
|
+
console.log(chalk.yellow('💡 Suggestions:'));
|
|
519
|
+
error.suggestions.forEach(suggestion => {
|
|
520
|
+
console.log(` • ${suggestion}`);
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
process.exit(1);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Format bytes to human-readable string
|
|
530
|
+
*
|
|
531
|
+
* @param {number} bytes - Bytes
|
|
532
|
+
* @returns {string} Formatted string
|
|
533
|
+
*/
|
|
534
|
+
function formatBytes(bytes) {
|
|
535
|
+
if (bytes === 0) return '0 B';
|
|
536
|
+
|
|
537
|
+
const k = 1024;
|
|
538
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
539
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
540
|
+
|
|
541
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Display template guide
|
|
546
|
+
*
|
|
547
|
+
* @returns {Promise<void>}
|
|
548
|
+
*/
|
|
549
|
+
async function displayGuide() {
|
|
550
|
+
console.log(chalk.red('🔥') + ' Spec Template Guide');
|
|
551
|
+
console.log();
|
|
552
|
+
|
|
553
|
+
console.log(chalk.blue.bold('What are Spec Templates?'));
|
|
554
|
+
console.log();
|
|
555
|
+
console.log('Spec templates are pre-built frameworks for common feature types.');
|
|
556
|
+
console.log('They provide structured requirements, design patterns, and task lists');
|
|
557
|
+
console.log('to help you get started quickly with best practices.');
|
|
558
|
+
console.log();
|
|
559
|
+
|
|
560
|
+
console.log(chalk.blue.bold('Quick Start:'));
|
|
561
|
+
console.log();
|
|
562
|
+
console.log(`1. ${chalk.cyan('kse templates list')} - Browse available templates`);
|
|
563
|
+
console.log(`2. ${chalk.cyan('kse templates show <template-id>')} - View template details`);
|
|
564
|
+
console.log(`3. ${chalk.cyan('kse spec create my-feature --template <template-id>')} - Create spec from template`);
|
|
565
|
+
console.log();
|
|
566
|
+
|
|
567
|
+
console.log(chalk.blue.bold('Common Commands:'));
|
|
568
|
+
console.log();
|
|
569
|
+
console.log(` ${chalk.cyan('kse templates list')} - List all templates`);
|
|
570
|
+
console.log(` ${chalk.cyan('kse templates search <keyword>')} - Search templates`);
|
|
571
|
+
console.log(` ${chalk.cyan('kse templates update')} - Update template library`);
|
|
572
|
+
console.log(` ${chalk.cyan('kse templates sources')} - Manage template sources`);
|
|
573
|
+
console.log(` ${chalk.cyan('kse templates cache')} - View cache status`);
|
|
574
|
+
console.log();
|
|
575
|
+
|
|
576
|
+
console.log(chalk.blue.bold('Custom Sources:'));
|
|
577
|
+
console.log();
|
|
578
|
+
console.log('You can add your own template repositories:');
|
|
579
|
+
console.log(` ${chalk.cyan('kse templates add-source my-templates https://github.com/user/templates.git')}`);
|
|
580
|
+
console.log();
|
|
581
|
+
|
|
582
|
+
console.log(chalk.blue.bold('Documentation:'));
|
|
583
|
+
console.log();
|
|
584
|
+
console.log('For more information, see:');
|
|
585
|
+
console.log(` ${chalk.gray('docs/spec-workflow.md')}`);
|
|
586
|
+
console.log(` ${chalk.gray('https://github.com/heguangyong/scene-capability-engine')}`);
|
|
587
|
+
console.log();
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Create template from existing Spec command
|
|
592
|
+
*
|
|
593
|
+
* @param {Object} options - Command options
|
|
594
|
+
* @returns {Promise<void>}
|
|
595
|
+
*/
|
|
596
|
+
async function createFromSpec(options = {}) {
|
|
597
|
+
const {
|
|
598
|
+
spec,
|
|
599
|
+
output = null,
|
|
600
|
+
preview = false,
|
|
601
|
+
dryRun = false,
|
|
602
|
+
interactive = true
|
|
603
|
+
} = options;
|
|
604
|
+
|
|
605
|
+
if (!spec) {
|
|
606
|
+
console.log(chalk.red('❌ Error: Spec identifier is required'));
|
|
607
|
+
console.log();
|
|
608
|
+
console.log(chalk.gray('Usage:'), chalk.cyan('kse templates create-from-spec --spec <identifier>'));
|
|
609
|
+
console.log();
|
|
610
|
+
console.log(chalk.gray('Example:'), chalk.cyan('kse templates create-from-spec --spec 22-00'));
|
|
611
|
+
process.exit(1);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
try {
|
|
615
|
+
const TemplateCreator = require('../templates/template-creator');
|
|
616
|
+
const creator = new TemplateCreator({ interactive });
|
|
617
|
+
|
|
618
|
+
const result = await creator.createTemplate({
|
|
619
|
+
spec,
|
|
620
|
+
output,
|
|
621
|
+
preview,
|
|
622
|
+
dryRun,
|
|
623
|
+
interactive
|
|
624
|
+
});
|
|
625
|
+
|
|
626
|
+
if (!result.dryRun) {
|
|
627
|
+
console.log(chalk.green('✅ Template created successfully!'));
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
} catch (error) {
|
|
631
|
+
console.log();
|
|
632
|
+
console.log(chalk.red('❌ Error:'), error.message);
|
|
633
|
+
|
|
634
|
+
if (error.stack && process.env.DEBUG) {
|
|
635
|
+
console.log();
|
|
636
|
+
console.log(chalk.gray(error.stack));
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
process.exit(1);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
module.exports = {
|
|
644
|
+
listTemplates,
|
|
645
|
+
searchTemplates,
|
|
646
|
+
showTemplate,
|
|
647
|
+
updateTemplates,
|
|
648
|
+
addSource,
|
|
649
|
+
removeSource,
|
|
650
|
+
listSources,
|
|
651
|
+
cacheCommand,
|
|
652
|
+
displayGuide,
|
|
653
|
+
createFromSpec
|
|
654
|
+
};
|