Skip to content

Commit 2c90cf5

Browse files
fix: correct image relative paths for GitHub Pages rendering
Lab markdown files are at labs/lab-XX/README.md (2 levels deep). Image references used ../images/ which resolved to labs/images/ (404). Changed to ../../images/ to correctly resolve to the root images/ directory. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 322e51f commit 2c90cf5

12 files changed

Lines changed: 65 additions & 65 deletions

File tree

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ Examples:
7777
Place screenshot references after the step that produces visible output:
7878

7979
```markdown
80-
![ESLint results showing 12 warnings](../images/lab-02/lab-02-eslint-output.png)
80+
![ESLint results showing 12 warnings](../../images/lab-02/lab-02-eslint-output.png)
8181
```
8282

8383
### Adding New Screenshots

labs/lab-00-prerequisites/README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ npm --version
4141

4242
You should see Node.js version 20.x or higher.
4343

44-
![Node.js version verification](../images/lab-00/lab-00-node-version.png)
44+
![Node.js version verification](../../images/lab-00/lab-00-node-version.png)
4545

4646
### Exercise 2: Install Python 3.12+
4747

@@ -56,7 +56,7 @@ pip --version
5656

5757
You should see Python version 3.12.x or higher.
5858

59-
![Python version verification](../images/lab-00/lab-00-python-version.png)
59+
![Python version verification](../../images/lab-00/lab-00-python-version.png)
6060

6161
### Exercise 3: Install .NET 8 SDK
6262

@@ -70,7 +70,7 @@ dotnet --version
7070

7171
You should see version 8.0.x or higher.
7272

73-
![.NET SDK version verification](../images/lab-00/lab-00-dotnet-version.png)
73+
![.NET SDK version verification](../../images/lab-00/lab-00-dotnet-version.png)
7474

7575
### Exercise 4: Install Java 21+
7676

@@ -85,7 +85,7 @@ mvn --version
8585

8686
You should see Java version 21.x or higher.
8787

88-
![Java version verification](../images/lab-00/lab-00-java-version.png)
88+
![Java version verification](../../images/lab-00/lab-00-java-version.png)
8989

9090
### Exercise 5: Install Go 1.22+
9191

@@ -99,7 +99,7 @@ go version
9999

100100
You should see Go version 1.22.x or higher.
101101

102-
![Go version verification](../images/lab-00/lab-00-go-version.png)
102+
![Go version verification](../../images/lab-00/lab-00-go-version.png)
103103

104104
### Exercise 6: Install Docker
105105

@@ -114,7 +114,7 @@ docker --version
114114
docker run hello-world
115115
```
116116

117-
![Docker version verification](../images/lab-00/lab-00-docker-version.png)
117+
![Docker version verification](../../images/lab-00/lab-00-docker-version.png)
118118

119119
### Exercise 7: Install Scanning Tools
120120

@@ -176,7 +176,7 @@ Write-Host "Lizard: $(lizard --version)"
176176
Write-Host "golangci-lint: $(golangci-lint --version)"
177177
```
178178

179-
![All scanning tools verified](../images/lab-00/lab-00-tools-installed.png)
179+
![All scanning tools verified](../../images/lab-00/lab-00-tools-installed.png)
180180

181181
### Exercise 8: Fork and Clone the Demo App Repository
182182

