Commit Graph
34 Commits
Author SHA1 Message Date
Mads LorentzenandClaude Opus 5 34b8b3f91f fix(onboarding): warn about public forks at the point of decision (#345) (#348)
The quick start walked a new user into gh repo fork - forks of public
repos are always public - and two steps later had /setup write personal
data into tracked files, with the only complete warning in SETUP.md
section 8, a section about pulling updates that a first-time user has no
reason to open during onboarding. A real user hit exactly this (#345).

The warning now sits adjacent to both fork commands (README step 1,
SETUP.md section 2, both pointing at section 8's private-remote recipe),
and /setup checks the origin's visibility BEFORE writing anything: a
public-fork origin gets a confirm-first warning instead of a note after
every file is on disk. A private origin, no origin, or a non-git
directory continues silently. Reported by @basilevs with a complete
reproduction and fix analysis; this implements his fixes (1) and (4).

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 21:33:32 +02:00
Mads Lorentzen 24d5391cd0 Merge pull request #347 from MadsLorentzen/fix/2026-08-19-review-fixes
Act on the 2026-08-19 deep code review: 35 findings fixed, every fix with the test that would have caught it
2026-08-19 21:15:15 +02:00
Mads LorentzenandClaude Opus 4.8 b204c44fdb chore(funding): add GitHub Sponsors button alongside Ko-fi (#240)
GitHub Sponsors profile for @MadsLorentzen is now live and accepting
sponsorships. Add it to FUNDING.yml so the repo's native "Sponsor this
project" box links to both GitHub Sponsors and Ko-fi, meeting developer
and non-developer supporters on whichever path is lowest-friction for
them. Ko-fi remains unchanged; the README Ko-fi block is untouched.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-25 21:59:09 +02:00
Mads LorentzenandClaude Opus 4.8 a68028bc54 fix(cli): pin @types/bun and @bunli/* to concrete versions to stop CI type-drift (#226)
CI runs `bun install` (not --frozen-lockfile) and the CLIs' package.json
pinned @types/bun, @bunli/core, and @bunli/utils to "latest", so each fresh
install could resolve a different version than the lockfile. When a "latest"
bun-types resolved that didn't satisfy the tsconfig (lib: ["ESNext"] with no
DOM, types: ["bun-types"] as the only source of Response/URL/fetch globals),
`bun run typecheck` failed across every .ts file - a transient red on PRs that
never touched TypeScript (observed on #207, which changes only SKILL.md).

Pin the three previously-floating dev/framework deps to the versions the
lockfiles already resolve, so behavior is unchanged and the drift class is
gone:
- @types/bun: latest -> 1.3.14  (all 6 CLIs)
- @bunli/core:  latest -> 0.9.1  (jobbank, jobdanmark, jobindex, jobnet)
- @bunli/utils: latest -> 0.6.0  (jobbank, jobdanmark, jobindex, jobnet)

The ^-ranged deps (node-html-parser, zod, typescript) are left as-is; they are
semver-guarded and were not the cause. No lockfiles committed (bun.lock stays
gitignored per existing policy). Verified: all 6 CLIs install and `bun run
typecheck` clean with the pins.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 17:18:46 +02:00
Mads LorentzenandClaude Opus 4.8 905f6e0946 docs(releases): add CHANGELOG + release-based update guidance; sharpen real-path bar (#225)
Addresses #213 (how to keep up with a fast-moving upstream) and closes the
verification loophole surfaced in the 2026-07-22 triage audit.

- Add CHANGELOG.md (Keep a Changelog + semver), with v1.0.0 as the first
  tagged baseline and an Unreleased section for going forward.
- SETUP.md section 8: recommend updating to a tagged release (a vetted,
  described checkpoint) over pulling raw master; fetch --tags and merge a tag.
- README: add a "Staying up to date" pointer to Releases, the CHANGELOG, and
  check_upstream_updates.py.
- CONTRIBUTING.md: sharpen "Claims get verified" - a test that distinguishes
  master from the fix is necessary but not sufficient; the failing input must
  be one the workflow actually produces, not one the test hand-builds. Fixes
  demonstrated only through a synthetic input the real code path never receives
  get declined even when their test is green.

Note: the git tag / GitHub Release for v1.0.0 is intentionally left for the
maintainer to cut.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-22 11:36:47 +02:00
Mads LorentzenandClaude Fable 5 122db059cb feat(apply): requirement-coverage rules and CV targeting improvements from output benchmark (#184)
Seven improvements sourced from blind regression probes comparing current
outputs against real April-2026 baselines (each an area where the older
outputs scored better):
- every stated requirement addressed - matched or honestly gapped, never
  silently omitted (the benchmark run omitted a stated Kubernetes
  requirement entirely; omission reads as hiding under questioning)
- nice-to-haves engaged by name with honest adjacency framing; posting's
  literal term preferred, including in CV section headings
- stated logistics/prerequisites addressed in the letter (clearances,
  availability, job ID, multi-country language mapping)
- domain-transfer argument leads the CV profile statement for
  domain-changers
- evidence links (href) on every verifiable named artifact
framework_version: 05 -> 1.2.0.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 22:22:05 +02:00
Mads LorentzenandClaude Fable 5 12717d2c12 fix(templates): correct 06 structure-block antipattern and 05 needspace scope (#183)
Both found by empirically re-running the /apply pipeline end-to-end:
06's Document Structure block still demonstrated itemize wrapped inside
lettercontent - the exact antipattern its own pitfall section forbids -
and following 05's needspace guidance at section level pushed an entire
Education block to a new page, costing a page instead of saving one.
framework_version: 05 -> 1.1.1, 06 -> 1.0.1.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 22:19:02 +02:00
Mads LorentzenandClaude Fable 5 de91a97fe8 feat(apply): make CV language a profile setting, defaulting to English (#179)
The CV was hardcoded 'Always in English' - fine for the Danish/English
demonstration profile, a real disadvantage for fork users in markets
where applications are expected in the local language (cover letters
already match the posting's language). /setup now asks once and records
'CV language:' in CLAUDE.md's Identity section; /apply reads it with
English as the default, so existing users see zero behavior change.
The ATS keyword rule is reworded language-neutrally.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 08:39:51 +02:00
Mads LorentzenandClaude Fable 5 3847088986 fix(setup): ground Path A profile-statement extraction against the profile (#178)
Completes the loop behind #177: /apply drift could be archived by
/outcome, then laundered into 05-cv-templates.md as a reusable template
by /setup Path A - promoting a one-off drifted claim into source
material for every future application. Path A now verifies extracted
statements' factual claims against 01-candidate-profile.md (keeping
framing only), and 05-cv-templates.md marks [Used for:] statements as
phrasing references, never fact sources. framework_version 1.1.0.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 08:39:17 +02:00
Mads Lorentzen d2e14418ca docs(setup): document upstream-pull workflow and failure-isolate install loops (#176)
Adds SETUP.md section 8 (pulling upstream updates into a personalized fork: commit-first, check_upstream_updates.py preview, conflicts-as-signal) closing #174, reported by @sharique. Also brings SETUP.md's duplicate install loops up to #157's failure-isolated pattern.
2026-07-17 22:05:43 +02:00
Mads Lorentzen fb91be7a0b security: treat job postings as untrusted input across /apply and /rank (#175)
Prompt-injection hardening from the dataflow analysis in #173 by @Defaultuser361: data-not-instructions rules in /apply and /rank, reviewer research constrained to the user-confirmed company identity, writing-style verify rule tightened to independently located sources (framework_version 1.1.0), SECURITY.md private reporting channel, README note. Closes #173.
2026-07-17 21:48:59 +02:00
Mads LorentzenandClaude Fable 5 dd6d7efea6 docs: warn fork authors about GitHub's default PR base (#167)
Three personalized-fork PRs (#155, #162, #165) were filed against
upstream by accident in one week - GitHub points new fork PRs at the
upstream repo by default, and nothing warned about it at the moment of
filing. Adds a PR template with the heads-up in the compose box (plus
the review norms the process asks for anyway) and one sentence in
CONTRIBUTING's fork section naming the mechanism.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:26:45 +02:00
Mads LorentzenandClaude Fable 5 be427a7607 docs: codify the runtime policy - Claude Code first, runtime forks welcome (#163)
Writes down the architecture decision from the #78 discussion (2026-07-15):
Claude Code is the reference runtime; other agent runtimes are supported at
the edges via the portable portal skills in .agents/skills/, the root
AGENTS.md signpost, and thin-pointer community forks. Per-runtime command
trees stay in forks for the same reason market portals do.

README gets one line in Prerequisites; CONTRIBUTING gets the policy section
beside the market-skills rule it mirrors, including the explicit revisit
conditions.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 22:34:10 +02:00
Mads LorentzenandClaude Fable 5 1526afcbfe docs: add the maintainer's story to the README (#138)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 16:34:58 +02:00
Mads LorentzenandClaude Fable 5 855b6725f3 brand: tagline line + the hired-moment coffee ask (#136)
* feat(brand): tagline under the H1 and the hired-moment coffee line

Two items from the branding strategy: the positioning line lands in the
README itself (the repo description already carries it), and /outcome's
hired path gets its single, value-framed donation ask - once per hire,
never nagging, never effort-framed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(brand): pay-it-forward framing for the hired-moment line

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 11:17:48 +02:00
Mads LorentzenandClaude Fable 5 013b90132b chore: slim brand assets to just the mascot GIF (#135)
The regeneration pipeline, AI source sheets, retired sprites, avatar,
social card, and internal design/plan docs are maintainer tooling, not
template content - archived in the maintainer's private workspace. Fork
users get the 30 KB animation and nothing they didn't ask for. The
.gitignore PNG allowlist is dropped along with the PNGs it served.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 10:30:55 +02:00
Mads LorentzenandClaude Fable 5 09f0417d78 brand: meet Pip, the courier bird (#132)
* docs: add mascot & brand design spec (Pip the courier bird)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: Pip wears a tie - update mascot spec to v5 flight loop

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: add Pip brand PR implementation plan

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): v7 master GIF - drop frame scaling, add enclosed-hole transparency

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): v8 master GIF - fix hole classification (chest stays opaque)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): scrub stale v5 references

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): v10 master GIF - line-fitted envelope border clipping

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): label pipeline as v10

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): v16 master GIF - targeted removal of gap blob

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): v17 master GIF - drop envelope border clipping, keep blob removal

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(plan): v19 final master GIF - user-approved thin outline repair

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(brand): add Pip mascot assets and regeneration pipeline

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(brand): Pip takes over the README header

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(spec): scrub stale scaling line

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(brand): avatar, social card, and mascot sources (PNG allowlist)

The global *.png personal-data rule silently excluded the mascot's source
sheets and generated PNGs; allowlist the upstream-controlled assets/mascot/
paths without weakening the fork-protecting rule.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 10:21:36 +02:00
Mads LorentzenandClaude Fable 5 543d1a733e docs: add no-crypto/no-token disclaimer (#127)
The repo's owner has received multiple pump.fun token-sponsorship
solicitations this week. This pre-empts any 'the developer
acknowledged the token' narrative and protects users from
unauthorized schemes trading on the project's name.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 20:12:42 +02:00
Mads LorentzenandClaude Fable 5 22d8b48dcf docs: add Trendshift #1-repository-of-the-day badge (#126)
Commemorates #1 on GitHub Trending (all languages), July 7 2026.
Official Trendshift embed, linked to the tracked stats page.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 17:24:43 +02:00
Mads LorentzenandClaude Fable 5 6e92a4358a docs: add credit norm to CONTRIBUTING.md (#89)
Co-authored-by for incorporated code; named commit/PR mention for
independently written fixes derived from reports. Prompted by the
question in #66.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 06:10:16 +02:00
Mads LorentzenandClaude Fable 5 d4415dff16 docs: add CONTRIBUTING.md codifying the project philosophy (#80)
Codifies what has so far lived in PR closing comments: the universal-
template rule, merge/decline criteria with precedent links, the
feature-complete command bar, the empirical-verification standard,
and the fork path via /add-portal and the community forks discussion.

GitHub auto-surfaces CONTRIBUTING.md on new PRs and issues; README
gets a one-line pointer for browsers.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 21:11:03 +02:00
Mads LorentzenandClaude Fable 5 05e886c855 docs: add donation message above Ko-fi button and community-forks pointer (#79)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 20:44:28 +02:00
Mads LorentzenandClaude Fable 5 a558c8593b fix: rename job-scraper skill to 'scrape' so /scrape resolves natively (#74)
The docs instruct users to run /scrape, but the skill's name was
job-scraper, so /scrape never resolved as a command - it only worked
via fuzzy trigger matching on the description. Renaming the skill's
name field makes /scrape a real, autocompleted command, consistent
with /upskill (whose skill is named upskill). Folder path unchanged.

Fixes #68. No wrapper command per the single-source-of-truth
precedent (#52).

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 18:51:18 +02:00
Mads LorentzenandClaude Fable 5 a5ffcc39ff chore: untrack tracker CSV, scope scraper Bash permission, fix portal SKILL.md paths (#71)
- Untrack job_search_tracker.csv: it was both tracked and listed in
  .gitignore (same inconsistency class as the settings.local.json fix
  in #27). Users' personal rows risked merge conflicts on every pull;
  commands already create the file with the standard header when it
  is missing.
- Scope job-scraper's allowed-tools Bash entry (from #52) to
  'bun --version' and the portal-CLI invocation pattern, adopting the
  tighter form proposed in #65.
- Fix all five portal SKILL.mds documenting 'bun run skills/...'
  paths that do not resolve from the repo root ('.agents/skills/...'
  is correct) - now load-bearing since #52 wired /scrape to read
  these docs for CLI invocations. Surfaced in #66.
- Teach tools/lint_skills.py to glob-expand allowed-tools bun run
  targets so scoped wildcard permissions lint correctly.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 17:14:39 +02:00
Mads LorentzenandClaude Fable 5 f3d4448cca fix: restore Danish CLI commands/ and tsconfig files dropped by old .gitignore (#53)
The pre-#21 .gitignore's unanchored 'commands/' rule silently excluded
.agents/skills/*/cli/src/commands/ (and the tsconfigs) from the initial
release, so every clone's four Danish portal CLIs failed on import with
'Cannot find module ./commands/search.js'. #21 fixed the rule but the
files were never restored - git history has no trace of them.

Restored from the maintainer's working copies, including the updated
jobindex helpers.ts (Jobindex moved search results from the JSON
endpoint, which now returns 204, into an embedded HTML Stash blob).

Verified: all four CLIs typecheck and return live results with their
documented flags. Surfaced while reviewing #52.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 17:39:47 +02:00
Mads LorentzenandClaude Fable 5 a0d576e0ca chore: add test script to linkedin-search cli package.json (#38)
Matches the jobindex-search convention; follow-up noted in #35 review.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 21:25:25 +02:00
Mads LorentzenandClaude Fable 5 261b57edfd docs: move Ko-fi button below intro paragraph (#33)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 19:38:56 +02:00
Mads LorentzenandClaude Fable 5 a7f20e101c docs: add Ko-fi Buy me a coffee button to top of README (#32)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 19:38:11 +02:00
Mads LorentzenandClaude Fable 5 3e47ed2a2d feat: add Ko-fi sponsor button via FUNDING.yml (#29)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 11:20:27 +02:00
Mads LorentzenandClaude Fable 5 f9c1978c65 docs: add linkedin-search to install lists in README and SETUP (#28)
Follow-up to #20: the linkedin-search CLI landed without being added to
the bun install instructions. Included in both lists with a note that
the install is optional (zero runtime dependencies, dev types only).
Also updated the README file tree and Bun prerequisite wording to
reflect that the toolset is no longer Denmark-only.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 10:59:08 +02:00
Mads LorentzenandClaude Fable 5 f15b9fb65d Tighten pre-approved permissions and untrack settings.local.json (#27)
* fix: move scoped permissions to settings.json, drop curl, untrack settings.local.json

Addresses #23:
- Remove pre-approved Bash(curl:*) - no agent workflow uses curl, and a
  toolkit that routinely feeds untrusted job postings to the model should
  not ship a pre-approved exfiltration-capable command
- Move shared permissions to .claude/settings.json (committed by
  convention) and scope them tighter: Bash(bun run:*) for the job portal
  CLIs, Bash(python/python3 salary_lookup.py:*) for salary lookups
- Untrack .claude/settings.local.json - it was committed despite being
  listed in .gitignore; the file stays local for personal overrides

Reported-by: @josealfonsomora

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(setup): warn existing cloners about stale settings.local.json

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 10:56:17 +02:00
Mads LorentzenandClaude Opus 4.7 974b29ec3a refactor: fold /setup_docs into /setup as third onboarding path (#9)
* refactor: fold /setup_docs into /setup as third onboarding path

- Auto-detect documents/ at /setup Step 0; offer three paths (documents
  folder, single CV import, interview).
- Inline document-driven merge logic into setup.md as Path A: read-before-
  write, additive vs. conflicting bucket merge with per-conflict prompts,
  inference labeling for behavioral and style files, STAR-stub generation
  instead of fabrication.
- Step 3 substeps for skill files skip when Path A populated them; non-
  skill substeps (CLAUDE.md, cv/main_example.tex, search-queries.md)
  always run. Path C interview preserved verbatim. /setup --section <name>
  update flow preserved.
- Delete .claude/commands/setup_docs.md.
- Update /reset prompts to point only at /setup. Update documents/README.md
  to reference /setup throughout. Update README.md to drop the standalone
  /setup_docs section and add upskill/ to the skills tree.
- Remove the trailing comma left in .claude/settings.local.json after the
  PR #6 revert (was technically invalid JSON).

Single onboarding entry point. documents/ folder convention unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(README): finish readme alignment for the /setup fold

- Update onboarding-paths tip to reflect three paths (was "Either"
  before /setup_docs landed in PR #6).
- Add documents/ and upskill/ entries to the file tree, both relied
  on by the new /setup Path A and by /upskill respectively.
- Add a brief "Other commands" section briefly describing /expand and
  /upskill so users discover them without having to read individual
  command files. /reset stays in the existing "Starting over"
  subsection, now linked from the new section.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 09:57:33 +02:00
Mads Lorentzen 1bf6a22cd9 Merge pull request #8 from MadsLorentzen/feat/moderncv-color-overrides-and-itemize-cleanup
- cv/main_example.tex: add color1 overrides for firstnamestyle, lastnamestyle, and sectionstyle so the first name, last name, and section headings render in the moderncv blue accent instead of black (default banking on modern MiKTeX). Strip 21 inter-item \vspace{1pt} lines from itemize lists, which intermittently produced an oversized gap before a single bullet because the inter-item \vspace creates a paragraph break that interacts with the list's internal \itemsep.
  
- .claude/skills/job-application-assistant/05-cv-templates.md: document both patterns so /apply produces CVs that match the example template.
  
- SETUP.md: fix two stale pdflatex references that contradicted the rest of the docs (README, CLAUDE.md, and 05-cv-templates.md already specified lualatex).
2026-04-28 21:08:20 +02:00
Mads Lorentzen 6c23f80c03 Merge pull request #7 from MadsLorentzen/feat/compile-verify-and-relevance-weighted-cutting
Add PDF verification loop and relevance-weighted CV cutting to /apply
2026-04-25 13:57:45 +02:00