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,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Manager
|
|
3
|
+
* Central coordinator for knowledge base operations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs-extra');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const EntryManager = require('./entry-manager');
|
|
9
|
+
const IndexManager = require('./index-manager');
|
|
10
|
+
const TemplateManager = require('./template-manager');
|
|
11
|
+
|
|
12
|
+
class KnowledgeManager {
|
|
13
|
+
constructor(projectRoot) {
|
|
14
|
+
this.projectRoot = projectRoot;
|
|
15
|
+
this.knowledgePath = path.join(projectRoot, '.kiro', 'knowledge');
|
|
16
|
+
|
|
17
|
+
this.entryManager = new EntryManager(this.knowledgePath);
|
|
18
|
+
this.indexManager = new IndexManager(this.knowledgePath);
|
|
19
|
+
this.templateManager = new TemplateManager(this.knowledgePath);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Initialize knowledge base
|
|
24
|
+
*/
|
|
25
|
+
async initialize() {
|
|
26
|
+
// Create directory structure
|
|
27
|
+
await fs.ensureDir(this.knowledgePath);
|
|
28
|
+
await fs.ensureDir(path.join(this.knowledgePath, 'patterns'));
|
|
29
|
+
await fs.ensureDir(path.join(this.knowledgePath, 'lessons'));
|
|
30
|
+
await fs.ensureDir(path.join(this.knowledgePath, 'workflows'));
|
|
31
|
+
await fs.ensureDir(path.join(this.knowledgePath, 'checklists'));
|
|
32
|
+
await fs.ensureDir(path.join(this.knowledgePath, 'references'));
|
|
33
|
+
await fs.ensureDir(path.join(this.knowledgePath, '.templates'));
|
|
34
|
+
await fs.ensureDir(path.join(this.knowledgePath, '.backups'));
|
|
35
|
+
|
|
36
|
+
// Create README
|
|
37
|
+
const readme = `# Knowledge Base
|
|
38
|
+
|
|
39
|
+
This directory contains your personal knowledge base for this project.
|
|
40
|
+
|
|
41
|
+
## Structure
|
|
42
|
+
|
|
43
|
+
- \`patterns/\` - Design patterns and architectural solutions
|
|
44
|
+
- \`lessons/\` - Lessons learned from experience
|
|
45
|
+
- \`workflows/\` - Custom workflows and processes
|
|
46
|
+
- \`checklists/\` - Checklists for common tasks
|
|
47
|
+
- \`references/\` - Reference materials and links
|
|
48
|
+
|
|
49
|
+
## Usage
|
|
50
|
+
|
|
51
|
+
\`\`\`bash
|
|
52
|
+
# Add new entry
|
|
53
|
+
kse knowledge add <type> "<title>"
|
|
54
|
+
|
|
55
|
+
# List all entries
|
|
56
|
+
kse knowledge list
|
|
57
|
+
|
|
58
|
+
# Search entries
|
|
59
|
+
kse knowledge search <keyword>
|
|
60
|
+
|
|
61
|
+
# Analyze knowledge base
|
|
62
|
+
kse knowledge analyze
|
|
63
|
+
|
|
64
|
+
# Integrate knowledge into project
|
|
65
|
+
kse knowledge integrate <id> --target <destination>
|
|
66
|
+
\`\`\`
|
|
67
|
+
|
|
68
|
+
## Learn More
|
|
69
|
+
|
|
70
|
+
See \`docs/knowledge-management-guide.md\` for complete documentation.
|
|
71
|
+
`;
|
|
72
|
+
|
|
73
|
+
await fs.writeFile(path.join(this.knowledgePath, 'README.md'), readme, 'utf-8');
|
|
74
|
+
|
|
75
|
+
// Initialize index
|
|
76
|
+
await this.indexManager.load();
|
|
77
|
+
await this.indexManager.save();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Check if knowledge base is initialized
|
|
82
|
+
* @returns {boolean}
|
|
83
|
+
*/
|
|
84
|
+
async isInitialized() {
|
|
85
|
+
return fs.pathExists(this.knowledgePath);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Add new entry
|
|
90
|
+
* @param {string} type - Entry type
|
|
91
|
+
* @param {string} title - Entry title
|
|
92
|
+
* @param {Object} options - Additional options
|
|
93
|
+
* @returns {Object} - Created entry info
|
|
94
|
+
*/
|
|
95
|
+
async addEntry(type, title, options = {}) {
|
|
96
|
+
if (!await this.isInitialized()) {
|
|
97
|
+
throw new Error('Knowledge base not initialized. Run: kse knowledge init');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Validate type
|
|
101
|
+
const validTypes = ['pattern', 'lesson', 'workflow', 'checklist', 'reference'];
|
|
102
|
+
if (!validTypes.includes(type)) {
|
|
103
|
+
throw new Error(`Invalid type: ${type}. Valid types: ${validTypes.join(', ')}`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Get template
|
|
107
|
+
const template = await this.templateManager.getTemplate(type);
|
|
108
|
+
|
|
109
|
+
// Create entry
|
|
110
|
+
const result = await this.entryManager.create(type, title, template, {
|
|
111
|
+
tags: options.tags || [],
|
|
112
|
+
category: options.category || null
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// Update index
|
|
116
|
+
const entryData = await this.entryManager.read(result.path);
|
|
117
|
+
await this.indexManager.addEntry({
|
|
118
|
+
...entryData.metadata,
|
|
119
|
+
file: result.file
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get entry by ID
|
|
127
|
+
* @param {string} id - Entry ID
|
|
128
|
+
* @returns {Object} - Entry data
|
|
129
|
+
*/
|
|
130
|
+
async getEntry(id) {
|
|
131
|
+
const entry = await this.indexManager.findById(id);
|
|
132
|
+
if (!entry) {
|
|
133
|
+
throw new Error(`Entry not found: ${id}`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const filePath = path.join(this.knowledgePath, entry.file);
|
|
137
|
+
return this.entryManager.read(filePath);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Update entry
|
|
142
|
+
* @param {string} id - Entry ID
|
|
143
|
+
* @param {Object} updates - Updates to apply
|
|
144
|
+
*/
|
|
145
|
+
async updateEntry(id, updates) {
|
|
146
|
+
const entry = await this.indexManager.findById(id);
|
|
147
|
+
if (!entry) {
|
|
148
|
+
throw new Error(`Entry not found: ${id}`);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const filePath = path.join(this.knowledgePath, entry.file);
|
|
152
|
+
await this.entryManager.update(filePath, updates.content, updates.metadata);
|
|
153
|
+
|
|
154
|
+
// Update index
|
|
155
|
+
if (updates.metadata) {
|
|
156
|
+
await this.indexManager.updateEntry(id, updates.metadata);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Delete entry
|
|
162
|
+
* @param {string} id - Entry ID
|
|
163
|
+
* @param {Object} options - Delete options
|
|
164
|
+
*/
|
|
165
|
+
async deleteEntry(id, options = {}) {
|
|
166
|
+
const entry = await this.indexManager.findById(id);
|
|
167
|
+
if (!entry) {
|
|
168
|
+
throw new Error(`Entry not found: ${id}`);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const filePath = path.join(this.knowledgePath, entry.file);
|
|
172
|
+
await this.entryManager.delete(filePath, options.backup !== false);
|
|
173
|
+
|
|
174
|
+
// Update index
|
|
175
|
+
await this.indexManager.removeEntry(id);
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
id,
|
|
179
|
+
title: entry.title,
|
|
180
|
+
deleted: true
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* List entries
|
|
186
|
+
* @param {Object} filters - Filter options
|
|
187
|
+
* @returns {Array} - Filtered entries
|
|
188
|
+
*/
|
|
189
|
+
async listEntries(filters = {}) {
|
|
190
|
+
await this.indexManager.load();
|
|
191
|
+
|
|
192
|
+
let entries = this.indexManager.index.entries;
|
|
193
|
+
|
|
194
|
+
// Apply filters
|
|
195
|
+
if (filters.type) {
|
|
196
|
+
entries = entries.filter(e => e.type === filters.type);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (filters.tag) {
|
|
200
|
+
entries = entries.filter(e => e.tags.includes(filters.tag));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (filters.status) {
|
|
204
|
+
entries = entries.filter(e => e.status === filters.status);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Apply sorting
|
|
208
|
+
if (filters.sort) {
|
|
209
|
+
const [field, order = 'asc'] = filters.sort.split(':');
|
|
210
|
+
entries.sort((a, b) => {
|
|
211
|
+
const aVal = a[field];
|
|
212
|
+
const bVal = b[field];
|
|
213
|
+
const comparison = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;
|
|
214
|
+
return order === 'desc' ? -comparison : comparison;
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return entries;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Search entries
|
|
223
|
+
* @param {string} keyword - Search keyword
|
|
224
|
+
* @param {Object} options - Search options
|
|
225
|
+
* @returns {Array} - Search results
|
|
226
|
+
*/
|
|
227
|
+
async search(keyword, options = {}) {
|
|
228
|
+
// Search in index first
|
|
229
|
+
const indexResults = await this.indexManager.search(keyword);
|
|
230
|
+
|
|
231
|
+
if (!options.fullText) {
|
|
232
|
+
return indexResults;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Full-text search in files
|
|
236
|
+
const results = [];
|
|
237
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
238
|
+
|
|
239
|
+
for (const entry of indexResults) {
|
|
240
|
+
const filePath = path.join(this.knowledgePath, entry.file);
|
|
241
|
+
const data = await this.entryManager.read(filePath);
|
|
242
|
+
|
|
243
|
+
if (data.content.toLowerCase().includes(lowerKeyword)) {
|
|
244
|
+
// Extract context snippet
|
|
245
|
+
const lines = data.content.split('\n');
|
|
246
|
+
const matchingLines = lines.filter(line =>
|
|
247
|
+
line.toLowerCase().includes(lowerKeyword)
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
results.push({
|
|
251
|
+
...entry,
|
|
252
|
+
matches: matchingLines.slice(0, 3),
|
|
253
|
+
score: matchingLines.length
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Sort by relevance
|
|
259
|
+
results.sort((a, b) => b.score - a.score);
|
|
260
|
+
|
|
261
|
+
return results;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Get statistics
|
|
266
|
+
* @returns {Object} - Statistics
|
|
267
|
+
*/
|
|
268
|
+
async getStats() {
|
|
269
|
+
return this.indexManager.getStats();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
module.exports = KnowledgeManager;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Manager
|
|
3
|
+
* Manages entry templates
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs-extra');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
class TemplateManager {
|
|
10
|
+
constructor(knowledgePath) {
|
|
11
|
+
this.knowledgePath = knowledgePath;
|
|
12
|
+
this.templatesDir = path.join(knowledgePath, '.templates');
|
|
13
|
+
this.builtInTemplatesDir = path.join(__dirname, 'templates');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Get template by type
|
|
18
|
+
* @param {string} type - Template type
|
|
19
|
+
* @returns {string} - Template content
|
|
20
|
+
*/
|
|
21
|
+
async getTemplate(type) {
|
|
22
|
+
// Check custom template first
|
|
23
|
+
const customPath = path.join(this.templatesDir, `${type}.md`);
|
|
24
|
+
if (await fs.pathExists(customPath)) {
|
|
25
|
+
return fs.readFile(customPath, 'utf-8');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Fall back to built-in template
|
|
29
|
+
return this.getDefaultTemplate(type);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* List available templates
|
|
34
|
+
* @returns {Array} - Template names
|
|
35
|
+
*/
|
|
36
|
+
async listTemplates() {
|
|
37
|
+
const templates = ['pattern', 'lesson', 'workflow', 'checklist', 'reference'];
|
|
38
|
+
|
|
39
|
+
// Check for custom templates
|
|
40
|
+
if (await fs.pathExists(this.templatesDir)) {
|
|
41
|
+
const files = await fs.readdir(this.templatesDir);
|
|
42
|
+
const customTemplates = files
|
|
43
|
+
.filter(f => f.endsWith('.md'))
|
|
44
|
+
.map(f => path.basename(f, '.md'));
|
|
45
|
+
|
|
46
|
+
return [...new Set([...templates, ...customTemplates])];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return templates;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Get default built-in template
|
|
54
|
+
* @param {string} type - Template type
|
|
55
|
+
* @returns {string} - Template content
|
|
56
|
+
*/
|
|
57
|
+
getDefaultTemplate(type) {
|
|
58
|
+
const templates = {
|
|
59
|
+
pattern: `## Context
|
|
60
|
+
|
|
61
|
+
Describe when and where this pattern applies.
|
|
62
|
+
|
|
63
|
+
## Problem
|
|
64
|
+
|
|
65
|
+
What problem does this pattern solve?
|
|
66
|
+
|
|
67
|
+
## Solution
|
|
68
|
+
|
|
69
|
+
How to implement this pattern.
|
|
70
|
+
|
|
71
|
+
## Examples
|
|
72
|
+
|
|
73
|
+
\`\`\`javascript
|
|
74
|
+
// Code example
|
|
75
|
+
\`\`\`
|
|
76
|
+
|
|
77
|
+
## Trade-offs
|
|
78
|
+
|
|
79
|
+
Advantages and disadvantages.
|
|
80
|
+
|
|
81
|
+
## References
|
|
82
|
+
|
|
83
|
+
- Related patterns
|
|
84
|
+
- External resources
|
|
85
|
+
`,
|
|
86
|
+
|
|
87
|
+
lesson: `## Situation
|
|
88
|
+
|
|
89
|
+
What was the context or project?
|
|
90
|
+
|
|
91
|
+
## Challenge
|
|
92
|
+
|
|
93
|
+
What problem or challenge did you face?
|
|
94
|
+
|
|
95
|
+
## Action
|
|
96
|
+
|
|
97
|
+
What did you do to address it?
|
|
98
|
+
|
|
99
|
+
## Result
|
|
100
|
+
|
|
101
|
+
What was the outcome?
|
|
102
|
+
|
|
103
|
+
## Lesson Learned
|
|
104
|
+
|
|
105
|
+
What did you learn from this experience?
|
|
106
|
+
|
|
107
|
+
## Application
|
|
108
|
+
|
|
109
|
+
How can this lesson be applied in the future?
|
|
110
|
+
`,
|
|
111
|
+
|
|
112
|
+
workflow: `## Purpose
|
|
113
|
+
|
|
114
|
+
What is this workflow for?
|
|
115
|
+
|
|
116
|
+
## Prerequisites
|
|
117
|
+
|
|
118
|
+
What needs to be in place before starting?
|
|
119
|
+
|
|
120
|
+
## Steps
|
|
121
|
+
|
|
122
|
+
1. First step
|
|
123
|
+
2. Second step
|
|
124
|
+
3. Third step
|
|
125
|
+
|
|
126
|
+
## Verification
|
|
127
|
+
|
|
128
|
+
How to verify the workflow completed successfully?
|
|
129
|
+
|
|
130
|
+
## Troubleshooting
|
|
131
|
+
|
|
132
|
+
Common issues and solutions.
|
|
133
|
+
|
|
134
|
+
## References
|
|
135
|
+
|
|
136
|
+
- Related workflows
|
|
137
|
+
- Documentation links
|
|
138
|
+
`,
|
|
139
|
+
|
|
140
|
+
checklist: `## Purpose
|
|
141
|
+
|
|
142
|
+
What is this checklist for?
|
|
143
|
+
|
|
144
|
+
## Checklist Items
|
|
145
|
+
|
|
146
|
+
- [ ] Item 1
|
|
147
|
+
- [ ] Item 2
|
|
148
|
+
- [ ] Item 3
|
|
149
|
+
|
|
150
|
+
## Notes
|
|
151
|
+
|
|
152
|
+
Additional context or tips.
|
|
153
|
+
|
|
154
|
+
## References
|
|
155
|
+
|
|
156
|
+
- Related checklists
|
|
157
|
+
- Documentation
|
|
158
|
+
`,
|
|
159
|
+
|
|
160
|
+
reference: `## Overview
|
|
161
|
+
|
|
162
|
+
Brief description of this reference.
|
|
163
|
+
|
|
164
|
+
## Key Information
|
|
165
|
+
|
|
166
|
+
Important details, links, or data.
|
|
167
|
+
|
|
168
|
+
## Usage
|
|
169
|
+
|
|
170
|
+
How to use this reference.
|
|
171
|
+
|
|
172
|
+
## Examples
|
|
173
|
+
|
|
174
|
+
Practical examples.
|
|
175
|
+
|
|
176
|
+
## Related
|
|
177
|
+
|
|
178
|
+
- Related references
|
|
179
|
+
- External links
|
|
180
|
+
`
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
if (!templates[type]) {
|
|
184
|
+
throw new Error(`Unknown template type: ${type}`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return templates[type];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
module.exports = TemplateManager;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lock module exports
|
|
3
|
+
* @module lib/lock
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { LockManager, DEFAULT_TIMEOUT_HOURS } = require('./lock-manager');
|
|
7
|
+
const { MachineIdentifier } = require('./machine-identifier');
|
|
8
|
+
const { LockFile, LOCK_FILE_NAME, LOCK_VERSION } = require('./lock-file');
|
|
9
|
+
const { TaskLockManager } = require('./task-lock-manager');
|
|
10
|
+
const { SteeringFileLock } = require('./steering-file-lock');
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
LockManager,
|
|
14
|
+
MachineIdentifier,
|
|
15
|
+
LockFile,
|
|
16
|
+
DEFAULT_TIMEOUT_HOURS,
|
|
17
|
+
LOCK_FILE_NAME,
|
|
18
|
+
LOCK_VERSION,
|
|
19
|
+
TaskLockManager,
|
|
20
|
+
SteeringFileLock
|
|
21
|
+
};
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LockFile - Manages lock file I/O operations
|
|
3
|
+
* @module lib/lock/lock-file
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs').promises;
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
const LOCK_FILE_NAME = '.lock';
|
|
10
|
+
const LOCK_VERSION = '1.0.0';
|
|
11
|
+
|
|
12
|
+
class LockFile {
|
|
13
|
+
/**
|
|
14
|
+
* @param {string} specsDir - Path to specs directory
|
|
15
|
+
*/
|
|
16
|
+
constructor(specsDir) {
|
|
17
|
+
this.specsDir = specsDir;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Get lock file path for a spec
|
|
22
|
+
* @param {string} specName - Name of the Spec
|
|
23
|
+
* @returns {string}
|
|
24
|
+
* @private
|
|
25
|
+
*/
|
|
26
|
+
_getLockPath(specName) {
|
|
27
|
+
return path.join(this.specsDir, specName, LOCK_FILE_NAME);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Read lock metadata from a Spec
|
|
32
|
+
* @param {string} specName - Name of the Spec
|
|
33
|
+
* @returns {Promise<LockMetadata|null>}
|
|
34
|
+
*/
|
|
35
|
+
async read(specName) {
|
|
36
|
+
const lockPath = this._getLockPath(specName);
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const data = await fs.readFile(lockPath, 'utf8');
|
|
40
|
+
const metadata = JSON.parse(data);
|
|
41
|
+
|
|
42
|
+
if (!this._isValidMetadata(metadata)) {
|
|
43
|
+
return null; // Corrupted lock file
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return this._normalizeMetadata(metadata);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
if (error.code === 'ENOENT') {
|
|
49
|
+
return null; // No lock file
|
|
50
|
+
}
|
|
51
|
+
if (error instanceof SyntaxError) {
|
|
52
|
+
return null; // Invalid JSON - corrupted
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Write lock metadata to a Spec
|
|
60
|
+
* @param {string} specName - Name of the Spec
|
|
61
|
+
* @param {LockMetadata} metadata - Lock metadata to write
|
|
62
|
+
* @returns {Promise<void>}
|
|
63
|
+
*/
|
|
64
|
+
async write(specName, metadata) {
|
|
65
|
+
const lockPath = this._getLockPath(specName);
|
|
66
|
+
const specDir = path.dirname(lockPath);
|
|
67
|
+
|
|
68
|
+
// Ensure spec directory exists
|
|
69
|
+
await fs.mkdir(specDir, { recursive: true });
|
|
70
|
+
|
|
71
|
+
const normalizedMetadata = {
|
|
72
|
+
...metadata,
|
|
73
|
+
version: metadata.version || LOCK_VERSION
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
if (!this._isValidMetadata(normalizedMetadata)) {
|
|
77
|
+
throw new Error('Invalid lock metadata: missing required fields');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Atomic write using temp file
|
|
81
|
+
const tempPath = `${lockPath}.tmp`;
|
|
82
|
+
const content = JSON.stringify(normalizedMetadata, null, 2);
|
|
83
|
+
|
|
84
|
+
await fs.writeFile(tempPath, content, 'utf8');
|
|
85
|
+
await fs.rename(tempPath, lockPath);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Delete lock file from a Spec
|
|
91
|
+
* @param {string} specName - Name of the Spec
|
|
92
|
+
* @returns {Promise<boolean>}
|
|
93
|
+
*/
|
|
94
|
+
async delete(specName) {
|
|
95
|
+
const lockPath = this._getLockPath(specName);
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
await fs.unlink(lockPath);
|
|
99
|
+
return true;
|
|
100
|
+
} catch (error) {
|
|
101
|
+
if (error.code === 'ENOENT') {
|
|
102
|
+
return false; // Already deleted
|
|
103
|
+
}
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Check if lock file exists
|
|
110
|
+
* @param {string} specName - Name of the Spec
|
|
111
|
+
* @returns {Promise<boolean>}
|
|
112
|
+
*/
|
|
113
|
+
async exists(specName) {
|
|
114
|
+
const lockPath = this._getLockPath(specName);
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
await fs.access(lockPath);
|
|
118
|
+
return true;
|
|
119
|
+
} catch {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* List all Specs with lock files
|
|
126
|
+
* @returns {Promise<string[]>}
|
|
127
|
+
*/
|
|
128
|
+
async listLockedSpecs() {
|
|
129
|
+
const lockedSpecs = [];
|
|
130
|
+
|
|
131
|
+
try {
|
|
132
|
+
const entries = await fs.readdir(this.specsDir, { withFileTypes: true });
|
|
133
|
+
|
|
134
|
+
for (const entry of entries) {
|
|
135
|
+
if (entry.isDirectory()) {
|
|
136
|
+
const lockPath = path.join(this.specsDir, entry.name, LOCK_FILE_NAME);
|
|
137
|
+
try {
|
|
138
|
+
await fs.access(lockPath);
|
|
139
|
+
lockedSpecs.push(entry.name);
|
|
140
|
+
} catch {
|
|
141
|
+
// No lock file
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
} catch (error) {
|
|
146
|
+
if (error.code !== 'ENOENT') {
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return lockedSpecs;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Validate lock metadata structure
|
|
156
|
+
* @param {Object} metadata
|
|
157
|
+
* @returns {boolean}
|
|
158
|
+
* @private
|
|
159
|
+
*/
|
|
160
|
+
_isValidMetadata(metadata) {
|
|
161
|
+
return (
|
|
162
|
+
metadata &&
|
|
163
|
+
typeof metadata.owner === 'string' &&
|
|
164
|
+
typeof metadata.machineId === 'string' &&
|
|
165
|
+
typeof metadata.hostname === 'string' &&
|
|
166
|
+
typeof metadata.timestamp === 'string' &&
|
|
167
|
+
typeof metadata.timeout === 'number' &&
|
|
168
|
+
metadata.owner.length > 0 &&
|
|
169
|
+
metadata.machineId.length > 0
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Normalize metadata with default values for optional fields
|
|
175
|
+
* @param {Object} metadata
|
|
176
|
+
* @returns {LockMetadata}
|
|
177
|
+
* @private
|
|
178
|
+
*/
|
|
179
|
+
_normalizeMetadata(metadata) {
|
|
180
|
+
return {
|
|
181
|
+
owner: metadata.owner,
|
|
182
|
+
machineId: metadata.machineId,
|
|
183
|
+
hostname: metadata.hostname,
|
|
184
|
+
timestamp: metadata.timestamp,
|
|
185
|
+
reason: metadata.reason || null,
|
|
186
|
+
timeout: metadata.timeout,
|
|
187
|
+
version: metadata.version || LOCK_VERSION
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
module.exports = { LockFile, LOCK_FILE_NAME, LOCK_VERSION };
|