@@ -210,7 +210,7 @@ cq-demo-app-004
210210
cq-demo-app-005
211211
```
212212

213-
![Cloning the demo-app repository](../images/lab-00/lab-00-clone-repo.png)
213+
![Cloning the demo-app repository](../../images/lab-00/lab-00-clone-repo.png)
214214

215215
### Exercise 9: Verify Docker Builds
216216

labs/lab-01-explore-demo-apps/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ You should see the following key directories:
4646

4747
Additional directories include `src/converters/` (SARIF converters), `src/config/` (tool configurations), `scripts/` (bootstrap and data pipeline), and `power-bi/` (PBIP dashboard).
4848

49-
![Repository directory structure](../images/lab-01/lab-01-repo-structure.png)
49+
![Repository directory structure](../../images/lab-01/lab-01-repo-structure.png)
5050

5151
### Exercise 2: Explore cq-demo-app-001 (TypeScript / Express)
5252

@@ -84,7 +84,7 @@ docker run -d -p 3000:3000 --name app001 cq-demo-app-001
8484

8585
Open [http://localhost:3000](http://localhost:3000) to see the running app.
8686

87-
![TypeScript Express app running](../images/lab-01/lab-01-app-001-running.png)
87+
![TypeScript Express app running](../../images/lab-01/lab-01-app-001-running.png)
8888

8989
Clean up:
9090

@@ -128,7 +128,7 @@ docker run -d -p 5000:5000 --name app002 cq-demo-app-002
128128

129129
Open [http://localhost:5000](http://localhost:5000) to verify.
130130

131-
![Python Flask app running](../images/lab-01/lab-01-app-002-running.png)
131+
![Python Flask app running](../../images/lab-01/lab-01-app-002-running.png)
132132

133133
Clean up:
134134

@@ -172,7 +172,7 @@ docker run -d -p 8080:8080 --name app003 cq-demo-app-003
172172

173173
Open [http://localhost:8080](http://localhost:8080) to verify.
174174

175-
![C# ASP.NET Core app running](../images/lab-01/lab-01-app-003-running.png)
175+
![C# ASP.NET Core app running](../../images/lab-01/lab-01-app-003-running.png)
176176

177177
Clean up:
178178

@@ -216,7 +216,7 @@ docker run -d -p 8080:8080 --name app004 cq-demo-app-004
216216

217217
Open [http://localhost:8080](http://localhost:8080) to verify.
218218

219-
![Java Spring Boot app running](../images/lab-01/lab-01-app-004-running.png)
219+
![Java Spring Boot app running](../../images/lab-01/lab-01-app-004-running.png)
220220

221221
Clean up:
222222

@@ -260,7 +260,7 @@ docker run -d -p 8080:8080 --name app005 cq-demo-app-005
260260

261261
Open [http://localhost:8080](http://localhost:8080) to verify.
262262

263-
![Go net/http app running](../images/lab-01/lab-01-app-005-running.png)
263+
![Go net/http app running](../../images/lab-01/lab-01-app-005-running.png)
264264

265265
Clean up:
266266

@@ -285,7 +285,7 @@ Look for these patterns:
285285
4. **Copy-pasted blocks**: Similar code blocks in different files
286286
5. **Missing tests**: Source files without corresponding test files
287287

288-
![Sample code with intentional violations](../images/lab-01/lab-01-violations-preview.png)
288+
![Sample code with intentional violations](../../images/lab-01/lab-01-violations-preview.png)
289289

290290
## Verification Checkpoint
291291

labs/lab-02-linting/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ You should see violations such as:
4949
- `@typescript-eslint/no-unused-vars` — declared but unused variables
5050
- `@typescript-eslint/no-explicit-any` — use of `any` type instead of specific types
5151

52-
![ESLint output showing TypeScript violations](../images/lab-02/lab-02-eslint-output.png)
52+
![ESLint output showing TypeScript violations](../../images/lab-02/lab-02-eslint-output.png)
5353

5454
Now run ESLint with SARIF output to see the machine-readable format:
5555

@@ -68,7 +68,7 @@ Examine the SARIF output:
6868
Get-Content eslint-results.sarif | ConvertFrom-Json | ConvertTo-Json -Depth 10 | Select-Object -First 60
6969
```
7070
71-
![ESLint SARIF output](../images/lab-02/lab-02-eslint-sarif.png)
71+
![ESLint SARIF output](../../images/lab-02/lab-02-eslint-sarif.png)
7272

