Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 5 additions & 5 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@
"name": "Te-Shu Wang"
},
"metadata": {
"description": "AI search optimization: scan, generate, and transform website content for AI readability",
"version": "0.5.3"
"description": "Content-readiness lint with evidence-bounded AI discovery experiments",
"version": "0.6.0"
},
"plugins": [
{
"name": "aeoptimize",
"source": "./",
"description": "CLI toolkit + Claude Code skills for transforming SEO-optimized websites into AI-search-ready content",
"description": "CLI and Claude Code skills for reproducible content-readiness checks",
"category": "seo",
"tags": ["aeo", "seo", "ai-search", "llms-txt", "structured-data"],
"homepage": "https://github.com/dexuwang627-cloud/aeoptimize",
"repository": "https://github.com/dexuwang627-cloud/aeoptimize"
"homepage": "https://github.com/cucuwang/aeoptimize",
"repository": "https://github.com/cucuwang/aeoptimize"
}
]
}
8 changes: 4 additions & 4 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"name": "aeoptimize",
"description": "AI search optimization toolkit: scan, generate, and transform website content for AI readability",
"version": "0.5.3",
"description": "Content-readiness lint and evidence-bounded discovery experiments",
"version": "0.6.0",
"author": {
"name": "Te-Shu Wang"
},
"homepage": "https://github.com/dexuwang627-cloud/aeoptimize",
"repository": "https://github.com/dexuwang627-cloud/aeoptimize",
"homepage": "https://github.com/cucuwang/aeoptimize",
"repository": "https://github.com/cucuwang/aeoptimize",
"license": "MIT",
"keywords": ["aeo", "seo", "ai-search", "llms-txt", "structured-data", "claude-code-skill"],
"commands": [
Expand Down
10 changes: 10 additions & 0 deletions .github/fixtures/action-low/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Fixture</title>
</head>
<body>
<main></main>
</body>
</html>
98 changes: 95 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ jobs:
test-and-build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [18, 20, 22]
node-version: [22, 24]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
Expand All @@ -20,15 +21,106 @@ jobs:
- run: npm ci
- run: npm test
- run: npm run build
- run: bash action/test-contract.sh
- run: npm pack --dry-run
- run: npm audit --audit-level=high

lint-readme-commands:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
node-version: 24
- run: npm ci
- run: npm run build
- name: Verify CLI is callable as aeoptimize
run: node dist/cli/index.js --version
run: node dist/cli/index.js --version
- name: Verify public metadata uses the current repository owner
run: npm test -- --run src/core/__tests__/evidence-boundaries.test.ts

action-contract:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
- run: npm ci
- run: npm run build
- run: npm pack

- name: Advisory mode is the default
id: advisory
uses: ./
with:
path: .github/fixtures/action-low
min-score: '100'
package-spec: ./aeoptimize-0.6.0.tgz

- name: Validate Action outputs
env:
SCORE: ${{ steps.advisory.outputs.score }}
REPORT: ${{ steps.advisory.outputs.report }}
run: |
case "$SCORE" in
''|*[!0-9]*) echo "Invalid score output: $SCORE"; exit 1 ;;
esac
node -e "const r=JSON.parse(process.env.REPORT);if(r.overall.total!==Number(process.env.SCORE))process.exit(1)"

- name: Blocking mode passes at an accepted threshold
id: blocking-passes
uses: ./
with:
path: .github/fixtures/action-low
min-score: '0'
fail-on-low-score: 'true'
package-spec: ./aeoptimize-0.6.0.tgz

- name: Validate blocking outputs
env:
SCORE: ${{ steps.blocking-passes.outputs.score }}
REPORT: ${{ steps.blocking-passes.outputs.report }}
run: |
case "$SCORE" in
''|*[!0-9]*) echo "Invalid score output: $SCORE"; exit 1 ;;
esac
node -e "const r=JSON.parse(process.env.REPORT);if(r.overall.total!==Number(process.env.SCORE))process.exit(1)"

- name: Blocking mode fails below threshold
id: blocking-fails
continue-on-error: true
uses: ./
with:
path: .github/fixtures/action-low
min-score: '100'
fail-on-low-score: 'true'
package-spec: ./aeoptimize-0.6.0.tgz

- name: Invalid choice is rejected
id: invalid-choice
continue-on-error: true
uses: ./
with:
path: .github/fixtures/action-low
fail-on-low-score: sometimes
package-spec: ./aeoptimize-0.6.0.tgz

- name: Out-of-range threshold is rejected
id: invalid-threshold
continue-on-error: true
uses: ./
with:
path: .github/fixtures/action-low
min-score: '101'
package-spec: ./aeoptimize-0.6.0.tgz

- name: Assert expected failures
env:
BLOCKING_OUTCOME: ${{ steps.blocking-fails.outcome }}
INVALID_OUTCOME: ${{ steps.invalid-choice.outcome }}
THRESHOLD_OUTCOME: ${{ steps.invalid-threshold.outcome }}
run: |
test "$BLOCKING_OUTCOME" = failure
test "$INVALID_OUTCOME" = failure
test "$THRESHOLD_OUTCOME" = failure
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Changelog

All notable user-visible changes will be documented here. The project follows Semantic Versioning after the v0.6 evidence baseline is released.

## 0.6.0 — 2026-08-16

### Changed

- Reframed the score as deterministic content readiness rather than a prediction of ranking or AI citation.
- Classified FAQ and `llms.txt` as optional, zero-point signals.
- Removed the exact-one-H1 and fixed meta-description-length assumptions.
- Changed quantitative-content guidance to flag unsourced claims instead of rewarding more numbers.
- Stopped inferring `FAQPage` structured data from question headings.
- Limited CI support to maintained Node.js LTS lines and refreshed dependencies.
- Added methodology, contribution, security, roadmap, and root GitHub Action files.
- Made the GitHub Action advisory by default, with explicit blocking mode, version-matched package installation, stable outputs, and contract fixtures.

### Security

- Updated runtime and development dependencies to remove known npm audit findings present in the previous lockfile.

## 0.5.3 — 2026-04-15

- Added the `aeoptimize` executable alias.
- Synchronized CLI, Action, and plugin version metadata.
37 changes: 37 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Contributing

Contributions that make `aeoptimize` more reproducible, explainable, or easier to adopt are welcome.

## Development setup

Use Node.js 22.12 or newer. Node 24 LTS is the recommended development version.

```bash
npm ci
npm run check
npm pack --dry-run
npm audit --audit-level=high
```

Do not commit `node_modules`, `dist`, package tarballs, credentials, or reports containing private URLs.

## Pull requests

Keep each pull request focused. Include:

- the problem and user workflow;
- tests or fixtures that fail before the change and pass after it;
- JSON/output compatibility notes;
- documentation updates for user-visible behavior;
- the source and evidence class for any scoring-rule change.

Rule proposals must follow [docs/methodology.md](docs/methodology.md). Unsupported ranking, citation, adoption, or performance claims will not be accepted. Do not add fabricated statistics to examples or fixtures.

## Commit and review expectations

- Run `npm run check`, `npm pack --dry-run`, and `npm audit --audit-level=high`.
- Preserve deterministic output unless the pull request explicitly versions the methodology change.
- Treat generated JSON-LD and crawler policy as reviewable candidates, never universal defaults.
- Add a changelog entry for behavior, compatibility, security, or methodology changes.

Opening an issue before a large change is recommended so scope and compatibility can be agreed first.
Loading
Loading