@shriyanss/js-recon 1.4.1-alpha.5 → 1.4.1-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/build-and-prettify.yaml +9 -4
- package/.github/workflows/promote-js-recon.yml +116 -0
- package/.github/workflows/publish-js-recon.yml +14 -116
- package/CHANGELOG.md +12 -0
- package/CLAUDE.md +34 -6
- package/Dockerfile.release +29 -0
- package/build/globalConfig.js +1 -1
- package/package.json +1 -1
|
@@ -55,13 +55,20 @@ jobs:
|
|
|
55
55
|
prettier:
|
|
56
56
|
runs-on: ubuntu-latest
|
|
57
57
|
needs: audit
|
|
58
|
+
environment: commit-signing
|
|
58
59
|
steps:
|
|
59
60
|
- name: Checkout
|
|
60
61
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
61
62
|
with:
|
|
62
63
|
# Make sure the action checks out the repository to the pull request branch
|
|
63
64
|
ref: ${{ github.ref_name }}
|
|
64
|
-
|
|
65
|
+
|
|
66
|
+
- name: Configure SSH commit signing
|
|
67
|
+
uses: shriyanss/verified-commit-action@v1
|
|
68
|
+
with:
|
|
69
|
+
ssh-private-key: ${{ secrets.JS_RECON_SIGNING_KEY }}
|
|
70
|
+
commit-name: "js-recon-bot"
|
|
71
|
+
commit-email: ${{ secrets.JS_RECON_SIGNING_EMAIL }}
|
|
65
72
|
|
|
66
73
|
- name: Set up Node.js
|
|
67
74
|
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
@@ -77,14 +84,12 @@ jobs:
|
|
|
77
84
|
|
|
78
85
|
- name: Run Prettier
|
|
79
86
|
run: prettier --write . --config .prettierrc
|
|
80
|
-
|
|
87
|
+
|
|
81
88
|
- name: Remove node_modules
|
|
82
89
|
run: rm -rf node_modules
|
|
83
90
|
|
|
84
91
|
- name: Commit and push changes
|
|
85
92
|
run: |
|
|
86
|
-
git config user.name "github-actions[bot]"
|
|
87
|
-
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
88
93
|
git add .
|
|
89
94
|
git commit -m "chore: prettify code" || echo "No changes to commit"
|
|
90
95
|
git push
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Manually-triggered second phase of a release, run after a staged npm publish
|
|
2
|
+
# (see publish-js-recon.yml) has been approved by a human with 2FA on npmjs.com.
|
|
3
|
+
# Installs js-recon from the published npm registry artifact rather than
|
|
4
|
+
# building from git source, so the Homebrew/Docker/GHCR outputs are provably
|
|
5
|
+
# the same bits that were reviewed and approved on npm.
|
|
6
|
+
|
|
7
|
+
name: Promote JS Recon Release
|
|
8
|
+
|
|
9
|
+
on:
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
inputs:
|
|
12
|
+
version:
|
|
13
|
+
description: "Published npm version to promote (e.g. 1.4.1-alpha.6, no leading v)"
|
|
14
|
+
required: true
|
|
15
|
+
type: string
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
update-homebrew-tap:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- name: Fetch published tarball and compute SHA256
|
|
22
|
+
id: sha256
|
|
23
|
+
run: |
|
|
24
|
+
npm pack "@shriyanss/js-recon@${VERSION}"
|
|
25
|
+
SHA=$(sha256sum "shriyanss-js-recon-${VERSION}.tgz" | awk '{print $1}')
|
|
26
|
+
echo "sha256=${SHA}" >> "$GITHUB_OUTPUT"
|
|
27
|
+
env:
|
|
28
|
+
VERSION: ${{ inputs.version }}
|
|
29
|
+
|
|
30
|
+
- name: Check out homebrew-tap
|
|
31
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
32
|
+
with:
|
|
33
|
+
repository: shriyanss/homebrew-tap
|
|
34
|
+
path: homebrew-tap
|
|
35
|
+
|
|
36
|
+
- name: Update formula fields
|
|
37
|
+
working-directory: homebrew-tap
|
|
38
|
+
run: |
|
|
39
|
+
F="Formula/js-recon.rb"
|
|
40
|
+
sed -i "s|^ url \"https://registry\.npmjs\.org/@shriyanss/js-recon/-/js-recon-[^\"]*\"| url \"https://registry.npmjs.org/@shriyanss/js-recon/-/js-recon-${VERSION}.tgz\"|" "${F}"
|
|
41
|
+
sed -i "s|^ sha256 \"[a-f0-9]*\"| sha256 \"${SHA}\"|" "${F}"
|
|
42
|
+
env:
|
|
43
|
+
VERSION: ${{ inputs.version }}
|
|
44
|
+
SHA: ${{ steps.sha256.outputs.sha256 }}
|
|
45
|
+
|
|
46
|
+
- name: Commit and push
|
|
47
|
+
working-directory: homebrew-tap
|
|
48
|
+
run: |
|
|
49
|
+
git config user.name "github-actions[bot]"
|
|
50
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
51
|
+
git add Formula/js-recon.rb
|
|
52
|
+
git commit -m "chore: update js-recon formula to ${VERSION}"
|
|
53
|
+
git push
|
|
54
|
+
env:
|
|
55
|
+
VERSION: ${{ inputs.version }}
|
|
56
|
+
|
|
57
|
+
publish-docker:
|
|
58
|
+
runs-on: ubuntu-latest
|
|
59
|
+
environment: docker-publish
|
|
60
|
+
steps:
|
|
61
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
62
|
+
- name: Build and push to dockerhub
|
|
63
|
+
run: |
|
|
64
|
+
# login to docker
|
|
65
|
+
echo $DOCKER_SECRET | docker login -u shriyanss --password-stdin
|
|
66
|
+
|
|
67
|
+
# build the image from the published npm artifact
|
|
68
|
+
docker build -f Dockerfile.release --build-arg JS_RECON_VERSION=$VERSION -t shriyanss/js-recon:$VERSION .
|
|
69
|
+
|
|
70
|
+
# check if it is alpha or beta. default to latest
|
|
71
|
+
TAG="latest"
|
|
72
|
+
[[ "$VERSION" == *"beta"* ]] && TAG="beta"
|
|
73
|
+
[[ "$VERSION" == *"alpha"* ]] && TAG="alpha"
|
|
74
|
+
|
|
75
|
+
# tag again with whatever has been set
|
|
76
|
+
docker tag shriyanss/js-recon:$VERSION shriyanss/js-recon:$TAG
|
|
77
|
+
|
|
78
|
+
# push images with both tags
|
|
79
|
+
docker push shriyanss/js-recon:$VERSION
|
|
80
|
+
docker push shriyanss/js-recon:$TAG
|
|
81
|
+
|
|
82
|
+
env:
|
|
83
|
+
DOCKER_SECRET: ${{ secrets.DOCKER_SECRET }}
|
|
84
|
+
VERSION: ${{ inputs.version }}
|
|
85
|
+
|
|
86
|
+
publish-ghcr:
|
|
87
|
+
runs-on: ubuntu-latest
|
|
88
|
+
permissions:
|
|
89
|
+
contents: read
|
|
90
|
+
packages: write
|
|
91
|
+
steps:
|
|
92
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
93
|
+
- uses: docker/login-action@v3
|
|
94
|
+
with:
|
|
95
|
+
registry: ghcr.io
|
|
96
|
+
username: ${{ github.actor }}
|
|
97
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
98
|
+
- name: Build and push to github container registry
|
|
99
|
+
run: |
|
|
100
|
+
# build the image from the published npm artifact
|
|
101
|
+
docker build -f Dockerfile.release --build-arg JS_RECON_VERSION=$VERSION -t ghcr.io/shriyanss/js-recon:$VERSION .
|
|
102
|
+
|
|
103
|
+
# check if it is alpha or beta. default to latest
|
|
104
|
+
TAG="latest"
|
|
105
|
+
[[ "$VERSION" == *"beta"* ]] && TAG="beta"
|
|
106
|
+
[[ "$VERSION" == *"alpha"* ]] && TAG="alpha"
|
|
107
|
+
|
|
108
|
+
# tag again with whatever has been set
|
|
109
|
+
docker tag ghcr.io/shriyanss/js-recon:$VERSION ghcr.io/shriyanss/js-recon:$TAG
|
|
110
|
+
|
|
111
|
+
# push images with both tags
|
|
112
|
+
docker push ghcr.io/shriyanss/js-recon:$VERSION
|
|
113
|
+
docker push ghcr.io/shriyanss/js-recon:$TAG
|
|
114
|
+
|
|
115
|
+
env:
|
|
116
|
+
VERSION: ${{ inputs.version }}
|
|
@@ -63,6 +63,9 @@ jobs:
|
|
|
63
63
|
publish-npm:
|
|
64
64
|
needs: build
|
|
65
65
|
runs-on: ubuntu-latest
|
|
66
|
+
permissions:
|
|
67
|
+
id-token: write
|
|
68
|
+
contents: read
|
|
66
69
|
steps:
|
|
67
70
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
68
71
|
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
@@ -71,139 +74,34 @@ jobs:
|
|
|
71
74
|
registry-url: https://registry.npmjs.org/
|
|
72
75
|
- run: npm ci
|
|
73
76
|
- run: npm run build
|
|
74
|
-
- name:
|
|
77
|
+
- name: Ensure npm CLI supports OIDC trusted publishing
|
|
78
|
+
run: npm install -g npm@latest
|
|
79
|
+
- name: Stage release to npm via OIDC
|
|
75
80
|
run: |
|
|
76
81
|
TAG="latest"
|
|
77
82
|
[[ "$VERSION" == *"beta"* ]] && TAG="beta"
|
|
78
83
|
[[ "$VERSION" == *"alpha"* ]] && TAG="alpha"
|
|
79
|
-
npm publish --tag $TAG
|
|
84
|
+
npm stage publish --tag $TAG
|
|
80
85
|
env:
|
|
81
|
-
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
|
|
82
86
|
VERSION: ${{ github.event.release.tag_name }}
|
|
83
87
|
|
|
84
|
-
|
|
85
|
-
update-homebrew-tap:
|
|
86
|
-
needs: publish-npm
|
|
87
|
-
runs-on: ubuntu-latest
|
|
88
|
-
steps:
|
|
89
|
-
- name: Get release version
|
|
90
|
-
id: version
|
|
91
|
-
run: |
|
|
92
|
-
RAW="${{ github.event.release.tag_name }}"
|
|
93
|
-
echo "version=${RAW#v}" >> "$GITHUB_OUTPUT"
|
|
94
|
-
|
|
95
|
-
- name: Compute npm tarball SHA256
|
|
96
|
-
id: sha256
|
|
97
|
-
run: |
|
|
98
|
-
VERSION="${{ steps.version.outputs.version }}"
|
|
99
|
-
URL="https://registry.npmjs.org/@shriyanss/js-recon/-/js-recon-${VERSION}.tgz"
|
|
100
|
-
SHA=$(curl -fsSL "${URL}" | sha256sum | awk '{print $1}')
|
|
101
|
-
echo "sha256=${SHA}" >> "$GITHUB_OUTPUT"
|
|
102
|
-
|
|
103
|
-
- name: Check out homebrew-tap
|
|
104
|
-
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
105
|
-
with:
|
|
106
|
-
repository: shriyanss/homebrew-tap
|
|
107
|
-
token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
|
|
108
|
-
path: homebrew-tap
|
|
109
|
-
|
|
110
|
-
- name: Update formula fields
|
|
111
|
-
working-directory: homebrew-tap
|
|
112
|
-
run: |
|
|
113
|
-
VERSION="${{ steps.version.outputs.version }}"
|
|
114
|
-
SHA="${{ steps.sha256.outputs.sha256 }}"
|
|
115
|
-
F="Formula/js-recon.rb"
|
|
116
|
-
sed -i "s|^ url \"https://registry\.npmjs\.org/@shriyanss/js-recon/-/js-recon-[^\"]*\"| url \"https://registry.npmjs.org/@shriyanss/js-recon/-/js-recon-${VERSION}.tgz\"|" "${F}"
|
|
117
|
-
sed -i "s|^ sha256 \"[a-f0-9]*\"| sha256 \"${SHA}\"|" "${F}"
|
|
118
|
-
|
|
119
|
-
- name: Commit and push
|
|
120
|
-
working-directory: homebrew-tap
|
|
121
|
-
run: |
|
|
122
|
-
git config user.name "github-actions[bot]"
|
|
123
|
-
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
124
|
-
git add Formula/js-recon.rb
|
|
125
|
-
git commit -m "chore: update js-recon formula to ${{ steps.version.outputs.version }}"
|
|
126
|
-
git push
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
publish-docker:
|
|
130
|
-
needs: build
|
|
131
|
-
runs-on: ubuntu-latest
|
|
132
|
-
steps:
|
|
133
|
-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
134
|
-
- name: Build and push to dockerhub
|
|
135
|
-
run: |
|
|
136
|
-
# login to docker
|
|
137
|
-
echo $DOCKER_SECRET | docker login -u shriyanss --password-stdin
|
|
138
|
-
|
|
139
|
-
# build the image
|
|
140
|
-
docker build -t shriyanss/js-recon:$VERSION .
|
|
141
|
-
|
|
142
|
-
# check if it is alpha or beta. default to latest
|
|
143
|
-
TAG="latest"
|
|
144
|
-
[[ "$VERSION" == *"beta"* ]] && TAG="beta"
|
|
145
|
-
[[ "$VERSION" == *"alpha"* ]] && TAG="alpha"
|
|
146
|
-
|
|
147
|
-
# tag again with whatever has been set
|
|
148
|
-
docker tag shriyanss/js-recon:$VERSION shriyanss/js-recon:$TAG
|
|
149
|
-
|
|
150
|
-
# push images with both tags
|
|
151
|
-
docker push shriyanss/js-recon:$VERSION
|
|
152
|
-
docker push shriyanss/js-recon:$TAG
|
|
153
|
-
|
|
154
|
-
env:
|
|
155
|
-
DOCKER_SECRET: ${{ secrets.DOCKER_SECRET }}
|
|
156
|
-
VERSION: ${{ github.event.release.tag_name }}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
publish-ghcr:
|
|
160
|
-
needs: build
|
|
161
|
-
runs-on: ubuntu-latest
|
|
162
|
-
permissions:
|
|
163
|
-
contents: read
|
|
164
|
-
packages: write
|
|
165
|
-
steps:
|
|
166
|
-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
167
|
-
- uses: docker/login-action@v3
|
|
168
|
-
with:
|
|
169
|
-
registry: ghcr.io
|
|
170
|
-
username: ${{ github.actor }}
|
|
171
|
-
password: ${{ secrets.GITHUB_TOKEN }}
|
|
172
|
-
- name: Build and push to github container registry
|
|
173
|
-
run: |
|
|
174
|
-
# build the image
|
|
175
|
-
docker build -t ghcr.io/shriyanss/js-recon:$VERSION .
|
|
176
|
-
|
|
177
|
-
# check if it is alpha or beta. default to latest
|
|
178
|
-
TAG="latest"
|
|
179
|
-
[[ "$VERSION" == *"beta"* ]] && TAG="beta"
|
|
180
|
-
[[ "$VERSION" == *"alpha"* ]] && TAG="alpha"
|
|
181
|
-
|
|
182
|
-
# tag again with whatever has been set
|
|
183
|
-
docker tag ghcr.io/shriyanss/js-recon:$VERSION ghcr.io/shriyanss/js-recon:$TAG
|
|
184
|
-
|
|
185
|
-
# push images with both tags
|
|
186
|
-
docker push ghcr.io/shriyanss/js-recon:$VERSION
|
|
187
|
-
docker push ghcr.io/shriyanss/js-recon:$TAG
|
|
188
|
-
|
|
189
|
-
env:
|
|
190
|
-
VERSION: ${{ github.event.release.tag_name }}
|
|
191
|
-
|
|
192
88
|
merge_main_and_dev:
|
|
193
89
|
needs:
|
|
194
90
|
- publish-npm
|
|
195
|
-
- publish-docker
|
|
196
|
-
- publish-ghcr
|
|
197
91
|
runs-on: ubuntu-latest
|
|
92
|
+
environment: commit-signing
|
|
198
93
|
steps:
|
|
199
94
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
200
95
|
with:
|
|
201
|
-
ssh-key: ${{ secrets.DEPLOY_KEY }}
|
|
202
96
|
fetch-depth: 0
|
|
97
|
+
- name: Configure SSH commit signing
|
|
98
|
+
uses: shriyanss/verified-commit-action@v1
|
|
99
|
+
with:
|
|
100
|
+
ssh-private-key: ${{ secrets.JS_RECON_SIGNING_KEY }}
|
|
101
|
+
commit-name: "js-recon-bot"
|
|
102
|
+
commit-email: ${{ secrets.JS_RECON_SIGNING_EMAIL }}
|
|
203
103
|
- name: Merge main and dev
|
|
204
104
|
run: |
|
|
205
|
-
git config --global user.name 'github-actions[bot]'
|
|
206
|
-
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
|
|
207
105
|
git fetch origin main:main
|
|
208
106
|
git fetch origin dev:dev
|
|
209
107
|
git checkout dev
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## 1.4.1-alpha.7 - (unreleased)
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- CI: bot commits (`chore: prettify code`, `chore: merge changes after release vX.Y.Z`) are now cryptographically signed via SSH (using [`shriyanss/verified-commit-action`](https://github.com/shriyanss/verified-commit-action)) and show as "Verified" on GitHub, under a dedicated `js-recon-bot` identity. The signing key is scoped to a `commit-signing` GitHub Environment so it's only readable by the jobs that need it, not the whole repo. `promote-js-recon.yml`'s Docker/GHCR publish job now reads `DOCKER_SECRET` from a similarly scoped `docker-publish` environment, and the Homebrew tap job no longer references a token secret. (`ci`)
|
|
8
|
+
|
|
9
|
+
## 1.4.1-alpha.6 - 2026-07-13
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- CI: npm publishing now uses OIDC trusted publishing with staged releases (`npm stage publish`) instead of a classic auth token, since NPM is restricting tokens that bypass MFA. Promoting a staged release to live still requires a manual, 2FA-gated `npm stage approve` — this cannot be automated. The Homebrew tap update and Docker/GHCR image publishing have moved out of `publish-js-recon.yml` into a new manually-triggered workflow, `promote-js-recon.yml`, run after the staged release is approved. That workflow installs js-recon from the published npm registry artifact (`npm pack`/`npm install <pkg>@<version>`) rather than building from git source, as an additional supply-chain safeguard — what ships in the Docker/GHCR images and what Homebrew hashes is provably the same bits that were reviewed and approved on npm. (`ci`)
|
|
14
|
+
|
|
3
15
|
## 1.4.1-alpha.5 - 2026-07-13
|
|
4
16
|
|
|
5
17
|
### Fixed
|
package/CLAUDE.md
CHANGED
|
@@ -350,6 +350,16 @@ Releasing a new version touches three repos. Work on `dev` (js-recon, js-recon-r
|
|
|
350
350
|
|
|
351
351
|
**Ordering is critical**: release js-recon first (including the GitHub release so CI publishes it to npm), then snapshot and PR js-recon-docs. This ensures the docs `version_check` CI step passes instead of failing due to a missing npm package.
|
|
352
352
|
|
|
353
|
+
### Overview: automated stage → human approve → human-triggered promote
|
|
354
|
+
|
|
355
|
+
npm's OIDC trusted publishing for this package is scoped to **`npm stage publish`**, not direct `npm publish`. That means every js-recon release has three distinct phases, only the first of which Claude can execute unattended:
|
|
356
|
+
|
|
357
|
+
1. **Automated (Claude does this end-to-end):** bump version, update CHANGELOG, open and merge the `dev`→`main` PR (after CI is green and the user gives merge approval — never merge without it), create the GitHub release. That release triggers `publish-js-recon.yml`, which runs `version_check` → `audit` → `build` → `publish-npm` (stages to npm via OIDC, no token) → `merge_main_and_dev` — all fully automatic, no human input needed.
|
|
358
|
+
2. **Human-only (cannot be scripted or delegated):** npm requires interactive 2FA to promote a staged package to actually live on the registry. Claude reports the stage id and waits; the user runs `npm stage approve <stage-id>` (or clicks "Approve" on npmjs.com) themselves, on their own machine or browser.
|
|
359
|
+
3. **Human-triggered, then Claude drives it:** once the user confirms the package is live (e.g. "I've published on npm" / "go ahead"), Claude runs `gh workflow run promote-js-recon.yml -f version=<version>` and watches it to completion. This workflow (Homebrew tap, Docker, GHCR) installs from the published npm artifact rather than git source, so it can only run correctly after step 2 — that's why it's a separate manually-triggered workflow instead of chained onto `publish-js-recon.yml`.
|
|
360
|
+
|
|
361
|
+
The detailed step-by-step is below; the numbering restarts at 10 for the docs phase since it's a separate concern from the npm/GitHub release phase.
|
|
362
|
+
|
|
353
363
|
### When a user asks to prepare a release
|
|
354
364
|
|
|
355
365
|
Before writing any files, gather the current state:
|
|
@@ -401,26 +411,44 @@ Before writing any files, gather the current state:
|
|
|
401
411
|
|
|
402
412
|
Previous tag is left to GitHub's automatic detection (do not set `--target` or `--tag` beyond the tag name itself).
|
|
403
413
|
|
|
404
|
-
9. **Wait for npm publish** — monitor the release pipeline: `gh run list --repo shriyanss/js-recon --workflow
|
|
414
|
+
9. **Wait for npm stage publish** — monitor the release pipeline: `gh run list --repo shriyanss/js-recon --workflow "Publish JS Recon"`. `publish-npm` uses OIDC trusted publishing (`npm stage publish`, no token) to _stage_ the release — this is NOT the same as it being live.
|
|
405
415
|
|
|
406
|
-
|
|
416
|
+
10. **Approve the staged release** — npm's staged-publish approval always requires interactive 2FA, so this step can never be automated or scripted:
|
|
407
417
|
|
|
408
|
-
|
|
418
|
+
- Find the stage id: `npm stage list @shriyanss/js-recon` (or the "Staged Packages" tab on npmjs.com)
|
|
419
|
+
- Approve it: `npm stage approve <stage-id>` (prompts for 2FA), or click "Approve" on npmjs.com
|
|
420
|
+
- Confirm it's live: `npm view @shriyanss/js-recon@<version>`
|
|
409
421
|
|
|
410
|
-
|
|
422
|
+
11. **Manually trigger the promote workflow** — once the release is live, run `promote-js-recon.yml` to update Homebrew and publish the Docker/GHCR images:
|
|
423
|
+
|
|
424
|
+
```bash
|
|
425
|
+
gh workflow run promote-js-recon.yml --repo shriyanss/js-recon -f version=<version>
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
This workflow installs js-recon from the published npm registry artifact (`npm pack`/`npm install <pkg>@<version>`) rather than building from git source — an additional supply-chain check that the shipped images/formula match exactly what was approved on npm. Monitor: `gh run list --repo shriyanss/js-recon --workflow "Promote JS Recon Release"`.
|
|
429
|
+
|
|
430
|
+
### Homebrew tap (manual, part of `promote-js-recon.yml`)
|
|
431
|
+
|
|
432
|
+
The `update-homebrew-tap` job (now in `promote-js-recon.yml`, triggered per step 11 above):
|
|
433
|
+
|
|
434
|
+
1. `npm pack @shriyanss/js-recon@<version>` — downloads the exact published tarball from the registry and computes its SHA256 locally (no dependency on a public tarball URL being reachable yet)
|
|
411
435
|
2. Checks out `shriyanss/homebrew-tap` using `HOMEBREW_TAP_TOKEN` (a fine-grained PAT stored in `shriyanss/js-recon` secrets, scoped to `homebrew-tap` repo `Contents: Read and write` only — automatically masked in all log output, never echoed)
|
|
412
|
-
3. Updates `
|
|
436
|
+
3. Updates `url` and `sha256` in `Formula/js-recon.rb` via anchored `sed` — the formula has no explicit `version` field; Homebrew derives it from the `url`
|
|
413
437
|
4. Commits `chore: update js-recon formula to <version>` and pushes
|
|
414
438
|
|
|
415
439
|
Monitor: `gh run list --repo shriyanss/homebrew-tap --workflow ci.yml`
|
|
416
440
|
|
|
417
|
-
**If the job fails:**
|
|
441
|
+
**If the job fails:** manually update: `npm pack @shriyanss/js-recon@<version> && sha256sum shriyanss-js-recon-<version>.tgz`, edit `Formula/js-recon.rb`, commit, and push to `shriyanss/homebrew-tap`.
|
|
418
442
|
|
|
419
443
|
**One-time setup** (must be done before the first release, already completed):
|
|
420
444
|
|
|
421
445
|
- `shriyanss/homebrew-tap` is a public GitHub repo with the formula at `Formula/js-recon.rb`
|
|
422
446
|
- `HOMEBREW_TAP_TOKEN` is a fine-grained PAT stored in `shriyanss/js-recon` → Settings → Secrets → Actions, scoped exclusively to the `homebrew-tap` repo
|
|
423
447
|
|
|
448
|
+
### Docker / GHCR images (manual, part of `promote-js-recon.yml`)
|
|
449
|
+
|
|
450
|
+
`publish-docker` and `publish-ghcr` (now in `promote-js-recon.yml`) build from `Dockerfile.release` instead of the default `Dockerfile`. `Dockerfile.release` runs `npm install -g @shriyanss/js-recon@<version>` against the live registry rather than copying local source and building — the published images are provably built from the approved npm artifact. The default `Dockerfile` (source build) is unchanged and still used for local/dev builds.
|
|
451
|
+
|
|
424
452
|
### Phase 2 — js-recon-docs (after npm is live)
|
|
425
453
|
|
|
426
454
|
10. **Fix doc gaps** — cross-check `docs/docs/modules/*.md` against `src/index.ts` and the new CHANGELOG entries. Add or update any missing flags, options, or command descriptions.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
FROM ghcr.io/puppeteer/puppeteer:25.3.0
|
|
2
|
+
|
|
3
|
+
WORKDIR /home/pptruser
|
|
4
|
+
|
|
5
|
+
USER root
|
|
6
|
+
ENV PUPPETEER_SKIP_DOWNLOAD=true
|
|
7
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
8
|
+
unzip \
|
|
9
|
+
libnspr4 libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 \
|
|
10
|
+
libxcomposite1 libxdamage1 libxrandr2 libgbm1 libxkbcommon0 \
|
|
11
|
+
libasound2 libpangocairo-1.0-0 libxfixes3 libxi6 libxinerama1 \
|
|
12
|
+
libxcursor1 libdrm2 && \
|
|
13
|
+
rm -rf /var/lib/apt/lists/*
|
|
14
|
+
|
|
15
|
+
ARG JS_RECON_VERSION
|
|
16
|
+
RUN npm install -g @shriyanss/js-recon@${JS_RECON_VERSION}
|
|
17
|
+
|
|
18
|
+
USER pptruser
|
|
19
|
+
RUN "$(npm root -g)/@shriyanss/js-recon/node_modules/.bin/puppeteer" browsers install chrome && \
|
|
20
|
+
for zip in /home/pptruser/.cache/puppeteer/chrome/*-chrome-linux64.zip; do \
|
|
21
|
+
[ -f "$zip" ] || break; \
|
|
22
|
+
version="${zip%-chrome-linux64.zip}"; version="${version##*/}"; \
|
|
23
|
+
dest="/home/pptruser/.cache/puppeteer/chrome/linux-${version}"; \
|
|
24
|
+
unzip -o "$zip" -d "${dest}/" && chmod +x "${dest}/chrome-linux64/chrome"; \
|
|
25
|
+
done
|
|
26
|
+
|
|
27
|
+
ENV IS_DOCKER=true
|
|
28
|
+
ENV NODE_OPTIONS="--max-http-header-size=99999999"
|
|
29
|
+
ENTRYPOINT ["js-recon"]
|
package/build/globalConfig.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const githubURL = "https://github.com/shriyanss/js-recon";
|
|
2
2
|
const modulesDocs = "https://js-recon.io/docs/category/modules";
|
|
3
|
-
const version = "1.4.1-alpha.
|
|
3
|
+
const version = "1.4.1-alpha.7";
|
|
4
4
|
const toolDesc = "JavaScript Enumeration and SAST";
|
|
5
5
|
const axiosNonHttpMethods = ["isAxiosError"]; // methods available in axios, which are not for making HTTP requests
|
|
6
6
|
let CONFIG = {
|