7373
```powershell
7474
cd ..
@@ -93,7 +93,7 @@ Ruff organizes rules by category prefix:
9393
| `I` | isort — import ordering | I001 (unsorted imports) |
9494
| `N` | pep8-naming — naming conventions | N802 (function name should be lowercase) |
9595

96-
![Ruff output showing Python violations](../images/lab-02/lab-02-ruff-output.png)
96+
![Ruff output showing Python violations](../../images/lab-02/lab-02-ruff-output.png)
9797

9898
Run Ruff with SARIF output:
9999

@@ -124,7 +124,7 @@ Common .NET Analyzer findings include:
124124
| CA1031 | Do not catch general exception types |
125125
| IDE0060 | Remove unused parameter |
126126

127-
![.NET Analyzers output](../images/lab-02/lab-02-dotnet-analyzers.png)
127+
![.NET Analyzers output](../../images/lab-02/lab-02-dotnet-analyzers.png)
128128

129129
To generate SARIF output from the .NET build:
130130

@@ -157,7 +157,7 @@ Common Checkstyle findings:
157157
| `JavadocMethod` | Missing Javadoc on public methods |
158158
| `CyclomaticComplexity` | Methods with complexity > 10 |
159159

160-
![Checkstyle output for Java](../images/lab-02/lab-02-checkstyle-output.png)
160+
![Checkstyle output for Java](../../images/lab-02/lab-02-checkstyle-output.png)
161161

162162
```powershell
163163
cd ..
@@ -182,7 +182,7 @@ Common golangci-lint findings:
182182
| `govet` | Reports suspicious constructs |
183183
| `unused` | Unused variables, functions, or types |
184184

185-
![golangci-lint output for Go](../images/lab-02/lab-02-golangci-lint-output.png)
185+
![golangci-lint output for Go](../../images/lab-02/lab-02-golangci-lint-output.png)
186186

187187
Run with SARIF output (golangci-lint does not natively output SARIF, but you can use JSON and convert):
188188

@@ -247,7 +247,7 @@ Key SARIF concepts:
247247
| `results[].locations` | File path, line number, and column |
248248
| `results[].message` | Human-readable description of the finding |
249249

250-
![SARIF JSON structure](../images/lab-02/lab-02-sarif-structure.png)
250+
![SARIF JSON structure](../../images/lab-02/lab-02-sarif-structure.png)
251251

252252
## Verification Checkpoint
253253

labs/lab-03-complexity/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Lizard outputs a table with these columns:
5959
| Length | Total function length in lines |
6060
| Location | File path and function name |
6161

62-
![Lizard output showing complexity metrics](../images/lab-03/lab-03-lizard-output.png)
62+
![Lizard output showing complexity metrics](../../images/lab-03/lab-03-lizard-output.png)
6363

6464
### Exercise 3: Generate CSV Output
6565

@@ -77,7 +77,7 @@ Get-Content lizard-output.csv | Select-Object -First 15
7777

7878
The CSV contains one row per function with columns: NLOC, CCN, Token, PARAM, Length, Location, File, Function, Start, End.
7979

80-
![Lizard CSV output](../images/lab-03/lab-03-lizard-csv.png)
80+
![Lizard CSV output](../../images/lab-03/lab-03-lizard-csv.png)
8181

8282
### Exercise 4: Convert to SARIF Format
8383

