Skip to content

Commit 268d9a4

Browse files
JaclynCodesgemini-code-assist[bot]CopilotCopilotcubic-dev-ai[bot]
authored
Milestones 🌸 (#182)
* Update src/symphonic_joules/audio.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Change ignored branch from 'Master' to 'main' Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Initial plan * Revert "[WIP] Refactor duplicated code in the codebase" (#137) * Initial plan (#138) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Update settings.json Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Transform README into production-ready documentation with comprehensive structure (#142) * Add energy calculation functions with tests (#143) * Initial plan * Add energy calculation functions with comprehensive tests Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Initial plan * Update docs/architecture.md with Living Architecture content Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Add automated iteration status email notifications via GitHub Actions (#156) * Change workflow branch from 'main' to 'canary' Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Initial plan * Optimize test suite performance with caching fixtures - Add session-scoped file content and AST parse caching in conftest.py - Update test_suite_validation.py to use cached fixtures (eliminated 22 file opens, 12 AST parses) - Update test_cross_file_consistency.py to use cached fixtures - Test runtime improved from 0.54s to 0.28s (~48% faster) - Estimated 10-50x improvement for larger test suites Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Add performance improvements documentation Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Address code review feedback - Rename ast_cache parameter to ast_tree_cache for clarity - Add comprehensive docstrings to helper functions - Simplify test_no_syntax_errors logic (avoid duplicate parsing) - Document repo_root scope change rationale Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Add helpful comment for future __all__ exports in audio.py Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Implement audio processing, energy calculations, and markdown linting Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Address code review feedback: fix error messages and test assertions Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Add explicit permissions to lint-markdown job for security Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Initial plan * Rename loop index for clarity Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Initial plan * Fix __all__ declaration in audio.py - set to empty list with future guidance comment Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Improve comment clarity - reference actual implemented functions Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update README.md * Initial plan * Expose audio and energy exports Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Update test_energy.py Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update energy.py Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update energy.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update architecture.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update test_iteration_status_emails_workflow.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update iteration-status-emails.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update .markdownlint.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update test_audio.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update test_audio.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update test_audio.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Add comprehensive README with scientific rigor and interface-first design Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Fix SVG styling issues and remove hard-coded dates Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Initial plan * Add missing test classes to maintain consistency with other workflow tests Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Fix test assertion to properly validate workflow steps Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Initial plan * Add soft-systems-palette.html with color swatches Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Fix grep count pattern to avoid double-printing zero Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> * Update tests/test_public_api_exports.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update .github/workflows/static.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update src/symphonic_joules/energy.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update tests/test_public_api_exports.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update src/symphonic_joules/audio.py 🎵🚀 Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Initial plan * Update README.md Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update .github/workflows/iteration-status-emails.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> * Update test count in README from 190+ to 800+ tests Co-authored-by: JaclynCodes <218383634+JaclynCodes@users.noreply.github.com> --------- Signed-off-by: Misfit <218383634+JaclynCodes@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
1 parent d661c8e commit 268d9a4

24 files changed

+3432
-605
lines changed

.github/workflows/blank.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,18 @@ jobs:
6161
run: |
6262
echo Add other actions to build,
6363
echo test, and deploy your project.
64+
65+
# Markdown linting job to enforce code block language tags
66+
lint-markdown:
67+
runs-on: ubuntu-latest
68+
permissions:
69+
contents: read
70+
steps:
71+
- uses: actions/checkout@v5
72+
73+
- name: Lint Markdown files
74+
uses: DavidAnson/markdownlint-cli2-action@v17
75+
with:
76+
config: '.markdownlint.json'
77+
globs: '**/*.md'
78+
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
name: Iteration Status Email Updates
2+
3+
on:
4+
# Trigger on updates to the January 2026 progress dashboard
5+
push:
6+
branches:
7+
- main
8+
- WIP
9+
paths:
10+
- 'docs/january-2026-progress.md'
11+
12+
# Scheduled runs daily during the iteration period at 9 AM UTC
13+
schedule:
14+
# Run daily at 9:00 AM UTC (cron format: minute hour day month weekday)
15+
- cron: '0 9 * * *'
16+
17+
# Allow manual trigger for testing
18+
workflow_dispatch:
19+
20+
jobs:
21+
parse-and-notify:
22+
name: Parse Dashboard and Send Notifications
23+
runs-on: ubuntu-latest
24+
25+
# Limit permissions for security (principle of least privilege)
26+
permissions:
27+
contents: read # Read access to checkout the repository
28+
29+
steps:
30+
- name: Checkout repository
31+
uses: actions/checkout@v4
32+
33+
- name: Set up Python
34+
uses: actions/setup-python@v5
35+
with:
36+
python-version: '3.11'
37+
38+
- name: Parse dashboard for task statuses
39+
id: parse
40+
run: |
41+
# Parse the dashboard file for runner and hand emoji tasks
42+
DASHBOARD_FILE="docs/january-2026-progress.md"
43+
44+
if [ ! -f "$DASHBOARD_FILE" ]; then
45+
echo "Dashboard file not found: $DASHBOARD_FILE"
46+
exit 1
47+
fi
48+
49+
echo "Parsing dashboard file..."
50+
51+
# Extract tasks with runner emoji (in progress)
52+
# Filtering strategy:
53+
# 1. Find lines with 🏃 emoji
54+
# 2. Exclude markdown headers (lines starting with ##)
55+
# 3. Exclude legend/status lines that contain "(runner" or "emoji)" after the emoji
56+
# 4. Accept task lines that follow format: "- 🏃 Task description"
57+
RUNNER_TASKS=$(grep -n "🏃" "$DASHBOARD_FILE" | \
58+
grep -v "^[0-9]*:##" | \
59+
grep -v "(runner" | \
60+
grep -v "emoji)" | \
61+
grep "^[0-9]*:-[[:space:]]*🏃" || true)
62+
63+
# Extract tasks with hand emoji (blocked/needs review)
64+
# Same filtering strategy as above
65+
HAND_TASKS=$(grep -n "✋" "$DASHBOARD_FILE" | \
66+
grep -v "^[0-9]*:##" | \
67+
grep -v "(hand" | \
68+
grep -v "emoji)" | \
69+
grep "^[0-9]*:-[[:space:]]*✋" || true)
70+
71+
# Count tasks
72+
RUNNER_COUNT=$(echo "$RUNNER_TASKS" | grep -c . || true)
73+
HAND_COUNT=$(echo "$HAND_TASKS" | grep -c . || true)
74+
75+
echo "Found $RUNNER_COUNT tasks in progress"
76+
echo "Found $HAND_COUNT blocked tasks"
77+
78+
# Display sample of found tasks for debugging
79+
if [ "$RUNNER_COUNT" -gt 0 ]; then
80+
echo "Sample in-progress task:"
81+
echo "$RUNNER_TASKS" | head -1
82+
fi
83+
84+
if [ "$HAND_COUNT" -gt 0 ]; then
85+
echo "Sample blocked task:"
86+
echo "$HAND_TASKS" | head -1
87+
fi
88+
89+
# Save results to output
90+
{
91+
echo 'RUNNER_TASKS<<EOF'
92+
echo "$RUNNER_TASKS"
93+
echo 'EOF'
94+
} >> $GITHUB_OUTPUT
95+
96+
{
97+
echo 'HAND_TASKS<<EOF'
98+
echo "$HAND_TASKS"
99+
echo 'EOF'
100+
} >> $GITHUB_OUTPUT
101+
102+
echo "RUNNER_COUNT=$RUNNER_COUNT" >> $GITHUB_OUTPUT
103+
echo "HAND_COUNT=$HAND_COUNT" >> $GITHUB_OUTPUT
104+
105+
- name: Generate email content
106+
id: email
107+
run: |
108+
# Generate email subject and body
109+
SUBJECT="[Symphonic-Joules] Daily Iteration Status - $(date +%Y-%m-%d)"
110+
111+
# Build email body
112+
BODY="Hello Team Leads,
113+
114+
This is your daily iteration status update for Symphonic-Joules.
115+
116+
=== IN PROGRESS TASKS (🏃) ===
117+
Count: ${{ steps.parse.outputs.RUNNER_COUNT }}
118+
119+
${{ steps.parse.outputs.RUNNER_TASKS }}
120+
121+
=== BLOCKED/NEEDS REVIEW TASKS (✋) ===
122+
Count: ${{ steps.parse.outputs.HAND_COUNT }}
123+
124+
${{ steps.parse.outputs.HAND_TASKS }}
125+
126+
=== SUMMARY ===
127+
- Tasks in progress: ${{ steps.parse.outputs.RUNNER_COUNT }}
128+
- Tasks blocked/needing review: ${{ steps.parse.outputs.HAND_COUNT }}
129+
130+
View full dashboard: https://github.com/${{ github.repository }}/blob/${{ github.sha }}/docs/january-2026-progress.md
131+
132+
Triggered by: ${{ github.event_name }}
133+
Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
134+
135+
---
136+
Automated notification from Symphonic-Joules Iteration Status System
137+
"
138+
139+
# Save to file for email action
140+
echo "$BODY" > email_body.txt
141+
echo "$SUBJECT" > email_subject.txt
142+
143+
echo "Email content generated"
144+
145+
- name: Send email notification
146+
uses: dawidd6/action-send-mail@v3
147+
with:
148+
# SMTP server configuration (using secrets)
149+
server_address: ${{ secrets.SMTP_SERVER }}
150+
server_port: ${{ secrets.SMTP_PORT }}
151+
username: ${{ secrets.SMTP_USERNAME }}
152+
password: ${{ secrets.SMTP_PASSWORD }}
153+
154+
# Email content
155+
subject: file://email_subject.txt
156+
body: file://email_body.txt
157+
158+
# Recipients (team leads)
159+
to: ${{ secrets.TEAM_LEADS_EMAIL }}
160+
from: ${{ secrets.SENDER_EMAIL }}
161+
162+
# Optional: CC or BCC
163+
# cc: additional@example.com
164+
# bcc: monitoring@example.com
165+
166+
# Optional: Attach the full dashboard
167+
# attachments: docs/january-2026-progress.md
168+
169+
# Connection settings
170+
secure: true
171+
ignore_cert: false
172+
173+
- name: Notification summary
174+
if: success()
175+
run: |
176+
echo "✅ Email notification sent successfully!"
177+
echo "Recipients: Team Leads"
178+
echo "In Progress Tasks: ${{ steps.parse.outputs.RUNNER_COUNT }}"
179+
echo "Blocked Tasks: ${{ steps.parse.outputs.HAND_COUNT }}"
180+
181+
- name: Error handling
182+
if: failure()
183+
run: |
184+
echo "❌ Failed to send email notification"
185+
echo "Please check:"
186+
echo " 1. SMTP secrets are configured correctly"
187+
echo " 2. Email server is accessible"
188+
echo " 3. Dashboard file exists and is parseable"
189+
exit 1

.markdownlint.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"default": true,
3+
"MD040": {
4+
"allowed_languages": [
5+
"python",
6+
"sh",
7+
"bash",
8+
"yaml",
9+
"yml",
10+
"json",
11+
"javascript",
12+
"typescript",
13+
"md",
14+
"text",
15+
"plaintext"
16+
]
17+
},
18+
"line-length": false,
19+
"no-duplicate-heading": {
20+
"siblings_only": true
21+
},
22+
"no-trailing-punctuation": {
23+
"punctuation": ".,;:"
24+
},
25+
"no-inline-html": false,
26+
"first-line-h1": false
27+
}

.vscode/settings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"githubPullRequests.ignoredPullRequestBranches": [
3-
"Master"
3+
"main"
44
]
5-
}
5+
}

0 commit comments

Comments
 (0)