elspais 0.11.1__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.
Files changed (148) hide show
  1. elspais/__init__.py +2 -11
  2. elspais/{sponsors/__init__.py → associates.py} +102 -58
  3. elspais/cli.py +395 -79
  4. elspais/commands/__init__.py +9 -3
  5. elspais/commands/analyze.py +121 -173
  6. elspais/commands/changed.py +15 -30
  7. elspais/commands/config_cmd.py +13 -16
  8. elspais/commands/edit.py +60 -44
  9. elspais/commands/example_cmd.py +319 -0
  10. elspais/commands/hash_cmd.py +167 -183
  11. elspais/commands/health.py +1177 -0
  12. elspais/commands/index.py +98 -114
  13. elspais/commands/init.py +103 -26
  14. elspais/commands/reformat_cmd.py +41 -444
  15. elspais/commands/rules_cmd.py +7 -3
  16. elspais/commands/trace.py +444 -321
  17. elspais/commands/validate.py +195 -415
  18. elspais/config/__init__.py +799 -5
  19. elspais/{core/content_rules.py → content_rules.py} +20 -3
  20. elspais/docs/cli/assertions.md +67 -0
  21. elspais/docs/cli/commands.md +304 -0
  22. elspais/docs/cli/config.md +262 -0
  23. elspais/docs/cli/format.md +66 -0
  24. elspais/docs/cli/git.md +45 -0
  25. elspais/docs/cli/health.md +190 -0
  26. elspais/docs/cli/hierarchy.md +60 -0
  27. elspais/docs/cli/ignore.md +72 -0
  28. elspais/docs/cli/mcp.md +245 -0
  29. elspais/docs/cli/quickstart.md +58 -0
  30. elspais/docs/cli/traceability.md +89 -0
  31. elspais/docs/cli/validation.md +96 -0
  32. elspais/graph/GraphNode.py +383 -0
  33. elspais/graph/__init__.py +40 -0
  34. elspais/graph/annotators.py +927 -0
  35. elspais/graph/builder.py +1886 -0
  36. elspais/graph/deserializer.py +248 -0
  37. elspais/graph/factory.py +284 -0
  38. elspais/graph/metrics.py +127 -0
  39. elspais/graph/mutations.py +161 -0
  40. elspais/graph/parsers/__init__.py +156 -0
  41. elspais/graph/parsers/code.py +213 -0
  42. elspais/graph/parsers/comments.py +112 -0
  43. elspais/graph/parsers/config_helpers.py +29 -0
  44. elspais/graph/parsers/heredocs.py +225 -0
  45. elspais/graph/parsers/journey.py +131 -0
  46. elspais/graph/parsers/remainder.py +79 -0
  47. elspais/graph/parsers/requirement.py +347 -0
  48. elspais/graph/parsers/results/__init__.py +6 -0
  49. elspais/graph/parsers/results/junit_xml.py +229 -0
  50. elspais/graph/parsers/results/pytest_json.py +313 -0
  51. elspais/graph/parsers/test.py +305 -0
  52. elspais/graph/relations.py +78 -0
  53. elspais/graph/serialize.py +216 -0
  54. elspais/html/__init__.py +8 -0
  55. elspais/html/generator.py +731 -0
  56. elspais/html/templates/trace_view.html.j2 +2151 -0
  57. elspais/mcp/__init__.py +47 -29
  58. elspais/mcp/__main__.py +5 -1
  59. elspais/mcp/file_mutations.py +138 -0
  60. elspais/mcp/server.py +2016 -247
  61. elspais/testing/__init__.py +4 -4
  62. elspais/testing/config.py +3 -0
  63. elspais/testing/mapper.py +1 -1
  64. elspais/testing/result_parser.py +25 -21
  65. elspais/testing/scanner.py +301 -12
  66. elspais/utilities/__init__.py +1 -0
  67. elspais/utilities/docs_loader.py +115 -0
  68. elspais/utilities/git.py +607 -0
  69. elspais/{core → utilities}/hasher.py +8 -22
  70. elspais/utilities/md_renderer.py +189 -0
  71. elspais/{core → utilities}/patterns.py +58 -57
  72. elspais/utilities/reference_config.py +626 -0
  73. elspais/validation/__init__.py +19 -0
  74. elspais/validation/format.py +264 -0
  75. {elspais-0.11.1.dist-info → elspais-0.43.5.dist-info}/METADATA +7 -4
  76. elspais-0.43.5.dist-info/RECORD +80 -0
  77. elspais/config/defaults.py +0 -173
  78. elspais/config/loader.py +0 -494
  79. elspais/core/__init__.py +0 -21
  80. elspais/core/git.py +0 -352
  81. elspais/core/models.py +0 -320
  82. elspais/core/parser.py +0 -640
  83. elspais/core/rules.py +0 -514
  84. elspais/mcp/context.py +0 -171
  85. elspais/mcp/serializers.py +0 -112
  86. elspais/reformat/__init__.py +0 -50
  87. elspais/reformat/detector.py +0 -119
  88. elspais/reformat/hierarchy.py +0 -246
  89. elspais/reformat/line_breaks.py +0 -220
  90. elspais/reformat/prompts.py +0 -123
  91. elspais/reformat/transformer.py +0 -264
  92. elspais/trace_view/__init__.py +0 -54
  93. elspais/trace_view/coverage.py +0 -183
  94. elspais/trace_view/generators/__init__.py +0 -12
  95. elspais/trace_view/generators/base.py +0 -329
  96. elspais/trace_view/generators/csv.py +0 -122
  97. elspais/trace_view/generators/markdown.py +0 -175
  98. elspais/trace_view/html/__init__.py +0 -31
  99. elspais/trace_view/html/generator.py +0 -1006
  100. elspais/trace_view/html/templates/base.html +0 -283
  101. elspais/trace_view/html/templates/components/code_viewer_modal.html +0 -14
  102. elspais/trace_view/html/templates/components/file_picker_modal.html +0 -20
  103. elspais/trace_view/html/templates/components/legend_modal.html +0 -69
  104. elspais/trace_view/html/templates/components/review_panel.html +0 -118
  105. elspais/trace_view/html/templates/partials/review/help/help-panel.json +0 -244
  106. elspais/trace_view/html/templates/partials/review/help/onboarding.json +0 -77
  107. elspais/trace_view/html/templates/partials/review/help/tooltips.json +0 -237
  108. elspais/trace_view/html/templates/partials/review/review-comments.js +0 -928
  109. elspais/trace_view/html/templates/partials/review/review-data.js +0 -961
  110. elspais/trace_view/html/templates/partials/review/review-help.js +0 -679
  111. elspais/trace_view/html/templates/partials/review/review-init.js +0 -177
  112. elspais/trace_view/html/templates/partials/review/review-line-numbers.js +0 -429
  113. elspais/trace_view/html/templates/partials/review/review-packages.js +0 -1029
  114. elspais/trace_view/html/templates/partials/review/review-position.js +0 -540
  115. elspais/trace_view/html/templates/partials/review/review-resize.js +0 -115
  116. elspais/trace_view/html/templates/partials/review/review-status.js +0 -659
  117. elspais/trace_view/html/templates/partials/review/review-sync.js +0 -992
  118. elspais/trace_view/html/templates/partials/review-styles.css +0 -2238
  119. elspais/trace_view/html/templates/partials/scripts.js +0 -1741
  120. elspais/trace_view/html/templates/partials/styles.css +0 -1756
  121. elspais/trace_view/models.py +0 -353
  122. elspais/trace_view/review/__init__.py +0 -60
  123. elspais/trace_view/review/branches.py +0 -1149
  124. elspais/trace_view/review/models.py +0 -1205
  125. elspais/trace_view/review/position.py +0 -609
  126. elspais/trace_view/review/server.py +0 -1056
  127. elspais/trace_view/review/status.py +0 -470
  128. elspais/trace_view/review/storage.py +0 -1367
  129. elspais/trace_view/scanning.py +0 -213
  130. elspais/trace_view/specs/README.md +0 -84
  131. elspais/trace_view/specs/tv-d00001-template-architecture.md +0 -36
  132. elspais/trace_view/specs/tv-d00002-css-extraction.md +0 -37
  133. elspais/trace_view/specs/tv-d00003-js-extraction.md +0 -43
  134. elspais/trace_view/specs/tv-d00004-build-embedding.md +0 -40
  135. elspais/trace_view/specs/tv-d00005-test-format.md +0 -78
  136. elspais/trace_view/specs/tv-d00010-review-data-models.md +0 -33
  137. elspais/trace_view/specs/tv-d00011-review-storage.md +0 -33
  138. elspais/trace_view/specs/tv-d00012-position-resolution.md +0 -33
  139. elspais/trace_view/specs/tv-d00013-git-branches.md +0 -31
  140. elspais/trace_view/specs/tv-d00014-review-api-server.md +0 -31
  141. elspais/trace_view/specs/tv-d00015-status-modifier.md +0 -27
  142. elspais/trace_view/specs/tv-d00016-js-integration.md +0 -33
  143. elspais/trace_view/specs/tv-p00001-html-generator.md +0 -33
  144. elspais/trace_view/specs/tv-p00002-review-system.md +0 -29
  145. elspais-0.11.1.dist-info/RECORD +0 -101
  146. {elspais-0.11.1.dist-info → elspais-0.43.5.dist-info}/WHEEL +0 -0
  147. {elspais-0.11.1.dist-info → elspais-0.43.5.dist-info}/entry_points.txt +0 -0
  148. {elspais-0.11.1.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>