mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-28 09:23:08 +08:00
- Implemented `planner` role for solution design and task decomposition using issue-plan-agent. - Introduced `reviewer` role for solution review, technical feasibility validation, and risk assessment. - Created `integrator` role for queue formation and conflict detection using issue-queue-agent. - Added `implementer` role for code implementation and test verification via code-developer. - Defined message types and role boundaries for each role to ensure clear responsibilities. - Established a team configuration file to manage roles, pipelines, and collaboration patterns for the issue processing pipeline.
494 lines
20 KiB
Markdown
494 lines
20 KiB
Markdown
# Phase 2: Test Context Gather (test-context-gather)
|
|
|
|
Gather test context via coverage analysis or codebase scan.
|
|
|
|
## Objective
|
|
|
|
- Gather test context (coverage analysis or codebase scan)
|
|
- Generate context package for downstream analysis
|
|
|
|
## Execution
|
|
|
|
### Step 1.2: Gather Test Context
|
|
|
|
Two modes are available depending on whether a source session exists:
|
|
|
|
---
|
|
|
|
### Mode A: Session Mode (gather from source session)
|
|
|
|
Collect test coverage context using test-context-search-agent and package into standardized test-context JSON.
|
|
|
|
#### Core Philosophy
|
|
|
|
- **Agent Delegation**: Delegate all test coverage analysis to `test-context-search-agent` for autonomous execution
|
|
- **Detection-First**: Check for existing test-context-package before executing
|
|
- **Coverage-First**: Analyze existing test coverage before planning new tests
|
|
- **Source Context Loading**: Import implementation summaries from source session
|
|
- **Standardized Output**: Generate `.workflow/active/{test_session_id}/.process/test-context-package.json`
|
|
|
|
#### Step A.1: Test-Context-Package Detection
|
|
|
|
**Execute First** - Check if valid package already exists:
|
|
|
|
```javascript
|
|
const testContextPath = `.workflow/${test_session_id}/.process/test-context-package.json`;
|
|
|
|
if (file_exists(testContextPath)) {
|
|
const existing = Read(testContextPath);
|
|
|
|
// Validate package belongs to current test session
|
|
if (existing?.metadata?.test_session_id === test_session_id) {
|
|
console.log("Valid test-context-package found for session:", test_session_id);
|
|
console.log("Coverage Stats:", existing.test_coverage.coverage_stats);
|
|
console.log("Framework:", existing.test_framework.framework);
|
|
console.log("Missing Tests:", existing.test_coverage.missing_tests.length);
|
|
return existing; // Skip execution, return existing
|
|
} else {
|
|
console.warn("Invalid test_session_id in existing package, re-generating...");
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Step A.2: Invoke Test-Context-Search Agent
|
|
|
|
**Only execute if Step A.1 finds no valid package**
|
|
|
|
```javascript
|
|
Task(
|
|
subagent_type="test-context-search-agent",
|
|
run_in_background=false,
|
|
description="Gather test coverage context",
|
|
prompt=`
|
|
|
|
## Execution Mode
|
|
**PLAN MODE** (Comprehensive) - Full Phase 1-3 execution
|
|
|
|
## Session Information
|
|
- **Test Session ID**: ${test_session_id}
|
|
- **Output Path**: .workflow/${test_session_id}/.process/test-context-package.json
|
|
|
|
## Mission
|
|
Execute complete test-context-search-agent workflow for test generation planning:
|
|
|
|
### Phase 1: Session Validation & Source Context Loading
|
|
1. **Detection**: Check for existing test-context-package (early exit if valid)
|
|
2. **Test Session Validation**: Load test session metadata, extract source_session reference
|
|
3. **Source Context Loading**: Load source session implementation summaries, changed files, tech stack
|
|
|
|
### Phase 2: Test Coverage Analysis
|
|
Execute coverage discovery:
|
|
- **Track 1**: Existing test discovery (find *.test.*, *.spec.* files)
|
|
- **Track 2**: Coverage gap analysis (match implementation files to test files)
|
|
- **Track 3**: Coverage statistics (calculate percentages, identify gaps by module)
|
|
|
|
### Phase 3: Framework Detection & Packaging
|
|
1. Framework identification from package.json/requirements.txt
|
|
2. Convention analysis from existing test patterns
|
|
3. Generate and validate test-context-package.json
|
|
|
|
## Output Requirements
|
|
Complete test-context-package.json with:
|
|
- **metadata**: test_session_id, source_session_id, task_type, complexity
|
|
- **source_context**: implementation_summaries, tech_stack, project_patterns
|
|
- **test_coverage**: existing_tests[], missing_tests[], coverage_stats
|
|
- **test_framework**: framework, version, test_pattern, conventions
|
|
- **assets**: implementation_summary[], existing_test[], source_code[] with priorities
|
|
- **focus_areas**: Test generation guidance based on coverage gaps
|
|
|
|
## Quality Validation
|
|
Before completion verify:
|
|
- [ ] Valid JSON format with all required fields
|
|
- [ ] Source session context loaded successfully
|
|
- [ ] Test coverage gaps identified
|
|
- [ ] Test framework detected (or marked as 'unknown')
|
|
- [ ] Coverage percentage calculated correctly
|
|
- [ ] Missing tests catalogued with priority
|
|
- [ ] Execution time < 30 seconds (< 60s for large codebases)
|
|
|
|
Execute autonomously following agent documentation.
|
|
Report completion with coverage statistics.
|
|
`
|
|
)
|
|
```
|
|
|
|
#### Step A.3: Output Verification
|
|
|
|
After agent completes, verify output:
|
|
|
|
```javascript
|
|
// Verify file was created
|
|
const outputPath = `.workflow/${test_session_id}/.process/test-context-package.json`;
|
|
if (!file_exists(outputPath)) {
|
|
throw new Error("Agent failed to generate test-context-package.json");
|
|
}
|
|
|
|
// Load and display summary
|
|
const testContext = Read(outputPath);
|
|
console.log("Test context package generated successfully");
|
|
console.log("Coverage:", testContext.test_coverage.coverage_stats.coverage_percentage + "%");
|
|
console.log("Tests to generate:", testContext.test_coverage.missing_tests.length);
|
|
```
|
|
|
|
---
|
|
|
|
### Mode B: Prompt Mode (gather from codebase)
|
|
|
|
Intelligently collect project context using context-search-agent based on task description, packages into standardized JSON.
|
|
|
|
#### Core Philosophy
|
|
|
|
- **Agent Delegation**: Delegate all discovery to `context-search-agent` for autonomous execution
|
|
- **Detection-First**: Check for existing context-package before executing
|
|
- **Plan Mode**: Full comprehensive analysis (vs lightweight brainstorm mode)
|
|
- **Standardized Output**: Generate `.workflow/active/{session}/.process/context-package.json`
|
|
|
|
#### Step B.1: Context-Package Detection
|
|
|
|
**Execute First** - Check if valid package already exists:
|
|
|
|
```javascript
|
|
const contextPackagePath = `.workflow/${session_id}/.process/context-package.json`;
|
|
|
|
if (file_exists(contextPackagePath)) {
|
|
const existing = Read(contextPackagePath);
|
|
|
|
// Validate package belongs to current session
|
|
if (existing?.metadata?.session_id === session_id) {
|
|
console.log("Valid context-package found for session:", session_id);
|
|
console.log("Stats:", existing.statistics);
|
|
console.log("Conflict Risk:", existing.conflict_detection.risk_level);
|
|
return existing; // Skip execution, return existing
|
|
} else {
|
|
console.warn("Invalid session_id in existing package, re-generating...");
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Step B.2: Complexity Assessment & Parallel Explore
|
|
|
|
**Only execute if Step B.1 finds no valid package**
|
|
|
|
```javascript
|
|
// B.2.1 Complexity Assessment
|
|
function analyzeTaskComplexity(taskDescription) {
|
|
const text = taskDescription.toLowerCase();
|
|
if (/architect|refactor|restructure|modular|cross-module/.test(text)) return 'High';
|
|
if (/multiple|several|integrate|migrate|extend/.test(text)) return 'Medium';
|
|
return 'Low';
|
|
}
|
|
|
|
const ANGLE_PRESETS = {
|
|
architecture: ['architecture', 'dependencies', 'modularity', 'integration-points'],
|
|
security: ['security', 'auth-patterns', 'dataflow', 'validation'],
|
|
performance: ['performance', 'bottlenecks', 'caching', 'data-access'],
|
|
bugfix: ['error-handling', 'dataflow', 'state-management', 'edge-cases'],
|
|
feature: ['patterns', 'integration-points', 'testing', 'dependencies'],
|
|
refactor: ['architecture', 'patterns', 'dependencies', 'testing']
|
|
};
|
|
|
|
function selectAngles(taskDescription, complexity) {
|
|
const text = taskDescription.toLowerCase();
|
|
let preset = 'feature';
|
|
if (/refactor|architect|restructure/.test(text)) preset = 'architecture';
|
|
else if (/security|auth|permission/.test(text)) preset = 'security';
|
|
else if (/performance|slow|optimi/.test(text)) preset = 'performance';
|
|
else if (/fix|bug|error|issue/.test(text)) preset = 'bugfix';
|
|
|
|
const count = complexity === 'High' ? 4 : (complexity === 'Medium' ? 3 : 1);
|
|
return ANGLE_PRESETS[preset].slice(0, count);
|
|
}
|
|
|
|
const complexity = analyzeTaskComplexity(task_description);
|
|
const selectedAngles = selectAngles(task_description, complexity);
|
|
const sessionFolder = `.workflow/active/${session_id}/.process`;
|
|
|
|
// B.2.2 Launch Parallel Explore Agents
|
|
const explorationTasks = selectedAngles.map((angle, index) =>
|
|
Task(
|
|
subagent_type="cli-explore-agent",
|
|
run_in_background=false,
|
|
description=`Explore: ${angle}`,
|
|
prompt=`
|
|
## Task Objective
|
|
Execute **${angle}** exploration for task planning context. Analyze codebase from this specific angle to discover relevant structure, patterns, and constraints.
|
|
|
|
## Assigned Context
|
|
- **Exploration Angle**: ${angle}
|
|
- **Task Description**: ${task_description}
|
|
- **Session ID**: ${session_id}
|
|
- **Exploration Index**: ${index + 1} of ${selectedAngles.length}
|
|
- **Output File**: ${sessionFolder}/exploration-${angle}.json
|
|
|
|
## MANDATORY FIRST STEPS (Execute by Agent)
|
|
1. Run: ccw tool exec get_modules_by_depth '{}' (project structure)
|
|
2. Run: rg -l "{keyword_from_task}" --type ts (locate relevant files)
|
|
3. Execute: cat ~/.ccw/workflows/cli-templates/schemas/explore-json-schema.json (get output schema reference)
|
|
|
|
## Exploration Strategy (${angle} focus)
|
|
|
|
**Step 1: Structural Scan** (Bash)
|
|
- get_modules_by_depth.sh -> identify modules related to ${angle}
|
|
- find/rg -> locate files relevant to ${angle} aspect
|
|
- Analyze imports/dependencies from ${angle} perspective
|
|
|
|
**Step 2: Semantic Analysis** (Gemini CLI)
|
|
- How does existing code handle ${angle} concerns?
|
|
- What patterns are used for ${angle}?
|
|
- Where would new code integrate from ${angle} viewpoint?
|
|
|
|
**Step 3: Write Output**
|
|
- Consolidate ${angle} findings into JSON
|
|
- Identify ${angle}-specific clarification needs
|
|
|
|
## Expected Output
|
|
|
|
**File**: ${sessionFolder}/exploration-${angle}.json
|
|
|
|
**Schema Reference**: Schema obtained in MANDATORY FIRST STEPS step 3, follow schema exactly
|
|
|
|
**Required Fields** (all ${angle} focused):
|
|
- project_structure: Modules/architecture relevant to ${angle}
|
|
- relevant_files: Files affected from ${angle} perspective
|
|
**MANDATORY**: Every file MUST use structured object format with ALL required fields:
|
|
[{path: "src/file.ts", relevance: 0.85, rationale: "Contains AuthService.login() - entry point for JWT token generation", role: "modify_target", discovery_source: "bash-scan", key_symbols: ["AuthService", "login"]}]
|
|
- **rationale** (required): Specific selection basis tied to ${angle} topic (>10 chars, not generic)
|
|
- **role** (required): modify_target|dependency|pattern_reference|test_target|type_definition|integration_point|config|context_only
|
|
- **discovery_source** (recommended): bash-scan|cli-analysis|ace-search|dependency-trace|manual
|
|
- **key_symbols** (recommended): Key functions/classes/types in the file relevant to the task
|
|
- Scores: 0.7+ high priority, 0.5-0.7 medium, <0.5 low
|
|
- patterns: ${angle}-related patterns to follow
|
|
- dependencies: Dependencies relevant to ${angle}
|
|
- integration_points: Where to integrate from ${angle} viewpoint (include file:line locations)
|
|
- constraints: ${angle}-specific limitations/conventions
|
|
- clarification_needs: ${angle}-related ambiguities (options array + recommended index)
|
|
- _metadata.exploration_angle: "${angle}"
|
|
|
|
## Success Criteria
|
|
- [ ] Schema obtained via cat explore-json-schema.json
|
|
- [ ] get_modules_by_depth.sh executed
|
|
- [ ] At least 3 relevant files identified with ${angle} rationale
|
|
- [ ] Patterns are actionable (code examples, not generic advice)
|
|
- [ ] Integration points include file:line locations
|
|
- [ ] Constraints are project-specific to ${angle}
|
|
- [ ] JSON output follows schema exactly
|
|
- [ ] clarification_needs includes options + recommended
|
|
|
|
## Output
|
|
Write: ${sessionFolder}/exploration-${angle}.json
|
|
Return: 2-3 sentence summary of ${angle} findings
|
|
`
|
|
)
|
|
);
|
|
|
|
// B.2.3 Generate Manifest after all complete
|
|
const explorationFiles = bash(`find ${sessionFolder} -name "exploration-*.json" -type f`).split('\n').filter(f => f.trim());
|
|
const explorationManifest = {
|
|
session_id,
|
|
task_description,
|
|
timestamp: new Date().toISOString(),
|
|
complexity,
|
|
exploration_count: selectedAngles.length,
|
|
angles_explored: selectedAngles,
|
|
explorations: explorationFiles.map(file => {
|
|
const data = JSON.parse(Read(file));
|
|
return { angle: data._metadata.exploration_angle, file: file.split('/').pop(), path: file, index: data._metadata.exploration_index };
|
|
})
|
|
};
|
|
Write(`${sessionFolder}/explorations-manifest.json`, JSON.stringify(explorationManifest, null, 2));
|
|
```
|
|
|
|
#### Step B.3: Invoke Context-Search Agent
|
|
|
|
**Only execute after Step B.2 completes**
|
|
|
|
```javascript
|
|
// Load user intent from planning-notes.md (from Phase 1)
|
|
const planningNotesPath = `.workflow/active/${session_id}/planning-notes.md`;
|
|
let userIntent = { goal: task_description, key_constraints: "None specified" };
|
|
|
|
if (file_exists(planningNotesPath)) {
|
|
const notesContent = Read(planningNotesPath);
|
|
const goalMatch = notesContent.match(/\*\*GOAL\*\*:\s*(.+)/);
|
|
const constraintsMatch = notesContent.match(/\*\*KEY_CONSTRAINTS\*\*:\s*(.+)/);
|
|
if (goalMatch) userIntent.goal = goalMatch[1].trim();
|
|
if (constraintsMatch) userIntent.key_constraints = constraintsMatch[1].trim();
|
|
}
|
|
|
|
Task(
|
|
subagent_type="context-search-agent",
|
|
run_in_background=false,
|
|
description="Gather comprehensive context for plan",
|
|
prompt=`
|
|
## Execution Mode
|
|
**PLAN MODE** (Comprehensive) - Full Phase 1-3 execution with priority sorting
|
|
|
|
## Session Information
|
|
- **Session ID**: ${session_id}
|
|
- **Task Description**: ${task_description}
|
|
- **Output Path**: .workflow/${session_id}/.process/context-package.json
|
|
|
|
## User Intent (from Phase 1 - Planning Notes)
|
|
**GOAL**: ${userIntent.goal}
|
|
**KEY_CONSTRAINTS**: ${userIntent.key_constraints}
|
|
|
|
This is the PRIMARY context source - all subsequent analysis must align with user intent.
|
|
|
|
## Exploration Input (from Step B.2)
|
|
- **Manifest**: ${sessionFolder}/explorations-manifest.json
|
|
- **Exploration Count**: ${explorationManifest.exploration_count}
|
|
- **Angles**: ${explorationManifest.angles_explored.join(', ')}
|
|
- **Complexity**: ${complexity}
|
|
|
|
## Mission
|
|
Execute complete context-search-agent workflow for implementation planning:
|
|
|
|
### Phase 1: Initialization & Pre-Analysis
|
|
1. **Project State Loading**:
|
|
- Read and parse .workflow/project-tech.json. Use its overview section as the foundational project_context.
|
|
- Read and parse .workflow/project-guidelines.json. Load conventions, constraints, and learnings into a project_guidelines section.
|
|
- If files don't exist, proceed with fresh analysis.
|
|
2. **Detection**: Check for existing context-package (early exit if valid)
|
|
3. **Foundation**: Initialize CodexLens, get project structure, load docs
|
|
4. **Analysis**: Extract keywords, determine scope, classify complexity based on task description and project state
|
|
|
|
### Phase 2: Multi-Source Context Discovery
|
|
Execute all discovery tracks (WITH USER INTENT INTEGRATION):
|
|
- **Track -1**: User Intent & Priority Foundation (EXECUTE FIRST)
|
|
- Load user intent (GOAL, KEY_CONSTRAINTS) from session input
|
|
- Map user requirements to codebase entities (files, modules, patterns)
|
|
- Establish baseline priority scores based on user goal alignment
|
|
- Output: user_intent_mapping.json with preliminary priority scores
|
|
|
|
- **Track 0**: Exploration Synthesis (load explorations-manifest.json, prioritize critical_files, deduplicate patterns/integration_points)
|
|
- **Track 1**: Historical archive analysis (query manifest.json for lessons learned)
|
|
- **Track 2**: Reference documentation (CLAUDE.md, architecture docs)
|
|
- **Track 3**: Web examples (use Exa MCP for unfamiliar tech/APIs)
|
|
- **Track 4**: Codebase analysis (5-layer discovery: files, content, patterns, deps, config/tests)
|
|
|
|
### Phase 3: Synthesis, Assessment & Packaging
|
|
1. Apply relevance scoring and build dependency graph
|
|
2. **Synthesize 5-source data** (including Track -1): Merge findings from all sources
|
|
- Priority order: User Intent > Archive > Docs > Exploration > Code > Web
|
|
- **Prioritize the context from project-tech.json** for architecture and tech stack unless code analysis reveals it's outdated
|
|
3. **Context Priority Sorting**:
|
|
a. Combine scores from Track -1 (user intent alignment) + relevance scores + exploration critical_files
|
|
b. Classify files into priority tiers:
|
|
- **Critical** (score >= 0.85): Directly mentioned in user goal OR exploration critical_files
|
|
- **High** (0.70-0.84): Key dependencies, patterns required for goal
|
|
- **Medium** (0.50-0.69): Supporting files, indirect dependencies
|
|
- **Low** (< 0.50): Contextual awareness only
|
|
c. Generate dependency_order: Based on dependency graph + user goal sequence
|
|
d. Document sorting_rationale: Explain prioritization logic
|
|
4. **Populate project_context**: Directly use the overview from project-tech.json
|
|
5. **Populate project_guidelines**: Load from project-guidelines.json
|
|
6. Integrate brainstorm artifacts (if .brainstorming/ exists, read content)
|
|
7. Perform conflict detection with risk assessment
|
|
8. **Inject historical conflicts** from archive analysis into conflict_detection
|
|
9. **Generate prioritized_context section**:
|
|
{
|
|
"prioritized_context": {
|
|
"user_intent": { "goal": "...", "scope": "...", "key_constraints": ["..."] },
|
|
"priority_tiers": {
|
|
"critical": [{ "path": "...", "relevance": 0.95, "rationale": "..." }],
|
|
"high": [...], "medium": [...], "low": [...]
|
|
},
|
|
"dependency_order": ["module1", "module2", "module3"],
|
|
"sorting_rationale": "Based on user goal alignment, exploration critical files, and dependency graph"
|
|
}
|
|
}
|
|
10. Generate and validate context-package.json with prioritized_context field
|
|
|
|
## Output Requirements
|
|
Complete context-package.json with:
|
|
- **metadata**: task_description, keywords, complexity, tech_stack, session_id
|
|
- **project_context**: description, technology_stack, architecture, key_components (from project-tech.json)
|
|
- **project_guidelines**: {conventions, constraints, quality_rules, learnings} (from project-guidelines.json)
|
|
- **assets**: {documentation[], source_code[], config[], tests[]} with relevance scores
|
|
- **dependencies**: {internal[], external[]} with dependency graph
|
|
- **brainstorm_artifacts**: {guidance_specification, role_analyses[], synthesis_output} with content
|
|
- **conflict_detection**: {risk_level, risk_factors, affected_modules[], mitigation_strategy, historical_conflicts[]}
|
|
- **exploration_results**: {manifest_path, exploration_count, angles, explorations[], aggregated_insights}
|
|
- **prioritized_context**: {user_intent, priority_tiers{critical, high, medium, low}, dependency_order[], sorting_rationale}
|
|
|
|
## Quality Validation
|
|
Before completion verify:
|
|
- [ ] Valid JSON format with all required fields
|
|
- [ ] File relevance accuracy >80%
|
|
- [ ] Dependency graph complete (max 2 transitive levels)
|
|
- [ ] Conflict risk level calculated correctly
|
|
- [ ] No sensitive data exposed
|
|
- [ ] Total files <= 50 (prioritize high-relevance)
|
|
|
|
Execute autonomously following agent documentation.
|
|
Report completion with statistics.
|
|
`
|
|
)
|
|
```
|
|
|
|
#### Step B.4: Output Verification
|
|
|
|
After agent completes, verify output:
|
|
|
|
```javascript
|
|
// Verify file was created
|
|
const outputPath = `.workflow/${session_id}/.process/context-package.json`;
|
|
if (!file_exists(outputPath)) {
|
|
throw new Error("Agent failed to generate context-package.json");
|
|
}
|
|
|
|
// Verify exploration_results included
|
|
const pkg = JSON.parse(Read(outputPath));
|
|
if (pkg.exploration_results?.exploration_count > 0) {
|
|
console.log(`Exploration results aggregated: ${pkg.exploration_results.exploration_count} angles`);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
**Input**: `testSessionId` from Phase 1
|
|
|
|
**Parse Output**:
|
|
- Extract: context package path (store as `contextPath`)
|
|
- Pattern: `.workflow/active/[testSessionId]/.process/[test-]context-package.json`
|
|
|
|
**Validation**:
|
|
- Context package file exists and is valid JSON
|
|
- Contains coverage analysis (session mode) or codebase analysis (prompt mode)
|
|
- Test framework detected
|
|
|
|
**TodoWrite Update (tasks attached)**:
|
|
```json
|
|
[
|
|
{"content": "Phase 1: Test Generation", "status": "in_progress"},
|
|
{"content": " -> Create test session", "status": "completed"},
|
|
{"content": " -> Gather test context", "status": "in_progress"},
|
|
{"content": " -> Load source/codebase context", "status": "in_progress"},
|
|
{"content": " -> Analyze test coverage", "status": "pending"},
|
|
{"content": " -> Generate context package", "status": "pending"},
|
|
{"content": " -> Test analysis (Gemini)", "status": "pending"},
|
|
{"content": " -> Generate test tasks", "status": "pending"},
|
|
{"content": "Phase 2: Test Cycle Execution", "status": "pending"}
|
|
]
|
|
```
|
|
|
|
**TodoWrite Update (tasks collapsed)**:
|
|
```json
|
|
[
|
|
{"content": "Phase 1: Test Generation", "status": "in_progress"},
|
|
{"content": " -> Create test session", "status": "completed"},
|
|
{"content": " -> Gather test context", "status": "completed"},
|
|
{"content": " -> Test analysis (Gemini)", "status": "pending"},
|
|
{"content": " -> Generate test tasks", "status": "pending"},
|
|
{"content": "Phase 2: Test Cycle Execution", "status": "pending"}
|
|
]
|
|
```
|
|
|
|
## Output
|
|
|
|
- **Variable**: `contextPath` (context-package.json path)
|
|
|
|
## Next Phase
|
|
|
|
Continue to [Phase 3: Test Concept Enhanced](03-test-concept-enhanced.md).
|