Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
ed16b1f
build: migrate Python packaging from requirements.txt/setup.py to uv
vinod0m Jul 6, 2026
dea32ec
feat: port Workspace and Login screens from the SoftwareDevLabs desig…
vinod0m Jul 6, 2026
cc52c55
chore: add project CLAUDE.md, ignore local AI-tooling state
vinod0m Jul 6, 2026
9d46638
feat: port Findings review screen from the SoftwareDevLabs design pro…
vinod0m Jul 6, 2026
247f392
fix: mount agent chat on project screens, restore focus rings, projec…
vinod0m Jul 6, 2026
bf5aef8
fix: guard placeholder route lookup against prototype keys
vinod0m Jul 6, 2026
97fd0bb
feat: port project Dashboard screen from the SoftwareDevLabs design p…
vinod0m Jul 6, 2026
17e4550
build: exclude *.test.ts from the app typecheck
vinod0m Jul 6, 2026
5e28f05
fix: collapse dashboard grid to one column on narrow viewports
vinod0m Jul 6, 2026
3b697cf
feat: port Evidence packs screen from the SoftwareDevLabs design project
vinod0m Jul 6, 2026
fa6961e
feat: port Audit trail screen from the SoftwareDevLabs design project
vinod0m Jul 7, 2026
63740ff
chore: ignore additional local AI-tooling directories
vinod0m Jul 7, 2026
f88b04b
fix: make audit entry ids unique within a session
vinod0m Jul 7, 2026
1947145
feat: port Traceability explorer screen from the SoftwareDevLabs desi…
vinod0m Jul 7, 2026
2d6d4b3
feat: port Vulnerabilities screen from the SoftwareDevLabs design pro…
vinod0m Jul 7, 2026
19d23f7
feat: port Releases screen from the SoftwareDevLabs design project
vinod0m Jul 7, 2026
1d63248
feat: port All items register screen from the SoftwareDevLabs design …
vinod0m Jul 7, 2026
0a50032
feat: port Risk management screen from the SoftwareDevLabs design pro…
vinod0m Jul 7, 2026
85532bb
feat: port Risk controls screen from the SoftwareDevLabs design project
vinod0m Jul 7, 2026
3632c08
feat: port SBOM management screen from the SoftwareDevLabs design pro…
vinod0m Jul 7, 2026
c4532d4
feat: port Agents configuration screen from the SoftwareDevLabs desig…
vinod0m Jul 7, 2026
a2fa9b8
feat: port Connectors catalog screen from the SoftwareDevLabs design …
vinod0m Jul 7, 2026
56f2433
feat: port project Settings screen from the SoftwareDevLabs design pr…
vinod0m Jul 7, 2026
fca235e
feat: port Graph view screen from the SoftwareDevLabs design project
vinod0m Jul 7, 2026
af6ebec
docs: mark all SoftwareDevLabs design screens as ported
vinod0m Jul 7, 2026
d176384
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
49e9556
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
cfebd89
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
ac26c2e
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
a076ba9
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
58b1606
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
36bce15
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
ae2d334
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
2646086
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
86a4219
Potential fix for pull request finding 'Expression has no effect'
vinod0m Jul 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 26 additions & 18 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ SDLC_core is a Python-based Software Development Life Cycle core project that pr
**CRITICAL**: Always run dependency installation before any build or test operations:

```bash
# Install testing and analysis dependencies (requirements.txt is empty)
pip install pytest pytest-cov mypy pylint
# Install testing and analysis dependencies from pyproject.toml
uv sync --group test --group lint --group docs
```

### Environment Setup
Expand All @@ -34,9 +34,9 @@ python --version
### Build Steps

1. **Bootstrap** - No specific bootstrap required, Python-based project
2. **Dependencies** - Manual installation required (empty requirements.txt):
2. **Dependencies** - Install via uv:
```bash
pip install pytest pytest-cov mypy pylint
uv sync --group test --group lint --group docs
```
3. **Build** - No compilation step needed for Python modules
4. **Validate** - Run linting and static analysis
Expand All @@ -47,15 +47,15 @@ python --version

