feat: Add dedicated About Me page with profile sections#1
feat: Add dedicated About Me page with profile sections#1DandaAkhilReddy wants to merge 17 commits intoclaude/create-github-website-p02okfrom
Conversation
- Create about.html with hero, bio, passions, and connect sections - Add assets/profile/ folder for profile images (hero.jpg, bio.jpg) - Update browse.html navigation with About Me link - Netflix-style dark theme matching existing site design - Include cricket gallery, LLM fine-tuning, and AI research cards Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
✅ Deploy Preview for dandaakhilreddy ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds an automation CLI and supporting libraries to generate project pages and update browse.html, introduces templates and a new static project page, updates site pages/assets (index, about, browse, profile/video placeholders), adds CI (Netlify) workflow and .gitignore, and adds tooling to commit/push changes. Changes
Sequence Diagram(s)sequenceDiagram
participant Dev as Developer
participant CLI as add-project.js
participant GH as GitHub API (Octokit)
participant Template as Template Generator
participant FS as Filesystem
participant Browse as browse-updater
participant Git as git-operations
participant Remote as Remote Repo
Dev->>CLI: run `add-project` (repo URL, flags)
CLI->>GH: parse URL & fetch repo data (readme, pkg, languages)
GH-->>CLI: return repo metadata and contents
CLI->>Template: build projectData → generate HTML, filename, card
Template-->>CLI: return HTML, filename, card snippet
CLI->>FS: write `projects/day-*.html` (unless dry-run)
CLI->>Browse: insert card into `browse.html`
Browse-->>FS: update file and return result
CLI->>Git: stage, commit, push (unless --no-push)
Git->>Remote: push to origin (attempt main → fallback master)
Remote-->>Git: return push result
Git-->>CLI: return status
CLI-->>Dev: print summary
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Tip Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs). Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bd5fe563df
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <a href="https://www.linkedin.com/in/akhil-reddy-danda-1a74b214b/" target="_blank" class="social-link"> | ||
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"/></svg> | ||
| </a> | ||
| <a href="https://github.com/DandaAkhilReddy" target="_blank" class="social-link"> |
There was a problem hiding this comment.
Add noopener/noreferrer on external target=_blank links
The LinkedIn and GitHub links open in a new tab via target="_blank" but omit rel="noopener noreferrer". In browsers that allow it, the newly opened page can access window.opener and potentially redirect or manipulate the original page (reverse‑tabnabbing). This only affects users who click those external links; adding the rel attributes prevents the opener access while preserving the new‑tab behavior.
Useful? React with 👍 / 👎.
- Changed logo text from initials to full name - Adjusted font sizes for better fit (8rem -> 4rem desktop, 4rem -> 2rem mobile) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Triggers on push to main branch - Triggers on pull requests to main - Adds PR comments with deploy preview links Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Fix all issues with AI agents
In @.github/workflows/deploy.yml:
- Around line 25-27: The workflow currently sets production-deploy: true which
causes PRs to deploy to production and uses github.event.head_commit.message
which is null for pull_request events; update the job so production-deploy is
only true for push events (use an expression based on github.event_name or event
type) and change deploy-message to fallback to a PR-safe value (e.g., use
github.event.head_commit.message when present, otherwise
github.event.pull_request.title or github.event.pull_request.body) — adjust the
production-deploy and deploy-message fields in the job configuration accordingly
so PRs get preview/draft deployments and deploy messages are non-null.
- Around line 18-21: Replace the tag-based actions with their immutable commit
SHAs: change uses: actions/checkout@v4 to the pinned SHA for that release and
uses: nwtgck/actions-netlify@v3.0 to its corresponding pinned SHA; keep the
original tag as a trailing comment for human reference (e.g., "# v4" and "#
v3.0") and document that Dependabot will update the SHAs going forward. Locate
the two usages by the identifiers actions/checkout@v4 and
nwtgck/actions-netlify@v3.0 and update them to the full commit SHAs while
retaining the tag comment.
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Deploy to Netlify | ||
| uses: nwtgck/actions-netlify@v3.0 |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
🧩 Analysis chain
🏁 Script executed:
# First, let's verify the actual file content
cat -n .github/workflows/deploy.yml | sed -n '15,25p'Repository: DandaAkhilReddy/dandaakhilreddy
Length of output: 415
🌐 Web query:
GitHub Actions security best practices SHA commit pinning vs tag versions 2025
💡 Result:
Short answer
- Default to pinning third‑party actions to full commit SHAs (immutable and recommended). [1][2]
- Pin to tags (e.g., v1.2.3) only when the action is an immutable release you trust; otherwise tags/branches are mutable and can be redirected. [1][2]
- GitHub now supports enforcement (require SHA pinning) and blocking specific actions/versions; GitHub also introduced immutable releases to make tag pinning safer. Enforce pinning at org/enterprise level and use Dependabot/attestations to manage updates. [3][2]
Why (short)
- Commit SHAs are immutable; tags/branches can be moved to malicious commits if a repo is compromised. Pinning to a SHA prevents silent supply‑chain substitution. [1][2]
- Immutable releases (GitHub feature) let authors publish tags/releases that cannot be moved, enabling safe tag pinning when used. [3]
Practical recommendations
- Pin to full-length commit SHAs for third‑party actions you didn’t author. Include the released tag in a comment (e.g., uses: actions/checkout@6929... # v4.1.7). [2]
- Prefer actions from verified authors or well‑maintained repos; audit action source code for mutable dependencies (unpinned images, downloads). [2][4]
- Enable org/enterprise policy to enforce SHA pinning and block known-bad actions; use Dependabot and immutable releases where available to simplify updates. [3][2]
- For local actions: either keep them local and document exceptions, or move them to a repo and pin by SHA so policy enforcement treats them as pinned. [3][7]
Tradeoffs (one line)
- SHA pinning = strongest safety but higher maintenance (manual updates); immutable tagged releases + Dependabot = easier maintenance with comparable safety if the release is truly immutable/attested. [2][3][4]
Sources
- GitHub Docs: Secure use reference / pin to full-length commit SHA. [1]
- GitHub Well‑Architected recommendations for Actions security. [2]
- GitHub Changelog: SHA pinning enforcement, blocking actions, immutable releases (2025). [3]
- Industry writeups on pinning risks and best practices (examples). [4]
🌐 Web query:
nwtgck/actions-netlify latest version releases
💡 Result:
Latest release: v3.0.0 — published March 10, 2024. [1][2]
Sources:
- GitHub releases page for nwtgck/actions-netlify. [1]
- GitHub Marketplace listing for the action (references v3.0). [2]
Pin GitHub Actions to full commit SHAs instead of tag-based versions.
Both actions/checkout@v4 and nwtgck/actions-netlify@v3.0 use mutable tag-based versions. GitHub's security guidance recommends pinning third-party actions to immutable commit SHAs to prevent supply chain attacks, as tags can be moved to malicious commits if a repository is compromised. Include the tag in a comment for reference (e.g., uses: actions/checkout@abc123... # v4). Use Dependabot to automate SHA updates and keep tags current.
🤖 Prompt for AI Agents
In @.github/workflows/deploy.yml around lines 18 - 21, Replace the tag-based
actions with their immutable commit SHAs: change uses: actions/checkout@v4 to
the pinned SHA for that release and uses: nwtgck/actions-netlify@v3.0 to its
corresponding pinned SHA; keep the original tag as a trailing comment for human
reference (e.g., "# v4" and "# v3.0") and document that Dependabot will update
the SHAs going forward. Locate the two usages by the identifiers
actions/checkout@v4 and nwtgck/actions-netlify@v3.0 and update them to the full
commit SHAs while retaining the tag comment.
| production-deploy: true | ||
| github-token: ${{ secrets.GITHUB_TOKEN }} | ||
| deploy-message: "Deploy from GitHub Actions - ${{ github.event.head_commit.message }}" |
There was a problem hiding this comment.
production-deploy: true will deploy PRs to production.
With production-deploy: true, both pushes to main and pull requests will trigger production deployments. Typically, PRs should receive preview/draft deployments to avoid overwriting production with unreviewed code.
Consider making production deploys conditional on push events only:
🔧 Suggested fix
- production-deploy: true
+ production-deploy: ${{ github.event_name == 'push' }}Additionally, github.event.head_commit.message is null for pull_request events (it only exists on push events), so the deploy message will be incomplete for PR builds. Consider a fallback:
- deploy-message: "Deploy from GitHub Actions - ${{ github.event.head_commit.message }}"
+ deploy-message: "Deploy from GitHub Actions - ${{ github.event.head_commit.message || github.event.pull_request.title }}"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| production-deploy: true | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| deploy-message: "Deploy from GitHub Actions - ${{ github.event.head_commit.message }}" | |
| production-deploy: ${{ github.event_name == 'push' }} | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| deploy-message: "Deploy from GitHub Actions - ${{ github.event.head_commit.message || github.event.pull_request.title }}" |
🤖 Prompt for AI Agents
In @.github/workflows/deploy.yml around lines 25 - 27, The workflow currently
sets production-deploy: true which causes PRs to deploy to production and uses
github.event.head_commit.message which is null for pull_request events; update
the job so production-deploy is only true for push events (use an expression
based on github.event_name or event type) and change deploy-message to fallback
to a PR-safe value (e.g., use github.event.head_commit.message when present,
otherwise github.event.pull_request.title or github.event.pull_request.body) —
adjust the production-deploy and deploy-message fields in the job configuration
accordingly so PRs get preview/draft deployments and deploy messages are
non-null.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…images - Changed intro text to stacked AKHIL/REDDY/DANDA format - Updated profile images to use cricket photos from assets - Profile names: Akhil, Century, CricClubs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@index.html`:
- Around line 182-201: The profile links use IDs "akhil", "century", and
"cricclubs" but browse.html's profileConfig only knows "recruiter", "developer",
"stalker", and "adventurer"; update browse.html by adding entries for
profileConfig["akhil"], profileConfig["century"], and profileConfig["cricclubs"]
(providing the same shape as existing entries: CSS class/video/source/text keys)
so the profile-card anchors in index.html map to valid configuration, or
alternatively change the href values in the index.html anchor tags to one of the
supported IDs ("recruiter", "developer", "stalker", "adventurer") to match the
existing profileConfig.
…intro - Intro text: AKHIL REDDY DANDA on one line - Profile names: Recruiter, Developer, Stalker, Adventurer (original) - Profile images: Using cricket photos from assets folder Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Folder structure: - assets/whos-watching/ - Profile selection images (Recruiter, Developer, Stalker, Adventurer) - assets/cricket/ - Cricket images (Century, CricClubs) - assets/profile/ - Profile picture Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added netflix-sound.mp3 to assets folder - Sound plays automatically on page load Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Removed non-interactive journey banner with 365 days progress - Removed footer journey note - Cleaner Netflix-style layout Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changed path from assets/cricket/ to assets/profile/ Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Project 6: Local Browser Control (AI browser automation with Claude) - Create portfolio automation system for auto-adding projects from GitHub URLs - Fix navigation in about.html (add missing Hire Me and Certifications links) - Set up video placeholder structure for persona-specific homepage videos - Add .gitignore for node_modules and build artifacts Automation system includes: - Node.js CLI tool (automation/add-project.js) - GitHub data fetcher - Handlebars template system - Auto-update browse.html with project cards - Git operations (commit/push) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
|
All alerts resolved. Learn more about Socket for GitHub. This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored. |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Fix all issues with AI agents
In `@automation/lib/git-operations.js`:
- Around line 46-56: Current code always pushes 'main' or 'master' via
git.push('origin', 'main'), which can update the wrong branch; modify the push
logic to determine the current branch (e.g. via git.revparse(['--abbrev-ref',
'HEAD']) or git.branch().current) and attempt git.push('origin', currentBranch)
first, and only if that fails and currentBranch === 'main' then fall back to
git.push('origin', 'master'); update the existing try/catch that calls git.push
to use the computed currentBranch and preserve the success/error logging for
each attempted push.
In `@automation/lib/github-fetcher.js`:
- Around line 13-29: The parseGitHubUrl function currently matches query strings
and hash fragments into the repo name; before applying the patterns (the
patterns array /github\.com\/([^\/]+)\/([^\/]+)/ and
/github\.com:([^\/]+)\/([^\/]+)/), strip any URL query or hash by removing
everything from the first '?' or '#' (e.g. url = url.replace(/[#?].*$/, '')) or
by using the URL constructor to get pathname, then run the existing regex and
keep the repo replacement (.replace(/\.git$/, '')) as-is so repo names are
clean.
In `@automation/package.json`:
- Around line 9-12: The package.json currently uses the "test" npm script to run
a networked demo ("test": "node add-project.js add https://github.com/...
--dry-run"), which makes tests nondeterministic; change the package.json
"scripts" so "test" runs a deterministic local check (or a lint/unit command)
and move the networked command into a new "demo" script (e.g., add "demo": "node
add-project.js add https://github.com/... --dry-run"); update any CI or docs
referencing "npm test" to use "npm run demo" where the live-repo behavior is
desired.
In `@browse.html`:
- Around line 371-395: The external anchor elements using target="_blank" (the
GitHub link with class "card-link github" and the Demo link with class
"card-link" that opens the YouTube URL) are missing rel="noopener noreferrer";
update those <a> tags to include rel="noopener noreferrer" to prevent tabnabbing
and ensure safe external linking, leaving the existing href, target, and classes
unchanged.
In `@projects/day-6-localbrowsercontrol.html`:
- Around line 194-200: The npm install line in the <div class="code-block">
currently uses a non-existent package name `claude-local-control`; update the
<code> element's text to the correct package name (or remove the global install
instruction if there is no published package) and ensure the copy button
behavior (onclick="copyCode(this)") copies the updated text. Locate the <code>
element inside the div with class "code-block" and change its content from `npm
install -g claude-local-control` to the verified package name (or a note
explaining how to install from source), and keep the copy button wiring intact.
🧹 Nitpick comments (8)
automation/lib/browse-updater.js (1)
28-58: Reuse captured closing tags to avoid fallback duplication.The replacement strings re-inject hard‑coded closing tags; if the markup shifts, the fallback can duplicate or misplace closing tags. Capturing the existing closing block is safer.
♻️ Suggested refactor
- const insertPattern = /(<\/div>\s*<\/div>\s*<\/div>\s*<\/section>\s*\n\s*<!-- Professional Experience -->)/; + const insertPattern = /(<\/div>\s*<\/div>\s*<\/div>\s*<\/section>\s*)(\n\s*<!-- Professional Experience -->)/; if (!insertPattern.test(browseContent)) { // Fallback: try to find just before Professional Experience section - const fallbackPattern = /( <\/section>\s*\n\s*<!-- Professional Experience -->)/; + const fallbackPattern = /(<\/section>\s*)(\n\s*<!-- Professional Experience -->)/; if (fallbackPattern.test(browseContent)) { browseContent = browseContent.replace( fallbackPattern, - `${cardHtml} - </div> - </div> - </section> - - <!-- Professional Experience -->` + `${cardHtml}$1$2` ); } else { throw new Error('Could not find insertion point in browse.html'); } } else { // Insert the new card before the closing tags browseContent = browseContent.replace( insertPattern, - `${cardHtml} - </div> - </div> - </section> - - <!-- Professional Experience -->` + `${cardHtml}$1$2` ); }automation/templates/project-template.hbs (1)
215-224: Consider adding a fallback fornavigator.clipboard.The Clipboard API may not be available in older browsers or non-secure contexts. A fallback using
execCommandwould improve compatibility.🔧 Suggested fallback implementation
// Copy code function function copyCode(btn) { const codeBlock = btn.parentElement; const code = codeBlock.querySelector('code').textContent; - navigator.clipboard.writeText(code).then(() => { + const copyToClipboard = (text) => { + if (navigator.clipboard && window.isSecureContext) { + return navigator.clipboard.writeText(text); + } else { + const textArea = document.createElement('textarea'); + textArea.value = text; + textArea.style.position = 'fixed'; + textArea.style.left = '-9999px'; + document.body.appendChild(textArea); + textArea.select(); + document.execCommand('copy'); + document.body.removeChild(textArea); + return Promise.resolve(); + } + }; + copyToClipboard(code).then(() => { btn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>'; setTimeout(() => { btn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>'; }, 2000); + }).catch(() => { + // Silent fail - user can manually copy }); }automation/add-project.js (2)
185-188: Ensure theprojects/directory exists before writing.If
projects/doesn't exist,fs.writeFilewill throwENOENT. Consider creating it if missing.🔧 Suggested fix
// 9. Write project file const projectPath = path.join(PORTFOLIO_PATH, 'projects', filename); + await fs.mkdir(path.dirname(projectPath), { recursive: true }); await fs.writeFile(projectPath, projectHtml); console.log(chalk.green(` Created: projects/${filename}`));
151-154: Feature title extraction may produce awkward results.Taking the first 3 words as a title could cut off mid-phrase. Consider extracting a subtitle/heading from the feature text if available, or prompting the user.
automation/lib/template-generator.js (3)
72-80: JSDoc comment doesn't match implementation.The docstring says "Mon YYYY" but the function returns "Mon D, YYYY" format.
📝 Fix documentation
/** - * Format date as "Mon YYYY" + * Format date as "Mon D, YYYY" * `@param` {Date} date * `@returns` {string} */
58-70: Timestamp fallback creates unwieldy filenames.If
projectNumberdoesn't contain a digit, the fallbackDate.now()produces filenames likeday-1737564023456-slug.html. Consider a more sensible fallback or validating input.🔧 Suggested improvement
export function generateFilename(title, projectNumber) { // Extract number from project number (e.g., "Project 7" -> "7") const numMatch = projectNumber?.match(/\d+/); - const num = numMatch ? numMatch[0] : Date.now(); + const num = numMatch ? numMatch[0] : 'new'; // Convert title to slug const slug = title
98-131: Consider HTML-escaping user-provided data in card generation.The
generateProjectCardfunction uses template literals without escaping. While the data source (GitHub API + CLI prompts) is relatively trusted, escaping would provide defense in depth against malformed or malicious content.🔧 Example escapeHtml utility
function escapeHtml(str) { if (!str) return ''; return str .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"'); } // Then use: escapeHtml(projectData.title) in the templateprojects/day-6-localbrowsercontrol.html (1)
332-379: JavaScript is duplicated from template.This is expected for a static page, but consider extracting shared JS to a separate file if more project pages are added manually (vs. generated from template).
| // Push to remote | ||
| console.log('Pushing to remote...'); | ||
| try { | ||
| await git.push('origin', 'main'); | ||
| console.log('Successfully pushed to origin/main'); | ||
| } catch (e) { | ||
| // Try master if main fails | ||
| try { | ||
| await git.push('origin', 'master'); | ||
| console.log('Successfully pushed to origin/master'); | ||
| } catch (e2) { |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, find and read the file to verify the code snippet
find . -name "git-operations.js" -type fRepository: DandaAkhilReddy/dandaakhilreddy
Length of output: 109
🏁 Script executed:
# Search for the push operations in the file
rg -A 20 "Push to remote" --type jsRepository: DandaAkhilReddy/dandaakhilreddy
Length of output: 1335
🏁 Script executed:
# Check package.json or lock files for simple-git version
fd -e "package.json" -e "package-lock.json" -e "yarn.lock" | head -5Repository: DandaAkhilReddy/dandaakhilreddy
Length of output: 57
🌐 Web query:
simple-git v3 branchLocal() API return type
💡 Result:
In simple-git v3, branchLocal() returns a BranchSummary (aka BranchSummaryResult) wrapped in the library Response type. TypeScript signature: branchLocal(callback?) => Response<resp.BranchSummary>. [1][2]
Sources:
[1] jsdocs.io — simple-git method signatures.
[2] simple-git (npm v3) README (branchLocal doc).
🌐 Web query:
simple-git v3 push() method branch parameter
💡 Result:
Short answer: simple-git v3 exposes push as either .push([options]) or .push(remote, branch[, options]). The branch argument is the same refspec/branch name you’d pass to git push (e.g. 'main', 'feature-branch', or a refspec like 'localBranch:remoteBranch'). Use .push('origin', 'main') or supply a full refspec when you need to rename or delete on the remote. [1][2]
Sources:
- simple-git API (push signatures). [1]
- git push / refspec behavior (what the branch/refspec string means). [2]
🏁 Script executed:
# Search for branchLocal usage in the codebase
rg "branchLocal" --type js -B 2 -A 5Repository: DandaAkhilReddy/dandaakhilreddy
Length of output: 545
🌐 Web query:
simple-git BranchSummary object structure current property
💡 Result:
The BranchSummary.current property is a string containing the name of the currently checked-out branch. (The BranchSummary also has branches which map branch names to objects where each branch object has a current boolean flag indicating if that branch is current.) [1][2]
Sources:
- simple-git BranchSummary interface (shows current: string and branches[name].current: boolean). [1]
- simple-git BranchSummary implementation / parse & push (initialises current as '' and sets current/name on push). [2]
🌐 Web query:
simple-git branchLocal() example usage TypeScript
💡 Result:
Example (TypeScript, async/await):
import { simpleGit, SimpleGit } from 'simple-git';
async function listLocalBranches(dir = process.cwd()) {
const git: SimpleGit = simpleGit(dir);
const summary = await git.branchLocal(); // returns BranchSummaryResult / resp.BranchSummary
// summary properties:
// - summary.all: string[] (array of branch names)
// - summary.current: string (current branch name)
// - summary.branches: { [name: string]: { name, commit, label } }
console.log('current:', summary.current);
console.log('all:', summary.all);
console.log('branches:', summary.branches);
}
listLocalBranches().catch(err => console.error(err));Notes:
- Types are bundled with simple-git; branchLocal() returns a BranchSummary-like object (see fields above). [1][2]
Sources:
[1] simple-git package docs (branchLocal).
[2] simple-git API/type docs (BranchSummary / branchLocal signature).
Push the current branch instead of hard‑coding main/master.
Running the CLI on a feature branch will still push main, unintentionally updating the wrong branch. Use the current branch and only fall back to master if the current branch is main.
🛠️ Proposed fix
// Push to remote
console.log('Pushing to remote...');
+ const { current: currentBranch } = await git.branchLocal();
try {
- await git.push('origin', 'main');
- console.log('Successfully pushed to origin/main');
+ await git.push('origin', currentBranch);
+ console.log(`Successfully pushed to origin/${currentBranch}`);
} catch (e) {
- // Try master if main fails
- try {
- await git.push('origin', 'master');
- console.log('Successfully pushed to origin/master');
- } catch (e2) {
- console.error('Failed to push. You may need to push manually.');
- throw e2;
- }
+ if (currentBranch === 'main') {
+ try {
+ await git.push('origin', 'master');
+ console.log('Successfully pushed to origin/master');
+ return;
+ } catch (e2) {
+ console.error('Failed to push. You may need to push manually.');
+ throw e2;
+ }
+ }
+ console.error('Failed to push. You may need to push manually.');
+ throw e;
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // Push to remote | |
| console.log('Pushing to remote...'); | |
| try { | |
| await git.push('origin', 'main'); | |
| console.log('Successfully pushed to origin/main'); | |
| } catch (e) { | |
| // Try master if main fails | |
| try { | |
| await git.push('origin', 'master'); | |
| console.log('Successfully pushed to origin/master'); | |
| } catch (e2) { | |
| // Push to remote | |
| console.log('Pushing to remote...'); | |
| const { current: currentBranch } = await git.branchLocal(); | |
| try { | |
| await git.push('origin', currentBranch); | |
| console.log(`Successfully pushed to origin/${currentBranch}`); | |
| } catch (e) { | |
| if (currentBranch === 'main') { | |
| try { | |
| await git.push('origin', 'master'); | |
| console.log('Successfully pushed to origin/master'); | |
| return; | |
| } catch (e2) { | |
| console.error('Failed to push. You may need to push manually.'); | |
| throw e2; | |
| } | |
| } | |
| console.error('Failed to push. You may need to push manually.'); | |
| throw e; | |
| } |
🤖 Prompt for AI Agents
In `@automation/lib/git-operations.js` around lines 46 - 56, Current code always
pushes 'main' or 'master' via git.push('origin', 'main'), which can update the
wrong branch; modify the push logic to determine the current branch (e.g. via
git.revparse(['--abbrev-ref', 'HEAD']) or git.branch().current) and attempt
git.push('origin', currentBranch) first, and only if that fails and
currentBranch === 'main' then fall back to git.push('origin', 'master'); update
the existing try/catch that calls git.push to use the computed currentBranch and
preserve the success/error logging for each attempted push.
| export function parseGitHubUrl(url) { | ||
| const patterns = [ | ||
| /github\.com\/([^\/]+)\/([^\/]+)/, | ||
| /github\.com:([^\/]+)\/([^\/]+)/ | ||
| ]; | ||
|
|
||
| for (const pattern of patterns) { | ||
| const match = url.match(pattern); | ||
| if (match) { | ||
| return { | ||
| owner: match[1], | ||
| repo: match[2].replace(/\.git$/, '') | ||
| }; | ||
| } | ||
| } | ||
|
|
||
| throw new Error(`Invalid GitHub URL: ${url}`); |
There was a problem hiding this comment.
Strip query/hash from GitHub URLs before parsing.
Common GitHub URLs include ?tab=... or #readme; the current regex captures those, producing an invalid repo name.
🛠️ Proposed fix
- repo: match[2].replace(/\.git$/, '')
+ repo: match[2].replace(/\.git$/, '').split(/[?#]/)[0]📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| export function parseGitHubUrl(url) { | |
| const patterns = [ | |
| /github\.com\/([^\/]+)\/([^\/]+)/, | |
| /github\.com:([^\/]+)\/([^\/]+)/ | |
| ]; | |
| for (const pattern of patterns) { | |
| const match = url.match(pattern); | |
| if (match) { | |
| return { | |
| owner: match[1], | |
| repo: match[2].replace(/\.git$/, '') | |
| }; | |
| } | |
| } | |
| throw new Error(`Invalid GitHub URL: ${url}`); | |
| export function parseGitHubUrl(url) { | |
| const patterns = [ | |
| /github\.com\/([^\/]+)\/([^\/]+)/, | |
| /github\.com:([^\/]+)\/([^\/]+)/ | |
| ]; | |
| for (const pattern of patterns) { | |
| const match = url.match(pattern); | |
| if (match) { | |
| return { | |
| owner: match[1], | |
| repo: match[2].replace(/\.git$/, '').split(/[?#]/)[0] | |
| }; | |
| } | |
| } | |
| throw new Error(`Invalid GitHub URL: ${url}`); |
🤖 Prompt for AI Agents
In `@automation/lib/github-fetcher.js` around lines 13 - 29, The parseGitHubUrl
function currently matches query strings and hash fragments into the repo name;
before applying the patterns (the patterns array
/github\.com\/([^\/]+)\/([^\/]+)/ and /github\.com:([^\/]+)\/([^\/]+)/), strip
any URL query or hash by removing everything from the first '?' or '#' (e.g. url
= url.replace(/[#?].*$/, '')) or by using the URL constructor to get pathname,
then run the existing regex and keep the repo replacement (.replace(/\.git$/,
'')) as-is so repo names are clean.
| "scripts": { | ||
| "add": "node add-project.js add", | ||
| "test": "node add-project.js add https://github.com/DandaAkhilReddy/test-repo --dry-run" | ||
| }, |
There was a problem hiding this comment.
Avoid using npm test as a networked demo.
npm test should be deterministic; hitting a live repo can fail due to network/rate limits and isn’t really a test. Consider moving this to a demo script and keep test stable.
🛠️ Proposed change
"scripts": {
"add": "node add-project.js add",
- "test": "node add-project.js add https://github.com/DandaAkhilReddy/test-repo --dry-run"
+ "test": "echo \"No automated tests yet\"",
+ "demo": "node add-project.js add https://github.com/DandaAkhilReddy/test-repo --dry-run"
},📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "scripts": { | |
| "add": "node add-project.js add", | |
| "test": "node add-project.js add https://github.com/DandaAkhilReddy/test-repo --dry-run" | |
| }, | |
| "scripts": { | |
| "add": "node add-project.js add", | |
| "test": "echo \"No automated tests yet\"", | |
| "demo": "node add-project.js add https://github.com/DandaAkhilReddy/test-repo --dry-run" | |
| }, |
🤖 Prompt for AI Agents
In `@automation/package.json` around lines 9 - 12, The package.json currently uses
the "test" npm script to run a networked demo ("test": "node add-project.js add
https://github.com/... --dry-run"), which makes tests nondeterministic; change
the package.json "scripts" so "test" runs a deterministic local check (or a
lint/unit command) and move the networked command into a new "demo" script
(e.g., add "demo": "node add-project.js add https://github.com/... --dry-run");
update any CI or docs referencing "npm test" to use "npm run demo" where the
live-repo behavior is desired.
| <!-- Project 6 Card - Local Browser Control --> | ||
| <div class="daily-card featured" onclick="window.location.href='projects/day-6-localbrowsercontrol.html'" style="cursor: pointer;"> | ||
| <div class="daily-card-image"> | ||
| <img src="https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=400&h=250&fit=crop" alt="Local Browser Control"> | ||
| <div class="day-badge new" style="background: linear-gradient(135deg, #d4a373 0%, #bc6c25 100%);">Project 6</div> | ||
| <div class="new-ribbon">NEW</div> | ||
| <div class="card-gradient"></div> | ||
| </div> | ||
| <div class="daily-card-content"> | ||
| <h3>Local Browser Control</h3> | ||
| <p class="card-description">AI browser automation using Claude's Computer Use - vision, mouse, keyboard, and self-healing</p> | ||
| <div class="card-stats"> | ||
| <span class="stat-item"><strong>Vision</strong> AI</span> | ||
| <span class="stat-item"><strong>Docker</strong> + WSL2</span> | ||
| <span class="stat-item"><strong>100%</strong> local</span> | ||
| </div> | ||
| <div class="card-links"> | ||
| <a href="https://github.com/DandaAkhilReddy/localbrowsercontrol" target="_blank" class="card-link github"> | ||
| <svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg> | ||
| GitHub | ||
| </a> | ||
| <a href="https://youtu.be/gwFyF23d81M" target="_blank" class="card-link" style="background: rgba(255, 0, 0, 0.2); color: #ff4444;"> | ||
| <svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor"><path d="M19.615 3.184c-3.604-.246-11.631-.245-15.23 0-3.897.266-4.356 2.62-4.385 8.816.029 6.185.484 8.549 4.385 8.816 3.6.245 11.626.246 15.23 0 3.897-.266 4.356-2.62 4.385-8.816-.029-6.185-.484-8.549-4.385-8.816zm-10.615 12.816v-8l8 3.993-8 4.007z"/></svg> | ||
| Demo | ||
| </a> |
There was a problem hiding this comment.
Add rel="noopener noreferrer" to new external links.
target="_blank" should include rel to prevent tabnabbing.
🛠️ Proposed change
- <a href="https://github.com/DandaAkhilReddy/localbrowsercontrol" target="_blank" class="card-link github">
+ <a href="https://github.com/DandaAkhilReddy/localbrowsercontrol" target="_blank" rel="noopener noreferrer" class="card-link github">
...
- <a href="https://youtu.be/gwFyF23d81M" target="_blank" class="card-link" style="background: rgba(255, 0, 0, 0.2); color: `#ff4444`;">
+ <a href="https://youtu.be/gwFyF23d81M" target="_blank" rel="noopener noreferrer" class="card-link" style="background: rgba(255, 0, 0, 0.2); color: `#ff4444`;">🤖 Prompt for AI Agents
In `@browse.html` around lines 371 - 395, The external anchor elements using
target="_blank" (the GitHub link with class "card-link github" and the Demo link
with class "card-link" that opens the YouTube URL) are missing rel="noopener
noreferrer"; update those <a> tags to include rel="noopener noreferrer" to
prevent tabnabbing and ensure safe external linking, leaving the existing href,
target, and classes unchanged.
| <div class="code-block"> | ||
| <code>npm install -g claude-local-control</code> | ||
| <button class="copy-btn" onclick="copyCode(this)"> | ||
| <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg> | ||
| </button> | ||
| </div> | ||
| </div> |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check if the npm package exists in NPM registry
curl -s "https://registry.npmjs.org/claude-local-control" | jq '.name // "NOT_FOUND"' 2>/dev/null || echo "NOT_FOUND"Repository: DandaAkhilReddy/dandaakhilreddy
Length of output: 86
Remove or correct the npm package name claude-local-control.
The npm package claude-local-control does not exist in the NPM registry. Verify the correct package name and update the installation command accordingly.
🤖 Prompt for AI Agents
In `@projects/day-6-localbrowsercontrol.html` around lines 194 - 200, The npm
install line in the <div class="code-block"> currently uses a non-existent
package name `claude-local-control`; update the <code> element's text to the
correct package name (or remove the global install instruction if there is no
published package) and ensure the copy button behavior
(onclick="copyCode(this)") copies the updated text. Locate the <code> element
inside the div with class "code-block" and change its content from `npm install
-g claude-local-control` to the verified package name (or a note explaining how
to install from source), and keep the copy button wiring intact.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Created 14 comprehensive research documents (~50,000 words total) covering: **Geo-Fitness Platform (ReddyGo):** - Market research: $23.21B market by 2030, 73% churn crisis - Technical feasibility: 99.2% margins at 100K users ($0.008/user/mo) - Gap analysis: Real-time geo challenges = #1 white space opportunity - Agent architecture: 6-agent AI system, $0.023/challenge (97% cost savings) - Feature validation: Market demand × technical feasibility matrix - Research bibliography: 85+ sources with multi-source verification **Automation Stack:** - SearXNG MCP integration: 98% cost savings ($5-10/mo vs $500-600/mo) - GitHub automation: 87% cheaper than M365 ($42-67 vs $313-413/mo) - OpenAI Agents guide: Production implementation patterns - Cheapest stack: $792/mo for 100K users (99.2% margin) - GitHub API integration: Complete REST + GraphQL examples - M365 vs GitHub comparison: GitHub wins on cost, speed, scalability **Documentation Structure:** - 3 README files with Mermaid architecture diagrams - Master index with quick navigation - Platform-specific overviews - Automation deep dives **Key Findings:** ✅ $12.12B → $23.21B market (13.88% CAGR) ✅ Real-time geo challenges = unmet user need (16K Strava feature requests) ✅ AI Coach with memory: +32% retention (94% vs 62%) ✅ 5-layer anti-cheat: 97.4% fraud detection ✅ Local-first privacy: Prevents Strava/MyFitnessPal breach scenarios ✅ Self-hosted search: 98% cost reduction via SearXNG ✅ GitHub-first automation: $3,240-4,140/year savings vs M365 **Next Steps:** - Phase 1 MVP: Real-time challenges + AI Coach + Anti-cheat - Target: 1,000 beta users, 70%+ retention, <$0.10/user/mo cost - Timeline: Months 1-3 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
…video - Replace autoplay sound with click-gated overlay (fixes browser autoplay block) - Add CSS-only floating particle animation on home page - Add fixed full-page background video on browse page with profile-based switching - Remove redundant hero section videos (replaced by single background video) - Add dark overlay for text readability over video background
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
browse.html (1)
409-414:⚠️ Potential issue | 🟡 MinorAdd
rel="noopener noreferrer"on new external links.These
target="_blank"links should includerelto prevent tabnabbing.🛡️ Suggested fix
- <a href="https://github.com/DandaAkhilReddy/localbrowsercontrol" target="_blank" class="card-link github"> + <a href="https://github.com/DandaAkhilReddy/localbrowsercontrol" target="_blank" rel="noopener noreferrer" class="card-link github"> @@ - <a href="https://youtu.be/gwFyF23d81M" target="_blank" class="card-link" style="background: rgba(255, 0, 0, 0.2); color: `#ff4444`;"> + <a href="https://youtu.be/gwFyF23d81M" target="_blank" rel="noopener noreferrer" class="card-link" style="background: rgba(255, 0, 0, 0.2); color: `#ff4444`;">🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@browse.html` around lines 409 - 414, The two external anchor elements using target="_blank" (the <a> with class "card-link github" linking to github.com/DandaAkhilReddy/localbrowsercontrol and the <a> with class "card-link" linking to youtu.be/gwFyF23d81M) must include rel="noopener noreferrer" to prevent tabnabbing; update those anchor tags (identify by their class names "card-link github" and "card-link") to add rel="noopener noreferrer" alongside the existing target attribute.
🧹 Nitpick comments (1)
index.html (1)
123-160: Add a reduced-motion fallback for decorative animations.Consider disabling non-essential motion when users request reduced motion.
🧩 Suggested CSS
+ `@media` (prefers-reduced-motion: reduce) { + .particle, + .enter-overlay .enter-brand, + .enter-overlay .enter-prompt, + .netflix-intro.playing, + .netflix-intro.playing .logo-text, + .profile-selection.visible { + animation: none !important; + transition: none !important; + } + }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@index.html` around lines 123 - 160, The particle animation lacks a reduced-motion fallback; add a prefers-reduced-motion: reduce media query that targets the .particles container, .particle rules and the `@keyframes` floatUp usage to disable or set animation: none (or drastically shorten/stop movement and transitions) and ensure particles remain non-animated and visible/hidden consistently when users request reduced motion; update the .particle and .particles styles and any animation-duration/animation properties referencing floatUp to respect this media query.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@browse.html`:
- Around line 42-45: The background video is hidden on small screens via
.bg-video-container but still loaded/played by JS; update the video
initialization code (e.g., initBgVideo / loadBgVideo / playBgVideo) to first
check window.matchMedia('(max-width: 600px)').matches and skip
creating/attaching the <video> element or calling play() when true, and change
the markup to defer loading (move src into a data-bg-video-src attribute or only
set video.src when creating the element) so the browser won't fetch the video on
mobile; ensure any teardown or listeners that expect .bg-video-container or
.bg-video-overlay are guarded by the same media check.
In `@index.html`:
- Around line 290-293: The entry gate div with id "enter-overlay" is mouse-only;
make it keyboard-accessible by adding keyboard semantics and activation: give
the element role="button", tabindex="0", and an appropriate aria-label (e.g.,
matching the visible text in .enter-prompt or .enter-brand), and wire a keydown
handler on the same element that triggers the existing click handler when Enter
(key === "Enter") or Space (key === " " || key === "Spacebar") is pressed. Apply
the same changes to the second instance referenced (lines 361-375) so both
overlays behave identically for keyboard users.
---
Duplicate comments:
In `@browse.html`:
- Around line 409-414: The two external anchor elements using target="_blank"
(the <a> with class "card-link github" linking to
github.com/DandaAkhilReddy/localbrowsercontrol and the <a> with class
"card-link" linking to youtu.be/gwFyF23d81M) must include rel="noopener
noreferrer" to prevent tabnabbing; update those anchor tags (identify by their
class names "card-link github" and "card-link") to add rel="noopener noreferrer"
alongside the existing target attribute.
---
Nitpick comments:
In `@index.html`:
- Around line 123-160: The particle animation lacks a reduced-motion fallback;
add a prefers-reduced-motion: reduce media query that targets the .particles
container, .particle rules and the `@keyframes` floatUp usage to disable or set
animation: none (or drastically shorten/stop movement and transitions) and
ensure particles remain non-animated and visible/hidden consistently when users
request reduced motion; update the .particle and .particles styles and any
animation-duration/animation properties referencing floatUp to respect this
media query.
ℹ️ Review info
Configuration used: defaults
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
automation/package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (2)
browse.htmlindex.html
| @media (max-width: 600px) { | ||
| .bg-video-container { display: none; } | ||
| .bg-video-overlay { background: #141414; } | ||
| } |
There was a problem hiding this comment.
Avoid loading background video when it is hidden on mobile.
The mobile CSS hides the video, but JS still loads/plays it. This wastes bandwidth and battery on small screens.
⚡ Suggested fix
// Switch full-page background video based on profile
const bgVideo = document.getElementById('bg-video');
const srcLocal = document.getElementById('bg-video-src-local');
const srcFallback = document.getElementById('bg-video-src-fallback');
- srcLocal.src = config.localVideo;
- srcFallback.src = config.fallbackVideo;
- bgVideo.load();
- bgVideo.play().catch(() => {});
+ const shouldLoadVideo = !window.matchMedia('(max-width: 600px)').matches;
+
+ if (shouldLoadVideo) {
+ srcLocal.src = config.localVideo;
+ srcFallback.src = config.fallbackVideo;
+ bgVideo.load();
+ bgVideo.play().catch(() => {});
+ } else {
+ bgVideo.pause();
+ srcLocal.removeAttribute('src');
+ srcFallback.removeAttribute('src');
+ bgVideo.load();
+ }Also applies to: 1045-1051
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@browse.html` around lines 42 - 45, The background video is hidden on small
screens via .bg-video-container but still loaded/played by JS; update the video
initialization code (e.g., initBgVideo / loadBgVideo / playBgVideo) to first
check window.matchMedia('(max-width: 600px)').matches and skip
creating/attaching the <video> element or calling play() when true, and change
the markup to defer loading (move src into a data-bg-video-src attribute or only
set video.src when creating the element) so the browser won't fetch the video on
mobile; ensure any teardown or listeners that expect .bg-video-container or
.bg-video-overlay are guarded by the same media check.
| <div class="enter-overlay" id="enter-overlay"> | ||
| <div class="enter-brand">AKHIL REDDY DANDA</div> | ||
| <div class="enter-prompt">Click to Enter</div> | ||
| </div> |
There was a problem hiding this comment.
Make the entry gate keyboard-accessible.
The interactive gate is mouse-only right now. Add keyboard semantics and Enter/Space activation so users can reach the page without a pointer device.
♿ Suggested fix
- <div class="enter-overlay" id="enter-overlay">
+ <div class="enter-overlay" id="enter-overlay" role="button" tabindex="0" aria-label="Enter site">
<div class="enter-brand">AKHIL REDDY DANDA</div>
<div class="enter-prompt">Click to Enter</div>
</div> .enter-overlay {
position: fixed;
@@
cursor: pointer;
transition: opacity 0.6s ease, visibility 0.6s ease;
}
+
+ .enter-overlay:focus-visible {
+ outline: 2px solid `#fff`;
+ outline-offset: 4px;
+ }- overlay.addEventListener('click', () => {
+ const startExperience = () => {
// Hide the overlay
overlay.classList.add('hidden');
@@
setTimeout(() => {
profileSelection.classList.add('visible');
}, 3500);
- });
+ };
+
+ overlay.addEventListener('click', startExperience);
+ overlay.addEventListener('keydown', (e) => {
+ if (e.key === 'Enter' || e.key === ' ') {
+ e.preventDefault();
+ startExperience();
+ }
+ });Also applies to: 361-375
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@index.html` around lines 290 - 293, The entry gate div with id
"enter-overlay" is mouse-only; make it keyboard-accessible by adding keyboard
semantics and activation: give the element role="button", tabindex="0", and an
appropriate aria-label (e.g., matching the visible text in .enter-prompt or
.enter-brand), and wire a keydown handler on the same element that triggers the
existing click handler when Enter (key === "Enter") or Space (key === " " || key
=== "Spacebar") is pressed. Apply the same changes to the second instance
referenced (lines 361-375) so both overlays behave identically for keyboard
users.
Add AI Hedge Fund project card to browse.html and create detail page with 18 specialized investor agents (Buffett, Munger, Damodaran, etc.) analyzing stocks via fundamentals, technicals, sentiment, and valuation.
feat: add Project 7 - ReddyHedgefund AI Hedge Fund
Summary by CodeRabbit
New Features
Style
Chores
Bug Fixes