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
4 changes: 4 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ jobs:
node-version: 24
- run: node --check app-1.0.0.js && node --check siblings-1.0.0.js && node --check value-1.0.0.js && node --check candidate/redirect.js
- run: node --test test/*.test.js
- run: npm ci
working-directory: launch
- run: npm test && npm run demo && npm run receipts:demo
working-directory: launch
deploy:
if: github.event_name != 'pull_request'
needs: check
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules/
launch/receipts.json
launch/coverage/
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

Public interactive demo: https://deployanyway.github.io/

Launch walkthrough: https://deployanyway.github.io/launch/. The [runnable project](launch/README.md) uses all five published npm packages with actual filesystem failures, request scopes, incident drafts and measured Node/c8/build receipts. CI verifies both passing and blocked builds. [Short launch post](launch/POST.md) is ready to copy and share.

Static HTML, CSS and browser ES modules. No analytics, accounts or backend. Inputs stay in the browser. The five demos use vendored 1.0.0 package source; the dog logger uses a single-string `node:util` adapter because the form does not accept formatting arguments. This adapter is not a replacement for the npm library's full Node formatting behavior.

## Develop
Expand Down
16 changes: 15 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,21 @@ <h2 id="why-title">Serious about the work. Playful about the day.</h2>
caring about the work is the point.
</p>
</section>
<section class="why" aria-labelledby="launch-title">
<h2 id="launch-title">
Fetch the request. Follow the cause. Bring receipts.
</h2>
<p>
Dallas brings the energy. Benji asks whether the build passed. See all
five tools work together: request logging, real error diagnosis, an
honest incident draft, status summaries and a release gate backed by
measured commands.
</p>
<p>
<a href="launch/">Run the real workflow →</a> · Copyable setup,
source, tests and actual passing/blocked results.
</p>
</section>
<nav class="tool-grid" aria-label="Choose a tool">
<a href="#bro-say"
><strong>bro-say</strong><span>Give your terminal a personality</span
Expand Down Expand Up @@ -369,4 +384,3 @@ <h2 id="feedback-title">Help us make the next release useful.</h2>
</main>
</body>
</html>

9 changes: 9 additions & 0 deletions launch/POST.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
DeployAnyway 1.0: fetch the request, follow the cause, bring receipts.

Dallas brings the energy. Benji asks whether the build passed. Our five small developer tools now work together: request-scoped logs with redaction, Error/cause diagnostics, honest incident drafts, readable status summaries, and release checks backed by real tests, coverage and builds.

Try the walkthrough and copy the runnable example: https://deployanyway.github.io/launch/

It includes an actual missing-file failure and a deliberately broken build. Confidence gets a tail wag; passing commands get the release.

Software nobody requested, built with questionable priorities, and shipped with absolute confidence!
34 changes: 34 additions & 0 deletions launch/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Fetch the request. Follow the cause. Bring receipts.

Dallas fetches the request. Benji checks the evidence. Neither gets victory zoomies until the commands pass.

This small runnable project uses the five published DeployAnyway 1.0.0 packages. It performs a real missing-file request and a healthy request, then collects actual Node test, c8 coverage and build results. The release demonstration includes an actual deliberately invalid syntax check, so the blocked gate is measured rather than a made-up score.

With Git and Node 22.13+ or 24:

```sh
git clone https://github.com/DeployAnyway/deployanyway.github.io.git
cd deployanyway.github.io/launch
npm ci
npm run demo
npm run receipts:demo
```

`demo` checks that the missing-file command exits 1 and the healthy command exits 0. `receipts:demo` checks that the real passing collector exits 0 and the failed-build collector exits 1; the demonstration harness itself exits 0 only if those expectations hold. It leaves the last (blocked) bundle in ignored `receipts.json`. No server is started, request is sent, or incident message is posted.

For one real check on this example:

```sh
npm run release:receipts
npx @deployanyway/ship-it-meter@1.0.0 --report-file receipts.json --json
```

The collector requires clean tracked source and an unchanged Git commit. Commit your edits before collecting evidence. Its timestamps and commit are pipeline claims, not cryptographic signatures. The fixture demonstrates how to wire this into your project; it does not establish that your application is production-ready.

- `workflow.js`: request-scoped doggo logs, configured credential redaction, Error/cause diagnostics, honest incident draft with an explicit missing next update, and bro-say status presentation.
- `test/workflow.test.js`: actual missing/valid/malformed files, request context, redaction and command status.
- `receipts-demo.mjs`: fresh completed tests/coverage/build receipts and ship-it-meter policy.

Do not log arbitrary secret-bearing error messages without reviewing them. doggo-log protects configured context keys and configured literal values; it does not sanitize the separate diagnostic or incident outputs automatically. Keep real stack disclosure opt-in. All examples use dummy credentials and original on-brand humor.

[Try all five tools](https://deployanyway.github.io/) · [Launch walkthrough](https://deployanyway.github.io/launch/)
18 changes: 18 additions & 0 deletions launch/build.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { spawnSync } from "node:child_process";
import { fileURLToPath } from "node:url";
// The failure scenario actually executes invalid JavaScript through node --check.
const files =
process.env.DEPLOYANYWAY_BUILD_EXAMPLE === "fail"
? ["./fixtures/broken.js"]
: ["./request.mjs", "./workflow.js"];
for (const file of files) {
const result = spawnSync(
process.execPath,
["--check", fileURLToPath(new URL(file, import.meta.url))],
{ stdio: "inherit" },
);
if (result.status !== 0) {
process.exitCode = result.status ?? 1;
break;
}
}
1 change: 1 addition & 0 deletions launch/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ "service": "DeployAnyway demo", "zoomies": "after verification" }
19 changes: 19 additions & 0 deletions launch/demo.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { spawnSync } from "node:child_process";
import { fileURLToPath } from "node:url";
for (const [mode, expected] of [
["failure", 1],
["healthy", 0],
]) {
console.log(
`\n--- ${mode}: real filesystem request; expected exit ${expected} ---`,
);
const result = spawnSync(
process.execPath,
[fileURLToPath(new URL("./request.mjs", import.meta.url)), mode],
{ encoding: "utf8" },
);
process.stdout.write(result.stdout);
process.stderr.write(result.stderr);
console.log(`Actual child exit: ${result.status}`);
if (result.status !== expected) process.exitCode = 1;
}
2 changes: 2 additions & 0 deletions launch/fixtures/broken.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// Deliberately invalid; only used to measure a real failed build in the demonstration.
export const zoomies = ;
159 changes: 159 additions & 0 deletions launch/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta
name="description"
content="A real DeployAnyway workflow: request-scoped logs, Error cause diagnostics and release gates backed by measured tests, coverage and builds. Fetch the request. Follow the cause. Bring receipts."
/>
<link rel="canonical" href="https://deployanyway.github.io/launch/" />
<link rel="icon" href="../favicon.svg" type="image/svg+xml" />
<link rel="stylesheet" href="../style-54d303f2.css?v=launch-1" />
<title>Fetch. Diagnose. Verify. · DeployAnyway 1.0</title>
<meta property="og:type" content="article" />
<meta
property="og:title"
content="Fetch the request. Follow the cause. Bring receipts."
/>
<meta
property="og:description"
content="Five useful developer tools, one real workflow. Dallas brings the energy. Benji checks the evidence."
/>
<meta property="og:url" content="https://deployanyway.github.io/launch/" />
<meta
property="og:image"
content="https://deployanyway.github.io/assets/deployanyway-husky.png"
/>
<meta
property="og:image:alt"
content="DeployAnyway husky developer badge"
/>
<meta name="twitter:card" content="summary" />
<script type="module" src="launch.js?v=launch-1"></script>
</head>
<body>
<main>
<a class="brand-logo" href="/" aria-label="DeployAnyway home"
><img
src="../assets/deployanyway-husky.png"
alt="DeployAnyway husky developer badge"
width="180"
height="180"
/></a>
<p class="eyebrow">DEPLOYANYWAY 1.0 · A REAL WORKFLOW</p>
<h1>Fetch the request. Follow the cause. Bring receipts.</h1>
<p class="manifesto">
Dallas brings the energy. Benji asks whether the build passed.
</p>
<p>
Five small tools, one useful routine: keep the request context, explain
the failure, own the incident, preserve the exit code, and check the
release evidence. The jokes are optional. The facts aren’t.
</p>

<section class="why" aria-labelledby="request-title">
<h2 id="request-title">1. Fetch the request. Guard the context.</h2>
<p>
<a href="/#doggo-log">doggo-log</a> carries a request ID through an
awaited file read and redacts the configured dummy credential before
writing.
</p>
<pre class="preset-library">
{"requestId":"benji-42","authorization":"[REDACTED]"}
Dallas fetched the request. Benji checked the config.</pre>
<p>
AsyncLocalStorage runs in Node. This page shows output from the
runnable project, not a browser simulation of a server.
</p>
</section>
<section class="why" aria-labelledby="cause-title">
<h2 id="cause-title">2. Follow the cause. Own the problem.</h2>
<p>
A real missing file triggers an Error wrapped with a cause.
<a href="/#error-translator">error-translator</a> finds ENOENT and
suggests checking the full path.
<a href="/#excuse-js">excuse-js</a> drafts the known impact and action
without inventing a next-update time.
</p>
<pre class="preset-library">
Caused by: Error [ENOENT]
File or directory not found
Try: Check the full path and the current working directory.

Status: investigating
Current action: Check the cause and restore the configuration file
Next update: Not scheduled
Missing facts: nextUpdate</pre>
<p>
“No victory zoomies yet.” <a href="/#bro-say">bro-say</a> renders
FAILED, and the command actually exits 1. The healthy request reads a
valid file and exits 0. No incident message is posted.
</p>
</section>
<section class="why" aria-labelledby="receipts-title">
<h2 id="receipts-title">3. Confidence needs receipts.</h2>
<p>
<a href="/#ship-it-meter">ship-it-meter</a> checks fresh completed
Node tests, c8 coverage and an actual syntax-check build for the same
committed source. Then the example executes deliberately broken
JavaScript: the build fails and the gate blocks.
</p>
<pre class="preset-library">
Passing build → Gate: PASS; actual collector exit: 0
Broken build → Gate: BLOCKED; actual collector exit: 1
The receipts say stop. Confidence must wait.</pre>
<p>
This checks the example project—not your production application.
Commit and timestamp metadata are trusted-pipeline claims, not
signatures. The demonstration harness returns success only when both
expected outcomes occur.
</p>
</section>

<section class="why" aria-labelledby="run-title">
<h2 id="run-title">Run it. Keep the useful bits.</h2>
<p>
Git and Node 22.13+ or 24. Installs the five exact published 1.0.0
packages plus c8 for development.
</p>
<pre class="preset-library" id="launch-setup">
git clone https://github.com/DeployAnyway/deployanyway.github.io.git
cd deployanyway.github.io/launch
npm ci
npm run demo
npm run receipts:demo</pre>
<button type="button" id="copy-launch">Copy setup</button>
<p id="launch-copy-status" role="status" aria-live="polite"></p>
<p>
<a
href="https://github.com/DeployAnyway/deployanyway.github.io/tree/main/launch"
>Source, tests and integration notes</a
>
· <a href="transcript.txt">Recorded request output</a> ·
<a href="receipt-transcript.txt">Recorded measured gate output</a>
· <a href="POST.md">Short launch post to copy and share</a>
</p>
<p>
The collector requires clean tracked source and an unchanged Git
commit. Commit edits before running it. The final demo receipt file
contains the blocked build; run
<code>npm run release:receipts</code> to generate a fresh passing
bundle. Credentials here are dummy values. Review real diagnostic
messages before logging or sharing them.
</p>
</section>
<footer>
<p>
Software nobody requested, built with questionable priorities, and
shipped with absolute confidence!
</p>
<p>
<a href="/">Try all five tools and their options</a> ·
<a href="/#feedback-title">Bugs, ideas and feedback</a> ·
<a href="https://www.npmjs.com/org/deployanyway">Install from npm</a>
</p>
</footer>
</main>
</body>
</html>
13 changes: 13 additions & 0 deletions launch/launch.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const button = document.getElementById("copy-launch");
const status = document.getElementById("launch-copy-status");
button.addEventListener("click", async () => {
try {
await navigator.clipboard.writeText(
document.getElementById("launch-setup").textContent,
);
status.textContent = "Setup copied. Fetch responsibly.";
} catch {
status.textContent =
"Copy unavailable here. Select and copy the setup commands above.";
}
});
Loading
Loading