|
| 1 | +# Plan: Scientific Agentic Engineering — Repository & Website Scaffold |
| 2 | + |
| 3 | +## Context |
| 4 | + |
| 5 | +Victor Weeks is a 2026 BSSw Fellow at NSF NCAR developing "Scientific Agentic Engineering" — methodology for integrating AI agents into scientific software workflows. The project needs a professional, public-facing GitHub repo with an incrementally-built website. Git repo already initialized at `/Users/vweeks/NCAR/BSSw/scientific-agentic-engineering/`. |
| 6 | + |
| 7 | +**Sensitive material constraint**: The SOW (`../2026_BSSw-SOW_VictorWeeks_revised_20260212.docx`) is one directory up. Budget, financial details, and SOW contents must never enter version control. |
| 8 | + |
| 9 | +## Architecture Decision |
| 10 | + |
| 11 | +**Bare Astro + Tailwind + Pagefind + Content Collections.** Not Starlight as a framework, not pure Quarto. Cherry-pick Starlight components where useful. Quarto's role is reduced to computational notebook rendering only (tutorials with Pyodide in later milestones). |
| 12 | + |
| 13 | +**Why this architecture:** |
| 14 | +- Each milestone extends the component library rather than bolting on new architectural patterns |
| 15 | +- The site grows organically from a simple foundation into a rich resource |
| 16 | +- Mirrors the methodology the fellowship teaches: principled, incremental, AI-assistable |
| 17 | +- Maximum control — no framework opinions constraining layout or navigation |
| 18 | +- Content Collections with typed schemas map cleanly to fellowship deliverables |
| 19 | + |
| 20 | +**Milestone-aligned component growth:** |
| 21 | +- **M1** (July 2026): Landing page layout + Framework document layout |
| 22 | +- **M2** (Oct 2026): Catalog layout (community repo) + Tutorial layout (with Quarto/Pyodide) |
| 23 | +- **M3** (Jan 2027): Failure mode exhibit layout + Full tutorial series |
| 24 | +- **M4** (April 2027): Workshop recording layout |
| 25 | + |
| 26 | +## Decisions |
| 27 | + |
| 28 | +- **Repo**: `scientific-agentic-engineering` on Victor's personal GitHub |
| 29 | +- **Framework**: Astro (bare, no Starlight governance) |
| 30 | +- **Styling**: Tailwind CSS |
| 31 | +- **Search**: Pagefind (static, framework-independent) |
| 32 | +- **Content**: Astro Content Collections with typed schemas |
| 33 | +- **Notebooks**: Quarto + Pyodide for interactive tutorials (M2+) |
| 34 | +- **License**: Dual — `LICENSE-CODE` (MIT) + `LICENSE-CONTENT` (CC-BY-4.0) |
| 35 | +- **Deployment**: GitHub Actions (Astro build → GitHub Pages) |
| 36 | + |
| 37 | +--- |
| 38 | + |
| 39 | +## Implementation Steps |
| 40 | + |
| 41 | +### Batch 0: Prerequisites |
| 42 | + |
| 43 | +1. **Verify Node.js** is installed (`node --version`, need 18+) |
| 44 | +2. **Create Astro project** via `npm create astro@latest` in the existing repo directory |
| 45 | +3. **Add integrations**: `npx astro add tailwind`, add Pagefind |
| 46 | +4. **Create GitHub repo**: `gh repo create scientific-agentic-engineering --public --source=. --remote=origin` |
| 47 | + |
| 48 | +### Batch 1: Foundation (Commit 1 — "Initial project setup") |
| 49 | + |
| 50 | +| File | Purpose | |
| 51 | +|------|---------| |
| 52 | +| `.gitignore` | Broad defensive patterns (*.docx, *.mov, SOW*, node_modules, dist, .astro) | |
| 53 | +| `LICENSE-CODE` | MIT license, copyright 2026 Victor Weeks | |
| 54 | +| `LICENSE-CONTENT` | CC-BY-4.0 full text | |
| 55 | +| `README.md` | Badges (BSSw Fellow, licenses, website, CI), project overview, acknowledgment | |
| 56 | +| `CITATION.cff` | CFF 1.2.0 with dual license, ORCID, keywords | |
| 57 | +| `CONTRIBUTING.md` | How to contribute, dual license notice | |
| 58 | + |
| 59 | +**Key `.gitignore` additions beyond Astro defaults:** |
| 60 | +``` |
| 61 | +# Block sensitive/large file types broadly |
| 62 | +*.docx *.xlsx *.pptx *.mov *.mp4 *.zip |
| 63 | +SOW* sow* budget* *statement*of*work* |
| 64 | +``` |
| 65 | + |
| 66 | +### Batch 2: Astro Site Structure (Commit 2 — "Add Astro site with landing page") |
| 67 | + |
| 68 | +**Astro project structure:** |
| 69 | + |
| 70 | +``` |
| 71 | +scientific-agentic-engineering/ |
| 72 | +├── astro.config.mjs # Astro config with Tailwind, site URL |
| 73 | +├── tailwind.config.mjs # Tailwind config |
| 74 | +├── tsconfig.json # TypeScript config (Astro default) |
| 75 | +├── package.json # Dependencies |
| 76 | +│ |
| 77 | +├── src/ |
| 78 | +│ ├── content/ |
| 79 | +│ │ ├── config.ts # Content Collection schemas (typed) |
| 80 | +│ │ └── framework/ # M1: Framework documents (markdown) |
| 81 | +│ │ └── _placeholder.md |
| 82 | +│ │ |
| 83 | +│ ├── layouts/ |
| 84 | +│ │ ├── BaseLayout.astro # HTML shell: head, meta, nav, footer |
| 85 | +│ │ └── FrameworkLayout.astro # M1: Layout for framework docs |
| 86 | +│ │ |
| 87 | +│ ├── components/ |
| 88 | +│ │ ├── Nav.astro # Top navigation bar |
| 89 | +│ │ ├── Footer.astro # Footer with BSSw acknowledgment + licenses |
| 90 | +│ │ ├── Hero.astro # Landing page hero section |
| 91 | +│ │ └── FeatureCard.astro # Landing page feature cards |
| 92 | +│ │ |
| 93 | +│ ├── pages/ |
| 94 | +│ │ ├── index.astro # Landing page |
| 95 | +│ │ ├── about.astro # About Victor / fellowship |
| 96 | +│ │ └── framework/ |
| 97 | +│ │ └── [...slug].astro # Dynamic routes from content collection |
| 98 | +│ │ |
| 99 | +│ └── styles/ |
| 100 | +│ └── global.css # Tailwind directives + any global styles |
| 101 | +│ |
| 102 | +├── public/ |
| 103 | +│ ├── favicon.svg # Simple placeholder favicon |
| 104 | +│ └── robots.txt # Allow all crawlers |
| 105 | +│ |
| 106 | +└── docs/ |
| 107 | + └── development-log.md # Already exists — meta-documentation |
| 108 | +``` |
| 109 | + |
| 110 | +**Content Collection schema** (`src/content/config.ts`): |
| 111 | +```typescript |
| 112 | +import { defineCollection, z } from 'astro:content'; |
| 113 | + |
| 114 | +const framework = defineCollection({ |
| 115 | + type: 'content', |
| 116 | + schema: z.object({ |
| 117 | + title: z.string(), |
| 118 | + description: z.string(), |
| 119 | + order: z.number(), |
| 120 | + draft: z.boolean().default(false), |
| 121 | + }), |
| 122 | +}); |
| 123 | + |
| 124 | +// Future collections added per-milestone: |
| 125 | +// M2: tutorials, community (catalog items) |
| 126 | +// M3: failure-modes |
| 127 | +// M4: workshops |
| 128 | + |
| 129 | +export const collections = { framework }; |
| 130 | +``` |
| 131 | + |
| 132 | +**Landing page** (`src/pages/index.astro`): |
| 133 | +- Hero component: project title, one-line description, CTA button → Framework |
| 134 | +- 4 FeatureCard components: Framework, Tutorials (coming M2), Community (coming M2), Workshops (coming M4) |
| 135 | +- BSSw acknowledgment block |
| 136 | +- Clean, minimal — Tailwind utility classes, no complex styling |
| 137 | + |
| 138 | +**Nav component**: Home, Framework, About. Tutorials/Community/Workshops links added as milestones deliver them. |
| 139 | + |
| 140 | +**Footer component**: © 2026 Victor Weeks | Content: CC-BY-4.0 | Code: MIT | Supported by the BSSw Fellowship Program |
| 141 | + |
| 142 | +**After creating files**: `npm run dev` to verify local rendering. |
| 143 | + |
| 144 | +### Batch 3: CI/CD (Commit 3 — "Add GitHub Actions deployment") |
| 145 | + |
| 146 | +| File | Purpose | |
| 147 | +|------|---------| |
| 148 | +| `.github/workflows/deploy.yml` | Astro build → GitHub Pages | |
| 149 | + |
| 150 | +**GitHub Actions workflow:** |
| 151 | +```yaml |
| 152 | +name: Deploy to GitHub Pages |
| 153 | +on: |
| 154 | + push: |
| 155 | + branches: [main] |
| 156 | + workflow_dispatch: |
| 157 | + |
| 158 | +permissions: |
| 159 | + contents: read |
| 160 | + pages: write |
| 161 | + id-token: write |
| 162 | + |
| 163 | +jobs: |
| 164 | + build: |
| 165 | + runs-on: ubuntu-latest |
| 166 | + steps: |
| 167 | + - uses: actions/checkout@v4 |
| 168 | + - uses: actions/setup-node@v4 |
| 169 | + with: |
| 170 | + node-version: 20 |
| 171 | + cache: npm |
| 172 | + - run: npm ci |
| 173 | + - run: npm run build |
| 174 | + - uses: actions/upload-pages-artifact@v3 |
| 175 | + with: |
| 176 | + path: dist/ |
| 177 | + |
| 178 | + deploy: |
| 179 | + needs: build |
| 180 | + runs-on: ubuntu-latest |
| 181 | + environment: |
| 182 | + name: github-pages |
| 183 | + url: ${{ steps.deployment.outputs.page_url }} |
| 184 | + steps: |
| 185 | + - id: deployment |
| 186 | + uses: actions/deploy-pages@v4 |
| 187 | +``` |
| 188 | +
|
| 189 | +**Post-push**: In GitHub repo Settings → Pages → Source: "GitHub Actions". |
| 190 | +
|
| 191 | +--- |
| 192 | +
|
| 193 | +## Files Deferred to Later Milestones |
| 194 | +
|
| 195 | +| What | When | Why | |
| 196 | +|------|------|-----| |
| 197 | +| `FrameworkLayout.astro` content | M1 (July 2026) | Layout exists in scaffold; real content comes with framework draft | |
| 198 | +| Tutorial layout + Quarto integration | M2 (Oct 2026) | Tutorials are M2 deliverable | |
| 199 | +| Catalog layout (community repo) | M2 (Oct 2026) | Community repo launches at M2 | |
| 200 | +| Pagefind integration | M2 (Oct 2026) | Not enough content to search until M2 | |
| 201 | +| Failure mode exhibit layout | M3 (Jan 2027) | Failure modes documented at M3 | |
| 202 | +| Workshop recording layout | M4 (April 2027) | Workshops happen at M4 | |
| 203 | +| Quarto notebooks + Pyodide | M2 (Oct 2026) | Interactive tutorials are M2+ | |
| 204 | +| `.devcontainer` | M2+ | No contributors yet | |
| 205 | +| Pre-commit hooks | M2+ | No Python code yet | |
| 206 | + |
| 207 | +--- |
| 208 | + |
| 209 | +## Milestone Component Roadmap |
| 210 | + |
| 211 | +### M1 (July 2026): Foundation |
| 212 | +**New components**: `Hero`, `FeatureCard`, `Nav`, `Footer`, `BaseLayout`, `FrameworkLayout` |
| 213 | +**Content**: Framework draft documents in `src/content/framework/` |
| 214 | +**Site sections live**: Home, Framework, About |
| 215 | + |
| 216 | +### M2 (October 2026): Catalog + Tutorials |
| 217 | +**New components**: `CatalogCard`, `CatalogLayout`, `TutorialLayout`, `CodeBlock` (Pyodide wrapper) |
| 218 | +**New collections**: `tutorials`, `community` |
| 219 | +**Integrations**: Pagefind for search, Quarto for notebook rendering |
| 220 | +**Site sections live**: + Tutorials, + Community |
| 221 | + |
| 222 | +### M3 (January 2027): Failure Modes + Full Tutorials |
| 223 | +**New components**: `FailureModeExhibit`, `BeforeAfter` (comparison layout) |
| 224 | +**New collection**: `failure-modes` |
| 225 | +**Content**: Full tutorial series, failure mode visual documentation |
| 226 | +**Site sections live**: + Failure Modes gallery |
| 227 | + |
| 228 | +### M4 (April 2027): Workshops |
| 229 | +**New components**: `WorkshopCard`, `VideoEmbed`, `WorkshopLayout` |
| 230 | +**New collection**: `workshops` |
| 231 | +**Content**: Workshop recordings, HPC webinar, BSSw.io blog post draft |
| 232 | +**Site sections live**: + Workshops archive |
| 233 | + |
| 234 | +--- |
| 235 | + |
| 236 | +## Verification |
| 237 | + |
| 238 | +After each batch: |
| 239 | + |
| 240 | +1. **Batch 1**: `git status` clean, no sensitive files. `grep -ri "SOW\|budget\|25,000" .` returns nothing |
| 241 | +2. **Batch 2**: `npm run dev` → landing page renders at localhost, nav works, feature cards display, footer shows acknowledgment + licenses, dark mode if configured |
| 242 | +3. **Batch 3**: Push → GitHub Actions succeeds → site live at Pages URL |
| 243 | +4. **CITATION.cff**: GitHub shows "Cite this repository" on repo page |
| 244 | +5. **Lighthouse**: Run accessibility audit on local dev server |
| 245 | + |
| 246 | +--- |
| 247 | + |
| 248 | +## Critical Files |
| 249 | + |
| 250 | +- `.gitignore` — First file created; broad defensive patterns prevent SOW leak |
| 251 | +- `astro.config.mjs` — Central Astro config (site URL, integrations, output mode) |
| 252 | +- `src/content/config.ts` — Content Collection schemas; typed foundation for all deliverables |
| 253 | +- `src/layouts/BaseLayout.astro` — HTML shell shared by every page; nav, footer, meta |
| 254 | +- `.github/workflows/deploy.yml` — Deployment automation; must use Pages v4 action pattern |
| 255 | +- `src/pages/index.astro` — Landing page; first impression of the project |
0 commit comments