```bash
# Test framework validation (will show "no tests ran" for empty template files)
PYTHONPATH=. python -m pytest test/ -v
PYTHONPATH=. uv run pytest test/ -v

# Run tests with coverage (when actual tests exist)
PYTHONPATH=. python -m pytest test/ --cov=src/ --cov-report=xml
PYTHONPATH=. uv run pytest test/ --cov=src/ --cov-report=xml

# Run specific test types (currently empty template structure)
PYTHONPATH=. python -m pytest test/unit/ -v # Unit tests
PYTHONPATH=. python -m pytest test/integration/ -v # Integration tests
PYTHONPATH=. python -m pytest test/e2e/ -v # End-to-end tests
PYTHONPATH=. uv run pytest test/unit/ -v # Unit tests
PYTHONPATH=. uv run pytest test/integration/ -v # Integration tests
PYTHONPATH=. uv run pytest test/e2e/ -v # End-to-end tests
```

**Test Structure** (template-ready):
Expand All @@ -70,10 +70,10 @@ PYTHONPATH=. python -m pytest test/e2e/ -v # End-to-end tests

```bash
# Run pylint on all Python files (clean output)
python -m pylint src/ --exit-zero
uv run pylint $(git ls-files '*.py') --exit-zero

# Run mypy static analysis (works correctly with documented exclusion)
python -m mypy src/ --ignore-missing-imports --exclude="src/llm/router.py"
uv run mypy src/ --ignore-missing-imports --exclude="src/llm/router.py"
```

**SUCCESS**: mypy runs cleanly with documented parameters.
Expand Down Expand Up @@ -172,10 +172,12 @@ doc/ → Project documentation:

### Key Dependencies and Architecture Notes

**Python Module Dependencies** (install manually):
**Python Module Dependencies** (managed via uv):
- `pytest`, `pytest-cov` - Testing framework
- `mypy` - Static type checking
- `pylint` - Code quality analysis
- `flake8` - Style checks
- `sphinx`, `sphinx-autodoc-typehints` - Documentation generation

