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,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations Commands
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for DevOps integration foundation:
|
|
5
|
+
* - kse ops init: Initialize operations specs
|
|
6
|
+
* - kse ops validate: Validate operations specs
|
|
7
|
+
* - kse ops audit: Query audit logs
|
|
8
|
+
* - kse ops takeover: Manage takeover levels
|
|
9
|
+
* - kse ops feedback: Manage user feedback
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const chalk = require('chalk');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const OperationsManager = require('../operations/operations-manager');
|
|
15
|
+
const PermissionManager = require('../operations/permission-manager');
|
|
16
|
+
const AuditLogger = require('../operations/audit-logger');
|
|
17
|
+
const FeedbackManager = require('../operations/feedback-manager');
|
|
18
|
+
const { SecurityEnvironment } = require('../operations/models');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Initialize operations specs for a project
|
|
22
|
+
*
|
|
23
|
+
* @param {string} projectName - Project name
|
|
24
|
+
* @param {Object} options - Command options
|
|
25
|
+
* @param {string} options.template - Template name (default: 'default')
|
|
26
|
+
* @returns {Promise<void>}
|
|
27
|
+
*/
|
|
28
|
+
async function initCommand(projectName, options = {}) {
|
|
29
|
+
const { template = 'default' } = options;
|
|
30
|
+
const projectPath = process.cwd();
|
|
31
|
+
|
|
32
|
+
console.log(chalk.blue('🚀 Initializing operations specs...'));
|
|
33
|
+
console.log();
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const opsManager = new OperationsManager(projectPath);
|
|
37
|
+
|
|
38
|
+
// Create operations spec
|
|
39
|
+
await opsManager.createOperationsSpec(projectName, template);
|
|
40
|
+
|
|
41
|
+
console.log(chalk.green('✅ Operations specs created successfully!'));
|
|
42
|
+
console.log();
|
|
43
|
+
console.log(chalk.gray(`Location: .kiro/specs/${projectName}/operations/`));
|
|
44
|
+
console.log();
|
|
45
|
+
console.log(chalk.yellow('Next steps:'));
|
|
46
|
+
console.log(' 1. Fill in the operations spec documents');
|
|
47
|
+
console.log(' 2. Run: kse ops validate ' + projectName);
|
|
48
|
+
console.log(' 3. Commit the operations specs with your code');
|
|
49
|
+
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.error(chalk.red('❌ Error initializing operations specs:'));
|
|
52
|
+
console.error(chalk.red(error.message));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Validate operations specs
|
|
59
|
+
*
|
|
60
|
+
* @param {string} projectName - Project name (optional, validates all if not specified)
|
|
61
|
+
* @param {Object} options - Command options
|
|
62
|
+
* @returns {Promise<void>}
|
|
63
|
+
*/
|
|
64
|
+
async function validateCommand(projectName, options = {}) {
|
|
65
|
+
const projectPath = process.cwd();
|
|
66
|
+
|
|
67
|
+
console.log(chalk.blue('🔍 Validating operations specs...'));
|
|
68
|
+
console.log();
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const opsManager = new OperationsManager(projectPath);
|
|
72
|
+
|
|
73
|
+
if (projectName) {
|
|
74
|
+
// Validate specific project
|
|
75
|
+
const spec = await opsManager.loadOperationsSpec(projectName);
|
|
76
|
+
const result = opsManager.validateOperationsSpec(spec);
|
|
77
|
+
|
|
78
|
+
displayValidationResult(projectName, result);
|
|
79
|
+
|
|
80
|
+
if (!result.valid) {
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
// Validate all projects
|
|
85
|
+
const projects = await opsManager.listOperationsSpecs();
|
|
86
|
+
|
|
87
|
+
if (projects.length === 0) {
|
|
88
|
+
console.log(chalk.yellow('No operations specs found.'));
|
|
89
|
+
console.log(chalk.gray('Run: kse ops init <project-name> to create one'));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
let allValid = true;
|
|
94
|
+
for (const project of projects) {
|
|
95
|
+
try {
|
|
96
|
+
const spec = await opsManager.loadOperationsSpec(project);
|
|
97
|
+
const result = opsManager.validateOperationsSpec(spec);
|
|
98
|
+
displayValidationResult(project, result);
|
|
99
|
+
|
|
100
|
+
if (!result.valid) {
|
|
101
|
+
allValid = false;
|
|
102
|
+
}
|
|
103
|
+
} catch (error) {
|
|
104
|
+
console.log(chalk.red(`❌ ${project}: ${error.message}`));
|
|
105
|
+
allValid = false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (!allValid) {
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
} catch (error) {
|
|
115
|
+
console.error(chalk.red('❌ Error validating operations specs:'));
|
|
116
|
+
console.error(chalk.red(error.message));
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Display validation result
|
|
123
|
+
*
|
|
124
|
+
* @param {string} projectName - Project name
|
|
125
|
+
* @param {Object} result - Validation result
|
|
126
|
+
*/
|
|
127
|
+
function displayValidationResult(projectName, result) {
|
|
128
|
+
if (result.valid) {
|
|
129
|
+
console.log(chalk.green(`✅ ${projectName}: Valid`));
|
|
130
|
+
} else {
|
|
131
|
+
console.log(chalk.red(`❌ ${projectName}: Invalid`));
|
|
132
|
+
|
|
133
|
+
if (result.errors && result.errors.length > 0) {
|
|
134
|
+
console.log(chalk.red(' Errors:'));
|
|
135
|
+
result.errors.forEach(error => {
|
|
136
|
+
console.log(chalk.red(` - ${error}`));
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (result.warnings && result.warnings.length > 0) {
|
|
141
|
+
console.log(chalk.yellow(' Warnings:'));
|
|
142
|
+
result.warnings.forEach(warning => {
|
|
143
|
+
console.log(chalk.yellow(` - ${warning}`));
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
console.log();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Query audit logs
|
|
152
|
+
*
|
|
153
|
+
* @param {Object} options - Command options
|
|
154
|
+
* @param {string} options.project - Filter by project
|
|
155
|
+
* @param {string} options.from - Start date
|
|
156
|
+
* @param {string} options.to - End date
|
|
157
|
+
* @param {string} options.type - Filter by operation type
|
|
158
|
+
* @param {string} options.format - Output format (json/csv)
|
|
159
|
+
* @returns {Promise<void>}
|
|
160
|
+
*/
|
|
161
|
+
async function auditCommand(options = {}) {
|
|
162
|
+
const { project, from, to, type, format = 'json' } = options;
|
|
163
|
+
const projectPath = process.cwd();
|
|
164
|
+
|
|
165
|
+
console.log(chalk.blue('📋 Querying audit logs...'));
|
|
166
|
+
console.log();
|
|
167
|
+
|
|
168
|
+
try {
|
|
169
|
+
const auditLogger = new AuditLogger(projectPath);
|
|
170
|
+
|
|
171
|
+
// Build query
|
|
172
|
+
const query = {};
|
|
173
|
+
if (project) query.projectName = project;
|
|
174
|
+
if (from) query.fromDate = new Date(from);
|
|
175
|
+
if (to) query.toDate = new Date(to);
|
|
176
|
+
if (type) query.operationType = type;
|
|
177
|
+
|
|
178
|
+
// Query logs
|
|
179
|
+
const logs = await auditLogger.queryLogs(query);
|
|
180
|
+
|
|
181
|
+
if (logs.length === 0) {
|
|
182
|
+
console.log(chalk.yellow('No audit logs found matching the criteria.'));
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
console.log(chalk.green(`Found ${logs.length} audit log entries`));
|
|
187
|
+
console.log();
|
|
188
|
+
|
|
189
|
+
if (format === 'json') {
|
|
190
|
+
console.log(JSON.stringify(logs, null, 2));
|
|
191
|
+
} else if (format === 'csv') {
|
|
192
|
+
const csv = await auditLogger.exportLogs(query, 'csv');
|
|
193
|
+
console.log(csv);
|
|
194
|
+
} else {
|
|
195
|
+
// Display summary
|
|
196
|
+
logs.forEach(log => {
|
|
197
|
+
console.log(chalk.cyan(`[${log.timestamp}] ${log.operationType}`));
|
|
198
|
+
console.log(chalk.gray(` Project: ${log.project}`));
|
|
199
|
+
console.log(chalk.gray(` Outcome: ${log.outcome}`));
|
|
200
|
+
console.log(chalk.gray(` Level: ${log.takeoverLevel}`));
|
|
201
|
+
console.log();
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
} catch (error) {
|
|
206
|
+
console.error(chalk.red('❌ Error querying audit logs:'));
|
|
207
|
+
console.error(chalk.red(error.message));
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Manage takeover levels
|
|
214
|
+
*
|
|
215
|
+
* @param {string} action - Action (get/set)
|
|
216
|
+
* @param {string} projectName - Project name
|
|
217
|
+
* @param {Object} options - Command options
|
|
218
|
+
* @param {string} options.level - Takeover level (for set action)
|
|
219
|
+
* @param {string} options.environment - Security environment
|
|
220
|
+
* @param {string} options.reason - Reason for change (for set action)
|
|
221
|
+
* @param {string} options.user - User making the change (for set action)
|
|
222
|
+
* @returns {Promise<void>}
|
|
223
|
+
*/
|
|
224
|
+
async function takeoverCommand(action, projectName, options = {}) {
|
|
225
|
+
const { level, environment = SecurityEnvironment.DEVELOPMENT, reason, user = 'cli-user' } = options;
|
|
226
|
+
const projectPath = process.cwd();
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
const permissionManager = new PermissionManager(projectPath);
|
|
230
|
+
|
|
231
|
+
if (action === 'get') {
|
|
232
|
+
// Get current takeover level
|
|
233
|
+
const currentLevel = await permissionManager.getTakeoverLevel(projectName, environment);
|
|
234
|
+
|
|
235
|
+
console.log(chalk.blue(`Takeover level for ${projectName} (${environment}):`));
|
|
236
|
+
console.log(chalk.green(` ${currentLevel}`));
|
|
237
|
+
|
|
238
|
+
} else if (action === 'set') {
|
|
239
|
+
// Set takeover level
|
|
240
|
+
if (!level) {
|
|
241
|
+
console.error(chalk.red('❌ Error: --level is required for set action'));
|
|
242
|
+
console.log(chalk.gray('Usage: kse ops takeover set <project> --level <L1-L5> --reason <reason>'));
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (!reason) {
|
|
247
|
+
console.error(chalk.red('❌ Error: --reason is required for set action'));
|
|
248
|
+
console.log(chalk.gray('Usage: kse ops takeover set <project> --level <L1-L5> --reason <reason>'));
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
await permissionManager.setTakeoverLevel(projectName, environment, level, reason, user);
|
|
253
|
+
|
|
254
|
+
console.log(chalk.green('✅ Takeover level updated successfully!'));
|
|
255
|
+
console.log(chalk.gray(` Project: ${projectName}`));
|
|
256
|
+
console.log(chalk.gray(` Environment: ${environment}`));
|
|
257
|
+
console.log(chalk.gray(` New Level: ${level}`));
|
|
258
|
+
console.log(chalk.gray(` Reason: ${reason}`));
|
|
259
|
+
|
|
260
|
+
} else {
|
|
261
|
+
console.error(chalk.red(`❌ Unknown action: ${action}`));
|
|
262
|
+
console.log(chalk.gray('Valid actions: get, set'));
|
|
263
|
+
process.exit(1);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
} catch (error) {
|
|
267
|
+
console.error(chalk.red('❌ Error managing takeover level:'));
|
|
268
|
+
console.error(chalk.red(error.message));
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Manage user feedback
|
|
275
|
+
*
|
|
276
|
+
* @param {string} action - Action (list/respond)
|
|
277
|
+
* @param {Object} options - Command options
|
|
278
|
+
* @param {string} options.project - Filter by project
|
|
279
|
+
* @param {string} options.status - Filter by status
|
|
280
|
+
* @param {string} options.severity - Filter by severity
|
|
281
|
+
* @param {string} options.feedbackId - Feedback ID (for respond action)
|
|
282
|
+
* @param {string} options.message - Response message (for respond action)
|
|
283
|
+
* @returns {Promise<void>}
|
|
284
|
+
*/
|
|
285
|
+
async function feedbackCommand(action, options = {}) {
|
|
286
|
+
const { project, status, severity, feedbackId, message } = options;
|
|
287
|
+
const projectPath = process.cwd();
|
|
288
|
+
|
|
289
|
+
try {
|
|
290
|
+
const feedbackManager = new FeedbackManager(projectPath);
|
|
291
|
+
|
|
292
|
+
if (action === 'list') {
|
|
293
|
+
// List feedbacks
|
|
294
|
+
const filters = {};
|
|
295
|
+
if (project) filters.project = project;
|
|
296
|
+
if (status) filters.status = status;
|
|
297
|
+
if (severity) filters.severity = severity;
|
|
298
|
+
|
|
299
|
+
const feedbacks = await feedbackManager.listFeedbacks(filters);
|
|
300
|
+
|
|
301
|
+
if (feedbacks.length === 0) {
|
|
302
|
+
console.log(chalk.yellow('No feedback found matching the criteria.'));
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
console.log(chalk.green(`Found ${feedbacks.length} feedback items`));
|
|
307
|
+
console.log();
|
|
308
|
+
|
|
309
|
+
feedbacks.forEach(fb => {
|
|
310
|
+
console.log(chalk.cyan(`[${fb.id}] ${fb.content.title}`));
|
|
311
|
+
console.log(chalk.gray(` Project: ${fb.project} (${fb.version})`));
|
|
312
|
+
console.log(chalk.gray(` Type: ${fb.type} | Severity: ${fb.severity}`));
|
|
313
|
+
console.log(chalk.gray(` Status: ${fb.status}`));
|
|
314
|
+
console.log(chalk.gray(` Created: ${fb.createdAt}`));
|
|
315
|
+
console.log();
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
} else if (action === 'respond') {
|
|
319
|
+
// Respond to feedback
|
|
320
|
+
if (!feedbackId) {
|
|
321
|
+
console.error(chalk.red('❌ Error: --feedback-id is required for respond action'));
|
|
322
|
+
console.log(chalk.gray('Usage: kse ops feedback respond --feedback-id <id> --message <message>'));
|
|
323
|
+
process.exit(1);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (!message) {
|
|
327
|
+
console.error(chalk.red('❌ Error: --message is required for respond action'));
|
|
328
|
+
console.log(chalk.gray('Usage: kse ops feedback respond --feedback-id <id> --message <message>'));
|
|
329
|
+
process.exit(1);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
await feedbackManager.trackResolution(feedbackId, 'resolved', message);
|
|
333
|
+
|
|
334
|
+
console.log(chalk.green('✅ Feedback response recorded successfully!'));
|
|
335
|
+
console.log(chalk.gray(` Feedback ID: ${feedbackId}`));
|
|
336
|
+
console.log(chalk.gray(` Resolution: ${message}`));
|
|
337
|
+
|
|
338
|
+
} else {
|
|
339
|
+
console.error(chalk.red(`❌ Unknown action: ${action}`));
|
|
340
|
+
console.log(chalk.gray('Valid actions: list, respond'));
|
|
341
|
+
process.exit(1);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
} catch (error) {
|
|
345
|
+
console.error(chalk.red('❌ Error managing feedback:'));
|
|
346
|
+
console.error(chalk.red(error.message));
|
|
347
|
+
process.exit(1);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Main ops command router
|
|
353
|
+
*
|
|
354
|
+
* @param {string} subcommand - Subcommand (init/validate/audit/takeover/feedback)
|
|
355
|
+
* @param {Array} args - Command arguments
|
|
356
|
+
* @param {Object} options - Command options
|
|
357
|
+
* @returns {Promise<void>}
|
|
358
|
+
*/
|
|
359
|
+
async function opsCommand(subcommand, args = [], options = {}) {
|
|
360
|
+
switch (subcommand) {
|
|
361
|
+
case 'init':
|
|
362
|
+
if (args.length === 0) {
|
|
363
|
+
console.error(chalk.red('❌ Error: Project name is required'));
|
|
364
|
+
console.log(chalk.gray('Usage: kse ops init <project-name> [--template <template-name>]'));
|
|
365
|
+
process.exit(1);
|
|
366
|
+
}
|
|
367
|
+
await initCommand(args[0], options);
|
|
368
|
+
break;
|
|
369
|
+
|
|
370
|
+
case 'validate':
|
|
371
|
+
await validateCommand(args[0], options);
|
|
372
|
+
break;
|
|
373
|
+
|
|
374
|
+
case 'audit':
|
|
375
|
+
await auditCommand(options);
|
|
376
|
+
break;
|
|
377
|
+
|
|
378
|
+
case 'takeover':
|
|
379
|
+
if (args.length < 2) {
|
|
380
|
+
console.error(chalk.red('❌ Error: Action and project name are required'));
|
|
381
|
+
console.log(chalk.gray('Usage: kse ops takeover <get|set> <project-name> [options]'));
|
|
382
|
+
process.exit(1);
|
|
383
|
+
}
|
|
384
|
+
await takeoverCommand(args[0], args[1], options);
|
|
385
|
+
break;
|
|
386
|
+
|
|
387
|
+
case 'feedback':
|
|
388
|
+
if (args.length === 0) {
|
|
389
|
+
console.error(chalk.red('❌ Error: Action is required'));
|
|
390
|
+
console.log(chalk.gray('Usage: kse ops feedback <list|respond> [options]'));
|
|
391
|
+
process.exit(1);
|
|
392
|
+
}
|
|
393
|
+
await feedbackCommand(args[0], options);
|
|
394
|
+
break;
|
|
395
|
+
|
|
396
|
+
default:
|
|
397
|
+
console.log(chalk.red('❌ Unknown ops subcommand'));
|
|
398
|
+
console.log();
|
|
399
|
+
console.log(chalk.blue('Available commands:'));
|
|
400
|
+
console.log(' kse ops init <project-name> - Initialize operations specs');
|
|
401
|
+
console.log(' kse ops validate [project] - Validate operations specs');
|
|
402
|
+
console.log(' kse ops audit [options] - Query audit logs');
|
|
403
|
+
console.log(' kse ops takeover <action> <project> - Manage takeover levels');
|
|
404
|
+
console.log(' kse ops feedback <action> - Manage user feedback');
|
|
405
|
+
process.exit(1);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
module.exports = opsCommand;
|