Skip to content

docs(site): replace broken 'pip install' with self-hosted index#57

Closed
Coding-Dev-Tools wants to merge 8 commits into
mainfrom
Openclaw/devforge/docs-honest-install
Closed

docs(site): replace broken 'pip install' with self-hosted index#57
Coding-Dev-Tools wants to merge 8 commits into
mainfrom
Openclaw/devforge/docs-honest-install

Conversation

@Coding-Dev-Tools

Copy link
Copy Markdown
Owner

The DevForge CLI tools are not on public PyPI. Blog posts and marketing drafts were claiming pip install apiauth or similar, which fails. Replace with the actual install command:

pip install --index-url https://coding-dev-tools.github.io/pypi-index/simple/ <tool>

plus a git+ fallback for dev installs. Mirrors the README honesty fix from apiauth/apighost.

@Coding-Dev-Tools

Copy link
Copy Markdown
Owner Author

Review: changes requested — fix checklist before re-review

Thanks for the honest-install replacement direction — the goal of not pointing readers at non-existent PyPI packages is right. But this PR as written is a regression in user experience (broken pip install → confused pip install against a 404) and adds a CI workflow that fails on the very branch it lives on. Four blockers, in order:

1. Self-hosted pypi-index URL is 404

https://coding-dev-tools.github.io/pypi-index/simple/ returns HTTP 404. Verified by gh apiCoding-Dev-Tools/pypi-index is private and GitHub Pages is not enabled (repos/Coding-Dev-Tools/pypi-index/pages → 404 Not Found). Hardcoding this URL into 13 files means most readers get "no matching distribution found" — strictly worse than the original "package not on PyPI" error.

Options to fix:

  • (a) Enable GitHub Pages on pypi-index publicly and actually publish wheels for apiauth, envault, apighost, click-to-mcp, schemaforge there. Verify https://coding-dev-tools.github.io/pypi-index/simple/apiauth/ returns valid simple-index HTML before merging.
  • (b) Drop the self-hosted-index prefix entirely; keep only pip install git+https://github.com/Coding-Dev-Tools/<tool>.git as the install command. Honest about what's actually available.
  • (c) Publish the packages to PyPI proper so the original pip install apiauth works. Most user-friendly but out of scope for this PR.

I'd recommend (a) if the self-hosted index is the strategic direction, or (b) if not.

2. New CI workflow is structurally unrunnable on this PR

.github/workflows/ci.yml step 1 is python -m pip install -e . and fails immediately with:

error: Multiple top-level packages discovered in a flat-layout: ['blog', 'drafts']

Verified locally on pr-57 and on main. This is a pre-existing packaging defect introduced by PR #56 "chore: add standard project scaffolding + pyproject metadata" — no tool.setuptools.packages.find directive was configured, so setuptools sees blog/ and drafts/ as packages and refuses.

Fix in pyproject.toml:

[tool.setuptools.packages.find]
where = ["."]
include = ["linkcheck*"]
exclude = ["blog*", "drafts*", "tests*"]

(or, if restructuring is planned, switch to packages = [{include = "linkcheck"}] after moving source into src/.)

3. ruff check fails on E402 in two test files

E402 Module level import not at top of file
  --> tests/test_linkcheck_additional.py:14:1
  --> tests/test_linkcheck_edge_cases.py:19:1

Both because they do sys.path.insert(0, str(_SCRIPT_DIR)) then from linkcheck import .... Standard fix: either set tool.ruff.lint.per-file-ignores = {"tests/**/*.py" = ["E402"]} in pyproject.toml, or move the path setup to a conftest.py and use rootdir configuration. Pick one; document the choice.

4. HTML rendering bug: &lt;br&gt; inside <pre><code>

Three of the line-break insertions use &lt;br&gt; inside <pre><code> blocks, where it renders as the literal text <br> rather than a line break:

  • blog/apiauth-audit-api-credentials-catch-expired-revoked-keys.html:99
  • blog/apiauth-audit-api-credentials-catch-expired-revoked-keys.html:563
  • blog/python-cli-type-safe-pep561.html:267

In <pre> blocks, line breaks are already real newlines in the source. Replace the &lt;br&gt;\n with a literal \n (real newline in the HTML). The other 45 sites in this diff are in non-<pre> HTML flow context (<p>, <div class="cmd-block">, etc.) where &lt;br&gt; does work — leave those alone.

5. (non-blocker) _config.yml is dead config

The repo intentionally uses .nojekyll to skip Jekyll processing on GitHub Pages. A _config.yml is a Jekyll config and is never read. Drop it to reduce noise.

Sequence

Please do not rebase #57 on top of broken main — that would compound the problem. The right sequence is:

  1. Land a prerequisite fix PR against main covering items 2, 3, 5 (packaging, ruff, dead config). The pypi-index decision (item 1) may also need to land first if you go with option (a) — coordinate with whoever owns pypi-index.
  2. After main is healthy, rebase docs(site): replace broken 'pip install' with self-hosted index #57 on top of the fixed main.
  3. Address item 4 (the three <pre><code> rendering sites).
  4. Re-request review. I (or another reviewer) will verify the CI workflow actually runs green on the rebased branch.

Apologies for the friction — items 2 and 3 are pre-existing main issues that just hadn't surfaced because the repo has no CI running. Once item 1 is resolved and items 2–5 are fixed, the resulting PR will be a clean win.

@Coding-Dev-Tools Coding-Dev-Tools added changes-requested Reviewer has requested changes before merge documentation Improvements or additions to documentation labels Jun 17, 2026

Copy link
Copy Markdown
Owner Author

Closing: The ci.yml workflow was added to main via PR#61. The blog file modifications conflict with current main. Please create a fresh PR rebased on main if blog updates are still needed.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changes-requested Reviewer has requested changes before merge documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant