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,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations Module
|
|
3
|
+
*
|
|
4
|
+
* Core module for DevOps integration foundation
|
|
5
|
+
* Provides operations spec management, permission control, feedback handling, and audit logging
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
module.exports = {
|
|
9
|
+
// Core managers
|
|
10
|
+
OperationsManager: require('./operations-manager'),
|
|
11
|
+
PermissionManager: require('./permission-manager'),
|
|
12
|
+
FeedbackManager: require('./feedback-manager'),
|
|
13
|
+
AuditLogger: require('./audit-logger'),
|
|
14
|
+
|
|
15
|
+
// Template system
|
|
16
|
+
TemplateLoader: require('./template-loader'),
|
|
17
|
+
|
|
18
|
+
// Validation
|
|
19
|
+
OperationsValidator: require('./operations-validator'),
|
|
20
|
+
|
|
21
|
+
// Data models
|
|
22
|
+
models: require('./models')
|
|
23
|
+
};
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data Models for Operations Module
|
|
3
|
+
*
|
|
4
|
+
* Defines core data structures and enums
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Takeover Level Enum
|
|
9
|
+
* Defines the degree of AI autonomy in executing operations
|
|
10
|
+
*/
|
|
11
|
+
const TakeoverLevel = {
|
|
12
|
+
L1_OBSERVATION: 'L1_OBSERVATION',
|
|
13
|
+
L2_SUGGESTION: 'L2_SUGGESTION',
|
|
14
|
+
L3_SEMI_AUTO: 'L3_SEMI_AUTO',
|
|
15
|
+
L4_AUTO: 'L4_AUTO',
|
|
16
|
+
L5_FULLY_AUTONOMOUS: 'L5_FULLY_AUTONOMOUS'
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Security Environment Enum
|
|
21
|
+
* Deployment environment classification
|
|
22
|
+
*/
|
|
23
|
+
const SecurityEnvironment = {
|
|
24
|
+
DEVELOPMENT: 'development',
|
|
25
|
+
TEST: 'test',
|
|
26
|
+
PRE_PRODUCTION: 'pre-production',
|
|
27
|
+
PRODUCTION: 'production'
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Feedback Channel Enum
|
|
32
|
+
* Methods by which user feedback enters the system
|
|
33
|
+
*/
|
|
34
|
+
const FeedbackChannel = {
|
|
35
|
+
SUPPORT_TICKET: 'support_ticket',
|
|
36
|
+
MONITORING_ALERT: 'monitoring_alert',
|
|
37
|
+
USER_REPORT: 'user_report',
|
|
38
|
+
API_ENDPOINT: 'api_endpoint',
|
|
39
|
+
CUSTOMER_SURVEY: 'customer_survey'
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Feedback Type Enum
|
|
44
|
+
* Classification of feedback content
|
|
45
|
+
*/
|
|
46
|
+
const FeedbackType = {
|
|
47
|
+
BUG_REPORT: 'bug_report',
|
|
48
|
+
PERFORMANCE_ISSUE: 'performance_issue',
|
|
49
|
+
FEATURE_REQUEST: 'feature_request',
|
|
50
|
+
OPERATIONAL_CONCERN: 'operational_concern'
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Feedback Severity Enum
|
|
55
|
+
* Priority level of feedback
|
|
56
|
+
*/
|
|
57
|
+
const FeedbackSeverity = {
|
|
58
|
+
CRITICAL: 'critical', // System down
|
|
59
|
+
HIGH: 'high', // Degraded performance
|
|
60
|
+
MEDIUM: 'medium', // Usability issue
|
|
61
|
+
LOW: 'low' // Enhancement
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Feedback Status Enum
|
|
66
|
+
* Resolution lifecycle states
|
|
67
|
+
*/
|
|
68
|
+
const FeedbackStatus = {
|
|
69
|
+
ACKNOWLEDGED: 'acknowledged',
|
|
70
|
+
INVESTIGATING: 'investigating',
|
|
71
|
+
RESOLVED: 'resolved',
|
|
72
|
+
VERIFIED: 'verified'
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Operation Type Enum
|
|
77
|
+
* Types of operations that can be performed
|
|
78
|
+
*/
|
|
79
|
+
const OperationType = {
|
|
80
|
+
DEPLOYMENT: 'deployment',
|
|
81
|
+
CONFIGURATION_CHANGE: 'configuration_change',
|
|
82
|
+
DATA_MIGRATION: 'data_migration',
|
|
83
|
+
ROLLBACK: 'rollback',
|
|
84
|
+
MONITORING_UPDATE: 'monitoring_update',
|
|
85
|
+
TROUBLESHOOTING: 'troubleshooting',
|
|
86
|
+
FEEDBACK_RESPONSE: 'feedback_response',
|
|
87
|
+
PERMISSION_CHANGE: 'permission_change'
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Document Type Enum
|
|
92
|
+
* Types of operations spec documents
|
|
93
|
+
*/
|
|
94
|
+
const DocumentType = {
|
|
95
|
+
DEPLOYMENT: 'deployment',
|
|
96
|
+
MONITORING: 'monitoring',
|
|
97
|
+
OPERATIONS: 'operations',
|
|
98
|
+
TROUBLESHOOTING: 'troubleshooting',
|
|
99
|
+
ROLLBACK: 'rollback',
|
|
100
|
+
CHANGE_IMPACT: 'change-impact',
|
|
101
|
+
MIGRATION_PLAN: 'migration-plan',
|
|
102
|
+
FEEDBACK_RESPONSE: 'feedback-response',
|
|
103
|
+
TOOLS: 'tools' // AI-driven tools configuration
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
module.exports = {
|
|
107
|
+
TakeoverLevel,
|
|
108
|
+
SecurityEnvironment,
|
|
109
|
+
FeedbackChannel,
|
|
110
|
+
FeedbackType,
|
|
111
|
+
FeedbackSeverity,
|
|
112
|
+
FeedbackStatus,
|
|
113
|
+
OperationType,
|
|
114
|
+
DocumentType
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @typedef {Object} IssuePattern
|
|
119
|
+
* @property {string} pattern - Description of the issue pattern
|
|
120
|
+
* @property {number} occurrences - Number of times this pattern occurred
|
|
121
|
+
* @property {FeedbackType} type - Type of feedback
|
|
122
|
+
* @property {FeedbackSeverity} severity - Severity level
|
|
123
|
+
* @property {string[]} affectedVersions - Versions where this pattern appears
|
|
124
|
+
* @property {string} firstSeen - ISO timestamp of first occurrence
|
|
125
|
+
* @property {string} lastSeen - ISO timestamp of last occurrence
|
|
126
|
+
*/
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @typedef {Object} ResolutionTimeStats
|
|
130
|
+
* @property {number} average - Average resolution time in hours
|
|
131
|
+
* @property {number} median - Median resolution time in hours
|
|
132
|
+
* @property {number} min - Minimum resolution time in hours
|
|
133
|
+
* @property {number} max - Maximum resolution time in hours
|
|
134
|
+
* @property {Object.<FeedbackSeverity, number>} bySeverity - Average resolution time by severity
|
|
135
|
+
* @property {Object.<FeedbackType, number>} byType - Average resolution time by type
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @typedef {Object} SatisfactionTrend
|
|
140
|
+
* @property {string} period - Time period (e.g., "2026-01", "2026-W04")
|
|
141
|
+
* @property {number} totalFeedback - Total feedback items in period
|
|
142
|
+
* @property {number} resolvedCount - Number of resolved items
|
|
143
|
+
* @property {number} resolutionRate - Percentage of resolved items
|
|
144
|
+
* @property {number} averageResolutionTime - Average time to resolve in hours
|
|
145
|
+
* @property {Object.<FeedbackSeverity, number>} severityDistribution - Count by severity
|
|
146
|
+
*/
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @typedef {Object} VersionIssue
|
|
150
|
+
* @property {string} version - Project version
|
|
151
|
+
* @property {number} feedbackCount - Total feedback for this version
|
|
152
|
+
* @property {IssuePattern[]} topIssues - Most common issues in this version
|
|
153
|
+
* @property {number} criticalCount - Number of critical issues
|
|
154
|
+
* @property {number} averageResolutionTime - Average resolution time in hours
|
|
155
|
+
*/
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* @typedef {Object} FeedbackAnalytics
|
|
159
|
+
* @property {string} project - Project name
|
|
160
|
+
* @property {string} generatedAt - ISO timestamp of analytics generation
|
|
161
|
+
* @property {Object} timeRange - Time range for analytics
|
|
162
|
+
* @property {string} timeRange.from - Start date (ISO)
|
|
163
|
+
* @property {string} timeRange.to - End date (ISO)
|
|
164
|
+
* @property {IssuePattern[]} commonIssues - Most common issue patterns
|
|
165
|
+
* @property {ResolutionTimeStats} resolutionTimes - Resolution time statistics
|
|
166
|
+
* @property {SatisfactionTrend[]} satisfactionTrends - Satisfaction trends over time
|
|
167
|
+
* @property {VersionIssue[]} versionSpecificIssues - Issues by version
|
|
168
|
+
* @property {number} totalFeedback - Total feedback items analyzed
|
|
169
|
+
* @property {Object.<FeedbackStatus, number>} statusDistribution - Count by status
|
|
170
|
+
*/
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages operations specs lifecycle
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require('fs-extra');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const TemplateLoader = require('./template-loader');
|
|
10
|
+
const OperationsValidator = require('./operations-validator');
|
|
11
|
+
const { DocumentType } = require('./models');
|
|
12
|
+
|
|
13
|
+
class OperationsManager {
|
|
14
|
+
constructor(projectRoot = process.cwd()) {
|
|
15
|
+
this.projectRoot = projectRoot;
|
|
16
|
+
this.templateLoader = new TemplateLoader();
|
|
17
|
+
this.validator = new OperationsValidator();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Create operations spec from template
|
|
22
|
+
*
|
|
23
|
+
* @param {string} projectName - Project name
|
|
24
|
+
* @param {string} version - Project version
|
|
25
|
+
* @param {string} templateName - Template to use (default: 'default')
|
|
26
|
+
* @returns {Promise<string>} Path to created operations directory
|
|
27
|
+
*/
|
|
28
|
+
async createOperationsSpec(projectName, version = '1.0.0', templateName = 'default') {
|
|
29
|
+
const operationsPath = path.join(
|
|
30
|
+
this.projectRoot,
|
|
31
|
+
'.kiro/specs',
|
|
32
|
+
projectName,
|
|
33
|
+
'operations'
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
// Create operations directory
|
|
37
|
+
await fs.ensureDir(operationsPath);
|
|
38
|
+
|
|
39
|
+
// Load all templates
|
|
40
|
+
const templates = await this.templateLoader.loadAllTemplates(templateName);
|
|
41
|
+
|
|
42
|
+
// Write each template to file
|
|
43
|
+
const documentTypes = Object.values(DocumentType);
|
|
44
|
+
|
|
45
|
+
for (const docType of documentTypes) {
|
|
46
|
+
const template = templates[docType];
|
|
47
|
+
if (template) {
|
|
48
|
+
const fileName = docType === DocumentType.TOOLS ? 'tools.yaml' : `${docType}.md`;
|
|
49
|
+
const filePath = path.join(operationsPath, fileName);
|
|
50
|
+
await fs.writeFile(filePath, template, 'utf8');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Create version metadata file
|
|
55
|
+
const metadata = {
|
|
56
|
+
project: projectName,
|
|
57
|
+
version: version,
|
|
58
|
+
created: new Date().toISOString(),
|
|
59
|
+
template: templateName
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
await fs.writeFile(
|
|
63
|
+
path.join(operationsPath, '.metadata.json'),
|
|
64
|
+
JSON.stringify(metadata, null, 2),
|
|
65
|
+
'utf8'
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
return operationsPath;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Load operations spec
|
|
73
|
+
*
|
|
74
|
+
* @param {string} projectName - Project name
|
|
75
|
+
* @returns {Promise<Object>} Operations spec object
|
|
76
|
+
*/
|
|
77
|
+
async loadOperationsSpec(projectName) {
|
|
78
|
+
const operationsPath = path.join(
|
|
79
|
+
this.projectRoot,
|
|
80
|
+
'.kiro/specs',
|
|
81
|
+
projectName,
|
|
82
|
+
'operations'
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
// Check if operations directory exists
|
|
86
|
+
const exists = await fs.pathExists(operationsPath);
|
|
87
|
+
if (!exists) {
|
|
88
|
+
throw new Error(`Operations spec not found for project: ${projectName}`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Load metadata
|
|
92
|
+
const metadataPath = path.join(operationsPath, '.metadata.json');
|
|
93
|
+
let metadata = {};
|
|
94
|
+
if (await fs.pathExists(metadataPath)) {
|
|
95
|
+
try {
|
|
96
|
+
metadata = await fs.readJson(metadataPath);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
// If metadata is corrupted, use empty object
|
|
99
|
+
console.warn(`Warning: Could not parse metadata file: ${error.message}`);
|
|
100
|
+
metadata = {};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
project: projectName,
|
|
106
|
+
path: operationsPath,
|
|
107
|
+
metadata
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Validate operations spec
|
|
113
|
+
*
|
|
114
|
+
* @param {string} projectName - Project name
|
|
115
|
+
* @returns {Promise<Object>} Validation result
|
|
116
|
+
*/
|
|
117
|
+
async validateOperationsSpec(projectName) {
|
|
118
|
+
const spec = await this.loadOperationsSpec(projectName);
|
|
119
|
+
return await this.validator.validateComplete(spec.path);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* List all operations specs
|
|
124
|
+
*
|
|
125
|
+
* @returns {Promise<string[]>} Array of project names with operations specs
|
|
126
|
+
*/
|
|
127
|
+
async listOperationsSpecs() {
|
|
128
|
+
const specsPath = path.join(this.projectRoot, '.kiro/specs');
|
|
129
|
+
|
|
130
|
+
const exists = await fs.pathExists(specsPath);
|
|
131
|
+
if (!exists) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const entries = await fs.readdir(specsPath, { withFileTypes: true });
|
|
136
|
+
const projects = [];
|
|
137
|
+
|
|
138
|
+
for (const entry of entries) {
|
|
139
|
+
if (entry.isDirectory()) {
|
|
140
|
+
const operationsPath = path.join(specsPath, entry.name, 'operations');
|
|
141
|
+
if (await fs.pathExists(operationsPath)) {
|
|
142
|
+
projects.push(entry.name);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return projects;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
module.exports = OperationsManager;
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations Spec Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates operations spec completeness and structure
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require('fs-extra');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const { DocumentType } = require('./models');
|
|
10
|
+
|
|
11
|
+
// Required sections for each document type
|
|
12
|
+
const REQUIRED_SECTIONS = {
|
|
13
|
+
[DocumentType.DEPLOYMENT]: [
|
|
14
|
+
'Prerequisites',
|
|
15
|
+
'Deployment Steps',
|
|
16
|
+
'Environment Variables',
|
|
17
|
+
'Health Checks',
|
|
18
|
+
'Rollback Procedure'
|
|
19
|
+
],
|
|
20
|
+
[DocumentType.MONITORING]: [
|
|
21
|
+
'Metrics',
|
|
22
|
+
'Thresholds',
|
|
23
|
+
'Alert Rules',
|
|
24
|
+
'Response Procedures'
|
|
25
|
+
],
|
|
26
|
+
[DocumentType.OPERATIONS]: [
|
|
27
|
+
'Daily Tasks',
|
|
28
|
+
'Maintenance Procedures',
|
|
29
|
+
'Backup Procedures'
|
|
30
|
+
],
|
|
31
|
+
[DocumentType.TROUBLESHOOTING]: [
|
|
32
|
+
'Common Issues',
|
|
33
|
+
'Diagnostic Commands',
|
|
34
|
+
'Resolution Steps'
|
|
35
|
+
],
|
|
36
|
+
[DocumentType.ROLLBACK]: [
|
|
37
|
+
'Rollback Triggers',
|
|
38
|
+
'Rollback Steps',
|
|
39
|
+
'Data Recovery Procedures'
|
|
40
|
+
],
|
|
41
|
+
[DocumentType.CHANGE_IMPACT]: [
|
|
42
|
+
'Change Classification',
|
|
43
|
+
'Affected Systems',
|
|
44
|
+
'Risk Assessment'
|
|
45
|
+
],
|
|
46
|
+
[DocumentType.MIGRATION_PLAN]: [
|
|
47
|
+
'Migration Strategy',
|
|
48
|
+
'Data Mapping',
|
|
49
|
+
'Validation Steps',
|
|
50
|
+
'Rollback Plan'
|
|
51
|
+
],
|
|
52
|
+
[DocumentType.FEEDBACK_RESPONSE]: [
|
|
53
|
+
'Feedback Classification Rules',
|
|
54
|
+
'Response Procedures',
|
|
55
|
+
'Escalation Paths',
|
|
56
|
+
'Resolution Tracking'
|
|
57
|
+
]
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
class OperationsValidator {
|
|
61
|
+
/**
|
|
62
|
+
* Validate operations spec directory structure
|
|
63
|
+
*
|
|
64
|
+
* @param {string} operationsPath - Path to operations directory
|
|
65
|
+
* @returns {Promise<Object>} Validation result
|
|
66
|
+
*/
|
|
67
|
+
async validateStructure(operationsPath) {
|
|
68
|
+
const errors = [];
|
|
69
|
+
const warnings = [];
|
|
70
|
+
const missingDocuments = [];
|
|
71
|
+
const presentDocuments = [];
|
|
72
|
+
|
|
73
|
+
// Check if operations directory exists
|
|
74
|
+
const exists = await fs.pathExists(operationsPath);
|
|
75
|
+
if (!exists) {
|
|
76
|
+
errors.push({
|
|
77
|
+
type: 'missing_directory',
|
|
78
|
+
message: `Operations directory not found: ${operationsPath}`
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
valid: false,
|
|
83
|
+
errors,
|
|
84
|
+
warnings,
|
|
85
|
+
missingDocuments: Object.values(DocumentType),
|
|
86
|
+
presentDocuments: []
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Check for all required documents
|
|
91
|
+
const documentTypes = Object.values(DocumentType);
|
|
92
|
+
|
|
93
|
+
for (const docType of documentTypes) {
|
|
94
|
+
// tools.yaml is a YAML file, others are markdown
|
|
95
|
+
const fileName = docType === DocumentType.TOOLS ? `${docType}.yaml` : `${docType}.md`;
|
|
96
|
+
const docPath = path.join(operationsPath, fileName);
|
|
97
|
+
const docExists = await fs.pathExists(docPath);
|
|
98
|
+
|
|
99
|
+
if (docExists) {
|
|
100
|
+
presentDocuments.push(docType);
|
|
101
|
+
} else {
|
|
102
|
+
missingDocuments.push(docType);
|
|
103
|
+
errors.push({
|
|
104
|
+
type: 'missing_document',
|
|
105
|
+
documentType: docType,
|
|
106
|
+
message: `Required document missing: ${fileName}`
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
valid: errors.length === 0,
|
|
113
|
+
errors,
|
|
114
|
+
warnings,
|
|
115
|
+
missingDocuments,
|
|
116
|
+
presentDocuments,
|
|
117
|
+
totalRequired: documentTypes.length,
|
|
118
|
+
totalPresent: presentDocuments.length
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Validate document content (sections)
|
|
124
|
+
*
|
|
125
|
+
* @param {string} documentPath - Path to document file
|
|
126
|
+
* @param {string} documentType - Type of document
|
|
127
|
+
* @returns {Promise<Object>} Validation result
|
|
128
|
+
*/
|
|
129
|
+
async validateDocumentContent(documentPath, documentType) {
|
|
130
|
+
const errors = [];
|
|
131
|
+
const warnings = [];
|
|
132
|
+
|
|
133
|
+
// Check if document exists
|
|
134
|
+
const exists = await fs.pathExists(documentPath);
|
|
135
|
+
if (!exists) {
|
|
136
|
+
errors.push({
|
|
137
|
+
type: 'file_not_found',
|
|
138
|
+
message: `Document not found: ${documentPath}`
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
valid: false,
|
|
143
|
+
errors,
|
|
144
|
+
warnings,
|
|
145
|
+
missingSections: REQUIRED_SECTIONS[documentType] || [],
|
|
146
|
+
presentSections: []
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Read document content
|
|
151
|
+
const content = await fs.readFile(documentPath, 'utf8');
|
|
152
|
+
|
|
153
|
+
// Get required sections for this document type
|
|
154
|
+
const requiredSections = REQUIRED_SECTIONS[documentType];
|
|
155
|
+
if (!requiredSections) {
|
|
156
|
+
warnings.push({
|
|
157
|
+
type: 'unknown_document_type',
|
|
158
|
+
message: `No validation rules for document type: ${documentType}`
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
valid: true,
|
|
163
|
+
errors,
|
|
164
|
+
warnings,
|
|
165
|
+
missingSections: [],
|
|
166
|
+
presentSections: []
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Parse sections from markdown
|
|
171
|
+
const sections = this.parseSections(content);
|
|
172
|
+
const missingSections = [];
|
|
173
|
+
const presentSections = [];
|
|
174
|
+
|
|
175
|
+
// Check for required sections
|
|
176
|
+
for (const requiredSection of requiredSections) {
|
|
177
|
+
const found = sections.some(section =>
|
|
178
|
+
section.toLowerCase().includes(requiredSection.toLowerCase())
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
if (found) {
|
|
182
|
+
presentSections.push(requiredSection);
|
|
183
|
+
} else {
|
|
184
|
+
missingSections.push(requiredSection);
|
|
185
|
+
errors.push({
|
|
186
|
+
type: 'missing_section',
|
|
187
|
+
section: requiredSection,
|
|
188
|
+
message: `Required section missing: ${requiredSection}`
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
valid: errors.length === 0,
|
|
195
|
+
errors,
|
|
196
|
+
warnings,
|
|
197
|
+
missingSections,
|
|
198
|
+
presentSections,
|
|
199
|
+
totalRequired: requiredSections.length,
|
|
200
|
+
totalPresent: presentSections.length
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Validate complete operations spec
|
|
206
|
+
*
|
|
207
|
+
* @param {string} operationsPath - Path to operations directory
|
|
208
|
+
* @returns {Promise<Object>} Complete validation result
|
|
209
|
+
*/
|
|
210
|
+
async validateComplete(operationsPath) {
|
|
211
|
+
// First validate structure
|
|
212
|
+
const structureResult = await this.validateStructure(operationsPath);
|
|
213
|
+
|
|
214
|
+
if (!structureResult.valid) {
|
|
215
|
+
return {
|
|
216
|
+
valid: false,
|
|
217
|
+
structureValid: false,
|
|
218
|
+
contentValid: false,
|
|
219
|
+
structure: structureResult,
|
|
220
|
+
content: {}
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Then validate content of each document
|
|
225
|
+
const contentResults = {};
|
|
226
|
+
let allContentValid = true;
|
|
227
|
+
|
|
228
|
+
for (const docType of structureResult.presentDocuments) {
|
|
229
|
+
const docPath = path.join(operationsPath, `${docType}.md`);
|
|
230
|
+
const contentResult = await this.validateDocumentContent(docPath, docType);
|
|
231
|
+
|
|
232
|
+
contentResults[docType] = contentResult;
|
|
233
|
+
|
|
234
|
+
if (!contentResult.valid) {
|
|
235
|
+
allContentValid = false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return {
|
|
240
|
+
valid: structureResult.valid && allContentValid,
|
|
241
|
+
structureValid: structureResult.valid,
|
|
242
|
+
contentValid: allContentValid,
|
|
243
|
+
structure: structureResult,
|
|
244
|
+
content: contentResults
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Parse markdown sections (## headers)
|
|
250
|
+
*
|
|
251
|
+
* @param {string} content - Markdown content
|
|
252
|
+
* @returns {string[]} Array of section titles
|
|
253
|
+
*/
|
|
254
|
+
parseSections(content) {
|
|
255
|
+
const sections = [];
|
|
256
|
+
const lines = content.split('\n');
|
|
257
|
+
|
|
258
|
+
for (const line of lines) {
|
|
259
|
+
// Match ## Section Title
|
|
260
|
+
const match = line.match(/^##\s+(.+)$/);
|
|
261
|
+
if (match) {
|
|
262
|
+
sections.push(match[1].trim());
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return sections;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Get required sections for a document type
|
|
271
|
+
*
|
|
272
|
+
* @param {string} documentType - Type of document
|
|
273
|
+
* @returns {string[]} Array of required section names
|
|
274
|
+
*/
|
|
275
|
+
getRequiredSections(documentType) {
|
|
276
|
+
return REQUIRED_SECTIONS[documentType] || [];
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
module.exports = OperationsValidator;
|