**Branch Strategy** (from doc/submitting_code.md):
- `dev/main` - Primary development branch
Expand All @@ -202,23 +204,21 @@ NOTICE.md → Legal notices and attributions
README.md → Project overview and quick start
SECURITY.md → Security policy and reporting
SUPPORT.md → Support channels and help
requirements.txt → Python dependencies (currently empty)
setup.py → Python package setup (currently empty)
pyproject.toml → Python dependencies and uv groups
```

## Critical Instructions for Coding Agents

**ALWAYS do the following before making changes:**

1. **Install dependencies**: `pip install pytest pytest-cov mypy pylint`
1. **Install dependencies**: `uv sync --group test --group lint --group docs`
2. **Set Python path**: `export PYTHONPATH=.` or prefix commands with `PYTHONPATH=.`
3. **Test before changing**: `PYTHONPATH=. python -m pytest test/ -v` to validate current state
3. **Test before changing**: `PYTHONPATH=. uv run pytest test/ -v` to validate current state
4. **Check module imports**: Ensure new Python modules have proper `__init__.py` files
5. **Follow branch naming**: Use `dev/<alias>/<feature>` pattern for feature branches

**NEVER do the following:**
- Run tests without setting PYTHONPATH
- Assume requirements.txt contains dependencies
- Create modules named "router" (conflicts with existing router.py files)
- Modify Azure pipeline scripts without TypeScript knowledge
- Skip the inbox workflow when submitting to Overall Tool Repo
Expand All @@ -229,4 +229,12 @@ setup.py → Python package setup (currently empty)
- Consider impact on LLM client routing and fallback logic
- Verify no naming conflicts with existing modules

**Trust these instructions** - only search for additional information if these instructions are incomplete or found to be incorrect. The empty requirements.txt and specific PYTHONPATH requirements are documented limitations that require manual handling.
**Trust these instructions** - only search for additional information if these instructions are incomplete or found to be incorrect. The empty requirements.txt and specific PYTHONPATH requirements are documented limitations that require manual handling.

<claude-mem-context>
# claude-mem: Cross-Session Memory

*No context yet. Complete your first session and context will appear here.*

Use claude-mem's MCP search tools for manual memory queries.
</claude-mem-context>
7 changes: 4 additions & 3 deletions .github/workflows/pylint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ jobs:
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Set up uv
uses: astral-sh/setup-uv@v5
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pylint
uv sync --group lint
- name: Analysing the code with pylint
run: |
pylint $(git ls-files '*.py')
uv run pylint $(git ls-files '*.py')
9 changes: 5 additions & 4 deletions .github/workflows/python-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Set up uv
uses: astral-sh/setup-uv@v5
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install sphinx sphinx-autodoc-typehints
uv sync --group docs
- name: Generate Sphinx docs
run: |
sphinx-apidoc -o docs/ src/
sphinx-build -b html docs/ docs/_build/html
uv run sphinx-apidoc -o docs/ src/
uv run sphinx-build -b html docs/ docs/_build/html
- name: Upload documentation artifact
uses: actions/upload-artifact@v4
with:
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/python-style.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Set up uv
uses: astral-sh/setup-uv@v5
- name: Install flake8
run: pip install flake8
run: uv sync --group lint
- name: Run flake8
run: flake8 src/ --count --select=E9,F63,F7,F82 --show-source --statistics
run: uv run flake8 src/ --count --select=E9,F63,F7,F82 --show-source --statistics
10 changes: 5 additions & 5 deletions .github/workflows/python-test-static.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ jobs:
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Set up uv
uses: astral-sh/setup-uv@v5
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest pytest-cov mypy
uv sync --group test
- name: Run unit tests
run: pytest --cov=src/ --cov-report=xml
run: uv run pytest --cov=src/ --cov-report=xml
- name: Run mypy static analysis
run: mypy src/
run: uv run mypy src/
53 changes: 42 additions & 11 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -285,15 +285,46 @@ profiles.json
*.metaproj
*.swp

# MSBuildCache
/MSBuildCacheLogs/
*.DS_Store

# Node.js and npm
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Build outputs
# MSBuildCache
/MSBuildCacheLogs/
*.DS_Store
# Node.js and npm
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Build outputs
dist/


#Ignore vscode AI rules
.github/instructions/codacy.instructions.md

# Local AI-tooling state (per-machine, not project source)
.agents/
.augment/
.claude/
.claude-flow/
.codacy/
.codebuddy/
.codex/
.continue/
.cursor/
.factory/
.gemini/
.github/prompts/
.kilocode/
.kiro/
.opencode/
.qoder/
.roo/
.warp/
.playwright-mcp/
.tokensave/
.trae/
.windsurf/
WARP.md
skills-lock.json
.superpowers/
52 changes: 52 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
## Workflow Orchestration\
\
### 1. Plan Mode Default\
- Enter plan mode for ANY non-trivial task (3+ steps or architectural decisions)\
- If something goes sideways, STOP and re-plan immediately\
- Use plan mode for verification steps, not just building\
- Write detailed specs upfront to reduce ambiguity\
\
### 2. Subagent Strategy\
- Use subagents liberally to keep main context window clean\
- Offload research, exploration, and parallel analysis to subagents\
- For complex problems, throw more compute at it via subagents\
- One task per subagent for focused execution\
\
### 3. Self-Improvement Loop\
- After ANY correction from the user: update tasks/lessons.md with the pattern\
- Write rules for yourself that prevent the same mistake\
- Ruthlessly iterate on these lessons until mistake rate drops\
- Review lessons at session start for relevant project\
\
### 4. Verification Before Done\
- Never mark a task complete without proving it works\
- Diff behavior between main and your changes when relevant\
- Ask yourself: "Would a staff engineer approve this?"\
- Run tests, check logs, demonstrate correctness\
\
### 5. Demand Elegance (Balanced)\
- For non-trivial changes: pause and ask "is there a more elegant way?"\
- If a fix feels hacky: "Knowing everything I know now, implement the elegant solution"\
- Skip this for simple, obvious fixes -- don't over-engineer\
- Challenge your own work before presenting it\
\
### 6. Autonomous Bug Fixing\
- When given a bug report: just fix it. Don't ask for hand-holding\
- Point at logs, errors, failing tests -- then resolve them\
- Zero context switching required from the user\
- Go fix failing CI tests without being told how\
\
## Task Management\
\
1. Plan First: Write plan to tasks/todo.md with checkable items\
2. Verify Plan: Check in before starting implementation\
3. Track Progress: Mark items complete as you go\
4. Explain Changes: High-level summary at each step\
5. Document Results: Add review section to tasks/todo.md\
6. Capture Lessons: Update tasks/lessons.md after corrections\
\
## Core Principles\
\
- Simplicity First: Make every change as simple as possible. Impact minimal code.\
- No Laziness: Find root causes. No temporary fixes. Senior developer standards.\
- Minimal Impact: Only touch what's necessary. No side effects with new bugs.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ Documentation](https://github.com/SoftwareDevLabs).
## 🧭 Getting Started

1. Clone the repo
2. Install via `requirements.txt`
2. Install Python tooling with `uv sync --group test --group lint --group docs`
3. Set up model configs
4. Check sample code
5. Begin in notebooks
Expand All @@ -144,7 +144,7 @@ Documentation](https://github.com/SoftwareDevLabs).

## 📁 Core Files

- `requirements.txt` – Package dependencies
- `pyproject.toml` – Python project metadata and dependency groups
- `README.md` – Project overview and usage
- `Dockerfile` – Container build instructions

Expand Down
51 changes: 51 additions & 0 deletions design/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Design prototypes — SoftwareDevLabs

Source of the UI prototypes this app is implemented from.

- **Claude Design project:** [SoftwareDevLabs](https://claude.ai/design/p/c22e83d4-860e-49f1-8e50-c6a4a794752c)
- **Design system namespace:** `SoftwareDevLabsDesignSystem_e72b4a`

## What lives here

`sandbox/` holds vendored copies of the prototype screens (`*.dc.html`) as they were
implemented into the app. They are reference material — the `.dc.html` format needs the
Claude Design runtime and does not render standalone.

| Prototype | Implemented as |
| --- | --- |
| `sandbox/Workspace.dc.html` | `frontend/pages/WorkspacePage.tsx` + `frontend/features/workspace/` |
| `sandbox/Login.dc.html` | `frontend/pages/LoginPage.tsx` (mock auth against the demo account; sign-in lands on the Workspace since the project Dashboard is not ported yet) |
| `sandbox/Findings.dc.html` | `frontend/pages/FindingsPage.tsx` + `frontend/features/project/ProjectShell.tsx` (the project-level shell is shared by upcoming project screens) |
| `sandbox/Dashboard.dc.html` | `frontend/pages/ProjectDashboardPage.tsx` |
| `sandbox/Evidence.dc.html` | `frontend/pages/EvidencePage.tsx` |
| `sandbox/Audit.dc.html` | `frontend/pages/AuditPage.tsx` |
| `sandbox/Traceability.dc.html` | `frontend/pages/TraceabilityPage.tsx` |
| `sandbox/Vulnerabilities.dc.html` | `frontend/pages/VulnerabilitiesPage.tsx` |
| `sandbox/Releases.dc.html` | `frontend/pages/ReleasesPage.tsx` |
| `sandbox/Items.dc.html` | `frontend/pages/ItemsPage.tsx` |
| `sandbox/Risks.dc.html` | `frontend/pages/RisksPage.tsx` |
| `sandbox/RiskControls.dc.html` | `frontend/pages/RiskControlsPage.tsx` |
| `sandbox/SBOM.dc.html` | `frontend/pages/SbomPage.tsx` |
| `sandbox/AgentsApp.dc.html` | `frontend/pages/AgentsPage.tsx` |
| `sandbox/Connectors.dc.html` | `frontend/pages/ConnectorsPage.tsx` |
| `sandbox/Settings.dc.html` | `frontend/pages/ProjectSettingsPage.tsx` |
| `sandbox/Graph.dc.html` | `frontend/pages/GraphPage.tsx` |

Every prototype screen in the SoftwareDevLabs design project is now ported.

## What was integrated where

- **Design tokens** → `frontend/styles/tokens/` (colors, typography, spacing, base) —
verbatim from the design system, plus `frontend/styles/workspace.css` with the brand
Action-Blue accent override and app-shell responsive rules from the prototype.
- **Fonts** → `frontend/fonts/` (self-hosted Geist + Geist Mono variable, OFL 1.1).
- **DS components** (Badge, Tag, Button) → `frontend/components/ds/`.
- **Synthetic data layer** (`sandbox/sdl-data.js`) → `frontend/data/sdlData.ts` (typed).
- **"Ask the agents" panel** (`sandbox/sdl-chat.js`) → `frontend/features/workspace/AskAgentsPanel.tsx`.

## Keeping in sync

To pull design updates, use Claude Code with the claude_design MCP (`/design-login`,
then ask it to diff/import from the project above). When a prototype screen changes,
update its vendored copy here in the same commit as the implementation change so this
directory stays an accurate record of what was implemented.
32 changes: 32 additions & 0 deletions design/sandbox/AgentsApp.dc.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script src="./support.js"></script></head>
<body>
<x-dc>
<helmet><title>Agents — SoftwareDevLabs Sandbox</title></helmet>
<!-- Vendored record. Shell (topbar + grouped sidebar + Ask-the-agents chat) is identical to the other
project prototypes (see Findings.dc.html); implemented in frontend/features/project/ProjectShell.tsx.
Only the split-view <main> and data-dc-script are recorded below; the app renders it from
frontend/pages/AgentsPage.tsx. -->
<div data-screen-label="Agents configuration">
<main data-app-split="true" style="flex:1;display:flex;min-width:0;min-height:0">
<div data-app-list="true" style="width:300px;flex-shrink:0;border-right:1px solid var(--c-border-faint);padding:24px 12px;overflow:auto">
<div style="display:flex;align-items:center;justify-content:space-between;margin:0 8px 12px"><h1 style="margin:0;font-size:21px;font-weight:600;color:var(--c-text)">Agents</h1><button onClick="{{ toggleAddAgent() }}">+ Add</button></div>
<sc-if value="{{ addAgentOpen }}"><!-- new-agent form: name input, skill-pack select, schedule select, "Add as signed config change" button --></sc-if>
<sc-for list="{{ agentList }}" as="a"><button onClick="{{ a.select }}"><span>{{ a.name }}</span><span>{{ a.findingCount }}</span><span>{{ a.schedule }} · {{ a.modelShort }}</span></button></sc-for>
</div>
<div style="flex:1;overflow:auto;padding:24px 28px">
<h2>{{ sel.name }}</h2> <Badge>{{ sel.status }}</Badge> <p>{{ sel.desc }} Every output is a draft until an engineer signs it.</p>
<!-- Configuration card: Scope (read-only), Schedule select, Connected tools chips, Model select,
"Save as signed config change" Button → makeAuditEntry, prompt line. -->
<!-- Run history card: table (Run / Started / Findings / Duration) over sel.runs; Findings queue + audit-trail links. -->
</div>
</main>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script>
// Full logic recorded in frontend/pages/AgentsPage.tsx. Summary:
// - agentList = db.agents + loadState().config.customAgents; per-agent finding counts from db.findings.
// - select(a) sets schedule/model from the agent; saveConfig() appends a signed makeAuditEntry.
// - addAgent() validates name>=3, pushes to config.customAgents, appends signed audit entry, selects it.
</script>
</body></html>
Loading
Loading