elspais 0.11.2__py3-none-any.whl → 0.43.5__py3-none-any.whl
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.
- elspais/__init__.py +1 -10
- elspais/{sponsors/__init__.py → associates.py} +102 -56
- elspais/cli.py +366 -69
- elspais/commands/__init__.py +9 -3
- elspais/commands/analyze.py +118 -169
- elspais/commands/changed.py +12 -23
- elspais/commands/config_cmd.py +10 -13
- elspais/commands/edit.py +33 -13
- elspais/commands/example_cmd.py +319 -0
- elspais/commands/hash_cmd.py +161 -183
- elspais/commands/health.py +1177 -0
- elspais/commands/index.py +98 -115
- elspais/commands/init.py +99 -22
- elspais/commands/reformat_cmd.py +41 -433
- elspais/commands/rules_cmd.py +2 -2
- elspais/commands/trace.py +443 -324
- elspais/commands/validate.py +193 -411
- elspais/config/__init__.py +799 -5
- elspais/{core/content_rules.py → content_rules.py} +20 -2
- elspais/docs/cli/assertions.md +67 -0
- elspais/docs/cli/commands.md +304 -0
- elspais/docs/cli/config.md +262 -0
- elspais/docs/cli/format.md +66 -0
- elspais/docs/cli/git.md +45 -0
- elspais/docs/cli/health.md +190 -0
- elspais/docs/cli/hierarchy.md +60 -0
- elspais/docs/cli/ignore.md +72 -0
- elspais/docs/cli/mcp.md +245 -0
- elspais/docs/cli/quickstart.md +58 -0
- elspais/docs/cli/traceability.md +89 -0
- elspais/docs/cli/validation.md +96 -0
- elspais/graph/GraphNode.py +383 -0
- elspais/graph/__init__.py +40 -0
- elspais/graph/annotators.py +927 -0
- elspais/graph/builder.py +1886 -0
- elspais/graph/deserializer.py +248 -0
- elspais/graph/factory.py +284 -0
- elspais/graph/metrics.py +127 -0
- elspais/graph/mutations.py +161 -0
- elspais/graph/parsers/__init__.py +156 -0
- elspais/graph/parsers/code.py +213 -0
- elspais/graph/parsers/comments.py +112 -0
- elspais/graph/parsers/config_helpers.py +29 -0
- elspais/graph/parsers/heredocs.py +225 -0
- elspais/graph/parsers/journey.py +131 -0
- elspais/graph/parsers/remainder.py +79 -0
- elspais/graph/parsers/requirement.py +347 -0
- elspais/graph/parsers/results/__init__.py +6 -0
- elspais/graph/parsers/results/junit_xml.py +229 -0
- elspais/graph/parsers/results/pytest_json.py +313 -0
- elspais/graph/parsers/test.py +305 -0
- elspais/graph/relations.py +78 -0
- elspais/graph/serialize.py +216 -0
- elspais/html/__init__.py +8 -0
- elspais/html/generator.py +731 -0
- elspais/html/templates/trace_view.html.j2 +2151 -0
- elspais/mcp/__init__.py +45 -29
- elspais/mcp/__main__.py +5 -1
- elspais/mcp/file_mutations.py +138 -0
- elspais/mcp/server.py +1998 -244
- elspais/testing/__init__.py +3 -3
- elspais/testing/config.py +3 -0
- elspais/testing/mapper.py +1 -1
- elspais/testing/scanner.py +301 -12
- elspais/utilities/__init__.py +1 -0
- elspais/utilities/docs_loader.py +115 -0
- elspais/utilities/git.py +607 -0
- elspais/{core → utilities}/hasher.py +8 -22
- elspais/utilities/md_renderer.py +189 -0
- elspais/{core → utilities}/patterns.py +56 -51
- elspais/utilities/reference_config.py +626 -0
- elspais/validation/__init__.py +19 -0
- elspais/validation/format.py +264 -0
- {elspais-0.11.2.dist-info → elspais-0.43.5.dist-info}/METADATA +7 -4
- elspais-0.43.5.dist-info/RECORD +80 -0
- elspais/config/defaults.py +0 -179
- elspais/config/loader.py +0 -494
- elspais/core/__init__.py +0 -21
- elspais/core/git.py +0 -346
- elspais/core/models.py +0 -320
- elspais/core/parser.py +0 -639
- elspais/core/rules.py +0 -509
- elspais/mcp/context.py +0 -172
- elspais/mcp/serializers.py +0 -112
- elspais/reformat/__init__.py +0 -50
- elspais/reformat/detector.py +0 -112
- elspais/reformat/hierarchy.py +0 -247
- elspais/reformat/line_breaks.py +0 -218
- elspais/reformat/prompts.py +0 -133
- elspais/reformat/transformer.py +0 -266
- elspais/trace_view/__init__.py +0 -55
- elspais/trace_view/coverage.py +0 -183
- elspais/trace_view/generators/__init__.py +0 -12
- elspais/trace_view/generators/base.py +0 -334
- elspais/trace_view/generators/csv.py +0 -118
- elspais/trace_view/generators/markdown.py +0 -170
- elspais/trace_view/html/__init__.py +0 -33
- elspais/trace_view/html/generator.py +0 -1140
- elspais/trace_view/html/templates/base.html +0 -283
- elspais/trace_view/html/templates/components/code_viewer_modal.html +0 -14
- elspais/trace_view/html/templates/components/file_picker_modal.html +0 -20
- elspais/trace_view/html/templates/components/legend_modal.html +0 -69
- elspais/trace_view/html/templates/components/review_panel.html +0 -118
- elspais/trace_view/html/templates/partials/review/help/help-panel.json +0 -244
- elspais/trace_view/html/templates/partials/review/help/onboarding.json +0 -77
- elspais/trace_view/html/templates/partials/review/help/tooltips.json +0 -237
- elspais/trace_view/html/templates/partials/review/review-comments.js +0 -928
- elspais/trace_view/html/templates/partials/review/review-data.js +0 -961
- elspais/trace_view/html/templates/partials/review/review-help.js +0 -679
- elspais/trace_view/html/templates/partials/review/review-init.js +0 -177
- elspais/trace_view/html/templates/partials/review/review-line-numbers.js +0 -429
- elspais/trace_view/html/templates/partials/review/review-packages.js +0 -1029
- elspais/trace_view/html/templates/partials/review/review-position.js +0 -540
- elspais/trace_view/html/templates/partials/review/review-resize.js +0 -115
- elspais/trace_view/html/templates/partials/review/review-status.js +0 -659
- elspais/trace_view/html/templates/partials/review/review-sync.js +0 -992
- elspais/trace_view/html/templates/partials/review-styles.css +0 -2238
- elspais/trace_view/html/templates/partials/scripts.js +0 -1741
- elspais/trace_view/html/templates/partials/styles.css +0 -1756
- elspais/trace_view/models.py +0 -378
- elspais/trace_view/review/__init__.py +0 -63
- elspais/trace_view/review/branches.py +0 -1142
- elspais/trace_view/review/models.py +0 -1200
- elspais/trace_view/review/position.py +0 -591
- elspais/trace_view/review/server.py +0 -1032
- elspais/trace_view/review/status.py +0 -455
- elspais/trace_view/review/storage.py +0 -1343
- elspais/trace_view/scanning.py +0 -213
- elspais/trace_view/specs/README.md +0 -84
- elspais/trace_view/specs/tv-d00001-template-architecture.md +0 -36
- elspais/trace_view/specs/tv-d00002-css-extraction.md +0 -37
- elspais/trace_view/specs/tv-d00003-js-extraction.md +0 -43
- elspais/trace_view/specs/tv-d00004-build-embedding.md +0 -40
- elspais/trace_view/specs/tv-d00005-test-format.md +0 -78
- elspais/trace_view/specs/tv-d00010-review-data-models.md +0 -33
- elspais/trace_view/specs/tv-d00011-review-storage.md +0 -33
- elspais/trace_view/specs/tv-d00012-position-resolution.md +0 -33
- elspais/trace_view/specs/tv-d00013-git-branches.md +0 -31
- elspais/trace_view/specs/tv-d00014-review-api-server.md +0 -31
- elspais/trace_view/specs/tv-d00015-status-modifier.md +0 -27
- elspais/trace_view/specs/tv-d00016-js-integration.md +0 -33
- elspais/trace_view/specs/tv-p00001-html-generator.md +0 -33
- elspais/trace_view/specs/tv-p00002-review-system.md +0 -29
- elspais-0.11.2.dist-info/RECORD +0 -101
- {elspais-0.11.2.dist-info → elspais-0.43.5.dist-info}/WHEEL +0 -0
- {elspais-0.11.2.dist-info → elspais-0.43.5.dist-info}/entry_points.txt +0 -0
- {elspais-0.11.2.dist-info → elspais-0.43.5.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
|
6
|
-
<meta http-equiv="Pragma" content="no-cache">
|
|
7
|
-
<meta http-equiv="Expires" content="0">
|
|
8
|
-
<title>{% block title %}Requirements Traceability Matrix{% endblock %}</title>
|
|
9
|
-
|
|
10
|
-
{# Embedded CSS from external stylesheet #}
|
|
11
|
-
<style>
|
|
12
|
-
{{ css|safe }}
|
|
13
|
-
</style>
|
|
14
|
-
|
|
15
|
-
{# Review mode CSS (if enabled) #}
|
|
16
|
-
{% if review_mode %}
|
|
17
|
-
<style>
|
|
18
|
-
{{ review_css|safe }}
|
|
19
|
-
</style>
|
|
20
|
-
{% endif %}
|
|
21
|
-
|
|
22
|
-
{# External libraries for embedded mode (code viewer, markdown) #}
|
|
23
|
-
{% if embed_content %}
|
|
24
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/vs2015.min.css">
|
|
25
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
|
|
26
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/12.0.1/marked.min.js"></script>
|
|
27
|
-
{% endif %}
|
|
28
|
-
</head>
|
|
29
|
-
<body class="{% if edit_mode %}edit-mode-available{% endif %}{% if review_mode %} review-mode-available{% endif %}"{% if review_mode %} data-review-mode="true"{% endif %}>
|
|
30
|
-
<div class="app-layout">
|
|
31
|
-
<div class="main-content">
|
|
32
|
-
<div class="container">
|
|
33
|
-
{# Title bar with stats and controls #}
|
|
34
|
-
{% block title_bar %}
|
|
35
|
-
<div class="title-bar">
|
|
36
|
-
<h1>Requirements Traceability</h1>
|
|
37
|
-
<div class="stats-badges">
|
|
38
|
-
<span class="stat-badge prd" id="badgePRD"
|
|
39
|
-
data-active="{{ stats.prd.active }}"
|
|
40
|
-
data-all="{{ stats.prd.all }}"
|
|
41
|
-
onclick="filterByLevel('PRD')"
|
|
42
|
-
title="Click to filter by PRD">PRD: {{ stats.prd.active }}</span>
|
|
43
|
-
<span class="stat-badge ops" id="badgeOPS"
|
|
44
|
-
data-active="{{ stats.ops.active }}"
|
|
45
|
-
data-all="{{ stats.ops.all }}"
|
|
46
|
-
onclick="filterByLevel('OPS')"
|
|
47
|
-
title="Click to filter by OPS">OPS: {{ stats.ops.active }}</span>
|
|
48
|
-
<span class="stat-badge dev" id="badgeDEV"
|
|
49
|
-
data-active="{{ stats.dev.active }}"
|
|
50
|
-
data-all="{{ stats.dev.all }}"
|
|
51
|
-
onclick="filterByLevel('DEV')"
|
|
52
|
-
title="Click to filter by DEV">DEV: {{ stats.dev.active }}</span>
|
|
53
|
-
{% if repo_stats %}
|
|
54
|
-
<span class="stat-badge-separator">|</span>
|
|
55
|
-
{% for prefix, counts in repo_stats.items()|sort %}
|
|
56
|
-
<span class="stat-badge repo-badge" id="badgeRepo{{ prefix }}"
|
|
57
|
-
data-repo="{{ prefix }}"
|
|
58
|
-
data-active="{{ counts.active }}"
|
|
59
|
-
data-all="{{ counts.all }}"
|
|
60
|
-
onclick="toggleRepoFilter('{{ prefix }}')"
|
|
61
|
-
title="Click to toggle {{ prefix }} requirements">{{ prefix }}: {{ counts.active }}</span>
|
|
62
|
-
{% endfor %}
|
|
63
|
-
{% endif %}
|
|
64
|
-
<span class="stat-badge-separator">|</span>
|
|
65
|
-
<span class="stat-badge files-badge" id="badgeFiles"
|
|
66
|
-
data-count="{{ stats.impl_files }}"
|
|
67
|
-
onclick="toggleFilesFilter()"
|
|
68
|
-
title="Click to toggle implementation files">Files: {{ stats.impl_files }}</span>
|
|
69
|
-
</div>
|
|
70
|
-
<span class="version-badge">v{{ version }}</span>
|
|
71
|
-
<button class="btn btn-legend" onclick="openLegendModal()"
|
|
72
|
-
title="Generated: {{ timestamp }}">ℹ️ Legend</button>
|
|
73
|
-
{# Mode toggle buttons in a unified group (REQ-d00092) #}
|
|
74
|
-
<div class="mode-toggle-group">
|
|
75
|
-
{% if edit_mode %}
|
|
76
|
-
<button class="mode-toggle-btn" id="btnEditMode" onclick="toggleEditMode()">Edit Mode</button>
|
|
77
|
-
{% endif %}
|
|
78
|
-
{% if review_mode %}
|
|
79
|
-
<button class="mode-toggle-btn" id="btnReviewMode" onclick="ReviewSystem.toggleReviewMode()">Review Mode</button>
|
|
80
|
-
{% endif %}
|
|
81
|
-
</div>
|
|
82
|
-
</div>
|
|
83
|
-
{% endblock %}
|
|
84
|
-
|
|
85
|
-
{# Filter and view controls #}
|
|
86
|
-
{% block filter_controls %}
|
|
87
|
-
<div class="filter-controls">
|
|
88
|
-
<div class="view-toggle">
|
|
89
|
-
<button class="btn view-btn active" id="btnFlatView" onclick="switchView('flat')">Flat View</button>
|
|
90
|
-
<button class="btn view-btn" id="btnHierarchyView" onclick="switchView('hierarchy')">Hierarchical View</button>
|
|
91
|
-
<button class="btn view-btn" id="btnUncommittedView" onclick="switchView('uncommitted')">Uncommitted</button>
|
|
92
|
-
<button class="btn view-btn" id="btnBranchView" onclick="switchView('branch')">Changed vs Main</button>
|
|
93
|
-
</div>
|
|
94
|
-
<button class="btn toggle-btn" id="btnLeafOnly" onclick="toggleLeafOnly()">🍃 Leaf Only</button>
|
|
95
|
-
<label class="checkbox-label" title="Include deprecated requirements in counts and views">
|
|
96
|
-
<input type="checkbox" id="chkIncludeDeprecated" onchange="toggleIncludeDeprecated()">
|
|
97
|
-
Include deprecated
|
|
98
|
-
</label>
|
|
99
|
-
<label class="checkbox-label" title="Include requirements from spec/roadmap/ directory">
|
|
100
|
-
<input type="checkbox" id="chkIncludeRoadmap" onchange="toggleIncludeRoadmap()">
|
|
101
|
-
Include roadmap
|
|
102
|
-
</label>
|
|
103
|
-
<button class="btn btn-secondary" id="btnExpandAll" onclick="expandAll()">▼ Expand All</button>
|
|
104
|
-
<button class="btn btn-secondary" id="btnCollapseAll" onclick="collapseAll()">▶ Collapse All</button>
|
|
105
|
-
<button class="btn btn-secondary" onclick="clearFilters()">Clear</button>
|
|
106
|
-
<span class="filter-stats" id="filterStats"></span>
|
|
107
|
-
</div>
|
|
108
|
-
{% endblock %}
|
|
109
|
-
|
|
110
|
-
{# Edit mode panel (only shown in edit mode) #}
|
|
111
|
-
{% if edit_mode %}
|
|
112
|
-
{% block edit_mode_panel %}
|
|
113
|
-
<div id="editModePanel" class="edit-mode-panel" style="display: none;">
|
|
114
|
-
<div class="edit-mode-header">
|
|
115
|
-
<div class="edit-mode-title">
|
|
116
|
-
<strong>📝 Edit Mode</strong> - Select requirements to move
|
|
117
|
-
<span id="pendingChangesCount" class="badge" style="margin-left: 10px;">0 pending</span>
|
|
118
|
-
</div>
|
|
119
|
-
<div class="edit-mode-actions">
|
|
120
|
-
<button class="btn btn-secondary" onclick="clearPendingMoves()">Clear Selection</button>
|
|
121
|
-
<button class="btn btn-primary" id="btnApplyMoves" onclick="applyMoves()" disabled>Apply Moves</button>
|
|
122
|
-
</div>
|
|
123
|
-
</div>
|
|
124
|
-
<div class="pending-moves-section">
|
|
125
|
-
<div class="pending-moves-header" onclick="togglePendingMoves()"
|
|
126
|
-
style="cursor: pointer; user-select: none; display: flex; align-items: center; margin-bottom: 8px;">
|
|
127
|
-
<span id="pendingMovesToggle" style="margin-right: 6px; font-size: 12px;">▼</span>
|
|
128
|
-
<strong style="font-size: 12px;">Pending Moves</strong>
|
|
129
|
-
</div>
|
|
130
|
-
<div id="pendingMovesList" class="pending-moves-list"></div>
|
|
131
|
-
</div>
|
|
132
|
-
</div>
|
|
133
|
-
{% endblock %}
|
|
134
|
-
{% endif %}
|
|
135
|
-
|
|
136
|
-
{# Tree title #}
|
|
137
|
-
<h2 id="treeTitle">Traceability Tree - Flat View</h2>
|
|
138
|
-
|
|
139
|
-
{# Filter header with inputs #}
|
|
140
|
-
{% block filter_header %}
|
|
141
|
-
<div class="filter-header">
|
|
142
|
-
<div class="filter-column">
|
|
143
|
-
<div class="filter-label">REQ ID</div>
|
|
144
|
-
<input type="text" id="filterReqId" placeholder="Filter..." oninput="applyFilters()">
|
|
145
|
-
</div>
|
|
146
|
-
<div class="filter-column">
|
|
147
|
-
<div class="filter-label">Title</div>
|
|
148
|
-
<input type="text" id="filterTitle" placeholder="Search title..." oninput="applyFilters()">
|
|
149
|
-
</div>
|
|
150
|
-
<div class="filter-column">
|
|
151
|
-
<div class="filter-label">Level</div>
|
|
152
|
-
<select id="filterLevel" onchange="applyFilters()">
|
|
153
|
-
<option value="">All</option>
|
|
154
|
-
<option value="PRD">PRD</option>
|
|
155
|
-
<option value="OPS">OPS</option>
|
|
156
|
-
<option value="DEV">DEV</option>
|
|
157
|
-
</select>
|
|
158
|
-
</div>
|
|
159
|
-
<div class="filter-column">
|
|
160
|
-
<div class="filter-label">Status</div>
|
|
161
|
-
<select id="filterStatus" onchange="applyFilters()">
|
|
162
|
-
<option value="">All</option>
|
|
163
|
-
<option value="Active">Active</option>
|
|
164
|
-
<option value="Draft">Draft</option>
|
|
165
|
-
<option value="Deprecated">Deprecated</option>
|
|
166
|
-
</select>
|
|
167
|
-
</div>
|
|
168
|
-
<div class="filter-column">
|
|
169
|
-
<div class="filter-label">Cov</div>
|
|
170
|
-
<select id="filterCoverage" onchange="applyFilters()">
|
|
171
|
-
<option value="">All</option>
|
|
172
|
-
<option value="full">●</option>
|
|
173
|
-
<option value="partial">◐</option>
|
|
174
|
-
<option value="none">○</option>
|
|
175
|
-
</select>
|
|
176
|
-
</div>
|
|
177
|
-
<div class="filter-column">
|
|
178
|
-
<div class="filter-label">Topic</div>
|
|
179
|
-
<select id="filterTopic" onchange="applyFilters()">
|
|
180
|
-
<option value="">All</option>
|
|
181
|
-
{% for topic in topics %}
|
|
182
|
-
<option value="{{ topic }}">{{ topic }}</option>
|
|
183
|
-
{% endfor %}
|
|
184
|
-
</select>
|
|
185
|
-
</div>
|
|
186
|
-
</div>
|
|
187
|
-
{% endblock %}
|
|
188
|
-
|
|
189
|
-
{# Main requirements tree content #}
|
|
190
|
-
{% block requirements_tree %}
|
|
191
|
-
<div class="req-tree" id="reqTree">
|
|
192
|
-
{# Requirements will be inserted here dynamically or server-side #}
|
|
193
|
-
{% block requirements_list %}
|
|
194
|
-
{{ requirements_html|safe }}
|
|
195
|
-
{% endblock %}
|
|
196
|
-
</div>
|
|
197
|
-
{% endblock %}
|
|
198
|
-
</div>
|
|
199
|
-
</div>
|
|
200
|
-
|
|
201
|
-
{# Side panel for requirement details (only in embedded mode) #}
|
|
202
|
-
{% if embed_content %}
|
|
203
|
-
{% block side_panel %}
|
|
204
|
-
<div id="req-panel" class="side-panel hidden" style="position: relative;">
|
|
205
|
-
<div class="resize-handle" id="resizeHandle"></div>
|
|
206
|
-
<div class="panel-header">
|
|
207
|
-
<span>Requirements</span>
|
|
208
|
-
<button onclick="closeAllCards()">Close All</button>
|
|
209
|
-
</div>
|
|
210
|
-
<div id="req-card-stack"></div>
|
|
211
|
-
</div>
|
|
212
|
-
{% endblock %}
|
|
213
|
-
{% endif %}
|
|
214
|
-
|
|
215
|
-
{# Review panel (only in review mode) - wrapped in review-column (REQ-d00092) #}
|
|
216
|
-
{% if review_mode %}
|
|
217
|
-
{% block review_panel %}
|
|
218
|
-
<div id="review-column" class="review-column hidden">
|
|
219
|
-
<div id="reviewResizeHandle" class="review-resize-handle"></div>
|
|
220
|
-
{% include 'components/review_panel.html' %}
|
|
221
|
-
</div>
|
|
222
|
-
{% endblock %}
|
|
223
|
-
{% endif %}
|
|
224
|
-
</div>
|
|
225
|
-
|
|
226
|
-
{# JSON data for embedded mode (requirement content) #}
|
|
227
|
-
{% if embed_content %}
|
|
228
|
-
{% block json_data %}
|
|
229
|
-
<script id="req-content-data" type="application/json">
|
|
230
|
-
{{ req_json_data|safe }}
|
|
231
|
-
</script>
|
|
232
|
-
<script>
|
|
233
|
-
// Load REQ content data into global scope
|
|
234
|
-
window.REQ_CONTENT_DATA = JSON.parse(document.getElementById('req-content-data').textContent);
|
|
235
|
-
// Repository root for VS Code links (absolute path required for vscode:// protocol)
|
|
236
|
-
// Note: VS Code links only work on the machine where this file was generated
|
|
237
|
-
window.REPO_ROOT = '{{ repo_root }}';
|
|
238
|
-
</script>
|
|
239
|
-
{% endblock %}
|
|
240
|
-
{% endif %}
|
|
241
|
-
|
|
242
|
-
{# Review mode data (REQ-d00092) #}
|
|
243
|
-
{% if review_mode %}
|
|
244
|
-
{% block review_data %}
|
|
245
|
-
<script id="review-data" type="application/json">
|
|
246
|
-
{{ review_json_data|safe }}
|
|
247
|
-
</script>
|
|
248
|
-
<script>
|
|
249
|
-
// Load review data into global scope (REQ-d00092)
|
|
250
|
-
window.REVIEW_DATA = JSON.parse(document.getElementById('review-data').textContent);
|
|
251
|
-
// API URL for review operations (relative path for same-origin requests)
|
|
252
|
-
window.REVIEW_API_URL = '/api/reviews';
|
|
253
|
-
</script>
|
|
254
|
-
{% endblock %}
|
|
255
|
-
{% endif %}
|
|
256
|
-
|
|
257
|
-
{# Main JavaScript functionality #}
|
|
258
|
-
{% block scripts %}
|
|
259
|
-
<script>
|
|
260
|
-
{{ js|safe }}
|
|
261
|
-
</script>
|
|
262
|
-
{% endblock %}
|
|
263
|
-
|
|
264
|
-
{# Review mode JavaScript (if enabled) #}
|
|
265
|
-
{% if review_mode %}
|
|
266
|
-
{% block review_scripts %}
|
|
267
|
-
<script>
|
|
268
|
-
{{ review_js|safe }}
|
|
269
|
-
</script>
|
|
270
|
-
{% endblock %}
|
|
271
|
-
{% endif %}
|
|
272
|
-
|
|
273
|
-
{# Modals (file picker always included, others only in embedded mode) #}
|
|
274
|
-
{% block modals %}
|
|
275
|
-
{% include 'components/file_picker_modal.html' %}
|
|
276
|
-
{% if embed_content %}
|
|
277
|
-
{% include 'components/code_viewer_modal.html' %}
|
|
278
|
-
{% include 'components/legend_modal.html' %}
|
|
279
|
-
{% endif %}
|
|
280
|
-
{% endblock %}
|
|
281
|
-
|
|
282
|
-
</body>
|
|
283
|
-
</html>
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{# Code Viewer Modal - displays source code with syntax highlighting #}
|
|
2
|
-
<div id="code-viewer-modal" class="code-viewer-modal hidden">
|
|
3
|
-
<div class="code-viewer-container">
|
|
4
|
-
<div class="code-viewer-header">
|
|
5
|
-
<div>
|
|
6
|
-
<span id="code-viewer-title" class="code-viewer-title"></span>
|
|
7
|
-
<span id="code-viewer-line" class="code-viewer-line"></span>
|
|
8
|
-
<a id="code-viewer-vscode" href="#" title="Open in VS Code" class="vscode-link" style="font-size: 18px;">🔧</a>
|
|
9
|
-
</div>
|
|
10
|
-
<button class="code-viewer-close" onclick="closeCodeViewer()">Close (Esc)</button>
|
|
11
|
-
</div>
|
|
12
|
-
<div id="code-viewer-content" class="code-viewer-body"></div>
|
|
13
|
-
</div>
|
|
14
|
-
</div>
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{# File Picker Modal - select destination file for requirement moves #}
|
|
2
|
-
<div id="file-picker-modal" class="file-picker-modal hidden" onclick="if(event.target===this)closeFilePicker()">
|
|
3
|
-
<div class="file-picker-container">
|
|
4
|
-
<div class="file-picker-header">
|
|
5
|
-
<h2>Select Destination File</h2>
|
|
6
|
-
<button class="file-picker-close" onclick="closeFilePicker()">×</button>
|
|
7
|
-
</div>
|
|
8
|
-
<div class="file-picker-body">
|
|
9
|
-
<div class="file-picker-input-row">
|
|
10
|
-
<input type="text" id="filePickerInput" placeholder="Enter or select filename (e.g., prd-security.md)"
|
|
11
|
-
oninput="filterFiles(this.value)"
|
|
12
|
-
onkeydown="if(event.key==='Enter'){confirmFilePicker();event.preventDefault();}">
|
|
13
|
-
<button class="btn" onclick="confirmFilePicker()">Confirm</button>
|
|
14
|
-
</div>
|
|
15
|
-
<div id="filePickerError" class="file-picker-error" style="display: none;"></div>
|
|
16
|
-
<div class="file-picker-hint">Click a file below to select it, or type a new filename</div>
|
|
17
|
-
<div id="filePickerList" class="file-picker-list"></div>
|
|
18
|
-
</div>
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
{# Legend Modal - explains symbols, badges, and controls #}
|
|
2
|
-
<div id="legend-modal" class="legend-modal hidden" onclick="if(event.target===this)closeLegendModal()">
|
|
3
|
-
<div class="legend-modal-container">
|
|
4
|
-
<div class="legend-modal-header">
|
|
5
|
-
<h2>Legend</h2>
|
|
6
|
-
<button class="legend-modal-close" onclick="closeLegendModal()">×</button>
|
|
7
|
-
</div>
|
|
8
|
-
<div class="legend-modal-body">
|
|
9
|
-
<div class="legend-grid">
|
|
10
|
-
<div class="legend-section">
|
|
11
|
-
<h3>Requirement Levels</h3>
|
|
12
|
-
<ul>
|
|
13
|
-
<li><span class="stat-badge prd">PRD</span> Product Requirements</li>
|
|
14
|
-
<li><span class="stat-badge ops">OPS</span> Operations Requirements</li>
|
|
15
|
-
<li><span class="stat-badge dev">DEV</span> Development Requirements</li>
|
|
16
|
-
</ul>
|
|
17
|
-
</div>
|
|
18
|
-
<div class="legend-section">
|
|
19
|
-
<h3>Status</h3>
|
|
20
|
-
<ul>
|
|
21
|
-
<li><span class="status-badge status-active">Active</span> Active requirement</li>
|
|
22
|
-
<li><span class="status-badge status-draft">Draft</span> Draft requirement</li>
|
|
23
|
-
<li><span class="status-badge status-deprecated">Deprecated</span> Deprecated</li>
|
|
24
|
-
</ul>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="legend-section">
|
|
27
|
-
<h3>Implementation Coverage</h3>
|
|
28
|
-
<ul>
|
|
29
|
-
<li>● Full - All children/code implemented</li>
|
|
30
|
-
<li>◐ Partial - Some implementation</li>
|
|
31
|
-
<li>○ None - No implementation found</li>
|
|
32
|
-
</ul>
|
|
33
|
-
</div>
|
|
34
|
-
<div class="legend-section">
|
|
35
|
-
<h3>Test Status</h3>
|
|
36
|
-
<ul>
|
|
37
|
-
<li>✅ Tests passing</li>
|
|
38
|
-
<li>❌ Tests failing</li>
|
|
39
|
-
<li>⚡ Not tested</li>
|
|
40
|
-
</ul>
|
|
41
|
-
</div>
|
|
42
|
-
<div class="legend-section">
|
|
43
|
-
<h3>Change Indicators</h3>
|
|
44
|
-
<ul>
|
|
45
|
-
<li><span class="status-new">★</span> NEW - Uncommitted new requirement</li>
|
|
46
|
-
<li><span class="status-modified">◆</span> MODIFIED - Content changed (uncommitted)</li>
|
|
47
|
-
<li><span class="status-moved">↝</span> MOVED - Relocated to different file</li>
|
|
48
|
-
<li><span class="status-pending-move">⇢</span> PENDING - Staged for move (not yet executed)</li>
|
|
49
|
-
<li>🛤️ Roadmap - Requirement is in roadmap/ directory</li>
|
|
50
|
-
</ul>
|
|
51
|
-
</div>
|
|
52
|
-
<div class="legend-section">
|
|
53
|
-
<h3>Issues (Always Visible)</h3>
|
|
54
|
-
<ul>
|
|
55
|
-
<li><span class="conflict-icon">⚠️</span> CONFLICT - Roadmap REQ has same ID as existing REQ</li>
|
|
56
|
-
<li><span class="cycle-icon">🔄</span> CYCLE - REQ is part of a dependency cycle</li>
|
|
57
|
-
</ul>
|
|
58
|
-
</div>
|
|
59
|
-
</div>
|
|
60
|
-
<div class="legend-section" style="margin-top: 15px;">
|
|
61
|
-
<h3>Controls</h3>
|
|
62
|
-
<ul>
|
|
63
|
-
<li>▼/▶ Click to expand/collapse children</li>
|
|
64
|
-
<li>🍃 Leaf Only - Show only leaf requirements (no children)</li>
|
|
65
|
-
</ul>
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
{# IMPLEMENTS REQUIREMENTS:
|
|
2
|
-
REQ-tv-d00016: Review JavaScript Integration
|
|
3
|
-
REQ-d00092: Review System
|
|
4
|
-
Review panel component for trace_view
|
|
5
|
-
#}
|
|
6
|
-
|
|
7
|
-
{# Packages Panel (REQ-d00092-PKG-AJ: Must appear BEFORE review-panel in DOM) #}
|
|
8
|
-
<div id="reviewPackagesPanel" class="review-packages-panel" style="display: none;">
|
|
9
|
-
<div class="packages-header" onclick="ReviewSystem.togglePackagesPanel()">
|
|
10
|
-
<span class="collapse-icon">▼</span>
|
|
11
|
-
<h3>Review Packages</h3>
|
|
12
|
-
<button class="create-btn"
|
|
13
|
-
onclick="event.stopPropagation(); ReviewSystem.showCreatePackageDialog()">+ New Package</button>
|
|
14
|
-
<button id="packageFilterToggle"
|
|
15
|
-
onclick="ReviewSystem.togglePackageFilter(event)">Filter</button>
|
|
16
|
-
<span id="packageFilterIndicator" class="filter-indicator"></span>
|
|
17
|
-
</div>
|
|
18
|
-
<div class="packages-content">
|
|
19
|
-
<div class="package-list" id="rs-package-list"></div>
|
|
20
|
-
</div>
|
|
21
|
-
<div id="packageContextIndicator" class="package-context-indicator" style="display: none;"></div>
|
|
22
|
-
</div>
|
|
23
|
-
|
|
24
|
-
<div id="review-panel" class="review-panel">
|
|
25
|
-
{# Help Menu (REQ-d00092) #}
|
|
26
|
-
<div id="rs-help-menu" class="rs-help-menu-container">
|
|
27
|
-
<button id="rs-help-menu-btn" class="rs-help-menu-btn"
|
|
28
|
-
onclick="ReviewSystem.help && ReviewSystem.help.toggleHelpMenuFromBtn ? ReviewSystem.help.toggleHelpMenuFromBtn(this) : null">
|
|
29
|
-
? <span class="rs-menu-arrow">▼</span>
|
|
30
|
-
</button>
|
|
31
|
-
<div id="rs-help-menu-dropdown" class="rs-help-menu-dropdown">
|
|
32
|
-
<div class="rs-help-menu-section">
|
|
33
|
-
<button id="rs-menu-tour" class="rs-help-menu-item"
|
|
34
|
-
onclick="ReviewSystem.help && ReviewSystem.help.startTour && ReviewSystem.help.startTour()">
|
|
35
|
-
<span class="rs-menu-icon">🎯</span>
|
|
36
|
-
<span class="rs-menu-label">Take Tour</span>
|
|
37
|
-
</button>
|
|
38
|
-
<button id="rs-menu-help-panel" class="rs-help-menu-item"
|
|
39
|
-
onclick="ReviewSystem.help && ReviewSystem.help.toggleHelpPanel && ReviewSystem.help.toggleHelpPanel()">
|
|
40
|
-
<span class="rs-menu-icon">❓</span>
|
|
41
|
-
<span class="rs-menu-label">Help Panel</span>
|
|
42
|
-
<span class="rs-menu-shortcut">?</span>
|
|
43
|
-
</button>
|
|
44
|
-
</div>
|
|
45
|
-
<div class="rs-help-menu-section">
|
|
46
|
-
<div class="rs-help-menu-section-label">Documentation</div>
|
|
47
|
-
<a href="#" class="rs-help-menu-item">
|
|
48
|
-
<span class="rs-menu-icon">📚</span>
|
|
49
|
-
<span class="rs-menu-label">Quick Start</span>
|
|
50
|
-
</a>
|
|
51
|
-
<a href="#" class="rs-help-menu-item">
|
|
52
|
-
<span class="rs-menu-icon">📖</span>
|
|
53
|
-
<span class="rs-menu-label">User Guide</span>
|
|
54
|
-
</a>
|
|
55
|
-
</div>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
|
|
59
|
-
{# Help Panel (REQ-d00092) #}
|
|
60
|
-
<div class="rs-help-panel hidden" id="rs-help-panel">
|
|
61
|
-
<div class="rs-help-panel-header">
|
|
62
|
-
<h3>Help</h3>
|
|
63
|
-
<button class="rs-btn-link" onclick="ReviewSystem.help && ReviewSystem.help.hideHelpPanel && ReviewSystem.help.hideHelpPanel()">×</button>
|
|
64
|
-
</div>
|
|
65
|
-
<div class="rs-help-search">
|
|
66
|
-
<input id="rs-help-search" type="text" class="rs-help-search-input" placeholder="Search help..."
|
|
67
|
-
oninput="ReviewSystem.help && ReviewSystem.help.filterHelpContent && ReviewSystem.help.filterHelpContent(this.value)">
|
|
68
|
-
</div>
|
|
69
|
-
<div class="rs-help-sections" id="rs-help-sections"></div>
|
|
70
|
-
<div class="rs-help-footer">
|
|
71
|
-
<div>Need more help?</div>
|
|
72
|
-
<div class="rs-help-links">
|
|
73
|
-
<a href="#" class="rs-help-link" onclick="ReviewSystem.help && ReviewSystem.help.showOnboarding && ReviewSystem.help.showOnboarding()">View Tutorial</a>
|
|
74
|
-
</div>
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
|
|
78
|
-
{# Review Panel Header #}
|
|
79
|
-
<div class="review-panel-header">
|
|
80
|
-
<span class="review-panel-title">Review Panel</span>
|
|
81
|
-
</div>
|
|
82
|
-
|
|
83
|
-
{# No Selection State #}
|
|
84
|
-
<div id="review-panel-no-selection" class="review-panel-no-selection">
|
|
85
|
-
<div class="icon">💬</div>
|
|
86
|
-
<p>Select a requirement to start reviewing</p>
|
|
87
|
-
<p style="font-size: 12px;">Click on any REQ row to open it here</p>
|
|
88
|
-
</div>
|
|
89
|
-
|
|
90
|
-
{# Panel Content (populated dynamically) #}
|
|
91
|
-
<div id="review-panel-content" class="review-panel-content" style="display: none;"></div>
|
|
92
|
-
|
|
93
|
-
{# Combined View Container (REQ-d00092) #}
|
|
94
|
-
<div id="review-panel-combined" class="review-panel-combined" style="display: none;">
|
|
95
|
-
{# Status Section (appears first) #}
|
|
96
|
-
<div id="rs-status-section" class="rs-status-section">
|
|
97
|
-
<div class="rs-section-header">
|
|
98
|
-
<h4>Status</h4>
|
|
99
|
-
</div>
|
|
100
|
-
<div id="rs-status-content" class="rs-status-content"></div>
|
|
101
|
-
</div>
|
|
102
|
-
|
|
103
|
-
{# Section Divider #}
|
|
104
|
-
<div class="rs-section-divider"></div>
|
|
105
|
-
|
|
106
|
-
{# Comments Section #}
|
|
107
|
-
<div id="rs-comments-section" class="rs-comments-section">
|
|
108
|
-
<div class="rs-section-header">
|
|
109
|
-
<h4>Comments</h4>
|
|
110
|
-
<button id="rs-add-comment-btn" class="rs-add-comment-btn"
|
|
111
|
-
onclick="event.stopPropagation(); ReviewSystem.showNewCommentForm && ReviewSystem.showNewCommentForm()">
|
|
112
|
-
Add Comment
|
|
113
|
-
</button>
|
|
114
|
-
</div>
|
|
115
|
-
<div id="rs-comments-content" class="rs-comments-content"></div>
|
|
116
|
-
</div>
|
|
117
|
-
</div>
|
|
118
|
-
</div>
|