Commit Graph
170 Commits
Author SHA1 Message Date
kpcto bbd5c5a9f0 Merge pull request '[E00-S01-T05] Add root build/test scripts' (#372) from feature/158 into main
CI / Frozen lockfile install (push) Successful in 47s
2026-08-28 08:48:10 +00:00
implementer 0d1bd19093 feat: add root build/test/typecheck scripts (E00-S01-T05)
CI / Frozen lockfile install (pull_request) Successful in 50s
Adds root scripts so build, test and typecheck run from the workspace root:
- root package.json gains scripts: build (pnpm -r run build), test
  (node --test on tests/**/*.test.mjs), typecheck (pnpm -r run typecheck)
- every workspace package (apps/server, packages/core,
  extensions/example) gains build (tsc -p tsconfig.json) and typecheck
  (tsc -p tsconfig.json --noEmit) scripts
- typescript 6.0.3 pinned as an exact root devDependency so the commands
  run from a clean checkout; lockfile regenerated with pnpm 11.23.0

Verified from a clean state: pnpm install --frozen-lockfile passes,
pnpm build emits dist for all 3 packages, pnpm typecheck passes for all 3,
pnpm test runs tests/architecture-import.test.mjs 10/10 green, and CI's
pnpm -r list --depth -1 still lists all 4 workspace projects.

Closes #158
2026-08-28 08:39:13 +00:00
kpcto 2c0d081983 Merge pull request '[E00-S01-T04] Add dependency-boundary rule/test' (#371) from feature/157 into main
CI / Frozen lockfile install (push) Successful in 42s
2026-08-28 08:32:08 +00:00
implementer 4d0df92290 feat: add dependency-boundary rule and architecture import test (E00-S01-T04)
CI / Frozen lockfile install (pull_request) Successful in 38s
Adds a declarative dependency-boundary rule (dependency-boundaries.json)
classifying workspace packages into apps/packages/extensions groups and
forbidding packages/* (core) from importing extensions/* (concrete
extensions); core depends only on extension contracts, never concrete
extensions.

Adds tests/architecture-import.test.mjs (node:test, zero new dependencies,
lockfile untouched) that loads the rule, walks every workspace package's
source and resolves each import/export/require specifier (bare workspace
names, relative paths, dynamic import(), require(), export-from) to a
group, failing on any forbidden core -> extension edge. Comment-aware
scanning avoids false positives; line numbers in violation reports map to
the original source. Synthetic negative cases prove detection (bare name,
relative path, export-from, dynamic import, require), while the current
compliant graph passes with zero violations.

Verified: 10/10 tests pass; injecting a real core -> extension import makes
the integration test fail with a per-file/line violation report; pnpm 11.23.0
install --frozen-lockfile passes unchanged (CI frozen-install job stays green).

Closes #157
2026-08-28 08:30:34 +00:00
kpcto 4ef0ec9ae4 Merge pull request '[E00-S01-T03] Configure ESM package boundaries' (#370) from feature/156 into main
CI / Frozen lockfile install (push) Successful in 44s
2026-08-28 08:21:09 +00:00
implementer b1fef8d592 feat: configure ESM package boundaries across the workspace (E00-S01-T03)
CI / Frozen lockfile install (pull_request) Successful in 39s
Adds ESM boundary declarations to every workspace package manifest
(apps/server, packages/core, extensions/example): "type": "module",
"main"/"types" entry points and an "exports" map (types + import
conditions) so each package exposes only its public root; adds
"type": "module" to the workspace root package.json so the workspace is
uniformly ESM. Placeholder src/index.ts files stay as empty ESM modules.

Verified: each package compiles under tsconfig.base.json (NodeNext) with
TypeScript 6.0.3 and emits ESM dist/index.js + dist/index.d.ts; Node
imports each package by name through its exports map and rejects deep
subpath imports (ERR_PACKAGE_PATH_NOT_EXPORTED); pnpm 11.23.0
install --frozen-lockfile passes with the lockfile unchanged.

Closes #156
2026-08-28 08:13:00 +00:00
kpcto 97b702cc59 Merge pull request '[E00-S01-T02] Implement tsconfig.base.json' (#369) from feature/155 into main
CI / Frozen lockfile install (push) Successful in 47s
2026-08-28 08:08:08 +00:00
implementer 4e527f9267 feat: add strict tsconfig.base.json shared by all packages (E00-S01-T02)
CI / Frozen lockfile install (pull_request) Successful in 39s
Adds a strict base TypeScript config at the workspace root (ES2023 / NodeNext
/ strict family incl. noUncheckedIndexedAccess, exactOptionalPropertyTypes,
noImplicitOverride, useUnknownInCatchVariables, verbatimModuleSyntax per
Engineering-Standards) and gives every workspace package
(apps/server, packages/core, extensions/example) a tsconfig.json that extends
it. Each package gets a minimal src/index.ts placeholder so it compiles under
the base config (CJS-safe `export {}` until ESM boundaries land in T03).

Verified: every package typechecks and emits (js + d.ts + sourcemap) with the
pinned TypeScript 6.0.3; a strictness probe confirms the strict family fires.

Closes #155
2026-08-28 00:00:51 +00:00
kpcto 09c40bd9b3 Merge pull request '[E00-S01-T01] Create workspace/package manifests' (#368) from feature/154 into main
CI / Frozen lockfile install (push) Successful in 39s
Reviewed-on: #368
2026-08-27 23:47:58 +00:00
implementer a2fa1dee32 chore: bootstrap pnpm workspace and package manifests
CI / Frozen lockfile install (pull_request) Successful in 48s
E00-S01-T01: create workspace/package manifests
- root package.json pins packageManager pnpm@11.23.0
- pnpm-workspace.yaml separates apps/*, packages/*, extensions/* entries
- skeleton manifests for apps/server, packages/core, extensions/example
- committed frozen lockfile generated by pnpm 11.23.0
- minimal CI: pnpm install --frozen-lockfile + workspace verification
2026-08-27 23:07:58 +00:00
kpcto 7c21255582 Remove tests/scaffold.test.js 2026-08-26 22:36:42 +00:00
kpcto a410bdd3e4 Remove tests/reading-list.test.js 2026-08-26 22:36:38 +00:00
kpcto 03e885896a Remove tests/newsletter.test.js 2026-08-26 22:36:34 +00:00
kpcto 5ea4c2c2da Remove tests/mailto.test.js 2026-08-26 22:36:28 +00:00
kpcto def9940c5e Remove tests/contact.test.js 2026-08-26 22:36:23 +00:00
kpcto 2001d1c10d Remove reading.html 2026-08-26 22:36:18 +00:00
kpcto 05cb7af9b7 Remove package.json 2026-08-26 22:36:14 +00:00
kpcto 6407e7df34 Remove newsletter.html 2026-08-26 22:36:10 +00:00
kpcto d55eeca7d4 Remove js/reading-list.js 2026-08-26 22:36:06 +00:00
kpcto 7e290c5f04 Remove js/newsletter.js 2026-08-26 22:36:01 +00:00
kpcto 1e14fc106b Remove js/newsletter-config.js 2026-08-26 22:35:57 +00:00
kpcto c61d77e1b3 Remove js/mailto.js 2026-08-26 22:35:52 +00:00
kpcto 657c2e7d43 Remove js/contact.js 2026-08-26 22:35:48 +00:00
kpcto 3de742c8ed Remove index.html 2026-08-26 22:35:43 +00:00
kpcto 55af0d92c3 Remove data/reading-list.js 2026-08-26 22:35:39 +00:00
kpcto b32ddb1eed Remove css/style.css 2026-08-26 22:35:35 +00:00
kpcto d673d05d80 Remove contact.html 2026-08-26 22:35:31 +00:00
kpcto 39f51a322f Remove README.md 2026-08-26 22:35:26 +00:00
kpcto 66659c8d41 Remove .gitignore 2026-08-26 22:35:21 +00:00
kpcto c955a30a50 Remove .gitea/workflows/ci.yml 2026-08-26 22:34:50 +00:00
kpcto 2a321ad677 Merge pull request '[Story] Git-ignore local secrets and environment files' (#20) from feature/19 into main
CI / Run tests (push) Successful in 19s
CI / Secret scan (gitleaks) (push) Successful in 56s
Reviewed-on: #20
2026-08-26 21:37:38 +00:00
implementer e186faeb44 Add root .gitignore for local env files and node_modules
CI / Run tests (pull_request) Successful in 29s
CI / Secret scan (gitleaks) (pull_request) Successful in 57s
Ignores .env, .env.*, and node_modules/ at any depth so local secrets and dependency directories can never be committed accidentally. Single-file hygiene change; no tracked files affected. Closes #19.
2026-08-26 19:34:37 +00:00
kpcto 25caf810bc Merge pull request 'Update .gitea/workflows/ci.yml' (#18) from kpcto-patch-1 into main
CI / Run tests (push) Successful in 21s
CI / Secret scan (gitleaks) (push) Successful in 56s
Reviewed-on: #18
2026-08-26 18:18:00 +00:00
kpcto 94c1019a6f Update .gitea/workflows/ci.yml
CI / Run tests (pull_request) Successful in 21s
CI / Secret scan (gitleaks) (pull_request) Successful in 57s
2026-08-26 18:17:41 +00:00
kpcto c33614e3e5 Merge pull request 'Update .gitea/workflows/ci.yml' (#17) from kpcto-patch-2 into main
CI / Run tests (push) Successful in 33s
CI / Secret scan (gitleaks) (push) Failing after 13s
Reviewed-on: #17
2026-08-26 18:02:20 +00:00
kpcto 39587532c6 Update .gitea/workflows/ci.yml
CI / Run tests (pull_request) Successful in 28s
CI / Secret scan (gitleaks) (pull_request) Failing after 13s
2026-08-26 18:02:07 +00:00
kpcto 9f1a065529 Merge pull request 'Update .gitea/workflows/ci.yml' (#16) from kpcto-patch-1 into main
CI / Run tests (push) Failing after 21s
CI / Secret scan (gitleaks) (push) Failing after 13s
Reviewed-on: #16
2026-08-26 17:57:19 +00:00
kpcto d7740e3819 Update .gitea/workflows/ci.yml
CI / Run tests (pull_request) Failing after 21s
CI / Secret scan (gitleaks) (pull_request) Failing after 13s
2026-08-26 17:56:07 +00:00
kpcto 6620510bfb Merge pull request '[Story] Newsletter signup (serverless)' (#15) from feature/14 into main
CI / Run tests (push) Successful in 15s
CI / Secret scan (gitleaks) (push) Failing after 12s
Reviewed-on: #15
2026-08-26 11:44:09 +00:00
implementer 32c81d8b91 test: add 3xx-redirect failure and no-credential-header/URL checks
CI / Run tests (pull_request) Successful in 16s
CI / Secret scan (gitleaks) (pull_request) Failing after 13s
Extends the newsletter suite with two boundary cases: redirects (301/302/307/
308) must be treated as failures with the user-safe error, and the POST must
carry no credential of any kind — no api-key/auth-token/cookie headers, and no
token/secret in the body or URL.
2026-08-26 11:31:54 +00:00
implementer 86aa3afbbf refactor: newsletter signup posts no credential (SEC-14-R1 option a)
CI / Secret scan (gitleaks) (pull_request) Failing after 12s
CI / Run tests (pull_request) Successful in 15s
Rework PR #15 per security review SEC-14-R1: the client no longer carries
an API token. js/newsletter-config.js ships only the non-secret endpoint,
enforced https-only at config load time via validateEndpoint() (mirroring
the protocol allowlist in js/reading-list.js); js/newsletter.js POSTs
email-only with no Authorization header. Failure paths keep the single
user-safe message that never leaks token, endpoint, status, or raw body;
success still shows the confirmation. CI gains a gitleaks step that fails
on any secret hit; README documents the server-side token, the residual
signup-abuse risk, and the authoritative server-side validation follow-up.
2026-08-26 11:27:11 +00:00
bot-implementer cb9cf703a8 docs: document the newsletter page and its config in the README
CI / Run tests (pull_request) Successful in 16s
2026-08-25 19:15:56 +00:00
bot-implementer 49690a7934 test: component + unit tests for the newsletter signup
Covers the issue test plan: form renders and posts to the endpoint; token is
read from config, never hardcoded in source; a failed-token response shows a
user-safe error without leaking the secret; confirmation on success.
2026-08-25 19:15:56 +00:00
bot-implementer 24db5b8a50 feat: add serverless newsletter signup page
Adds newsletter.html with an email signup form that POSTs to a configured
serverless endpoint. The endpoint and API token live in
js/newsletter-config.js (token defaults to an empty deploy-time placeholder,
never hardcoded in page logic). Missing/invalid tokens and network failures
surface a fixed user-safe error; successful signups show a confirmation.
Links the page from the site navigation on all pages.
2026-08-25 19:15:56 +00:00
kpcto e24ba8916d Merge pull request '[Story] Update home page intro copy' (#13) from feature/12 into main
CI / Run tests (push) Has been cancelled
Reviewed-on: #13
2026-08-25 18:59:48 +00:00
bot-implementer a93b860cda Update home page intro copy: recipe → road trip
CI / Run tests (pull_request) Successful in 1m26s
2026-08-25 18:53:06 +00:00
kpcto f40b66d5cc Merge pull request '[Story] Reading list page' (#11) from feature/10 into main
CI / Run tests (push) Has been cancelled
Reviewed-on: #11
2026-08-25 17:14:31 +00:00
bot-implementer fb62194d40 feat: harden external reading links with rel="noopener noreferrer"
CI / Run tests (pull_request) Has been cancelled
All reading list links point at external http(s) URLs, so each rendered
anchor now carries rel="noopener noreferrer" as a hardening best
practice. Renderer test updated for the new attribute and asserts every
rendered link carries it.
2026-08-25 15:15:31 +00:00
kpcto 5bd86f3f9b Merge pull request '[Story] Reading list page' (#9) from feature/8 into main
CI / Run tests (push) Has been cancelled
Reviewed-on: #9
2026-08-25 12:33:20 +00:00
bot-implementer e4a192baab docs: document the reading list page and data file in the README
CI / Run tests (pull_request) Has been cancelled
2026-08-25 12:30:10 +00:00