@@ -98,7 +98,7 @@ Examine the generated SARIF:
9898
Get-Content complexity.sarif | ConvertFrom-Json | Select-Object -ExpandProperty runs | Select-Object -ExpandProperty results | Select-Object ruleId, level, @{N='function';E={$_.locations[0].physicalLocation.artifactLocation.uri}} | Format-Table
9999
```
100100

101-
![lizard-to-sarif.py conversion output](../images/lab-03/lab-03-sarif-conversion.png)
101+
![lizard-to-sarif.py conversion output](../../images/lab-03/lab-03-sarif-conversion.png)
102102

103103
### Exercise 5: Identify High-Complexity Functions
104104

@@ -114,7 +114,7 @@ For each flagged function, note:
114114
2. **What causes it** — nested `if/else`, `switch` statements, loops within loops
115115
3. **How to fix it** — extract helper functions, use early returns, replace conditionals with lookup tables
116116

117-
![Functions exceeding CCN threshold](../images/lab-03/lab-03-high-ccn-functions.png)
117+
![Functions exceeding CCN threshold](../../images/lab-03/lab-03-high-ccn-functions.png)
118118

119119
### Exercise 6: Analyze Nesting Depth
120120

labs/lab-04-duplication/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ jscpd scans for blocks of duplicated code (clones) across files and languages. T
4141
- **Lines** of duplicated code
4242
- **Percentage** of duplication in the codebase
4343

44-
![jscpd output showing duplicates](../images/lab-04/lab-04-jscpd-output.png)
44+
![jscpd output showing duplicates](../../images/lab-04/lab-04-jscpd-output.png)
4545

4646
### Exercise 2: Generate an HTML Report
4747

@@ -65,7 +65,7 @@ The HTML report provides:
6565
- Side-by-side comparison of duplicated blocks
6666
- File-level and project-level duplication metrics
6767

68-
![jscpd HTML report](../images/lab-04/lab-04-duplication-report.png)
68+
![jscpd HTML report](../../images/lab-04/lab-04-duplication-report.png)
6969

7070
### Exercise 3: Understand Clone Types
7171

@@ -83,7 +83,7 @@ Review a detected clone in detail:
8383
jscpd cq-demo-app-001/src cq-demo-app-002/src --min-lines 5 --reporters consoleFull
8484
```
8585

86-
![Clone detail view](../images/lab-04/lab-04-clone-details.png)
86+
![Clone detail view](../../images/lab-04/lab-04-clone-details.png)
8787

8888
### Exercise 4: Configure Detection Thresholds
8989

@@ -123,7 +123,7 @@ Key configuration options:
123123
| `ignore` | `[]` | Glob patterns for files/directories to exclude |
124124
| `reporters` | `["consoleFull"]` | Output formats: `console`, `consoleFull`, `json`, `html`, `sarif` |
125125

126-
![.jscpd.json configuration](../images/lab-04/lab-04-jscpd-config.png)
126+
![.jscpd.json configuration](../../images/lab-04/lab-04-jscpd-config.png)
127127

128128
### Exercise 5: Generate SARIF Output
129129

labs/lab-05-coverage/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Jest outputs a coverage summary table:
4343
| **Functions** | Percentage of functions called |
4444
| **Lines** | Percentage of lines executed |
4545

46-
![Jest coverage output](../images/lab-05/lab-05-jest-coverage.png)
46+
![Jest coverage output](../../images/lab-05/lab-05-jest-coverage.png)
4747

4848
The coverage summary JSON is saved to `coverage/coverage-summary.json`. Note the intentionally low coverage — many utility functions have no tests.
4949

@@ -60,7 +60,7 @@ python -m pytest tests/ --cov=src --cov-report=term --cov-report=xml:coverage.xm
6060

6161
pytest-cov generates a Cobertura XML report at `coverage.xml` and prints a terminal summary.
6262

63-
![pytest-cov coverage output](../images/lab-05/lab-05-pytest-coverage.png)
63+
![pytest-cov coverage output](../../images/lab-05/lab-05-pytest-coverage.png)
6464

6565
Note which modules have low coverage — the service layer typically has the least coverage in this demo app because error-handling paths are untested.
6666

@@ -89,7 +89,7 @@ reportgenerator -reports:TestResults/**/coverage.cobertura.xml -targetdir:Covera
8989
Get-Content CoverageReport/Summary.txt
9090
```
9191

92-
![Coverlet coverage output](../images/lab-05/lab-05-coverlet-output.png)
92+
![Coverlet coverage output](../../images/lab-05/lab-05-coverlet-output.png)
9393

9494
```powershell
9595
cd ..
@@ -112,7 +112,7 @@ View the summary:
112112
Get-Content target/site/jacoco/jacoco.xml | Select-String "counter type" | Select-Object -First 10
113113
```
114114

115-
![JaCoCo coverage output](../images/lab-05/lab-05-jacoco-output.png)
115+
![JaCoCo coverage output](../../images/lab-05/lab-05-jacoco-output.png)
116116

117117
```powershell
118118
cd ..
@@ -128,7 +128,7 @@ go tool cover -func=coverage.out
128128

