Compare commits

...

3 Commits

Author SHA1 Message Date
peptiderepo
f1bc323d75 ci: adopt shared reusable deploy workflow (deploy-app.yml)
Replaces the per-repo staging/smoke/production jobs with one call to
peptiderepo/peptide-e2e/.github/workflows/deploy-app.yml (target_path=wp-content/themes/peptide-starter).
Validated end-to-end on the calculator pilot.

Agent-Session: cto rollout-reusable-deploy
2026-06-09 19:16:08 +07:00
peptiderepo
0a2a48a9f0 ci(audit): retry PR-association check (#58)
listPullRequestsAssociatedWithCommit is eventually-consistent after a squash
merge; the single immediate call intermittently flagged legit merges as
'direct push to main'. Now polls up to 5x/10s before opening an issue.

Agent-Session: cto audit-race-fix
2026-06-09 13:39:10 +07:00
peptiderepo
844951b268 feat(front-page): remove Science Feed card + 3-item news teaser (v2.2.2)
Merges PR #55. Science Feed removed from module grid (5 cards). Inline news feed replaced with 3-item teaser + CTA. Version 2.2.1 → 2.2.2.
2026-04-29 14:35:03 +07:00
7 changed files with 52 additions and 160 deletions

View File

@@ -30,138 +30,10 @@ jobs:
run: |
find assets/js -name "*.js" -exec node --check {} \;
deploy-staging:
name: Deploy to Staging
deploy:
name: Deploy (shared pipeline)
needs: validate
runs-on: ubuntu-latest
environment: staging
steps:
- uses: actions/checkout@v4
- name: Setup SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -p ${{ secrets.SSH_PORT }} ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts 2>/dev/null || true
- name: Deploy via rsync → staging
run: |
rsync -avz --delete \
--exclude='.git' \
--exclude='.github' \
--exclude='tests/' \
--exclude='phpunit.xml' \
--exclude='composer.json' \
--exclude='composer.lock' \
--exclude='vendor/' \
--exclude='node_modules/' \
--exclude='.phpcs.xml.dist' \
-e "ssh -i ~/.ssh/deploy_key -p ${{ secrets.SSH_PORT }} -o StrictHostKeyChecking=accept-new -o ConnectTimeout=30 -o BatchMode=yes" \
./ ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }}:~/domains/peptiderepo.com/public_html/staging/wp-content/themes/peptide-starter/
- name: Staging health check
run: |
sleep 5
STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://staging.peptiderepo.com/ || echo "000")
echo "Staging responded: HTTP $STATUS"
- name: Cleanup
if: always()
run: rm -f ~/.ssh/deploy_key
smoke:
name: Smoke tests (staging)
needs: deploy-staging
uses: peptiderepo/peptide-e2e/.github/workflows/smoke.yml@main
secrets:
STAGING_WP_ADMIN_USER: ${{ secrets.STAGING_WP_ADMIN_USER }}
STAGING_WP_ADMIN_PASSWORD: ${{ secrets.STAGING_WP_ADMIN_PASSWORD }}
deploy-production:
name: Deploy to Production
needs: [validate, deploy-staging] # smoke is informational; not gating prod until e2e suite is stable
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -p ${{ secrets.SSH_PORT }} ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts 2>/dev/null || true
- name: Snapshot plugin inventory (pre-deploy)
# Guards against the 2026-04-23 incident where rsync to wrong path clobbered WP core.
# Checks that the active plugin count is sane before and after deploy.
# Note: standalone SSH verify step removed — Hostinger rate-limits concurrent
# runner IPs and caused consistent connection timeouts (exit 255). The rsync
# itself will fail safely if the path doesn't exist.
run: |
ssh -i ~/.ssh/deploy_key -p ${{ secrets.SSH_PORT }} \
-o StrictHostKeyChecking=accept-new \
-o ConnectTimeout=30 \
-o BatchMode=yes \
${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }} \
"wp --path=/home/${{ secrets.SSH_USERNAME }}/domains/peptiderepo.com/public_html plugin list --status=active --fields=name --allow-root 2>/dev/null | tee /tmp/plugins_pre_deploy.txt && echo \"Pre-deploy plugin count: \$(wc -l < /tmp/plugins_pre_deploy.txt)\""
- name: Deploy via rsync → production
run: |
rsync -avz --delete \
--exclude='.git' \
--exclude='.github' \
--exclude='tests/' \
--exclude='phpunit.xml' \
--exclude='composer.json' \
--exclude='composer.lock' \
--exclude='vendor/' \
--exclude='node_modules/' \
--exclude='.phpcs.xml.dist' \
-e "ssh -i ~/.ssh/deploy_key -p ${{ secrets.SSH_PORT }} -o StrictHostKeyChecking=accept-new -o ConnectTimeout=30 -o BatchMode=yes" \
./ ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }}:/home/${{ secrets.SSH_USERNAME }}/domains/peptiderepo.com/public_html/wp-content/themes/peptide-starter/
- name: Verify plugin inventory unchanged (post-deploy)
run: |
ssh -i ~/.ssh/deploy_key -p ${{ secrets.SSH_PORT }} \
-o StrictHostKeyChecking=accept-new \
-o ConnectTimeout=30 \
-o BatchMode=yes \
${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }} << 'ENDSSH'
wp --path=/home/${{ secrets.SSH_USERNAME }}/domains/peptiderepo.com/public_html plugin list --status=active --fields=name --allow-root 2>/dev/null > /tmp/plugins_post_deploy.txt
PRE=$(wc -l < /tmp/plugins_pre_deploy.txt)
POST=$(wc -l < /tmp/plugins_post_deploy.txt)
echo "Pre-deploy active plugins: $PRE"
echo "Post-deploy active plugins: $POST"
if [ "$POST" -lt "$PRE" ]; then
echo "ERROR: Plugin count dropped from $PRE to $POST after deploy."
diff /tmp/plugins_pre_deploy.txt /tmp/plugins_post_deploy.txt || true
exit 1
fi
echo "Plugin inventory OK."
ENDSSH
- name: Purge LiteSpeed Cache
run: |
ssh -i ~/.ssh/deploy_key -p ${{ secrets.SSH_PORT }} \
-o StrictHostKeyChecking=accept-new \
-o ConnectTimeout=30 \
-o BatchMode=yes \
${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }} << 'ENDSSH'
CACHE_DIR="/home/${{ secrets.SSH_USERNAME }}/domains/peptiderepo.com/public_html/wp-content/litespeed"
if [ -d "$CACHE_DIR" ]; then
rm -rf "$CACHE_DIR"/*
echo "LiteSpeed cache purged."
fi
touch "/home/${{ secrets.SSH_USERNAME }}/domains/peptiderepo.com/public_html/.lscache_purge" 2>/dev/null || true
ENDSSH
- name: Production health check
run: |
sleep 5
STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://peptiderepo.com)
if [ "$STATUS" != "200" ] && [ "$STATUS" != "403" ]; then
echo "ERROR: Site returned unexpected HTTP $STATUS after deploy"
exit 1
fi
echo "Production healthy (HTTP $STATUS)"
- name: Cleanup
if: always()
run: rm -f ~/.ssh/deploy_key
- name: Deploy summary
run: |
echo "## Deployment Complete" >> $GITHUB_STEP_SUMMARY
echo "- **Commit:** \`${GITHUB_SHA::7}\`" >> $GITHUB_STEP_SUMMARY
echo "- **Deployed to:** peptiderepo.com/themes/peptide-starter" >> $GITHUB_STEP_SUMMARY
uses: peptiderepo/peptide-e2e/.github/workflows/deploy-app.yml@main
with:
target_path: wp-content/themes/peptide-starter
secrets: inherit

View File

@@ -29,12 +29,22 @@ jobs:
with:
script: |
const sha = context.sha;
const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({
owner: context.repo.owner,
repo: context.repo.repo,
commit_sha: sha,
});
const merged = prs.find(p => p.merged_at);
// Squash-merge -> PR association is eventually-consistent; poll briefly
// before concluding this was a direct push (avoids false positives on merges).
async function findMergedPR() {
for (let attempt = 1; attempt <= 5; attempt++) {
const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({
owner: context.repo.owner,
repo: context.repo.repo,
commit_sha: sha,
});
const m = prs.find(p => p.merged_at);
if (m) return m;
if (attempt < 5) await new Promise(r => setTimeout(r, 10000));
}
return null;
}
const merged = await findMergedPR();
if (merged) {
core.info(`OK: commit ${sha.substring(0,7)} came from PR #${merged.number}`);
return;

View File

@@ -1,5 +1,18 @@
# Peptide Starter Theme - Changelog
## [2.2.2] - 2026-04-29 — Front page layout restructure
### Changed
- `template-parts/module-cards.php`: Removed Science Feed from the module card
grid. The grid is for interactive tools only; news is content. Grid is now
5 cards: Peptides, Calculator, Protocol Builder, Tracker, Subject Log. No card
in this set goes inactive-dimmed due to a plugin registration check.
- `front-page.php`: Replaced the full `[peptide_news]` inline feed with a
3-item teaser row (`[peptide_news count="3"]`) and a "View all research →"
CTA linking to `/news`. Reduces page weight and drives traffic to the
dedicated news page.
## [2.2.1] - 2026-04-29 — RCT inline abbreviation tooltip
### Added

View File

@@ -204,7 +204,7 @@ $featured_monograph_ids = array( 211, 36, 177 );
</section>
<?php endif; ?>
<!-- Research Modules Grid (6 cards) -->
<!-- Research Modules Grid (5 cards) -->
<?php get_template_part( 'template-parts/module', 'cards' ); ?>
<!-- PRAutoBlogger Posts Widget -->
@@ -214,19 +214,22 @@ $featured_monograph_ids = array( 211, 36, 177 );
}
?>
<!-- News Feed Section -->
<!-- News Teaser Section — 3 items + "View all" CTA -->
<?php
if ( shortcode_exists( 'peptide_news' ) ) {
?>
<section class="news-feed-section">
<section class="news-teaser-section">
<div class="ps-container">
<div class="news-feed-header">
<h2 class="news-feed-title"><?php esc_html_e( 'What\'s new', 'peptide-starter' ); ?></h2>
<p class="news-feed-description">
<?php esc_html_e( 'Recent peptide research, regulatory shifts, and synthesis news. New posts weekly.', 'peptide-starter' ); ?>
</p>
<div class="news-teaser-header">
<div>
<h2><?php esc_html_e( 'Latest Peptide Research', 'peptide-starter' ); ?></h2>
<p><?php esc_html_e( 'Recent publications from leading research sources.', 'peptide-starter' ); ?></p>
</div>
<a href="<?php echo esc_url( home_url( '/news' ) ); ?>" class="ps-btn ps-btn-secondary">
<?php esc_html_e( 'View all research →', 'peptide-starter' ); ?>
</a>
</div>
<?php echo do_shortcode( '[peptide_news]' ); ?>
<?php echo do_shortcode( '[peptide_news count="3"]' ); ?>
</div>
</section>
<?php
@@ -236,3 +239,4 @@ $featured_monograph_ids = array( 211, 36, 177 );
</main>
<?php get_footer(); ?>

View File

@@ -26,7 +26,7 @@ if ( ! defined( 'ABSPATH' ) ) {
}
// Theme constants.
define( 'PEPTIDE_STARTER_VERSION', '2.2.1' );
define( 'PEPTIDE_STARTER_VERSION', '2.2.2' );
define( 'PEPTIDE_STARTER_DIR', get_template_directory() );
define( 'PEPTIDE_STARTER_URI', get_template_directory_uri() );

View File

@@ -4,7 +4,7 @@ Theme URI: https://github.com/peptiderepo/peptide-starter
Description: Premium, accessible WordPress theme for scientific peptide reference database
Author: Peptide Repo
Author URI: https://peptiderepo.com
Version: 2.2.1
Version: 2.2.2
License: GPL v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: peptide-starter

View File

@@ -2,7 +2,7 @@
/**
* Template Part: Research Module Cards
*
* Renders a 6-card grid of research modules (tools/sections) for the front page.
* Renders a 5-card grid of research modules (tools/sections) for the front page.
* Each card checks if the target plugin is active; inactive cards are dimmed.
* Cards with 'coming_soon' => true display a "Coming soon" badge overlaid in
* the top-right corner — layered on top of the --inactive visual treatment.
@@ -58,14 +58,6 @@ $modules = array(
'available' => shortcode_exists( 'peptide_tracker' ),
'coming_soon' => true,
),
array(
'title' => __( 'Science Feed', 'peptide-starter' ),
'description' => __( 'What\'s new in peptide research. Filtered for what matters, weekly.', 'peptide-starter' ),
'url' => '/news',
'icon' => '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 22h16a2 2 0 002-2V4a2 2 0 00-2-2H8a2 2 0 00-2 2v16a2 2 0 01-2 2zm0 0a2 2 0 01-2-2v-9c0-1.1.9-2 2-2h2"/><line x1="10" y1="6" x2="18" y2="6"/><line x1="10" y1="10" x2="18" y2="10"/><line x1="10" y1="14" x2="14" y2="14"/></svg>',
'available' => shortcode_exists( 'peptide_news' ),
'coming_soon' => false,
),
array(
'title' => __( 'Subject Log', 'peptide-starter' ),
'description' => __( 'Track outcomes over time. Subjective markers, lab results, protocol changes — your own data, kept private.', 'peptide-starter' ),
@@ -109,3 +101,4 @@ $modules = array(
</div>
</div>
</section>