create-byan-agent 2.0.1 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/API-BYAN-V2.md +741 -0
- package/BMAD-QUICK-REFERENCE.md +370 -0
- package/CHANGELOG-v2.1.0.md +371 -0
- package/LICENSE +1 -1
- package/MIGRATION-v2.0-to-v2.1.md +430 -0
- package/README-BYAN-V2.md +446 -0
- package/README.md +264 -201
- package/install/.eslintrc.js +20 -0
- package/install/.prettierrc +7 -0
- package/install/BUGFIX-CHALK.md +173 -0
- package/install/BUGFIX-DOCUMENTATION-INDEX.md +299 -0
- package/install/BUGFIX-PATH-RESOLUTION.md +293 -0
- package/install/BUGFIX-QUICKSTART.md +184 -0
- package/install/BUGFIX-SUMMARY.txt +91 -0
- package/install/BUGFIX-VISUAL-SUMMARY.md +253 -0
- package/install/DEPLOYMENT-GUIDE-V2.md +431 -0
- package/install/DOCS-INDEX.md +261 -0
- package/install/GUIDE-INSTALLATION-BYAN-SIMPLE.md +1083 -0
- package/install/INSTALLER-V2-CHANGES.md +472 -0
- package/install/LICENSE +21 -0
- package/install/PUBLICATION-CHECKLIST.md +265 -0
- package/install/PUBLISH-GUIDE.md +190 -0
- package/install/QUICKSTART.md +311 -0
- package/install/README-NPM-PUBLISH.md +298 -0
- package/install/README-NPM-SHORT.md +298 -0
- package/install/README-NPM.md +433 -0
- package/install/README-RACHID.md +302 -0
- package/install/README-V2-INDEX.md +306 -0
- package/install/README.md +298 -0
- package/install/RESUME-EXECUTIF-YAN.md +408 -0
- package/install/UPDATE-SUMMARY.md +205 -0
- package/install/__tests__/integration/detection-flow.test.js +154 -0
- package/install/__tests__/platforms/claude-code.test.js +175 -0
- package/install/__tests__/platforms/codex.test.js +80 -0
- package/install/__tests__/platforms/copilot-cli.test.js +118 -0
- package/install/__tests__/platforms/vscode.test.js +67 -0
- package/install/__tests__/utils/file-utils.test.js +87 -0
- package/install/__tests__/utils/git-detector.test.js +80 -0
- package/install/__tests__/utils/logger.test.js +83 -0
- package/install/__tests__/utils/node-detector.test.js +71 -0
- package/install/__tests__/utils/os-detector.test.js +63 -0
- package/install/__tests__/utils/yaml-utils.test.js +85 -0
- package/install/__tests__/yanstaller/detector.test.js +210 -0
- package/install/coverage/clover.xml +219 -0
- package/install/coverage/coverage-final.json +13 -0
- package/install/coverage/lcov-report/base.css +224 -0
- package/install/coverage/lcov-report/block-navigation.js +87 -0
- package/install/coverage/lcov-report/favicon.png +0 -0
- package/install/coverage/lcov-report/index.html +146 -0
- package/install/coverage/lcov-report/lib/errors.js.html +268 -0
- package/install/coverage/lcov-report/lib/exit-codes.js.html +247 -0
- package/install/coverage/lcov-report/lib/index.html +131 -0
- package/install/coverage/lcov-report/lib/platforms/claude-code.js.html +343 -0
- package/install/coverage/lcov-report/lib/platforms/codex.js.html +361 -0
- package/install/coverage/lcov-report/lib/platforms/copilot-cli.js.html +454 -0
- package/install/coverage/lcov-report/lib/platforms/index.html +176 -0
- package/install/coverage/lcov-report/lib/platforms/index.js.html +127 -0
- package/install/coverage/lcov-report/lib/platforms/vscode.js.html +238 -0
- package/install/coverage/lcov-report/lib/utils/config-loader.js.html +322 -0
- package/install/coverage/lcov-report/lib/utils/file-utils.js.html +397 -0
- package/install/coverage/lcov-report/lib/utils/git-detector.js.html +190 -0
- package/install/coverage/lcov-report/lib/utils/index.html +206 -0
- package/install/coverage/lcov-report/lib/utils/logger.js.html +277 -0
- package/install/coverage/lcov-report/lib/utils/node-detector.js.html +259 -0
- package/install/coverage/lcov-report/lib/utils/os-detector.js.html +307 -0
- package/install/coverage/lcov-report/lib/utils/yaml-utils.js.html +346 -0
- package/install/coverage/lcov-report/lib/yanstaller/backuper.js.html +409 -0
- package/install/coverage/lcov-report/lib/yanstaller/detector.js.html +508 -0
- package/install/coverage/lcov-report/lib/yanstaller/index.html +236 -0
- package/install/coverage/lcov-report/lib/yanstaller/index.js.html +364 -0
- package/install/coverage/lcov-report/lib/yanstaller/installer.js.html +505 -0
- package/install/coverage/lcov-report/lib/yanstaller/interviewer.js.html +349 -0
- package/install/coverage/lcov-report/lib/yanstaller/recommender.js.html +379 -0
- package/install/coverage/lcov-report/lib/yanstaller/troubleshooter.js.html +352 -0
- package/install/coverage/lcov-report/lib/yanstaller/validator.js.html +679 -0
- package/install/coverage/lcov-report/lib/yanstaller/wizard.js.html +412 -0
- package/install/coverage/lcov-report/platforms/claude-code.js.html +343 -0
- package/install/coverage/lcov-report/platforms/codex.js.html +361 -0
- package/install/coverage/lcov-report/platforms/copilot-cli.js.html +454 -0
- package/install/coverage/lcov-report/platforms/index.html +176 -0
- package/install/coverage/lcov-report/platforms/index.js.html +127 -0
- package/install/coverage/lcov-report/platforms/vscode.js.html +238 -0
- package/install/coverage/lcov-report/prettify.css +1 -0
- package/install/coverage/lcov-report/prettify.js +2 -0
- package/install/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/install/coverage/lcov-report/sorter.js +210 -0
- package/install/coverage/lcov-report/utils/file-utils.js.html +397 -0
- package/install/coverage/lcov-report/utils/git-detector.js.html +190 -0
- package/install/coverage/lcov-report/utils/index.html +191 -0
- package/install/coverage/lcov-report/utils/logger.js.html +277 -0
- package/install/coverage/lcov-report/utils/node-detector.js.html +259 -0
- package/install/coverage/lcov-report/utils/os-detector.js.html +307 -0
- package/install/coverage/lcov-report/utils/yaml-utils.js.html +346 -0
- package/install/coverage/lcov-report/yanstaller/detector.js.html +508 -0
- package/install/coverage/lcov-report/yanstaller/index.html +116 -0
- package/install/coverage/lcov.info +414 -0
- package/install/install.sh +239 -0
- package/install/jest.config.js +33 -0
- package/install/lib/errors.js +61 -0
- package/install/lib/exit-codes.js +54 -0
- package/install/lib/platforms/claude-code.js +86 -0
- package/install/lib/platforms/codex.js +92 -0
- package/install/lib/platforms/copilot-cli.js +123 -0
- package/install/lib/platforms/index.js +14 -0
- package/install/lib/platforms/vscode.js +51 -0
- package/install/lib/utils/config-loader.js +79 -0
- package/install/lib/utils/file-utils.js +104 -0
- package/install/lib/utils/git-detector.js +35 -0
- package/install/lib/utils/logger.js +64 -0
- package/install/lib/utils/node-detector.js +58 -0
- package/install/lib/utils/os-detector.js +74 -0
- package/install/lib/utils/yaml-utils.js +87 -0
- package/install/lib/yanstaller/backuper.js +108 -0
- package/install/lib/yanstaller/detector.js +141 -0
- package/install/lib/yanstaller/index.js +93 -0
- package/install/lib/yanstaller/installer.js +140 -0
- package/install/lib/yanstaller/interviewer.js +88 -0
- package/install/lib/yanstaller/recommender.js +98 -0
- package/install/lib/yanstaller/troubleshooter.js +89 -0
- package/install/lib/yanstaller/validator.js +198 -0
- package/install/lib/yanstaller/wizard.js +109 -0
- package/install/package-npm.json +55 -0
- package/install/package.json +63 -0
- package/install/src/byan-v2/context/copilot-context.js +79 -0
- package/install/src/byan-v2/context/session-state.js +98 -0
- package/install/src/byan-v2/dispatcher/complexity-scorer.js +232 -0
- package/install/src/byan-v2/dispatcher/local-executor.js +221 -0
- package/install/src/byan-v2/dispatcher/task-router.js +122 -0
- package/install/src/byan-v2/dispatcher/task-tool-interface-mock.js +134 -0
- package/install/src/byan-v2/dispatcher/task-tool-interface.js +123 -0
- package/install/src/byan-v2/generation/agent-profile-validator.js +113 -0
- package/install/src/byan-v2/generation/profile-template.js +113 -0
- package/install/src/byan-v2/generation/templates/default-agent.md +49 -0
- package/install/src/byan-v2/generation/templates/test-template.md +1 -0
- package/install/src/byan-v2/index.js +199 -0
- package/install/src/byan-v2/observability/error-tracker.js +105 -0
- package/install/src/byan-v2/observability/logger.js +154 -0
- package/install/src/byan-v2/observability/metrics-collector.js +194 -0
- package/install/src/byan-v2/orchestrator/analysis-state.js +268 -0
- package/install/src/byan-v2/orchestrator/generation-state.js +340 -0
- package/install/src/byan-v2/orchestrator/interview-state.js +271 -0
- package/install/src/byan-v2/orchestrator/state-machine.js +204 -0
- package/install/src/core/cache/cache.js +126 -0
- package/install/src/core/context/context.js +86 -0
- package/install/src/core/dispatcher/dispatcher.js +135 -0
- package/install/src/core/worker-pool/worker-pool.js +194 -0
- package/install/src/core/workflow/workflow-executor.js +220 -0
- package/install/src/index.js +139 -0
- package/install/src/observability/dashboard/dashboard.js +191 -0
- package/install/src/observability/logger/structured-logger.js +254 -0
- package/install/src/observability/metrics/metrics-collector.js +325 -0
- package/install/switch-to-v2.sh +126 -0
- package/install/test-chalk-fix.sh +210 -0
- package/install/test-installer-v2.sh +204 -0
- package/install/test-path-resolution.sh +200 -0
- package/package.json +53 -33
- package/src/byan-v2/context/copilot-context.js +79 -0
- package/src/byan-v2/context/session-state.js +98 -0
- package/src/byan-v2/data/mantras.json +852 -0
- package/src/byan-v2/dispatcher/complexity-scorer.js +232 -0
- package/src/byan-v2/dispatcher/five-whys-analyzer.js +310 -0
- package/src/byan-v2/dispatcher/local-executor.js +221 -0
- package/src/byan-v2/dispatcher/task-router.js +122 -0
- package/src/byan-v2/dispatcher/task-tool-interface-mock.js +134 -0
- package/src/byan-v2/dispatcher/task-tool-interface.js +123 -0
- package/src/byan-v2/generation/agent-profile-validator.js +113 -0
- package/src/byan-v2/generation/mantra-validator.js +416 -0
- package/src/byan-v2/generation/profile-template.js +113 -0
- package/src/byan-v2/generation/templates/default-agent.md +49 -0
- package/src/byan-v2/generation/templates/test-template.md +1 -0
- package/src/byan-v2/index.js +652 -0
- package/src/byan-v2/integration/voice-integration.js +295 -0
- package/src/byan-v2/observability/error-tracker.js +105 -0
- package/src/byan-v2/observability/logger.js +154 -0
- package/src/byan-v2/observability/metrics-collector.js +194 -0
- package/src/byan-v2/orchestrator/active-listener.js +541 -0
- package/src/byan-v2/orchestrator/analysis-state.js +268 -0
- package/src/byan-v2/orchestrator/generation-state.js +340 -0
- package/src/byan-v2/orchestrator/glossary-builder.js +431 -0
- package/src/byan-v2/orchestrator/interview-state.js +353 -0
- package/src/byan-v2/orchestrator/state-machine.js +253 -0
- package/src/core/cache/cache.js +126 -0
- package/src/core/context/context.js +86 -0
- package/src/core/dispatcher/dispatcher.js +135 -0
- package/src/core/worker-pool/worker-pool.js +194 -0
- package/src/core/workflow/workflow-executor.js +220 -0
- package/src/index.js +139 -0
- package/src/observability/dashboard/dashboard.js +191 -0
- package/src/observability/logger/structured-logger.js +254 -0
- package/src/observability/metrics/metrics-collector.js +325 -0
- package/templates/.github/agents/bmad-agent-test-dynamic.md +0 -21
- package/templates/.github/agents/franck.md +0 -379
- /package/{CHANGELOG.md → install/CHANGELOG.md} +0 -0
- /package/{bin → install/bin}/create-byan-agent-backup.js +0 -0
- /package/{bin → install/bin}/create-byan-agent-fixed.js +0 -0
- /package/{bin → install/bin}/create-byan-agent-v2.js +0 -0
- /package/{bin → install/bin}/create-byan-agent.js +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmad-master.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-agent-builder.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-module-builder.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-workflow-builder.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-analyst.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-architect.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-dev.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-pm.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-quick-flow-solo-dev.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-quinn.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-sm.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-tech-writer.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-ux-designer.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-byan-test.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-byan.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-carmack.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-brainstorming-coach.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-creative-problem-solver.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-design-thinking-coach.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-innovation-strategist.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-presentation-master.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-storyteller.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-marc.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-patnote.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-rachid.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-tea-tea.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/agent-builder.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/byan-test.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/byan.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/marc.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/module-builder.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/patnote.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/rachid.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/workflow-builder.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/data/mantras.yaml +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/data/templates.yaml +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/delete-agent-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/edit-agent-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/interview-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/quick-create-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/templates/base-agent-template.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/validate-agent-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/core/agents/carmack.md +0 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GlossaryBuilder - Interactive business glossary creation
|
|
3
|
+
* Mantra #33: Data Dictionary First
|
|
4
|
+
*
|
|
5
|
+
* Principles: KISS, DRY, SOLID
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const Logger = require('../observability/logger');
|
|
9
|
+
|
|
10
|
+
class GlossaryBuilder {
|
|
11
|
+
constructor(sessionState, logger = null) {
|
|
12
|
+
this.sessionState = sessionState;
|
|
13
|
+
this.logger = logger || new Logger('glossary-builder');
|
|
14
|
+
this.concepts = [];
|
|
15
|
+
this.minConcepts = 5;
|
|
16
|
+
this.minDefinitionLength = 20;
|
|
17
|
+
this.clarityThreshold = 0.7;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
start() {
|
|
21
|
+
this.logger.info('Starting glossary creation');
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
prompt: "Let's build a business glossary - a shared vocabulary that ensures clear communication.",
|
|
25
|
+
instructions: [
|
|
26
|
+
`I need at least ${this.minConcepts} core concepts from your domain.`,
|
|
27
|
+
'For each concept, provide:',
|
|
28
|
+
' - Name (e.g., "order", "customer", "product")',
|
|
29
|
+
' - Clear definition (minimum 20 characters)',
|
|
30
|
+
' - Examples are helpful but not required',
|
|
31
|
+
'',
|
|
32
|
+
'I will validate each definition and suggest related concepts you might have missed.'
|
|
33
|
+
].join('\n')
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
addConcept(name, definition) {
|
|
38
|
+
const validatedName = this._validateName(name);
|
|
39
|
+
if (!validatedName.valid) {
|
|
40
|
+
return { valid: false, issues: validatedName.issues };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Check for duplicates
|
|
44
|
+
if (this.concepts.some(c => c.name === validatedName.normalized)) {
|
|
45
|
+
return { valid: false, issues: ['Concept already exists'] };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const validatedDef = this.validateDefinition(definition);
|
|
49
|
+
if (!validatedDef.valid) {
|
|
50
|
+
return {
|
|
51
|
+
valid: false,
|
|
52
|
+
issues: validatedDef.issues,
|
|
53
|
+
challenge: this.challengeDefinition(definition)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const concept = {
|
|
58
|
+
name: validatedName.normalized,
|
|
59
|
+
definition: definition.trim(),
|
|
60
|
+
clarityScore: validatedDef.clarityScore,
|
|
61
|
+
relatedConcepts: [],
|
|
62
|
+
addedAt: new Date().toISOString()
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
this.concepts.push(concept);
|
|
66
|
+
this.logger.info('Concept added', { name: concept.name, clarityScore: concept.clarityScore });
|
|
67
|
+
|
|
68
|
+
const suggestions = this.suggestRelatedConcepts(this.concepts);
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
valid: true,
|
|
72
|
+
concept,
|
|
73
|
+
suggestions,
|
|
74
|
+
progress: `${this.concepts.length}/${this.minConcepts} concepts`
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
validateDefinition(definition) {
|
|
79
|
+
const issues = [];
|
|
80
|
+
|
|
81
|
+
if (!definition || typeof definition !== 'string') {
|
|
82
|
+
return { valid: false, clarityScore: 0, issues: ['Definition is required'] };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const trimmed = definition.trim();
|
|
86
|
+
|
|
87
|
+
if (trimmed.length < this.minDefinitionLength) {
|
|
88
|
+
issues.push(`Definition too short (min ${this.minDefinitionLength} characters)`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const clarityScore = this._calculateClarityScore(trimmed);
|
|
92
|
+
|
|
93
|
+
if (clarityScore < this.clarityThreshold) {
|
|
94
|
+
issues.push('Definition is too vague or ambiguous');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
valid: issues.length === 0,
|
|
99
|
+
clarityScore,
|
|
100
|
+
issues
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
_calculateClarityScore(definition) {
|
|
105
|
+
let score = 0;
|
|
106
|
+
let weights = 0;
|
|
107
|
+
|
|
108
|
+
const lengthScore = this._calculateLengthScore(definition.length);
|
|
109
|
+
score += lengthScore * 0.3;
|
|
110
|
+
weights += 0.3;
|
|
111
|
+
|
|
112
|
+
const specificityScore = this._calculateSpecificityScore(definition);
|
|
113
|
+
score += specificityScore * 0.3;
|
|
114
|
+
weights += 0.3;
|
|
115
|
+
|
|
116
|
+
const exampleScore = this._hasExamples(definition) ? 1.0 : 0.0;
|
|
117
|
+
score += exampleScore * 0.2;
|
|
118
|
+
weights += 0.2;
|
|
119
|
+
|
|
120
|
+
const ambiguityPenalty = this._calculateAmbiguityPenalty(definition);
|
|
121
|
+
score += ambiguityPenalty * 0.2;
|
|
122
|
+
weights += 0.2;
|
|
123
|
+
|
|
124
|
+
return Math.max(0, Math.min(1, score / weights));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
_calculateLengthScore(length) {
|
|
128
|
+
if (length < 20) return 0.0;
|
|
129
|
+
if (length >= 50 && length <= 200) return 1.0;
|
|
130
|
+
if (length > 200) return 0.5;
|
|
131
|
+
return length / 50;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
_calculateSpecificityScore(definition) {
|
|
135
|
+
const specificTerms = [
|
|
136
|
+
'when', 'after', 'before', 'contains', 'includes',
|
|
137
|
+
'must', 'should', 'can', 'will', 'has', 'is',
|
|
138
|
+
'created', 'updated', 'deleted', 'processed'
|
|
139
|
+
];
|
|
140
|
+
|
|
141
|
+
const lowerDef = definition.toLowerCase();
|
|
142
|
+
const foundTerms = specificTerms.filter(term => lowerDef.includes(term));
|
|
143
|
+
|
|
144
|
+
return Math.min(1.0, foundTerms.length / 3);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
_hasExamples(definition) {
|
|
148
|
+
const exampleIndicators = ['e.g.', 'example:', 'for example', 'such as', 'like'];
|
|
149
|
+
const lowerDef = definition.toLowerCase();
|
|
150
|
+
return exampleIndicators.some(indicator => lowerDef.includes(indicator));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
_calculateAmbiguityPenalty(definition) {
|
|
154
|
+
const ambiguousTerms = ['maybe', 'could be', 'sometimes', 'might', 'possibly', 'perhaps'];
|
|
155
|
+
const lowerDef = definition.toLowerCase();
|
|
156
|
+
const ambiguousCount = ambiguousTerms.filter(term => lowerDef.includes(term)).length;
|
|
157
|
+
|
|
158
|
+
return Math.max(0, 1.0 - (ambiguousCount * 0.3));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
challengeDefinition(definition) {
|
|
162
|
+
const suggestions = [
|
|
163
|
+
'Specify what makes it unique',
|
|
164
|
+
'Add concrete examples',
|
|
165
|
+
'Describe the boundaries or constraints',
|
|
166
|
+
'Explain relationships to other concepts'
|
|
167
|
+
];
|
|
168
|
+
|
|
169
|
+
// Check length first (most specific)
|
|
170
|
+
if (definition.length < 30) {
|
|
171
|
+
return {
|
|
172
|
+
reason: 'Definition is too vague and needs more detail',
|
|
173
|
+
suggestions: ['Expand on the definition with more context', ...suggestions]
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Then check for ambiguous terms
|
|
178
|
+
const ambiguousTerms = ['maybe', 'could be', 'sometimes', 'might', 'possibly', 'perhaps'];
|
|
179
|
+
const lowerDef = definition.toLowerCase();
|
|
180
|
+
if (ambiguousTerms.some(term => lowerDef.includes(term))) {
|
|
181
|
+
return {
|
|
182
|
+
reason: 'Definition contains ambiguous terms',
|
|
183
|
+
suggestions: ['Remove uncertain language', 'Be more precise', ...suggestions]
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Then check for examples
|
|
188
|
+
if (!this._hasExamples(definition)) {
|
|
189
|
+
return {
|
|
190
|
+
reason: 'Definition lacks concrete examples',
|
|
191
|
+
suggestions: ['Provide a concrete example', ...suggestions]
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const challenges = [
|
|
196
|
+
'Can you be more specific about when or how this is used?',
|
|
197
|
+
'What distinguishes this from related concepts?',
|
|
198
|
+
'What are the key characteristics that define this?',
|
|
199
|
+
'When does something become this vs something else?'
|
|
200
|
+
];
|
|
201
|
+
|
|
202
|
+
return {
|
|
203
|
+
reason: 'Definition could be clearer',
|
|
204
|
+
suggestions: [challenges[Math.floor(Math.random() * challenges.length)], ...suggestions]
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
suggestRelatedConcepts(existingConcepts) {
|
|
209
|
+
if (existingConcepts.length === 0) return [];
|
|
210
|
+
|
|
211
|
+
const domainPatterns = {
|
|
212
|
+
ecommerce: {
|
|
213
|
+
triggers: ['order', 'product', 'cart', 'customer', 'payment'],
|
|
214
|
+
suggestions: [
|
|
215
|
+
{ name: 'inventory', rationale: 'Track product availability and stock levels' },
|
|
216
|
+
{ name: 'shipping', rationale: 'Manage delivery and logistics for orders' },
|
|
217
|
+
{ name: 'discount', rationale: 'Apply promotional pricing to products' },
|
|
218
|
+
{ name: 'refund', rationale: 'Process returns and money back to customers' },
|
|
219
|
+
{ name: 'checkout', rationale: 'Complete the purchase transaction' }
|
|
220
|
+
]
|
|
221
|
+
},
|
|
222
|
+
finance: {
|
|
223
|
+
triggers: ['account', 'transaction', 'balance', 'transfer', 'payment'],
|
|
224
|
+
suggestions: [
|
|
225
|
+
{ name: 'reconciliation', rationale: 'Match transactions with bank records' },
|
|
226
|
+
{ name: 'statement', rationale: 'Summarize account activity' },
|
|
227
|
+
{ name: 'fee', rationale: 'Track service charges' },
|
|
228
|
+
{ name: 'interest', rationale: 'Calculate earnings on balances' },
|
|
229
|
+
{ name: 'deposit', rationale: 'Add funds to accounts' }
|
|
230
|
+
]
|
|
231
|
+
},
|
|
232
|
+
healthcare: {
|
|
233
|
+
triggers: ['patient', 'appointment', 'prescription', 'diagnosis', 'treatment'],
|
|
234
|
+
suggestions: [
|
|
235
|
+
{ name: 'medication', rationale: 'Prescribed drugs for treatment' },
|
|
236
|
+
{ name: 'provider', rationale: 'Healthcare professional giving care' },
|
|
237
|
+
{ name: 'insurance', rationale: 'Coverage for medical costs' },
|
|
238
|
+
{ name: 'record', rationale: 'Patient medical history' },
|
|
239
|
+
{ name: 'visit', rationale: 'Patient-provider encounter' }
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
software: {
|
|
243
|
+
triggers: ['user', 'session', 'authentication', 'authorization', 'role'],
|
|
244
|
+
suggestions: [
|
|
245
|
+
{ name: 'permission', rationale: 'Access rights to features' },
|
|
246
|
+
{ name: 'token', rationale: 'Credential for API access' },
|
|
247
|
+
{ name: 'profile', rationale: 'User information and preferences' },
|
|
248
|
+
{ name: 'settings', rationale: 'User configuration options' },
|
|
249
|
+
{ name: 'notification', rationale: 'Alert user of events' }
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
const existingNames = existingConcepts.map(c => c.name.toLowerCase());
|
|
255
|
+
|
|
256
|
+
for (const [domain, pattern] of Object.entries(domainPatterns)) {
|
|
257
|
+
const matchCount = pattern.triggers.filter(t => existingNames.includes(t)).length;
|
|
258
|
+
|
|
259
|
+
if (matchCount >= 2) {
|
|
260
|
+
const suggestions = pattern.suggestions
|
|
261
|
+
.filter(s => !existingNames.includes(s.name))
|
|
262
|
+
.slice(0, 5);
|
|
263
|
+
|
|
264
|
+
if (suggestions.length > 0) {
|
|
265
|
+
this.logger.info('Domain detected', { domain, suggestions: suggestions.map(s => s.name) });
|
|
266
|
+
return suggestions;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return [];
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
isComplete() {
|
|
275
|
+
if (this.concepts.length < this.minConcepts) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const validConcepts = this.concepts.filter(c => c.clarityScore >= this.clarityThreshold);
|
|
280
|
+
return validConcepts.length >= this.minConcepts;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
getConceptCount() {
|
|
284
|
+
return this.concepts.length;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
getConcepts() {
|
|
288
|
+
return [...this.concepts];
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
getCompletionStatus() {
|
|
292
|
+
return {
|
|
293
|
+
current: this.concepts.length,
|
|
294
|
+
required: this.minConcepts,
|
|
295
|
+
percentage: Math.round((this.concepts.length / this.minConcepts) * 100),
|
|
296
|
+
complete: this.isComplete()
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
_shouldTriggerForDomain(sessionData) {
|
|
301
|
+
if (!sessionData || !sessionData.domain) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const supportedDomains = ['ecommerce', 'finance', 'healthcare', 'software'];
|
|
306
|
+
return supportedDomains.includes(sessionData.domain.toLowerCase());
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
getDomainSuggestions(domain) {
|
|
310
|
+
const domainSuggestions = {
|
|
311
|
+
ecommerce: ['order', 'product', 'cart', 'customer', 'payment', 'inventory', 'shipping'],
|
|
312
|
+
finance: ['account', 'transaction', 'balance', 'transfer', 'payment', 'reconciliation'],
|
|
313
|
+
healthcare: ['patient', 'appointment', 'prescription', 'diagnosis', 'treatment', 'medication'],
|
|
314
|
+
software: ['user', 'session', 'authentication', 'authorization', 'role', 'permission']
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
return domainSuggestions[domain.toLowerCase()] || [];
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export() {
|
|
321
|
+
const domain = this._detectDomain();
|
|
322
|
+
|
|
323
|
+
return {
|
|
324
|
+
version: '1.0.0',
|
|
325
|
+
createdAt: new Date().toISOString(),
|
|
326
|
+
domain,
|
|
327
|
+
conceptCount: this.concepts.length,
|
|
328
|
+
concepts: this.concepts.map(c => ({
|
|
329
|
+
name: c.name,
|
|
330
|
+
definition: c.definition,
|
|
331
|
+
clarityScore: c.clarityScore,
|
|
332
|
+
addedAt: c.addedAt
|
|
333
|
+
})),
|
|
334
|
+
metadata: {
|
|
335
|
+
totalConcepts: this.concepts.length,
|
|
336
|
+
complete: this.isComplete(),
|
|
337
|
+
minRequired: this.minConcepts
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
exportAsMarkdown() {
|
|
343
|
+
const domain = this._detectDomain();
|
|
344
|
+
const lines = [
|
|
345
|
+
'# Business Glossary',
|
|
346
|
+
'',
|
|
347
|
+
`**Domain:** ${domain}`,
|
|
348
|
+
`**Concepts:** ${this.concepts.length}`,
|
|
349
|
+
`**Status:** ${this.isComplete() ? 'Complete' : 'In Progress'}`,
|
|
350
|
+
'',
|
|
351
|
+
'---',
|
|
352
|
+
''
|
|
353
|
+
];
|
|
354
|
+
|
|
355
|
+
this.concepts.forEach(concept => {
|
|
356
|
+
lines.push(`## ${concept.name}`);
|
|
357
|
+
lines.push('');
|
|
358
|
+
lines.push(concept.definition);
|
|
359
|
+
lines.push('');
|
|
360
|
+
lines.push(`*Clarity Score: ${concept.clarityScore.toFixed(2)}*`);
|
|
361
|
+
lines.push('');
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
return lines.join('\n');
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
exportAsJSON() {
|
|
368
|
+
return JSON.stringify(this.export(), null, 2);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
_detectDomain() {
|
|
372
|
+
const conceptNames = this.concepts.map(c => c.name.toLowerCase());
|
|
373
|
+
|
|
374
|
+
const domainKeywords = {
|
|
375
|
+
ecommerce: ['order', 'product', 'cart', 'customer', 'payment', 'shipping'],
|
|
376
|
+
finance: ['account', 'transaction', 'balance', 'payment', 'transfer'],
|
|
377
|
+
healthcare: ['patient', 'appointment', 'prescription', 'diagnosis'],
|
|
378
|
+
software: ['user', 'session', 'authentication', 'role', 'permission']
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
let maxMatch = 0;
|
|
382
|
+
let detectedDomain = 'general';
|
|
383
|
+
|
|
384
|
+
for (const [domain, keywords] of Object.entries(domainKeywords)) {
|
|
385
|
+
const matchCount = keywords.filter(k => conceptNames.includes(k)).length;
|
|
386
|
+
if (matchCount > maxMatch) {
|
|
387
|
+
maxMatch = matchCount;
|
|
388
|
+
detectedDomain = domain;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
return maxMatch >= 2 ? detectedDomain : 'general';
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
_validateName(name) {
|
|
396
|
+
if (!name || typeof name !== 'string') {
|
|
397
|
+
return { valid: false, issues: ['Name is required'] };
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
const trimmed = name.trim();
|
|
401
|
+
if (trimmed.length === 0) {
|
|
402
|
+
return { valid: false, issues: ['Name is required'] };
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const normalized = trimmed.toLowerCase().replace(/\s+/g, '-');
|
|
406
|
+
|
|
407
|
+
// Allow alphanumeric and hyphens, must start with letter
|
|
408
|
+
if (!/^[a-z]/.test(normalized)) {
|
|
409
|
+
return {
|
|
410
|
+
valid: false,
|
|
411
|
+
issues: ['Name must start with a letter']
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Check for invalid characters (allow letters, numbers, hyphens)
|
|
416
|
+
if (!/^[a-z][a-z0-9-]*$/.test(normalized)) {
|
|
417
|
+
return {
|
|
418
|
+
valid: false,
|
|
419
|
+
issues: ['Name contains invalid characters. Use only letters, numbers, and hyphens']
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (this.concepts.some(c => c.name === normalized)) {
|
|
424
|
+
return { valid: false, issues: ['Concept already exists'] };
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return { valid: true, normalized };
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
module.exports = GlossaryBuilder;
|