@agent-pattern-labs/leads-rig 0.1.3 → 0.1.5
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/.codex/config.toml +1 -1
- package/.cursor/rules/main.mdc +2 -2
- package/.opencode/skills/lead-harness.md +2 -2
- package/.opencode/skills/public-leads.md +2 -2
- package/.pi/iso-route.md +15 -0
- package/.pi/prompts/lead-harness.md +2 -2
- package/.pi/prompts/public-leads.md +2 -2
- package/.pi/settings.json +9 -0
- package/AGENTS.md +2 -2
- package/CLAUDE.md +2 -2
- package/README.md +23 -6
- package/bin/create-leads-harness.mjs +2 -2
- package/bin/lead-harness.mjs +75 -75
- package/config/profile.example.yml +8 -5
- package/docs/ARCHITECTURE.md +3 -3
- package/docs/CONSTRUCTION.md +2 -2
- package/docs/SETUP.md +23 -5
- package/iso/commands/lead-harness.md +2 -2
- package/iso/commands/public-leads.md +2 -2
- package/iso/instructions.md +2 -2
- package/lib/leadharness-crawler.mjs +17 -13
- package/lib/leadharness-ingest.mjs +23 -6
- package/lib/leadharness-leads.mjs +277 -4
- package/modes/_shared.md +4 -2
- package/modes/batch.md +1 -1
- package/modes/ingest.md +6 -3
- package/modes/pipeline.md +1 -1
- package/modes/setup.md +3 -2
- package/package.json +25 -25
- package/scripts/batch-orchestrator.mjs +1 -1
- package/scripts/ingest.mjs +2 -2
- package/scripts/pipeline.mjs +2 -2
package/.codex/config.toml
CHANGED
package/.cursor/rules/main.mdc
CHANGED
|
@@ -9,7 +9,7 @@ Agentic public-web lead discovery harness. It crawls company domains, extracts r
|
|
|
9
9
|
|
|
10
10
|
## Hard Limits
|
|
11
11
|
|
|
12
|
-
- [H1] Only collect public-source business contact data. Do not infer, guess, brute-force, or enrich private email addresses. Every lead needs a source URL and evidence excerpt.
|
|
12
|
+
- [H1] Only collect public-source business contact data. Do not infer, guess, brute-force, or enrich private email addresses. Every lead needs a source URL and evidence excerpt. The primary goal is named people, not generic company inboxes.
|
|
13
13
|
- [H2] Respect robots.txt, terms, rate limits, and site intent. If a page blocks crawling or is not public, record a warning and move on.
|
|
14
14
|
- [H3] Never send outreach from this harness. The output is reviewable lead records and ingest-ready artifacts, not email campaigns.
|
|
15
15
|
- [H4] Use file-backed artifacts before ingest. A subagent prose summary is not enough; write validated JSON/JSONL first, then ingest.
|
|
@@ -23,7 +23,7 @@ Agentic public-web lead discovery harness. It crawls company domains, extracts r
|
|
|
23
23
|
- [D2] Use deterministic local helpers when they can validate, normalize, manifest, preflight, postflight, or ingest artifacts.
|
|
24
24
|
- [D3] Read the active mode file before executing. Mode files own output shapes and gates.
|
|
25
25
|
- [D4] Prefer official company websites and high-signal pages: home, contact, about, team, leadership, people, press, blog, careers, and legal pages.
|
|
26
|
-
- [D5] Keep artifacts source-backed. Every emitted lead should include `domain`, `sourceUrl`, `evidence`, `emailType`, `extractionMethod`, `verificationStatus`, and `confidence`.
|
|
26
|
+
- [D5] Keep artifacts source-backed. Every emitted lead should include `domain`, `sourceUrl`, `evidence`, `emailType`, `extractionMethod`, `verificationStatus`, and `confidence`. Reject generic catch-all inboxes such as `info@`, `hello@`, `contact@`, `support@`, `team@`, and similar aliases; if no named person is available, prefer a `contact_path` record instead.
|
|
27
27
|
|
|
28
28
|
## Procedure
|
|
29
29
|
|
|
@@ -41,10 +41,10 @@ Available commands:
|
|
|
41
41
|
|
|
42
42
|
Local commands:
|
|
43
43
|
npx public-leads crawl --input data/domains.tsv --out data/lead-results.json
|
|
44
|
-
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
44
|
+
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
45
45
|
npx public-leads validate --input data/lead-results.json
|
|
46
46
|
npx public-leads manifest --input data/lead-results.json
|
|
47
|
-
npx public-leads ingest --input data/lead-results.json
|
|
47
|
+
npx public-leads ingest --input data/lead-results.json
|
|
48
48
|
npx public-leads verify
|
|
49
49
|
```
|
|
50
50
|
|
|
@@ -41,10 +41,10 @@ Available commands:
|
|
|
41
41
|
|
|
42
42
|
Local commands:
|
|
43
43
|
npx public-leads crawl --input data/domains.tsv --out data/lead-results.json
|
|
44
|
-
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
44
|
+
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
45
45
|
npx public-leads validate --input data/lead-results.json
|
|
46
46
|
npx public-leads manifest --input data/lead-results.json
|
|
47
|
-
npx public-leads ingest --input data/lead-results.json
|
|
47
|
+
npx public-leads ingest --input data/lead-results.json
|
|
48
48
|
npx public-leads verify
|
|
49
49
|
```
|
|
50
50
|
|
package/.pi/iso-route.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# iso-route — Pi notes
|
|
2
|
+
|
|
3
|
+
Pi reads `.pi/settings.json` for the default provider/model and model cycling. It does not have native role-specific subagent binding, so role entries below are advisory for manual model switching or extension/package workflows.
|
|
4
|
+
|
|
5
|
+
## Default
|
|
6
|
+
|
|
7
|
+
- **anthropic / claude-sonnet-4-6**
|
|
8
|
+
|
|
9
|
+
## Roles
|
|
10
|
+
|
|
11
|
+
| Role | Provider | Model | Thinking | Fallback |
|
|
12
|
+
| ---- | -------- | ----- | -------- | -------- |
|
|
13
|
+
| `fast` | anthropic | `claude-haiku-4-5` | - | - |
|
|
14
|
+
| `quality` | anthropic | `claude-opus-4-7` | high | - |
|
|
15
|
+
| `minimal` | anthropic | `claude-haiku-4-5` | - | - |
|
|
@@ -39,10 +39,10 @@ Available commands:
|
|
|
39
39
|
|
|
40
40
|
Local commands:
|
|
41
41
|
npx public-leads crawl --input data/domains.tsv --out data/lead-results.json
|
|
42
|
-
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
42
|
+
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
43
43
|
npx public-leads validate --input data/lead-results.json
|
|
44
44
|
npx public-leads manifest --input data/lead-results.json
|
|
45
|
-
npx public-leads ingest --input data/lead-results.json
|
|
45
|
+
npx public-leads ingest --input data/lead-results.json
|
|
46
46
|
npx public-leads verify
|
|
47
47
|
```
|
|
48
48
|
|
|
@@ -39,10 +39,10 @@ Available commands:
|
|
|
39
39
|
|
|
40
40
|
Local commands:
|
|
41
41
|
npx public-leads crawl --input data/domains.tsv --out data/lead-results.json
|
|
42
|
-
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
42
|
+
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
43
43
|
npx public-leads validate --input data/lead-results.json
|
|
44
44
|
npx public-leads manifest --input data/lead-results.json
|
|
45
|
-
npx public-leads ingest --input data/lead-results.json
|
|
45
|
+
npx public-leads ingest --input data/lead-results.json
|
|
46
46
|
npx public-leads verify
|
|
47
47
|
```
|
|
48
48
|
|
package/AGENTS.md
CHANGED
|
@@ -4,7 +4,7 @@ Agentic public-web lead discovery harness. It crawls company domains, extracts r
|
|
|
4
4
|
|
|
5
5
|
## Hard Limits
|
|
6
6
|
|
|
7
|
-
- [H1] Only collect public-source business contact data. Do not infer, guess, brute-force, or enrich private email addresses. Every lead needs a source URL and evidence excerpt.
|
|
7
|
+
- [H1] Only collect public-source business contact data. Do not infer, guess, brute-force, or enrich private email addresses. Every lead needs a source URL and evidence excerpt. The primary goal is named people, not generic company inboxes.
|
|
8
8
|
- [H2] Respect robots.txt, terms, rate limits, and site intent. If a page blocks crawling or is not public, record a warning and move on.
|
|
9
9
|
- [H3] Never send outreach from this harness. The output is reviewable lead records and ingest-ready artifacts, not email campaigns.
|
|
10
10
|
- [H4] Use file-backed artifacts before ingest. A subagent prose summary is not enough; write validated JSON/JSONL first, then ingest.
|
|
@@ -18,7 +18,7 @@ Agentic public-web lead discovery harness. It crawls company domains, extracts r
|
|
|
18
18
|
- [D2] Use deterministic local helpers when they can validate, normalize, manifest, preflight, postflight, or ingest artifacts.
|
|
19
19
|
- [D3] Read the active mode file before executing. Mode files own output shapes and gates.
|
|
20
20
|
- [D4] Prefer official company websites and high-signal pages: home, contact, about, team, leadership, people, press, blog, careers, and legal pages.
|
|
21
|
-
- [D5] Keep artifacts source-backed. Every emitted lead should include `domain`, `sourceUrl`, `evidence`, `emailType`, `extractionMethod`, `verificationStatus`, and `confidence`.
|
|
21
|
+
- [D5] Keep artifacts source-backed. Every emitted lead should include `domain`, `sourceUrl`, `evidence`, `emailType`, `extractionMethod`, `verificationStatus`, and `confidence`. Reject generic catch-all inboxes such as `info@`, `hello@`, `contact@`, `support@`, `team@`, and similar aliases; if no named person is available, prefer a `contact_path` record instead.
|
|
22
22
|
|
|
23
23
|
## Procedure
|
|
24
24
|
|
package/CLAUDE.md
CHANGED
|
@@ -4,7 +4,7 @@ Agentic public-web lead discovery harness. It crawls company domains, extracts r
|
|
|
4
4
|
|
|
5
5
|
## Hard Limits
|
|
6
6
|
|
|
7
|
-
- [H1] Only collect public-source business contact data. Do not infer, guess, brute-force, or enrich private email addresses. Every lead needs a source URL and evidence excerpt.
|
|
7
|
+
- [H1] Only collect public-source business contact data. Do not infer, guess, brute-force, or enrich private email addresses. Every lead needs a source URL and evidence excerpt. The primary goal is named people, not generic company inboxes.
|
|
8
8
|
- [H2] Respect robots.txt, terms, rate limits, and site intent. If a page blocks crawling or is not public, record a warning and move on.
|
|
9
9
|
- [H3] Never send outreach from this harness. The output is reviewable lead records and ingest-ready artifacts, not email campaigns.
|
|
10
10
|
- [H4] Use file-backed artifacts before ingest. A subagent prose summary is not enough; write validated JSON/JSONL first, then ingest.
|
|
@@ -18,7 +18,7 @@ Agentic public-web lead discovery harness. It crawls company domains, extracts r
|
|
|
18
18
|
- [D2] Use deterministic local helpers when they can validate, normalize, manifest, preflight, postflight, or ingest artifacts.
|
|
19
19
|
- [D3] Read the active mode file before executing. Mode files own output shapes and gates.
|
|
20
20
|
- [D4] Prefer official company websites and high-signal pages: home, contact, about, team, leadership, people, press, blog, careers, and legal pages.
|
|
21
|
-
- [D5] Keep artifacts source-backed. Every emitted lead should include `domain`, `sourceUrl`, `evidence`, `emailType`, `extractionMethod`, `verificationStatus`, and `confidence`.
|
|
21
|
+
- [D5] Keep artifacts source-backed. Every emitted lead should include `domain`, `sourceUrl`, `evidence`, `emailType`, `extractionMethod`, `verificationStatus`, and `confidence`. Reject generic catch-all inboxes such as `info@`, `hello@`, `contact@`, `support@`, `team@`, and similar aliases; if no named person is available, prefer a `contact_path` record instead.
|
|
22
22
|
|
|
23
23
|
## Procedure
|
|
24
24
|
|
package/README.md
CHANGED
|
@@ -6,11 +6,13 @@ Agentic public-web lead discovery harness for portable, source-backed lead artif
|
|
|
6
6
|
|
|
7
7
|
- Crawls public company websites through agent workflows.
|
|
8
8
|
- Produces source-backed lead artifacts matching the local lead-ingest contract.
|
|
9
|
-
- Validates lead JSON/JSONL before database handoff
|
|
9
|
+
- Validates lead JSON/JSONL before database handoff and rejects generic catch-all inboxes such as `info@` and `hello@`.
|
|
10
10
|
- Builds a local manifest for batch auditability.
|
|
11
11
|
- Submits validated payloads to a configured ingest API.
|
|
12
12
|
- Ships OpenCode, Claude Code, Cursor, Codex, and Pi harness config from one `iso/` source.
|
|
13
13
|
|
|
14
|
+
The harness is optimized to find named people who can actually be contacted. When only a general company contact path exists, it should emit a `contact_path` record rather than a generic organizational inbox.
|
|
15
|
+
|
|
14
16
|
## Core Commands
|
|
15
17
|
|
|
16
18
|
```bash
|
|
@@ -20,9 +22,9 @@ npm run smoke:iso
|
|
|
20
22
|
|
|
21
23
|
npx -p @agent-pattern-labs/leads-rig create-public-leads-harness my-lead-project
|
|
22
24
|
npx public-leads crawl --domains example.com --out data/lead-results.json
|
|
23
|
-
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
25
|
+
PUBLIC_LEADS_API=https://cold-agent-leads.example.com npx public-leads pipeline --input data/domains.tsv --ingest
|
|
24
26
|
npx public-leads validate --input examples/sample-leads.json
|
|
25
|
-
npx public-leads ingest --input examples/sample-leads.json --dry-run --out output/sample-ingest.json
|
|
27
|
+
PUBLIC_LEADS_API=https://cold-agent-leads.example.com npx public-leads ingest --input examples/sample-leads.json --dry-run --out output/sample-ingest.json
|
|
26
28
|
batch/batch-runner.sh --help
|
|
27
29
|
```
|
|
28
30
|
|
|
@@ -32,12 +34,27 @@ The default reference client posts to the Cold Agent Leads ingest API:
|
|
|
32
34
|
|
|
33
35
|
```http
|
|
34
36
|
POST /api/lead-ingests
|
|
35
|
-
Authorization: Bearer $
|
|
37
|
+
Authorization: Bearer $PUBLIC_LEADS_API_TOKEN
|
|
36
38
|
X-Admin-Email: admin@example.com
|
|
37
39
|
Content-Type: application/json
|
|
38
40
|
```
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
For upstream ingest, set `PUBLIC_LEADS_API`, `PUBLIC_LEADS_API_TOKEN`, and `PUBLIC_LEADS_OPERATOR_EMAIL`; no local Postgres or local Cold Agent Leads server is required. Endpoint details are configurable through environment variables, `config/profile.yml`, or CLI flags. `--target-project /path/to/cold-agent-leads` remains available only as compatibility for reading a local app `.env`. Payloads contain `jobId`, `domains`, `leads`, `results`, and `errors`, with the schema defined in `templates/lead-schema.json`.
|
|
43
|
+
|
|
44
|
+
Run from a Cold Agent Leads checkout without installing local package dependencies:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
cd /Users/charlie/Razroo/cold-agent-leads
|
|
48
|
+
export PUBLIC_LEADS_API=https://cold-agent-leads.example.com
|
|
49
|
+
export PUBLIC_LEADS_API_TOKEN=...
|
|
50
|
+
export PUBLIC_LEADS_OPERATOR_EMAIL=admin@example.com
|
|
51
|
+
npx -p @agent-pattern-labs/leads-rig public-leads pipeline \
|
|
52
|
+
--domains example.com \
|
|
53
|
+
--ingest \
|
|
54
|
+
--out data/lead-results.json \
|
|
55
|
+
--manifest data/lead-manifest.json \
|
|
56
|
+
--ingest-out data/ingest-response.json
|
|
57
|
+
```
|
|
41
58
|
|
|
42
59
|
Legacy aliases `lead-harness` and `create-leads-harness` remain available for compatibility.
|
|
43
60
|
|
|
@@ -53,7 +70,7 @@ gh run watch
|
|
|
53
70
|
You can also publish by creating a GitHub release for the package version:
|
|
54
71
|
|
|
55
72
|
```bash
|
|
56
|
-
gh release create v0.1.
|
|
73
|
+
gh release create v0.1.4 --title v0.1.4 --generate-notes
|
|
57
74
|
```
|
|
58
75
|
|
|
59
76
|
The package version must not already exist on npm.
|
|
@@ -51,7 +51,7 @@ write('package.json', JSON.stringify({
|
|
|
51
51
|
'update-harness': 'npm install @agent-pattern-labs/leads-rig@latest && public-leads sync',
|
|
52
52
|
},
|
|
53
53
|
dependencies: {
|
|
54
|
-
'@agent-pattern-labs/leads-rig': '^0.1.
|
|
54
|
+
'@agent-pattern-labs/leads-rig': '^0.1.4',
|
|
55
55
|
},
|
|
56
56
|
engines: {
|
|
57
57
|
node: '>=20.6.0',
|
|
@@ -143,7 +143,7 @@ npm run verify
|
|
|
143
143
|
opencode
|
|
144
144
|
\`\`\`
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
Set \`PUBLIC_LEADS_API\`, \`PUBLIC_LEADS_API_TOKEN\`, and \`PUBLIC_LEADS_OPERATOR_EMAIL\` for upstream ingest. Add domains to \`data/domains.tsv\` or \`data/pipeline.md\`.
|
|
147
147
|
`);
|
|
148
148
|
|
|
149
149
|
console.log('\nNext: npm install, then edit config/profile.yml and data/domains.tsv.\n');
|
package/bin/lead-harness.mjs
CHANGED
|
@@ -23,80 +23,80 @@ const commands = {
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
const helperAliases = {
|
|
26
|
-
'trace:list': ['@
|
|
27
|
-
'trace:stats': ['@
|
|
28
|
-
'trace:show': ['@
|
|
29
|
-
'guard:audit': ['@
|
|
30
|
-
'guard:explain': ['@
|
|
31
|
-
'ledger:status': ['@
|
|
32
|
-
'ledger:rebuild': ['@
|
|
33
|
-
'ledger:verify': ['@
|
|
34
|
-
'capabilities:list': ['@
|
|
35
|
-
'capabilities:explain': ['@
|
|
36
|
-
'capabilities:check': ['@
|
|
37
|
-
'context:list': ['@
|
|
38
|
-
'context:explain': ['@
|
|
39
|
-
'context:plan': ['@
|
|
40
|
-
'context:check': ['@
|
|
41
|
-
'context:render': ['@
|
|
42
|
-
'cache:key': ['@
|
|
43
|
-
'cache:has': ['@
|
|
44
|
-
'cache:get': ['@
|
|
45
|
-
'cache:put': ['@
|
|
46
|
-
'cache:status': ['@
|
|
47
|
-
'cache:list': ['@
|
|
48
|
-
'cache:verify': ['@
|
|
49
|
-
'cache:prune': ['@
|
|
50
|
-
'index:build': ['@
|
|
51
|
-
'index:status': ['@
|
|
52
|
-
'index:query': ['@
|
|
53
|
-
'index:has': ['@
|
|
54
|
-
'index:verify': ['@
|
|
55
|
-
'facts:build': ['@
|
|
56
|
-
'facts:status': ['@
|
|
57
|
-
'facts:query': ['@
|
|
58
|
-
'facts:has': ['@
|
|
59
|
-
'facts:verify': ['@
|
|
60
|
-
'score:compute': ['@
|
|
61
|
-
'score:verify': ['@
|
|
62
|
-
'score:check': ['@
|
|
63
|
-
'score:gate': ['@
|
|
64
|
-
'score:compare': ['@
|
|
65
|
-
'score:explain': ['@
|
|
66
|
-
'canon:normalize': ['@
|
|
67
|
-
'canon:key': ['@
|
|
68
|
-
'canon:compare': ['@
|
|
69
|
-
'canon:explain': ['@
|
|
70
|
-
'preflight:plan': ['@
|
|
71
|
-
'preflight:check': ['@
|
|
72
|
-
'preflight:explain': ['@
|
|
73
|
-
'postflight:status': ['@
|
|
74
|
-
'postflight:check': ['@
|
|
75
|
-
'postflight:explain': ['@
|
|
76
|
-
'timeline:status': ['@
|
|
77
|
-
'timeline:build': ['@
|
|
78
|
-
'timeline:plan': ['@
|
|
79
|
-
'timeline:due': ['@
|
|
80
|
-
'timeline:check': ['@
|
|
81
|
-
'timeline:verify': ['@
|
|
82
|
-
'prioritize:status': ['@
|
|
83
|
-
'prioritize:items': ['@
|
|
84
|
-
'prioritize:build': ['@
|
|
85
|
-
'prioritize:rank': ['@
|
|
86
|
-
'prioritize:select': ['@
|
|
87
|
-
'prioritize:check': ['@
|
|
88
|
-
'prioritize:verify': ['@
|
|
89
|
-
'lineage:status': ['@
|
|
90
|
-
'lineage:record': ['@
|
|
91
|
-
'lineage:check': ['@
|
|
92
|
-
'lineage:stale': ['@
|
|
93
|
-
'lineage:verify': ['@
|
|
94
|
-
'redact:scan': ['@
|
|
95
|
-
'redact:verify': ['@
|
|
96
|
-
'redact:apply': ['@
|
|
97
|
-
'migrate:plan': ['@
|
|
98
|
-
'migrate:apply': ['@
|
|
99
|
-
'migrate:check': ['@
|
|
26
|
+
'trace:list': ['@agent-pattern-labs/iso-trace', 'list'],
|
|
27
|
+
'trace:stats': ['@agent-pattern-labs/iso-trace', 'stats'],
|
|
28
|
+
'trace:show': ['@agent-pattern-labs/iso-trace', 'show'],
|
|
29
|
+
'guard:audit': ['@agent-pattern-labs/iso-guard', 'audit'],
|
|
30
|
+
'guard:explain': ['@agent-pattern-labs/iso-guard', 'explain'],
|
|
31
|
+
'ledger:status': ['@agent-pattern-labs/iso-ledger', 'status'],
|
|
32
|
+
'ledger:rebuild': ['@agent-pattern-labs/iso-ledger', 'rebuild'],
|
|
33
|
+
'ledger:verify': ['@agent-pattern-labs/iso-ledger', 'verify'],
|
|
34
|
+
'capabilities:list': ['@agent-pattern-labs/iso-capabilities', 'list'],
|
|
35
|
+
'capabilities:explain': ['@agent-pattern-labs/iso-capabilities', 'explain'],
|
|
36
|
+
'capabilities:check': ['@agent-pattern-labs/iso-capabilities', 'check'],
|
|
37
|
+
'context:list': ['@agent-pattern-labs/iso-context', 'list'],
|
|
38
|
+
'context:explain': ['@agent-pattern-labs/iso-context', 'explain'],
|
|
39
|
+
'context:plan': ['@agent-pattern-labs/iso-context', 'plan'],
|
|
40
|
+
'context:check': ['@agent-pattern-labs/iso-context', 'check'],
|
|
41
|
+
'context:render': ['@agent-pattern-labs/iso-context', 'render'],
|
|
42
|
+
'cache:key': ['@agent-pattern-labs/iso-cache', 'key'],
|
|
43
|
+
'cache:has': ['@agent-pattern-labs/iso-cache', 'has'],
|
|
44
|
+
'cache:get': ['@agent-pattern-labs/iso-cache', 'get'],
|
|
45
|
+
'cache:put': ['@agent-pattern-labs/iso-cache', 'put'],
|
|
46
|
+
'cache:status': ['@agent-pattern-labs/iso-cache', 'status'],
|
|
47
|
+
'cache:list': ['@agent-pattern-labs/iso-cache', 'list'],
|
|
48
|
+
'cache:verify': ['@agent-pattern-labs/iso-cache', 'verify'],
|
|
49
|
+
'cache:prune': ['@agent-pattern-labs/iso-cache', 'prune'],
|
|
50
|
+
'index:build': ['@agent-pattern-labs/iso-index', 'build'],
|
|
51
|
+
'index:status': ['@agent-pattern-labs/iso-index', 'status'],
|
|
52
|
+
'index:query': ['@agent-pattern-labs/iso-index', 'query'],
|
|
53
|
+
'index:has': ['@agent-pattern-labs/iso-index', 'has'],
|
|
54
|
+
'index:verify': ['@agent-pattern-labs/iso-index', 'verify'],
|
|
55
|
+
'facts:build': ['@agent-pattern-labs/iso-facts', 'build'],
|
|
56
|
+
'facts:status': ['@agent-pattern-labs/iso-facts', 'status'],
|
|
57
|
+
'facts:query': ['@agent-pattern-labs/iso-facts', 'query'],
|
|
58
|
+
'facts:has': ['@agent-pattern-labs/iso-facts', 'has'],
|
|
59
|
+
'facts:verify': ['@agent-pattern-labs/iso-facts', 'verify'],
|
|
60
|
+
'score:compute': ['@agent-pattern-labs/iso-score', 'compute'],
|
|
61
|
+
'score:verify': ['@agent-pattern-labs/iso-score', 'verify'],
|
|
62
|
+
'score:check': ['@agent-pattern-labs/iso-score', 'check'],
|
|
63
|
+
'score:gate': ['@agent-pattern-labs/iso-score', 'gate'],
|
|
64
|
+
'score:compare': ['@agent-pattern-labs/iso-score', 'compare'],
|
|
65
|
+
'score:explain': ['@agent-pattern-labs/iso-score', 'explain'],
|
|
66
|
+
'canon:normalize': ['@agent-pattern-labs/iso-canon', 'normalize'],
|
|
67
|
+
'canon:key': ['@agent-pattern-labs/iso-canon', 'key'],
|
|
68
|
+
'canon:compare': ['@agent-pattern-labs/iso-canon', 'compare'],
|
|
69
|
+
'canon:explain': ['@agent-pattern-labs/iso-canon', 'explain'],
|
|
70
|
+
'preflight:plan': ['@agent-pattern-labs/iso-preflight', 'plan'],
|
|
71
|
+
'preflight:check': ['@agent-pattern-labs/iso-preflight', 'check'],
|
|
72
|
+
'preflight:explain': ['@agent-pattern-labs/iso-preflight', 'explain'],
|
|
73
|
+
'postflight:status': ['@agent-pattern-labs/iso-postflight', 'status'],
|
|
74
|
+
'postflight:check': ['@agent-pattern-labs/iso-postflight', 'check'],
|
|
75
|
+
'postflight:explain': ['@agent-pattern-labs/iso-postflight', 'explain'],
|
|
76
|
+
'timeline:status': ['@agent-pattern-labs/iso-timeline', 'status'],
|
|
77
|
+
'timeline:build': ['@agent-pattern-labs/iso-timeline', 'build'],
|
|
78
|
+
'timeline:plan': ['@agent-pattern-labs/iso-timeline', 'plan'],
|
|
79
|
+
'timeline:due': ['@agent-pattern-labs/iso-timeline', 'due'],
|
|
80
|
+
'timeline:check': ['@agent-pattern-labs/iso-timeline', 'check'],
|
|
81
|
+
'timeline:verify': ['@agent-pattern-labs/iso-timeline', 'verify'],
|
|
82
|
+
'prioritize:status': ['@agent-pattern-labs/iso-prioritize', 'status'],
|
|
83
|
+
'prioritize:items': ['@agent-pattern-labs/iso-prioritize', 'items'],
|
|
84
|
+
'prioritize:build': ['@agent-pattern-labs/iso-prioritize', 'build'],
|
|
85
|
+
'prioritize:rank': ['@agent-pattern-labs/iso-prioritize', 'rank'],
|
|
86
|
+
'prioritize:select': ['@agent-pattern-labs/iso-prioritize', 'select'],
|
|
87
|
+
'prioritize:check': ['@agent-pattern-labs/iso-prioritize', 'check'],
|
|
88
|
+
'prioritize:verify': ['@agent-pattern-labs/iso-prioritize', 'verify'],
|
|
89
|
+
'lineage:status': ['@agent-pattern-labs/iso-lineage', 'status'],
|
|
90
|
+
'lineage:record': ['@agent-pattern-labs/iso-lineage', 'record'],
|
|
91
|
+
'lineage:check': ['@agent-pattern-labs/iso-lineage', 'check'],
|
|
92
|
+
'lineage:stale': ['@agent-pattern-labs/iso-lineage', 'stale'],
|
|
93
|
+
'lineage:verify': ['@agent-pattern-labs/iso-lineage', 'verify'],
|
|
94
|
+
'redact:scan': ['@agent-pattern-labs/iso-redact', 'scan'],
|
|
95
|
+
'redact:verify': ['@agent-pattern-labs/iso-redact', 'verify'],
|
|
96
|
+
'redact:apply': ['@agent-pattern-labs/iso-redact', 'apply'],
|
|
97
|
+
'migrate:plan': ['@agent-pattern-labs/iso-migrate', 'plan'],
|
|
98
|
+
'migrate:apply': ['@agent-pattern-labs/iso-migrate', 'apply'],
|
|
99
|
+
'migrate:check': ['@agent-pattern-labs/iso-migrate', 'check'],
|
|
100
100
|
};
|
|
101
101
|
|
|
102
102
|
const [, , cmd, ...rest] = process.argv;
|
|
@@ -161,7 +161,7 @@ function runIsoCli(pkgName, args) {
|
|
|
161
161
|
|
|
162
162
|
function defaultIsoArgs(pkgName, subcommand, args) {
|
|
163
163
|
const defaults = [];
|
|
164
|
-
if (pkgName === '@
|
|
164
|
+
if (pkgName === '@agent-pattern-labs/iso-trace') {
|
|
165
165
|
if (!hasFlag(args, '--cwd')) defaults.push('--cwd', PROJECT_DIR);
|
|
166
166
|
if ((subcommand === 'list' || subcommand === 'stats') && !hasFlag(args, '--since')) {
|
|
167
167
|
defaults.push('--since', '7d');
|
|
@@ -2,16 +2,19 @@
|
|
|
2
2
|
# Prefer environment variables for secrets in shared terminals.
|
|
3
3
|
|
|
4
4
|
api:
|
|
5
|
-
# Cold Agent Leads
|
|
6
|
-
#
|
|
7
|
-
base_url: "
|
|
5
|
+
# Set the deployed Cold Agent Leads API base URL through PUBLIC_LEADS_API,
|
|
6
|
+
# or put it here for a non-shared local profile. Example:
|
|
7
|
+
# base_url: "https://cold-agent-leads.example.com"
|
|
8
|
+
base_url: ""
|
|
8
9
|
ingest_path: "/api/lead-ingests"
|
|
10
|
+
# Optional compatibility only: set when reading ADMIN_API_TOKEN/ADMIN_EMAILS
|
|
11
|
+
# from a local cold-agent-leads checkout. Not needed for upstream ingest.
|
|
9
12
|
target_project: ""
|
|
10
|
-
operator_email: "
|
|
13
|
+
operator_email: ""
|
|
11
14
|
operator_email_header: "X-Admin-Email"
|
|
12
15
|
auth_header: "Authorization"
|
|
13
16
|
auth_scheme: "Bearer"
|
|
14
|
-
auth_token_env: "
|
|
17
|
+
auth_token_env: "PUBLIC_LEADS_API_TOKEN"
|
|
15
18
|
|
|
16
19
|
crawl:
|
|
17
20
|
max_pages: 10
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -68,10 +68,10 @@ domain input
|
|
|
68
68
|
| `scripts/validate-leads.mjs` | Normalizes and validates JSON/JSONL lead artifacts |
|
|
69
69
|
| `scripts/manifest.mjs` | Records validated batches in `data/lead-manifest.json` |
|
|
70
70
|
| `scripts/ingest.mjs` | Posts to the configured ingest endpoint |
|
|
71
|
-
| `scripts/batch-orchestrator.mjs` | Durable batch runner using `@
|
|
71
|
+
| `scripts/batch-orchestrator.mjs` | Durable batch runner using `@agent-pattern-labs/iso-orchestrator` |
|
|
72
72
|
| `verify-pipeline.mjs` | Repo/consumer health gate |
|
|
73
73
|
|
|
74
|
-
The package also carries the `@
|
|
74
|
+
The package also carries the `@agent-pattern-labs/iso-*` helper ecosystem for trace, guard, ledger, cache, canon, context, preflight, postflight, prioritize, lineage, redact, migrate, score, and timeline commands.
|
|
75
75
|
|
|
76
76
|
## Data Contract
|
|
77
77
|
|
|
@@ -82,4 +82,4 @@ The package also carries the `@razroo/iso-*` helper ecosystem for trace, guard,
|
|
|
82
82
|
- page visits
|
|
83
83
|
- ingest requests
|
|
84
84
|
|
|
85
|
-
The validator intentionally accepts the same defaults the local runtime normalizes, but it fails missing source evidence, invalid URL fields, invalid `emailType`, invalid `verificationStatus`, invalid confidence,
|
|
85
|
+
The validator intentionally accepts the same defaults the local runtime normalizes, but it fails missing source evidence, invalid URL fields, invalid `emailType`, invalid `verificationStatus`, invalid confidence, person/role leads without email, and generic catch-all inboxes such as `info@`, `hello@`, or similar organizational aliases.
|
package/docs/CONSTRUCTION.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
| Deterministic helpers | `scripts/crawl.mjs`, `scripts/pipeline.mjs`, `scripts/validate-leads.mjs`, `scripts/manifest.mjs`, `scripts/ingest.mjs`, `scripts/batch-orchestrator.mjs` |
|
|
15
15
|
| Consumer scaffold | `create-public-leads-harness <dir>` writes local config, input, output, and ignore files |
|
|
16
16
|
| Consumer sync | `public-leads sync` symlinks shared harness files from the installed package |
|
|
17
|
-
| Batch orchestration | `batch/batch-runner.sh` delegates to `@
|
|
17
|
+
| Batch orchestration | `batch/batch-runner.sh` delegates to `@agent-pattern-labs/iso-orchestrator` with bounded parallelism |
|
|
18
18
|
| Verification gates | `npm run verify`, `npm run smoke:iso`, sample validate/manifest/ingest, `npm pack` |
|
|
19
19
|
|
|
20
20
|
## Maintainer Rules
|
|
@@ -37,4 +37,4 @@
|
|
|
37
37
|
6. Run `npm audit`.
|
|
38
38
|
7. Run `npm pack` and confirm generated runtime surfaces are included.
|
|
39
39
|
8. Scaffold a clean consumer project and test install-time sync from the packed package or source tree.
|
|
40
|
-
9. Publish through GitHub Actions with `gh workflow run publish.yml --ref main`, or create a published release with `gh release create v0.1.
|
|
40
|
+
9. Publish through GitHub Actions with `gh workflow run publish.yml --ref main`, or create a published release with `gh release create v0.1.4 --title v0.1.4 --generate-notes`.
|
package/docs/SETUP.md
CHANGED
|
@@ -32,7 +32,9 @@ Then edit:
|
|
|
32
32
|
Use environment variables for secrets:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
|
-
export
|
|
35
|
+
export PUBLIC_LEADS_API=https://cold-agent-leads.example.com
|
|
36
|
+
export PUBLIC_LEADS_API_TOKEN=...
|
|
37
|
+
export PUBLIC_LEADS_OPERATOR_EMAIL=admin@example.com
|
|
36
38
|
```
|
|
37
39
|
|
|
38
40
|
## Validate A Payload
|
|
@@ -51,27 +53,43 @@ npx public-leads pipeline --input data/domains.tsv --out data/lead-results.json
|
|
|
51
53
|
## Dry-Run Ingest
|
|
52
54
|
|
|
53
55
|
```bash
|
|
54
|
-
npx public-leads ingest --input examples/sample-leads.json --dry-run --out output/sample-ingest.json
|
|
56
|
+
PUBLIC_LEADS_API=https://cold-agent-leads.example.com npx public-leads ingest --input examples/sample-leads.json --dry-run --out output/sample-ingest.json
|
|
55
57
|
```
|
|
56
58
|
|
|
57
59
|
## Live Ingest
|
|
58
60
|
|
|
59
61
|
```bash
|
|
60
|
-
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
61
|
-
npx public-leads ingest --input data/lead-results.json
|
|
62
|
+
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
63
|
+
npx public-leads ingest --input data/lead-results.json
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Run from `/Users/charlie/Razroo/cold-agent-leads` without local Postgres or a local API:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
cd /Users/charlie/Razroo/cold-agent-leads
|
|
70
|
+
export PUBLIC_LEADS_API=https://cold-agent-leads.example.com
|
|
71
|
+
export PUBLIC_LEADS_API_TOKEN=...
|
|
72
|
+
export PUBLIC_LEADS_OPERATOR_EMAIL=admin@example.com
|
|
73
|
+
npx -p @agent-pattern-labs/leads-rig public-leads pipeline \
|
|
74
|
+
--domains example.com \
|
|
75
|
+
--ingest \
|
|
76
|
+
--out data/lead-results.json \
|
|
77
|
+
--manifest data/lead-manifest.json \
|
|
78
|
+
--ingest-out data/ingest-response.json
|
|
62
79
|
```
|
|
63
80
|
|
|
64
81
|
Required request settings come from flags, environment, or `config/profile.yml`:
|
|
65
82
|
|
|
66
83
|
- `api.base_url`
|
|
67
84
|
- `api.ingest_path`
|
|
68
|
-
- `api.target_project`
|
|
69
85
|
- `api.operator_email`
|
|
70
86
|
- `api.operator_email_header`
|
|
71
87
|
- `api.auth_header`
|
|
72
88
|
- `api.auth_scheme`
|
|
73
89
|
- `api.auth_token_env`
|
|
74
90
|
|
|
91
|
+
Use `api.target_project` only when intentionally reading credentials from a local Cold Agent Leads checkout. Upstream ingest should use `PUBLIC_LEADS_API`, `PUBLIC_LEADS_API_TOKEN`, and `PUBLIC_LEADS_OPERATOR_EMAIL`.
|
|
92
|
+
|
|
75
93
|
## Batch
|
|
76
94
|
|
|
77
95
|
Create `batch/batch-input.tsv`:
|
|
@@ -44,10 +44,10 @@ Available commands:
|
|
|
44
44
|
|
|
45
45
|
Local commands:
|
|
46
46
|
npx public-leads crawl --input data/domains.tsv --out data/lead-results.json
|
|
47
|
-
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
47
|
+
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
48
48
|
npx public-leads validate --input data/lead-results.json
|
|
49
49
|
npx public-leads manifest --input data/lead-results.json
|
|
50
|
-
npx public-leads ingest --input data/lead-results.json
|
|
50
|
+
npx public-leads ingest --input data/lead-results.json
|
|
51
51
|
npx public-leads verify
|
|
52
52
|
```
|
|
53
53
|
|
|
@@ -44,10 +44,10 @@ Available commands:
|
|
|
44
44
|
|
|
45
45
|
Local commands:
|
|
46
46
|
npx public-leads crawl --input data/domains.tsv --out data/lead-results.json
|
|
47
|
-
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
47
|
+
npx public-leads pipeline --input data/domains.tsv --ingest
|
|
48
48
|
npx public-leads validate --input data/lead-results.json
|
|
49
49
|
npx public-leads manifest --input data/lead-results.json
|
|
50
|
-
npx public-leads ingest --input data/lead-results.json
|
|
50
|
+
npx public-leads ingest --input data/lead-results.json
|
|
51
51
|
npx public-leads verify
|
|
52
52
|
```
|
|
53
53
|
|
package/iso/instructions.md
CHANGED
|
@@ -4,7 +4,7 @@ Agentic public-web lead discovery harness. It crawls company domains, extracts r
|
|
|
4
4
|
|
|
5
5
|
## Hard Limits
|
|
6
6
|
|
|
7
|
-
- [H1] Only collect public-source business contact data. Do not infer, guess, brute-force, or enrich private email addresses. Every lead needs a source URL and evidence excerpt.
|
|
7
|
+
- [H1] Only collect public-source business contact data. Do not infer, guess, brute-force, or enrich private email addresses. Every lead needs a source URL and evidence excerpt. The primary goal is named people, not generic company inboxes.
|
|
8
8
|
- [H2] Respect robots.txt, terms, rate limits, and site intent. If a page blocks crawling or is not public, record a warning and move on.
|
|
9
9
|
- [H3] Never send outreach from this harness. The output is reviewable lead records and ingest-ready artifacts, not email campaigns.
|
|
10
10
|
- [H4] Use file-backed artifacts before ingest. A subagent prose summary is not enough; write validated JSON/JSONL first, then ingest.
|
|
@@ -18,7 +18,7 @@ Agentic public-web lead discovery harness. It crawls company domains, extracts r
|
|
|
18
18
|
- [D2] Use deterministic local helpers when they can validate, normalize, manifest, preflight, postflight, or ingest artifacts.
|
|
19
19
|
- [D3] Read the active mode file before executing. Mode files own output shapes and gates.
|
|
20
20
|
- [D4] Prefer official company websites and high-signal pages: home, contact, about, team, leadership, people, press, blog, careers, and legal pages.
|
|
21
|
-
- [D5] Keep artifacts source-backed. Every emitted lead should include `domain`, `sourceUrl`, `evidence`, `emailType`, `extractionMethod`, `verificationStatus`, and `confidence`.
|
|
21
|
+
- [D5] Keep artifacts source-backed. Every emitted lead should include `domain`, `sourceUrl`, `evidence`, `emailType`, `extractionMethod`, `verificationStatus`, and `confidence`. Reject generic catch-all inboxes such as `info@`, `hello@`, `contact@`, `support@`, `team@`, and similar aliases; if no named person is available, prefer a `contact_path` record instead.
|
|
22
22
|
|
|
23
23
|
## Procedure
|
|
24
24
|
|