job-forge 2.14.29 → 2.14.30
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/.cursor/rules/main.mdc +4 -1
- package/AGENTS.md +4 -1
- package/CLAUDE.md +4 -1
- package/README.md +6 -4
- package/bin/job-forge.mjs +30 -0
- package/docs/ARCHITECTURE.md +1 -0
- package/docs/CUSTOMIZATION.md +4 -0
- package/docs/README.md +1 -1
- package/docs/SETUP.md +2 -0
- package/iso/instructions.md +4 -1
- package/lib/jobforge-redact.mjs +25 -0
- package/package.json +6 -1
- package/scripts/redact.mjs +180 -0
- package/templates/migrations.json +5 -0
- package/templates/redact.json +77 -0
package/.cursor/rules/main.mdc
CHANGED
|
@@ -89,11 +89,14 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
|
|
|
89
89
|
- [D17] Treat `templates/postflight.json` as the source of truth for multi-apply dispatch settlement. Save the JSON preflight plan and per-round observed dispatch/outcome/artifact records, then run `npx job-forge postflight:status --plan <plan.json> --outcomes <outcomes.json>` after each round and `npx job-forge postflight:check ...` after merge/verify. Follow its next action instead of inferring completion from subagent prose.
|
|
90
90
|
why: `iso-postflight` is not an MCP and adds no prompt/tool-schema tokens; it makes "round complete", missing TSVs, failed candidates, replacements, merge, and verify an executable local gate instead of repeated orchestration prose
|
|
91
91
|
|
|
92
|
+
- [D18] Treat `templates/redact.json` as the source of truth before exporting local traces, prompts, reports, or fixtures outside the project. Use `npx job-forge redact:scan --input <file>`, `redact:apply --input <file> --output .jobforge-redacted/<file>`, or `redact:verify --input <file>` instead of hand-redacting with prose. This complements H8; it does not make it acceptable to paste secrets into prompts.
|
|
93
|
+
why: `iso-redact` is not an MCP and adds no prompt/tool-schema tokens; it gives deterministic safe-export checks whose findings do not print matched secret values
|
|
94
|
+
|
|
92
95
|
## Procedure
|
|
93
96
|
|
|
94
97
|
1. Check `cv.md`, `profile.yml`, and `portals.yml`; onboard if any file is missing.
|
|
95
98
|
2. Pick and name the mode from **Routing** [D6]. No match → ask; do not guess.
|
|
96
|
-
3. Read the active mode file [D3]. Use context bundle checks when changing context loads [D11]. Check cached artifacts before URL/JD refetches [D12]. Use artifact index lookups before broad file reads when they can answer the question [D13]. Use canonical identity keys for duplicate checks [D15]. Use migration checks for harness drift [D14]. Decide inline vs delegated work [D1].
|
|
99
|
+
3. Read the active mode file [D3]. Use context bundle checks when changing context loads [D11]. Check cached artifacts before URL/JD refetches [D12]. Use artifact index lookups before broad file reads when they can answer the question [D13]. Use canonical identity keys for duplicate checks [D15]. Use migration checks for harness drift [D14]. Use redaction checks before exporting local artifacts [D18]. Decide inline vs delegated work [D1].
|
|
97
100
|
4. Prepare Geometra dispatches: cleanup [H3], canon/index/ledger prefilter when useful [D8, D13, D15], dedupe [H2], location filter [D5], materialize candidate facts/gates and run preflight plan/check [D16], routing [D2, D10], proxy prompt hygiene [H8].
|
|
98
101
|
5. Dispatch at most 2 tasks per round [H1]; wait for final outcomes, not just task ids [H5b], then settle the round with postflight status [D17].
|
|
99
102
|
6. Keep multi-job form-filling out of the orchestrator [H4].
|
package/AGENTS.md
CHANGED
|
@@ -84,11 +84,14 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
|
|
|
84
84
|
- [D17] Treat `templates/postflight.json` as the source of truth for multi-apply dispatch settlement. Save the JSON preflight plan and per-round observed dispatch/outcome/artifact records, then run `npx job-forge postflight:status --plan <plan.json> --outcomes <outcomes.json>` after each round and `npx job-forge postflight:check ...` after merge/verify. Follow its next action instead of inferring completion from subagent prose.
|
|
85
85
|
why: `iso-postflight` is not an MCP and adds no prompt/tool-schema tokens; it makes "round complete", missing TSVs, failed candidates, replacements, merge, and verify an executable local gate instead of repeated orchestration prose
|
|
86
86
|
|
|
87
|
+
- [D18] Treat `templates/redact.json` as the source of truth before exporting local traces, prompts, reports, or fixtures outside the project. Use `npx job-forge redact:scan --input <file>`, `redact:apply --input <file> --output .jobforge-redacted/<file>`, or `redact:verify --input <file>` instead of hand-redacting with prose. This complements H8; it does not make it acceptable to paste secrets into prompts.
|
|
88
|
+
why: `iso-redact` is not an MCP and adds no prompt/tool-schema tokens; it gives deterministic safe-export checks whose findings do not print matched secret values
|
|
89
|
+
|
|
87
90
|
## Procedure
|
|
88
91
|
|
|
89
92
|
1. Check `cv.md`, `profile.yml`, and `portals.yml`; onboard if any file is missing.
|
|
90
93
|
2. Pick and name the mode from **Routing** [D6]. No match → ask; do not guess.
|
|
91
|
-
3. Read the active mode file [D3]. Use context bundle checks when changing context loads [D11]. Check cached artifacts before URL/JD refetches [D12]. Use artifact index lookups before broad file reads when they can answer the question [D13]. Use canonical identity keys for duplicate checks [D15]. Use migration checks for harness drift [D14]. Decide inline vs delegated work [D1].
|
|
94
|
+
3. Read the active mode file [D3]. Use context bundle checks when changing context loads [D11]. Check cached artifacts before URL/JD refetches [D12]. Use artifact index lookups before broad file reads when they can answer the question [D13]. Use canonical identity keys for duplicate checks [D15]. Use migration checks for harness drift [D14]. Use redaction checks before exporting local artifacts [D18]. Decide inline vs delegated work [D1].
|
|
92
95
|
4. Prepare Geometra dispatches: cleanup [H3], canon/index/ledger prefilter when useful [D8, D13, D15], dedupe [H2], location filter [D5], materialize candidate facts/gates and run preflight plan/check [D16], routing [D2, D10], proxy prompt hygiene [H8].
|
|
93
96
|
5. Dispatch at most 2 tasks per round [H1]; wait for final outcomes, not just task ids [H5b], then settle the round with postflight status [D17].
|
|
94
97
|
6. Keep multi-job form-filling out of the orchestrator [H4].
|
package/CLAUDE.md
CHANGED
|
@@ -84,11 +84,14 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
|
|
|
84
84
|
- [D17] Treat `templates/postflight.json` as the source of truth for multi-apply dispatch settlement. Save the JSON preflight plan and per-round observed dispatch/outcome/artifact records, then run `npx job-forge postflight:status --plan <plan.json> --outcomes <outcomes.json>` after each round and `npx job-forge postflight:check ...` after merge/verify. Follow its next action instead of inferring completion from subagent prose.
|
|
85
85
|
why: `iso-postflight` is not an MCP and adds no prompt/tool-schema tokens; it makes "round complete", missing TSVs, failed candidates, replacements, merge, and verify an executable local gate instead of repeated orchestration prose
|
|
86
86
|
|
|
87
|
+
- [D18] Treat `templates/redact.json` as the source of truth before exporting local traces, prompts, reports, or fixtures outside the project. Use `npx job-forge redact:scan --input <file>`, `redact:apply --input <file> --output .jobforge-redacted/<file>`, or `redact:verify --input <file>` instead of hand-redacting with prose. This complements H8; it does not make it acceptable to paste secrets into prompts.
|
|
88
|
+
why: `iso-redact` is not an MCP and adds no prompt/tool-schema tokens; it gives deterministic safe-export checks whose findings do not print matched secret values
|
|
89
|
+
|
|
87
90
|
## Procedure
|
|
88
91
|
|
|
89
92
|
1. Check `cv.md`, `profile.yml`, and `portals.yml`; onboard if any file is missing.
|
|
90
93
|
2. Pick and name the mode from **Routing** [D6]. No match → ask; do not guess.
|
|
91
|
-
3. Read the active mode file [D3]. Use context bundle checks when changing context loads [D11]. Check cached artifacts before URL/JD refetches [D12]. Use artifact index lookups before broad file reads when they can answer the question [D13]. Use canonical identity keys for duplicate checks [D15]. Use migration checks for harness drift [D14]. Decide inline vs delegated work [D1].
|
|
94
|
+
3. Read the active mode file [D3]. Use context bundle checks when changing context loads [D11]. Check cached artifacts before URL/JD refetches [D12]. Use artifact index lookups before broad file reads when they can answer the question [D13]. Use canonical identity keys for duplicate checks [D15]. Use migration checks for harness drift [D14]. Use redaction checks before exporting local artifacts [D18]. Decide inline vs delegated work [D1].
|
|
92
95
|
4. Prepare Geometra dispatches: cleanup [H3], canon/index/ledger prefilter when useful [D8, D13, D15], dedupe [H2], location filter [D5], materialize candidate facts/gates and run preflight plan/check [D16], routing [D2, D10], proxy prompt hygiene [H8].
|
|
93
96
|
5. Dispatch at most 2 tasks per round [H1]; wait for final outcomes, not just task ids [H5b], then settle the round with postflight status [D17].
|
|
94
97
|
6. Keep multi-job form-filling out of the orchestrator [H4].
|
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ The scaffolded `opencode.json` already has three MCPs wired up — they launch a
|
|
|
31
31
|
- **Gmail** — reads replies from recruiters
|
|
32
32
|
- **state-trace** — typed working memory for cross-session context (resumed batches, recent decisions, repeated portal quirks). Install once with `python3 -m pip install "state-trace[mcp]"`; the MCP command is `state-trace-mcp`.
|
|
33
33
|
|
|
34
|
-
JobForge also keeps MCP-free local workflow state: `templates/canon.json` defines URL/company/role identity keys via `@razroo/iso-canon`, `templates/contracts.json` defines tracker/apply artifact shapes via `@razroo/iso-contract`, `templates/capabilities.json` defines role capability boundaries via `@razroo/iso-capabilities`, `templates/context.json` defines deterministic mode/reference bundles via `@razroo/iso-context`, `templates/preflight.json` defines safe dispatch rounds/gates via `@razroo/iso-preflight`, `templates/postflight.json` defines safe dispatch settlement via `@razroo/iso-postflight`, `templates/migrations.json` defines safe consumer-project upgrades via `@razroo/iso-migrate`, `.jobforge-ledger/events.jsonl` records duplicate/status events via `@razroo/iso-ledger`, `.jobforge-cache/` stores reusable JD/artifact content via `@razroo/iso-cache`, and `.jobforge-index.json` indexes artifact source pointers via `@razroo/iso-index`. None of these add always-on prompt or tool-schema tokens.
|
|
34
|
+
JobForge also keeps MCP-free local workflow state: `templates/canon.json` defines URL/company/role identity keys via `@razroo/iso-canon`, `templates/contracts.json` defines tracker/apply artifact shapes via `@razroo/iso-contract`, `templates/capabilities.json` defines role capability boundaries via `@razroo/iso-capabilities`, `templates/context.json` defines deterministic mode/reference bundles via `@razroo/iso-context`, `templates/preflight.json` defines safe dispatch rounds/gates via `@razroo/iso-preflight`, `templates/postflight.json` defines safe dispatch settlement via `@razroo/iso-postflight`, `templates/redact.json` defines safe-export redaction rules via `@razroo/iso-redact`, `templates/migrations.json` defines safe consumer-project upgrades via `@razroo/iso-migrate`, `.jobforge-ledger/events.jsonl` records duplicate/status events via `@razroo/iso-ledger`, `.jobforge-cache/` stores reusable JD/artifact content via `@razroo/iso-cache`, and `.jobforge-index.json` indexes artifact source pointers via `@razroo/iso-index`. None of these add always-on prompt or tool-schema tokens.
|
|
35
35
|
|
|
36
36
|
`npm install` also materializes symlinks for every supported agent harness — OpenCode, Cursor, Claude Code, and Codex — so you can run `opencode`, `cursor`, `claude`, or `codex` in the same project and each picks up the shared MCP config and instructions.
|
|
37
37
|
|
|
@@ -78,7 +78,7 @@ JobForge turns opencode into a full job search command center. Instead of manual
|
|
|
78
78
|
| **Durable Batch Orchestration** | `batch-runner.sh` uses `@razroo/iso-orchestrator` for resumable bundle execution, bounded fan-out, mutexed state writes, and workflow records in `.jobforge-runs/`. |
|
|
79
79
|
| **Pipeline Integrity** | Automated merge, dedup, status normalization, health checks |
|
|
80
80
|
| **Cost-Aware Agent Routing** | Three subagents (`@general-free`, `@general-paid`, `@glm-minimal`) with per-task tool surfaces. On OpenCode, JobForge pins all tiers to `opencode-go/deepseek-v4-flash` so application runs avoid overloaded free-model pools. See [Subagent Routing in AGENTS.md](AGENTS.md) for the task-to-agent mapping. |
|
|
81
|
-
| **Trace + Telemetry + Guard + Contract + Canon + Ledger + Capabilities + Context + Cache + Index + Preflight + Postflight + Migrate** | `job-forge trace:*` exposes local OpenCode transcripts, `job-forge telemetry:*` summarizes runs, `job-forge guard:*` audits deterministic policy rules, `templates/contracts.json` enforces artifact shape with `iso-contract`, `job-forge canon:*` derives stable URL/company/role identity keys, `job-forge ledger:*` queries append-only workflow state, `job-forge capabilities:*` checks role boundaries, `job-forge context:*` plans mode/reference context bundles, `job-forge cache:*` reuses fetched JD/artifact content, `job-forge index:*` queries compact source pointers, `job-forge preflight:*` plans bounded apply dispatch rounds from file-backed candidate facts, `job-forge postflight:*` settles dispatch outcomes/artifacts/post-steps, and `job-forge migrate:*` applies safe consumer-project upgrades without MCP/tool-schema overhead. |
|
|
81
|
+
| **Trace + Telemetry + Guard + Contract + Canon + Ledger + Capabilities + Context + Cache + Index + Preflight + Postflight + Redact + Migrate** | `job-forge trace:*` exposes local OpenCode transcripts, `job-forge telemetry:*` summarizes runs, `job-forge guard:*` audits deterministic policy rules, `templates/contracts.json` enforces artifact shape with `iso-contract`, `job-forge canon:*` derives stable URL/company/role identity keys, `job-forge ledger:*` queries append-only workflow state, `job-forge capabilities:*` checks role boundaries, `job-forge context:*` plans mode/reference context bundles, `job-forge cache:*` reuses fetched JD/artifact content, `job-forge index:*` queries compact source pointers, `job-forge preflight:*` plans bounded apply dispatch rounds from file-backed candidate facts, `job-forge postflight:*` settles dispatch outcomes/artifacts/post-steps, `job-forge redact:*` sanitizes local exports, and `job-forge migrate:*` applies safe consumer-project upgrades without MCP/tool-schema overhead. |
|
|
82
82
|
| **Token Cost Visibility** | `job-forge tokens --days 1` for per-session breakdown; `job-forge session-report --since-minutes 60 --log` to flag sessions over budget and append history to `data/token-usage.tsv`. Auto-logged after every batch run. |
|
|
83
83
|
|
|
84
84
|
## Usage
|
|
@@ -148,6 +148,7 @@ my-search/
|
|
|
148
148
|
├── .jobforge-ledger/ # append-only local workflow events (personal, gitignored)
|
|
149
149
|
├── .jobforge-cache/ # content-addressed local JD/artifact cache (personal, gitignored)
|
|
150
150
|
├── .jobforge-index.json # deterministic artifact lookup index (generated, gitignored)
|
|
151
|
+
├── .jobforge-redacted/ # sanitized local exports (generated, gitignored)
|
|
151
152
|
├── reports/ # generated evaluation reports (personal, gitignored)
|
|
152
153
|
├── batch/{batch-input,batch-state}.tsv, tracker-additions/, logs/ # personal
|
|
153
154
|
├── .jobforge-runs/ # durable batch workflow records (generated)
|
|
@@ -164,7 +165,7 @@ my-search/
|
|
|
164
165
|
├── .opencode/skills/job-forge.md # → skill router
|
|
165
166
|
├── .opencode/agents/ # → @general-free, @general-paid, @glm-minimal
|
|
166
167
|
├── modes/ # → _shared.md + skill modes
|
|
167
|
-
├── templates/ # → states.yml, portals.example.yml, cv-template.html, canon.json, capabilities.json, context.json, index.json, preflight.json, postflight.json, migrations.json
|
|
168
|
+
├── templates/ # → states.yml, portals.example.yml, cv-template.html, canon.json, capabilities.json, context.json, index.json, preflight.json, postflight.json, redact.json, migrations.json
|
|
168
169
|
├── batch/batch-prompt.md # → batch worker prompt
|
|
169
170
|
├── batch/batch-runner.sh # → parallel orchestrator
|
|
170
171
|
│
|
|
@@ -190,7 +191,7 @@ JobForge/
|
|
|
190
191
|
│ ├── sync.mjs # postinstall: creates symlinks in consumer project
|
|
191
192
|
│ └── create-job-forge.mjs # scaffolder
|
|
192
193
|
├── modes/ # _shared.md + 16 skill modes
|
|
193
|
-
├── templates/ # cv-template.html, portals.example.yml, states.yml, canon.json, capabilities.json, context.json, preflight.json, postflight.json, migrations.json
|
|
194
|
+
├── templates/ # cv-template.html, portals.example.yml, states.yml, canon.json, capabilities.json, context.json, preflight.json, postflight.json, redact.json, migrations.json
|
|
194
195
|
├── config/profile.example.yml # template for consumer's profile.yml
|
|
195
196
|
├── batch/{batch-prompt.md,batch-runner.sh} # batch orchestrator
|
|
196
197
|
├── scripts/
|
|
@@ -204,6 +205,7 @@ JobForge/
|
|
|
204
205
|
│ ├── canon.mjs # iso-canon-backed identity normalization CLI
|
|
205
206
|
│ ├── preflight.mjs # iso-preflight-backed dispatch planning CLI
|
|
206
207
|
│ ├── postflight.mjs # iso-postflight-backed dispatch settlement CLI
|
|
208
|
+
│ ├── redact.mjs # iso-redact-backed safe-export redaction CLI
|
|
207
209
|
│ ├── migrate.mjs # iso-migrate-backed consumer-project migrations
|
|
208
210
|
│ ├── token-usage-report.mjs # opencode cost analyzer
|
|
209
211
|
│ └── release/check-source.mjs # version gate for npm publish
|
package/bin/job-forge.mjs
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
* canon:* Compute deterministic identity keys via iso-canon
|
|
29
29
|
* preflight:* Plan safe dispatch rounds via iso-preflight
|
|
30
30
|
* postflight:* Settle dispatch outcomes via iso-postflight
|
|
31
|
+
* redact:* Sanitize local exports via iso-redact
|
|
31
32
|
* migrate:* Apply deterministic consumer-project migrations via iso-migrate
|
|
32
33
|
* sync Re-run the harness symlink sync (bin/sync.mjs)
|
|
33
34
|
* help, --help Show this message
|
|
@@ -153,6 +154,14 @@ const postflightAliases = {
|
|
|
153
154
|
'postflight:path': 'path',
|
|
154
155
|
};
|
|
155
156
|
|
|
157
|
+
const redactAliases = {
|
|
158
|
+
'redact:scan': 'scan',
|
|
159
|
+
'redact:verify': 'verify',
|
|
160
|
+
'redact:apply': 'apply',
|
|
161
|
+
'redact:explain': 'explain',
|
|
162
|
+
'redact:path': 'path',
|
|
163
|
+
};
|
|
164
|
+
|
|
156
165
|
const migrateAliases = {
|
|
157
166
|
'migrate:plan': 'plan',
|
|
158
167
|
'migrate:apply': 'apply',
|
|
@@ -220,6 +229,10 @@ Commands:
|
|
|
220
229
|
postflight:status Reconcile dispatch plan, outcomes, artifacts, and post-steps
|
|
221
230
|
postflight:check Fail unless a dispatched workflow is fully settled
|
|
222
231
|
postflight:explain Show the active postflight workflow policy
|
|
232
|
+
redact:scan Scan local text for sensitive values before export
|
|
233
|
+
redact:verify Fail if local text still contains sensitive values
|
|
234
|
+
redact:apply Write a sanitized copy of local text
|
|
235
|
+
redact:explain Show the active redaction policy
|
|
223
236
|
migrate:plan Preview deterministic consumer-project migrations
|
|
224
237
|
migrate:apply Apply deterministic consumer-project migrations
|
|
225
238
|
migrate:check Fail if migrations are pending
|
|
@@ -268,6 +281,8 @@ Pass --help after a command to see its own flags, e.g.:
|
|
|
268
281
|
job-forge preflight:check --candidates batch/preflight-candidates.json
|
|
269
282
|
job-forge postflight:status --plan batch/preflight-plan.json --outcomes batch/postflight-outcomes.json
|
|
270
283
|
job-forge postflight:check --plan batch/preflight-plan.json --outcomes batch/postflight-outcomes.json
|
|
284
|
+
job-forge redact:scan --input raw-session.jsonl
|
|
285
|
+
job-forge redact:apply --input raw-session.jsonl --output .jobforge-redacted/session.jsonl
|
|
271
286
|
job-forge migrate:check
|
|
272
287
|
job-forge migrate:apply
|
|
273
288
|
|
|
@@ -444,6 +459,21 @@ if (cmd === 'postflight' || postflightAliases[cmd]) {
|
|
|
444
459
|
process.exit(result.status ?? 1);
|
|
445
460
|
}
|
|
446
461
|
|
|
462
|
+
if (cmd === 'redact' || redactAliases[cmd]) {
|
|
463
|
+
const redactArgs = cmd === 'redact'
|
|
464
|
+
? (rest.length === 0 ? ['help'] : rest)
|
|
465
|
+
: [redactAliases[cmd], ...rest];
|
|
466
|
+
|
|
467
|
+
const scriptPath = join(PKG_ROOT, 'scripts/redact.mjs');
|
|
468
|
+
const result = spawnSync(process.execPath, [scriptPath, ...redactArgs], {
|
|
469
|
+
stdio: 'inherit',
|
|
470
|
+
cwd: PROJECT_DIR,
|
|
471
|
+
env: process.env,
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
process.exit(result.status ?? 1);
|
|
475
|
+
}
|
|
476
|
+
|
|
447
477
|
if (cmd === 'migrate' || migrateAliases[cmd]) {
|
|
448
478
|
const migrateArgs = cmd === 'migrate'
|
|
449
479
|
? (rest.length === 0 ? ['help'] : rest)
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -235,6 +235,7 @@ Scripts maintain data consistency. In a consumer project they're invoked via the
|
|
|
235
235
|
| `scripts/context.mjs` | `npx job-forge context:list` / `context:plan` / `context:check` / `context:render` | Deterministic `@razroo/iso-context` mode/reference context bundle planning and rendering |
|
|
236
236
|
| `scripts/preflight.mjs` | `npx job-forge preflight:plan` / `preflight:check` / `preflight:explain` | Deterministic `@razroo/iso-preflight` dispatch planning for file-backed candidate facts and gates |
|
|
237
237
|
| `scripts/postflight.mjs` | `npx job-forge postflight:status` / `postflight:check` / `postflight:explain` | Deterministic `@razroo/iso-postflight` settlement for dispatch outcomes, required tracker TSV artifacts, and merge/verify post-steps |
|
|
238
|
+
| `scripts/redact.mjs` | `npx job-forge redact:scan` / `redact:apply` / `redact:verify` | Deterministic `@razroo/iso-redact` safe-export scanning and sanitization for traces, prompts, reports, and fixtures |
|
|
238
239
|
| `scripts/migrate.mjs` | `npx job-forge migrate:plan` / `migrate:apply` / `migrate:check` | Deterministic `@razroo/iso-migrate` consumer-project upgrades for scripts and generated-artifact ignores |
|
|
239
240
|
| `tracker-lib.mjs` | _(library)_ | Shared helpers for reading/writing day-based tracker files — imported by merge/dedup/verify/normalize |
|
|
240
241
|
| `bin/sync.mjs` | `npx job-forge sync` | Creates the harness symlinks in a consumer project and applies safe migrations (also runs as `postinstall`) |
|
package/docs/CUSTOMIZATION.md
CHANGED
|
@@ -166,6 +166,10 @@ Application dispatch policy lives in `templates/preflight.json` and is planned l
|
|
|
166
166
|
|
|
167
167
|
Application settlement policy lives in `templates/postflight.json` and is checked locally by `@razroo/iso-postflight`. After each dispatch round, record observed candidate outcomes and tracker TSV artifact paths in `batch/postflight-outcomes.json`, then run `job-forge postflight:status --plan batch/preflight-plan.json --outcomes batch/postflight-outcomes.json` to get the next safe action. After `merge` and `verify`, add post-step observations and run `job-forge postflight:check ...` to fail unless the workflow is complete. This is not an MCP and does not add prompt or tool-schema tokens.
|
|
168
168
|
|
|
169
|
+
## JobForge redaction policy
|
|
170
|
+
|
|
171
|
+
Safe-export redaction rules live in `templates/redact.json` and are enforced locally by `@razroo/iso-redact`. Use `job-forge redact:scan --input <file>` before sharing traces, prompts, reports, or fixtures outside the project, `job-forge redact:apply --input <file> --output .jobforge-redacted/<file>` to write a sanitized copy, and `job-forge redact:verify --input <file>` to fail if secrets or configured PII remain. Findings never print matched values. This is not an MCP and does not add prompt or tool-schema tokens.
|
|
172
|
+
|
|
169
173
|
## JobForge consumer migrations
|
|
170
174
|
|
|
171
175
|
Consumer-project migrations live in `templates/migrations.json` and are applied locally by `@razroo/iso-migrate`. `job-forge sync` applies safe migrations automatically after refreshing symlinks; use `JOB_FORGE_SKIP_MIGRATIONS=1` to opt out. Use `job-forge migrate:plan`, `job-forge migrate:apply`, and `job-forge migrate:check` to inspect or enforce script/gitignore drift explicitly. This is not an MCP and does not add prompt or tool-schema tokens.
|
package/docs/README.md
CHANGED
|
@@ -31,7 +31,7 @@ The harness exposes a single CLI (`job-forge`) installed as a `bin` entry. In a
|
|
|
31
31
|
|
|
32
32
|
| What you need | Where to read |
|
|
33
33
|
|---------------|---------------|
|
|
34
|
-
| Full command list (`verify`, `merge`, `dedup`, `normalize`, `pdf`, `sync-check`, `tokens`, `trace`, `telemetry`, `guard`, `ledger`, `canon`, `context`, `preflight`, `postflight`, `sync`). | [SETUP.md — Tracker and scripts (terminal)](SETUP.md#tracker-and-scripts-terminal). |
|
|
34
|
+
| Full command list (`verify`, `merge`, `dedup`, `normalize`, `pdf`, `sync-check`, `tokens`, `trace`, `telemetry`, `guard`, `ledger`, `canon`, `context`, `preflight`, `postflight`, `redact`, `sync`). | [SETUP.md — Tracker and scripts (terminal)](SETUP.md#tracker-and-scripts-terminal). |
|
|
35
35
|
| What each harness `.mjs` script does. | [ARCHITECTURE.md — Pipeline integrity](ARCHITECTURE.md#pipeline-integrity) and the scripts table underneath. |
|
|
36
36
|
| Batch runner, TSV layout, and `batch/tracker-additions/` merge flow. | [batch/README.md](../batch/README.md). |
|
|
37
37
|
| PR gate for harness contributions (`npm run verify` + `npm run build:dashboard`). | [CONTRIBUTING.md — Development](../CONTRIBUTING.md#development). |
|
package/docs/SETUP.md
CHANGED
|
@@ -136,6 +136,8 @@ From your project root, these commands maintain the tracker and pipeline checks.
|
|
|
136
136
|
| Fail on blocked preflight candidates | `npx job-forge preflight:check --candidates batch/preflight-candidates.json` | `npm run preflight:check -- --candidates ...` |
|
|
137
137
|
| Settle dispatch outcomes after a round | `npx job-forge postflight:status --plan batch/preflight-plan.json --outcomes batch/postflight-outcomes.json` | `npm run postflight:status -- --plan ... --outcomes ...` |
|
|
138
138
|
| Fail unless dispatch outcomes and post-steps are complete | `npx job-forge postflight:check --plan batch/preflight-plan.json --outcomes batch/postflight-outcomes.json` | `npm run postflight:check -- --plan ... --outcomes ...` |
|
|
139
|
+
| Sanitize local text before exporting it | `npx job-forge redact:apply --input raw-session.jsonl --output .jobforge-redacted/session.jsonl` | `npm run redact:apply -- --input ... --output ...` |
|
|
140
|
+
| Verify local text is safe to export | `npx job-forge redact:verify --input .jobforge-redacted/session.jsonl` | `npm run redact:verify -- --input ...` |
|
|
139
141
|
| Inspect pending consumer migrations | `npx job-forge migrate:plan` | `npm run migrate:plan` |
|
|
140
142
|
| Map status column to canonical labels | `npx job-forge normalize` | `npm run normalize` |
|
|
141
143
|
| Merge duplicate company/role rows | `npx job-forge dedup` | `npm run dedup` |
|
package/iso/instructions.md
CHANGED
|
@@ -84,11 +84,14 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
|
|
|
84
84
|
- [D17] Treat `templates/postflight.json` as the source of truth for multi-apply dispatch settlement. Save the JSON preflight plan and per-round observed dispatch/outcome/artifact records, then run `npx job-forge postflight:status --plan <plan.json> --outcomes <outcomes.json>` after each round and `npx job-forge postflight:check ...` after merge/verify. Follow its next action instead of inferring completion from subagent prose.
|
|
85
85
|
why: `iso-postflight` is not an MCP and adds no prompt/tool-schema tokens; it makes "round complete", missing TSVs, failed candidates, replacements, merge, and verify an executable local gate instead of repeated orchestration prose
|
|
86
86
|
|
|
87
|
+
- [D18] Treat `templates/redact.json` as the source of truth before exporting local traces, prompts, reports, or fixtures outside the project. Use `npx job-forge redact:scan --input <file>`, `redact:apply --input <file> --output .jobforge-redacted/<file>`, or `redact:verify --input <file>` instead of hand-redacting with prose. This complements H8; it does not make it acceptable to paste secrets into prompts.
|
|
88
|
+
why: `iso-redact` is not an MCP and adds no prompt/tool-schema tokens; it gives deterministic safe-export checks whose findings do not print matched secret values
|
|
89
|
+
|
|
87
90
|
## Procedure
|
|
88
91
|
|
|
89
92
|
1. Check `cv.md`, `profile.yml`, and `portals.yml`; onboard if any file is missing.
|
|
90
93
|
2. Pick and name the mode from **Routing** [D6]. No match → ask; do not guess.
|
|
91
|
-
3. Read the active mode file [D3]. Use context bundle checks when changing context loads [D11]. Check cached artifacts before URL/JD refetches [D12]. Use artifact index lookups before broad file reads when they can answer the question [D13]. Use canonical identity keys for duplicate checks [D15]. Use migration checks for harness drift [D14]. Decide inline vs delegated work [D1].
|
|
94
|
+
3. Read the active mode file [D3]. Use context bundle checks when changing context loads [D11]. Check cached artifacts before URL/JD refetches [D12]. Use artifact index lookups before broad file reads when they can answer the question [D13]. Use canonical identity keys for duplicate checks [D15]. Use migration checks for harness drift [D14]. Use redaction checks before exporting local artifacts [D18]. Decide inline vs delegated work [D1].
|
|
92
95
|
4. Prepare Geometra dispatches: cleanup [H3], canon/index/ledger prefilter when useful [D8, D13, D15], dedupe [H2], location filter [D5], materialize candidate facts/gates and run preflight plan/check [D16], routing [D2, D10], proxy prompt hygiene [H8].
|
|
93
96
|
5. Dispatch at most 2 tasks per round [H1]; wait for final outcomes, not just task ids [H5b], then settle the round with postflight status [D17].
|
|
94
97
|
6. Keep multi-job form-filling out of the orchestrator [H4].
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import {
|
|
4
|
+
loadRedactConfig,
|
|
5
|
+
parseJson,
|
|
6
|
+
} from '@razroo/iso-redact';
|
|
7
|
+
|
|
8
|
+
export const REDACT_CONFIG_FILE = 'templates/redact.json';
|
|
9
|
+
|
|
10
|
+
export function resolveProjectDir(projectDir = process.env.JOB_FORGE_PROJECT || process.cwd()) {
|
|
11
|
+
return projectDir;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function jobForgeRedactConfigPath(projectDir = resolveProjectDir()) {
|
|
15
|
+
return process.env.JOB_FORGE_REDACT_CONFIG || join(projectDir, REDACT_CONFIG_FILE);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function redactConfigExists(projectDir = resolveProjectDir()) {
|
|
19
|
+
return existsSync(jobForgeRedactConfigPath(projectDir));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function readJobForgeRedactConfig(projectDir = resolveProjectDir()) {
|
|
23
|
+
const path = jobForgeRedactConfigPath(projectDir);
|
|
24
|
+
return loadRedactConfig(parseJson(readFileSync(path, 'utf8'), path));
|
|
25
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "job-forge",
|
|
3
|
-
"version": "2.14.
|
|
3
|
+
"version": "2.14.30",
|
|
4
4
|
"description": "AI-powered job search pipeline built on opencode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -65,6 +65,10 @@
|
|
|
65
65
|
"postflight:status": "node bin/job-forge.mjs postflight:status",
|
|
66
66
|
"postflight:check": "node bin/job-forge.mjs postflight:check",
|
|
67
67
|
"postflight:explain": "node bin/job-forge.mjs postflight:explain",
|
|
68
|
+
"redact:scan": "node bin/job-forge.mjs redact:scan",
|
|
69
|
+
"redact:verify": "node bin/job-forge.mjs redact:verify",
|
|
70
|
+
"redact:apply": "node bin/job-forge.mjs redact:apply",
|
|
71
|
+
"redact:explain": "node bin/job-forge.mjs redact:explain",
|
|
68
72
|
"migrate:plan": "node bin/job-forge.mjs migrate:plan",
|
|
69
73
|
"migrate:apply": "node bin/job-forge.mjs migrate:apply",
|
|
70
74
|
"migrate:check": "node bin/job-forge.mjs migrate:check",
|
|
@@ -147,6 +151,7 @@
|
|
|
147
151
|
"@razroo/iso-orchestrator": "^0.1.0",
|
|
148
152
|
"@razroo/iso-postflight": "^0.1.0",
|
|
149
153
|
"@razroo/iso-preflight": "^0.1.0",
|
|
154
|
+
"@razroo/iso-redact": "^0.1.0",
|
|
150
155
|
"@razroo/iso-trace": "^0.4.0",
|
|
151
156
|
"playwright": "^1.58.1"
|
|
152
157
|
},
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
4
|
+
import { dirname, isAbsolute, relative, resolve } from 'path';
|
|
5
|
+
import {
|
|
6
|
+
formatConfigSummary,
|
|
7
|
+
formatScanResult,
|
|
8
|
+
loadRedactConfig,
|
|
9
|
+
parseJson,
|
|
10
|
+
redactText,
|
|
11
|
+
scanSources,
|
|
12
|
+
} from '@razroo/iso-redact';
|
|
13
|
+
import { PROJECT_DIR } from '../tracker-lib.mjs';
|
|
14
|
+
import {
|
|
15
|
+
jobForgeRedactConfigPath,
|
|
16
|
+
readJobForgeRedactConfig,
|
|
17
|
+
} from '../lib/jobforge-redact.mjs';
|
|
18
|
+
|
|
19
|
+
const USAGE = `job-forge redact - deterministic local redaction for exports
|
|
20
|
+
|
|
21
|
+
Usage:
|
|
22
|
+
job-forge redact:scan [--input <file> ...] [--stdin] [--config <file>] [--json]
|
|
23
|
+
job-forge redact:verify [--input <file> ...] [--stdin] [--config <file>] [--json]
|
|
24
|
+
job-forge redact:apply (--input <file> | --stdin) [--output <file>] [--config <file>] [--json]
|
|
25
|
+
job-forge redact:explain [--config <file>] [--json]
|
|
26
|
+
job-forge redact:path
|
|
27
|
+
|
|
28
|
+
Default policy is templates/redact.json. Findings never print matched values;
|
|
29
|
+
previews are redacted length markers. Use apply to write a sanitized copy
|
|
30
|
+
before exporting traces, prompts, reports, or fixture text.`;
|
|
31
|
+
|
|
32
|
+
const [cmd = 'help', ...rawArgs] = process.argv.slice(2);
|
|
33
|
+
const opts = parseArgs(rawArgs);
|
|
34
|
+
|
|
35
|
+
if (opts.help || cmd === 'help' || cmd === '--help' || cmd === '-h') {
|
|
36
|
+
console.log(USAGE);
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
if (cmd === 'path') {
|
|
42
|
+
console.log(configPath(opts));
|
|
43
|
+
} else if (cmd === 'scan' || cmd === 'verify') {
|
|
44
|
+
scan(cmd, opts);
|
|
45
|
+
} else if (cmd === 'apply') {
|
|
46
|
+
apply(opts);
|
|
47
|
+
} else if (cmd === 'explain') {
|
|
48
|
+
explain(opts);
|
|
49
|
+
} else {
|
|
50
|
+
console.error(`unknown redact command "${cmd}"\n`);
|
|
51
|
+
console.error(USAGE);
|
|
52
|
+
process.exit(2);
|
|
53
|
+
}
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function parseArgs(args) {
|
|
60
|
+
const opts = {
|
|
61
|
+
inputs: [],
|
|
62
|
+
stdin: false,
|
|
63
|
+
json: false,
|
|
64
|
+
help: false,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
for (let i = 0; i < args.length; i++) {
|
|
68
|
+
const arg = args[i];
|
|
69
|
+
if (arg === '--json') {
|
|
70
|
+
opts.json = true;
|
|
71
|
+
} else if (arg === '--input' || arg === '-i') {
|
|
72
|
+
opts.inputs.push(valueAfter(args, ++i, arg));
|
|
73
|
+
} else if (arg.startsWith('--input=')) {
|
|
74
|
+
opts.inputs.push(arg.slice('--input='.length));
|
|
75
|
+
} else if (arg === '--stdin') {
|
|
76
|
+
opts.stdin = true;
|
|
77
|
+
} else if (arg === '--output' || arg === '-o') {
|
|
78
|
+
opts.output = valueAfter(args, ++i, arg);
|
|
79
|
+
} else if (arg.startsWith('--output=')) {
|
|
80
|
+
opts.output = arg.slice('--output='.length);
|
|
81
|
+
} else if (arg === '--config' || arg === '-c') {
|
|
82
|
+
opts.config = valueAfter(args, ++i, arg);
|
|
83
|
+
} else if (arg.startsWith('--config=')) {
|
|
84
|
+
opts.config = arg.slice('--config='.length);
|
|
85
|
+
} else if (arg === '--help' || arg === '-h') {
|
|
86
|
+
opts.help = true;
|
|
87
|
+
} else if (arg.startsWith('--')) {
|
|
88
|
+
throw new Error(`unknown flag "${arg}"`);
|
|
89
|
+
} else {
|
|
90
|
+
opts.inputs.push(arg);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return opts;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function valueAfter(values, index, flag) {
|
|
98
|
+
const value = values[index];
|
|
99
|
+
if (!value || value.startsWith('--')) throw new Error(`${flag} requires a value`);
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function scan(mode, opts) {
|
|
104
|
+
const sources = readSources(opts);
|
|
105
|
+
if (sources.length === 0) throw new Error(`${mode} requires at least one --input or --stdin source`);
|
|
106
|
+
const result = scanSources(readConfig(opts), sources);
|
|
107
|
+
if (opts.json) {
|
|
108
|
+
console.log(JSON.stringify(result, null, 2));
|
|
109
|
+
} else {
|
|
110
|
+
console.log(formatScanResult(result, mode));
|
|
111
|
+
}
|
|
112
|
+
if (mode === 'verify' && !result.ok) process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function apply(opts) {
|
|
116
|
+
const sources = readSources(opts);
|
|
117
|
+
if (sources.length !== 1) throw new Error('apply requires exactly one --input or --stdin source');
|
|
118
|
+
const source = sources[0];
|
|
119
|
+
const result = redactText(readConfig(opts), source.text, { source: source.name });
|
|
120
|
+
if (opts.output) {
|
|
121
|
+
const output = resolveOutputPath(opts.output);
|
|
122
|
+
mkdirSync(dirname(output), { recursive: true });
|
|
123
|
+
writeFileSync(output, result.text, 'utf8');
|
|
124
|
+
if (opts.json) {
|
|
125
|
+
console.log(JSON.stringify({ ...result, text: undefined, output }, null, 2));
|
|
126
|
+
} else {
|
|
127
|
+
console.log(`iso-redact: wrote ${relativePath(output)} (${result.findings.length} finding(s) redacted)`);
|
|
128
|
+
}
|
|
129
|
+
} else if (opts.json) {
|
|
130
|
+
console.log(JSON.stringify(result, null, 2));
|
|
131
|
+
} else {
|
|
132
|
+
process.stdout.write(result.text);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function explain(opts) {
|
|
137
|
+
const config = readConfig(opts);
|
|
138
|
+
if (opts.json) {
|
|
139
|
+
console.log(JSON.stringify(config, null, 2));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
console.log(`config: ${relativePath(configPath(opts))}`);
|
|
143
|
+
console.log(formatConfigSummary(config));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function readSources(opts) {
|
|
147
|
+
const sources = opts.inputs.map((input) => {
|
|
148
|
+
const path = resolveInputPath(input);
|
|
149
|
+
return {
|
|
150
|
+
name: relativePath(path),
|
|
151
|
+
text: readFileSync(path, 'utf8'),
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
if (opts.stdin) sources.push({ name: '<stdin>', text: readFileSync(0, 'utf8') });
|
|
155
|
+
return sources;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function readConfig(opts) {
|
|
159
|
+
if (opts.config) {
|
|
160
|
+
const path = resolveInputPath(opts.config);
|
|
161
|
+
return loadRedactConfig(parseJson(readFileSync(path, 'utf8'), path));
|
|
162
|
+
}
|
|
163
|
+
return readJobForgeRedactConfig(PROJECT_DIR);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function configPath(opts) {
|
|
167
|
+
return opts.config ? resolveInputPath(opts.config) : jobForgeRedactConfigPath(PROJECT_DIR);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function resolveInputPath(path) {
|
|
171
|
+
return isAbsolute(path) ? path : resolve(PROJECT_DIR, path);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function resolveOutputPath(path) {
|
|
175
|
+
return isAbsolute(path) ? path : resolve(PROJECT_DIR, path);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function relativePath(path) {
|
|
179
|
+
return relative(PROJECT_DIR, path) || '.';
|
|
180
|
+
}
|
|
@@ -43,6 +43,10 @@
|
|
|
43
43
|
"postflight:status": "job-forge postflight:status",
|
|
44
44
|
"postflight:check": "job-forge postflight:check",
|
|
45
45
|
"postflight:explain": "job-forge postflight:explain",
|
|
46
|
+
"redact:scan": "job-forge redact:scan",
|
|
47
|
+
"redact:verify": "job-forge redact:verify",
|
|
48
|
+
"redact:apply": "job-forge redact:apply",
|
|
49
|
+
"redact:explain": "job-forge redact:explain",
|
|
46
50
|
"migrate:plan": "job-forge migrate:plan",
|
|
47
51
|
"migrate:apply": "job-forge migrate:apply",
|
|
48
52
|
"migrate:check": "job-forge migrate:check",
|
|
@@ -65,6 +69,7 @@
|
|
|
65
69
|
".jobforge-ledger/",
|
|
66
70
|
".jobforge-cache/",
|
|
67
71
|
".jobforge-index.json",
|
|
72
|
+
".jobforge-redacted/",
|
|
68
73
|
"batch/preflight-candidates.json",
|
|
69
74
|
"batch/preflight-plan.json",
|
|
70
75
|
"batch/postflight-outcomes.json"
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"defaults": {
|
|
4
|
+
"severity": "error",
|
|
5
|
+
"replacement": "[REDACTED:{id}]"
|
|
6
|
+
},
|
|
7
|
+
"builtins": [
|
|
8
|
+
{
|
|
9
|
+
"id": "email",
|
|
10
|
+
"severity": "warn"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"id": "phone",
|
|
14
|
+
"severity": "warn"
|
|
15
|
+
},
|
|
16
|
+
"openai-api-key",
|
|
17
|
+
"github-token",
|
|
18
|
+
"npm-token",
|
|
19
|
+
"aws-access-key-id",
|
|
20
|
+
"bearer-token",
|
|
21
|
+
"private-key",
|
|
22
|
+
"proxy-url-credentials"
|
|
23
|
+
],
|
|
24
|
+
"fields": [
|
|
25
|
+
{
|
|
26
|
+
"id": "profile-contact",
|
|
27
|
+
"label": "Profile contact field",
|
|
28
|
+
"severity": "warn",
|
|
29
|
+
"names": [
|
|
30
|
+
"email",
|
|
31
|
+
"phone",
|
|
32
|
+
"address",
|
|
33
|
+
"street",
|
|
34
|
+
"city",
|
|
35
|
+
"postalCode",
|
|
36
|
+
"zip",
|
|
37
|
+
"linkedin"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "proxy-config",
|
|
42
|
+
"label": "Proxy configuration field",
|
|
43
|
+
"names": [
|
|
44
|
+
"proxy",
|
|
45
|
+
"proxyUrl",
|
|
46
|
+
"proxy_url",
|
|
47
|
+
"server",
|
|
48
|
+
"username",
|
|
49
|
+
"password",
|
|
50
|
+
"bypass"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "credential-field",
|
|
55
|
+
"label": "Credential field",
|
|
56
|
+
"names": [
|
|
57
|
+
"apiKey",
|
|
58
|
+
"api_key",
|
|
59
|
+
"access_token",
|
|
60
|
+
"refresh_token",
|
|
61
|
+
"client_secret",
|
|
62
|
+
"clientSecret",
|
|
63
|
+
"authorization",
|
|
64
|
+
"cookie",
|
|
65
|
+
"session",
|
|
66
|
+
"token"
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"patterns": [
|
|
71
|
+
{
|
|
72
|
+
"id": "proxy-provider-account",
|
|
73
|
+
"label": "Proxy provider account identifier",
|
|
74
|
+
"pattern": "\\bbrd-customer-[A-Za-z0-9_.-]+\\b"
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|