129129
The `-func` flag shows per-function coverage. The Go demo app intentionally has minimal test files, resulting in very low coverage.
130130

131-
![Go test coverage output](../images/lab-05/lab-05-go-coverage.png)
131+
![Go test coverage output](../../images/lab-05/lab-05-go-coverage.png)
132132

133133
To generate an HTML coverage report:
134134

@@ -175,7 +175,7 @@ python src/converters/coverage-to-sarif.py --input cq-demo-app-004/target/site/j
175175
python src/converters/coverage-to-sarif.py --input cq-demo-app-005/coverage.out --format gocover --output cq-005-coverage.sarif --threshold 80
176176
```
177177

178-
![coverage-to-sarif.py conversion](../images/lab-05/lab-05-sarif-conversion.png)
178+
![coverage-to-sarif.py conversion](../../images/lab-05/lab-05-sarif-conversion.png)
179179

180180
### Exercise 7: Compare Coverage Across Apps
181181

@@ -200,7 +200,7 @@ Write-Host "App 005 (Go):"
200200
Get-Content cq-005-coverage.sarif | ConvertFrom-Json | Select-Object -ExpandProperty runs | Select-Object -ExpandProperty results | Measure-Object | Select-Object -ExpandProperty Count | ForEach-Object { Write-Host " Files below threshold: $_" }
201201
```
202202

203-
![Coverage comparison across apps](../images/lab-05/lab-05-coverage-comparison.png)
203+
![Coverage comparison across apps](../../images/lab-05/lab-05-coverage-comparison.png)
204204

205205
The 80% threshold is the CI quality gate standard. Any file below this threshold generates a SARIF finding that would block a merge in a production CI pipeline.
206206

labs/lab-06-ado-pipelines/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ If the repository has not been imported to ADO yet, use the bootstrap script or
3535

3636
Alternatively, use the `bootstrap-demo-apps-ado.ps1` script which automates this process.
3737

38-
![Importing repository into ADO](../images/lab-06-ado/lab-06-ado-pipeline-import.png)
38+
![Importing repository into ADO](../../images/lab-06-ado/lab-06-ado-pipeline-import.png)
3939

4040
### Exercise 2: Create the Pipeline
4141

@@ -89,11 +89,11 @@ steps:
8989
2. Click on the running pipeline to see job progress.
9090
3. Each matrix job runs independently and produces its own SARIF output.
9191
92-
![ADO pipeline running](../images/lab-06-ado/lab-06-ado-pipeline-run.png)
92+
![ADO pipeline running](../../images/lab-06-ado/lab-06-ado-pipeline-run.png)
9393
9494
Wait for all 5 matrix jobs to complete:
9595
96-
![ADO pipeline completed](../images/lab-06-ado/lab-06-ado-pipeline-complete.png)
96+
![ADO pipeline completed](../../images/lab-06-ado/lab-06-ado-pipeline-complete.png)
9797
9898
### Exercise 4: View Results in ADO Advanced Security
9999
@@ -104,7 +104,7 @@ Wait for all 5 matrix jobs to complete:
104104
- **Tool**: The scanner name from the SARIF `tool.driver.name` field
105105
- **Rule**: Individual rule IDs
106106

107-
![ADO Advanced Security findings](../images/lab-06-ado/lab-06-ado-advanced-security.png)
107+
![ADO Advanced Security findings](../../images/lab-06-ado/lab-06-ado-advanced-security.png)
108108

109109
### Exercise 5: Examine a Finding
110110

@@ -115,7 +115,7 @@ Click on any finding to see its detail view:
115115
- **Severity** mapped from the SARIF level
116116
- **Remediation guidance** from the SARIF `help.markdown` field
117117

118-
![ADO finding detail](../images/lab-06-ado/lab-06-ado-finding-detail.png)
118+
![ADO finding detail](../../images/lab-06-ado/lab-06-ado-finding-detail.png)
119119

120120
### Exercise 6: Compare GitHub vs. ADO Integration
121121

0 commit comments

Comments
 (0)