@codedrifters/configulator 0.0.258 → 0.0.260
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/lib/index.d.mts +7 -6
- package/lib/index.d.ts +7 -6
- package/lib/index.js +968 -73
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +968 -73
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -2432,7 +2432,7 @@ var bcmWriterBundle = {
|
|
|
2432
2432
|
// src/agent/bundles/company-profile.ts
|
|
2433
2433
|
var companyProfileAnalystSubAgent = {
|
|
2434
2434
|
name: "company-profile-analyst",
|
|
2435
|
-
description: "Researches an external company (competitor, vendor, partner, customer, etc.) from public sources and produces a structured markdown profile, then enqueues downstream `people:research` and `software:research` issues for notable people and software products surfaced during profiling. One company per session, tracked by company:* GitHub issue labels.",
|
|
2435
|
+
description: "Researches an external company (competitor, vendor, partner, customer, etc.) from public sources and produces a structured markdown profile, then enqueues downstream `people:research` and `software:research` issues for notable people and software products surfaced during profiling. Also handles profile enrichment against business-model canvases (`company:match`), maintenance refreshes on a configurable staleness cadence (`company:refresh`), and cross-profile competitive synthesis for a segment (`company:analyze`). One company or segment per session, tracked by company:* GitHub issue labels.",
|
|
2436
2436
|
model: AGENT_MODEL.POWERFUL,
|
|
2437
2437
|
maxTurns: 80,
|
|
2438
2438
|
platforms: { cursor: { exclude: true } },
|
|
@@ -2440,9 +2440,11 @@ var companyProfileAnalystSubAgent = {
|
|
|
2440
2440
|
"# Company Profile Analyst Agent",
|
|
2441
2441
|
"",
|
|
2442
2442
|
"You research a single external company from public sources and write",
|
|
2443
|
-
"a structured markdown profile
|
|
2444
|
-
"
|
|
2445
|
-
"
|
|
2443
|
+
"a structured markdown profile, then maintain it as facts drift and",
|
|
2444
|
+
"roll profiles up into segment-level competitive analysis. Each",
|
|
2445
|
+
"session claims one GitHub issue \u2014 one phase, one company (or one",
|
|
2446
|
+
"segment for `company:analyze`) \u2014 and produces files on disk plus",
|
|
2447
|
+
"optional follow-up research issues.",
|
|
2446
2448
|
"",
|
|
2447
2449
|
"This agent is **domain-neutral**. It makes no assumptions about what",
|
|
2448
2450
|
"the consuming project sells, which industry it serves, or which",
|
|
@@ -2459,7 +2461,9 @@ var companyProfileAnalystSubAgent = {
|
|
|
2459
2461
|
"## Design Principles",
|
|
2460
2462
|
"",
|
|
2461
2463
|
"1. **One company per session.** Never profile two companies in a",
|
|
2462
|
-
" single session, even if they came up together.",
|
|
2464
|
+
" single session, even if they came up together. The `company:analyze`",
|
|
2465
|
+
" phase is the single exception \u2014 it synthesizes across multiple",
|
|
2466
|
+
" profiles in **one segment** but never researches a new company.",
|
|
2463
2467
|
"2. **Public sources only.** Use the company's own site, press, product",
|
|
2464
2468
|
" docs, job listings, and other public material. Do not attempt to",
|
|
2465
2469
|
" access gated or paywalled content unless the invoking issue body",
|
|
@@ -2479,6 +2483,12 @@ var companyProfileAnalystSubAgent = {
|
|
|
2479
2483
|
" `people-profile` bundle via `people:research` issues; software",
|
|
2480
2484
|
" products are handed off to the `software-profile` bundle via",
|
|
2481
2485
|
" `software:research` issues.",
|
|
2486
|
+
"7. **Enrichment is not re-research.** `company:match` reads existing",
|
|
2487
|
+
" docs and edits the profile; it never runs web searches. Refresh is",
|
|
2488
|
+
" the only maintenance phase that goes back to the public web.",
|
|
2489
|
+
"8. **Synthesis waits for drafts.** `company:analyze` blocks if any",
|
|
2490
|
+
" `company:draft` issues for the target segment are still open.",
|
|
2491
|
+
" Never publish a partial landscape.",
|
|
2482
2492
|
"",
|
|
2483
2493
|
"---",
|
|
2484
2494
|
"",
|
|
@@ -2513,6 +2523,24 @@ var companyProfileAnalystSubAgent = {
|
|
|
2513
2523
|
"\u2502 bounded notes \u2502 \u2502 the configured path \u2502 \u2502 for people and \u2502",
|
|
2514
2524
|
"\u2502 file \u2502 \u2502 \u2502 \u2502 software surfaced \u2502",
|
|
2515
2525
|
"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
|
|
2526
|
+
" \u2502",
|
|
2527
|
+
" \u25BC",
|
|
2528
|
+
" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510",
|
|
2529
|
+
" \u2502 4. MATCH \u2502",
|
|
2530
|
+
" \u2502 Enrich profile \u2502",
|
|
2531
|
+
" \u2502 with business- \u2502",
|
|
2532
|
+
" \u2502 model and segment \u2502",
|
|
2533
|
+
" \u2502 context. No web. \u2502",
|
|
2534
|
+
" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
|
|
2535
|
+
"",
|
|
2536
|
+
"\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510",
|
|
2537
|
+
"\u2502 5. REFRESH \u2502 (cadence-driven, \u2502 6. ANALYZE \u2502",
|
|
2538
|
+
"\u2502 Re-verify an \u2502 or on-demand) \u2502 Synthesize across \u2502",
|
|
2539
|
+
"\u2502 existing profile \u2502 \u2502 profiles in one \u2502",
|
|
2540
|
+
"\u2502 with targeted web \u2502 \u2502 segment. No web. \u2502",
|
|
2541
|
+
"\u2502 searches. Update \u2502 \u2502 Blocks on open \u2502",
|
|
2542
|
+
"\u2502 in place. \u2502 \u2502 company:draft. \u2502",
|
|
2543
|
+
"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
|
|
2516
2544
|
"```",
|
|
2517
2545
|
"",
|
|
2518
2546
|
"**Issue labels encode the phase:**",
|
|
@@ -2520,41 +2548,87 @@ var companyProfileAnalystSubAgent = {
|
|
|
2520
2548
|
"| Label | Phase | Session work |",
|
|
2521
2549
|
"|-------|-------|-------------|",
|
|
2522
2550
|
"| `company:research` | 1. Research | Gather public sources. Write a bounded research-notes file. Create the draft issue. |",
|
|
2523
|
-
"| `company:draft` | 2. Draft | Read the research notes. Write the structured profile to `<PROFILES_DIR>`. Create the
|
|
2551
|
+
"| `company:draft` | 2. Draft | Read the research notes. Write the structured profile to `<PROFILES_DIR>`. Create the followup and (if enabled) match issues. |",
|
|
2524
2552
|
"| `company:followup` | 3. Followup | Read the profile. Enqueue people/software research issues for items surfaced in the profile. |",
|
|
2553
|
+
"| `company:match` | 4. Match | Read the profile. Enrich it with business-model, segment, and size context from existing docs. Bidirectionally cross-link matched business-model files. No web. |",
|
|
2554
|
+
"| `company:refresh` | 5. Refresh | Read an existing profile. Run 4\u20136 targeted web searches for recent developments. Update the profile in place and add a revision-history entry. |",
|
|
2555
|
+
"| `company:analyze` | 6. Analyze | Read every profile in one segment. Write a segment-level competitive-analysis document combining feature matrix, positioning, and strategic implications. No web. |",
|
|
2525
2556
|
"",
|
|
2526
2557
|
"All issues also carry `type:company-profile` and a `status:*` label.",
|
|
2527
2558
|
"",
|
|
2528
|
-
"**Issue count per company cycle:** 1 research + 1 draft + 0\u20131 followup
|
|
2529
|
-
"**2\
|
|
2530
|
-
"
|
|
2559
|
+
"**Issue count per company cycle:** 1 research + 1 draft + 0\u20131 followup +",
|
|
2560
|
+
"0\u20131 match = **2\u20134 sessions** on the initial cycle. `company:refresh`",
|
|
2561
|
+
"and `company:analyze` are independent downstream cycles that run on",
|
|
2562
|
+
"their own cadence.",
|
|
2531
2563
|
"",
|
|
2532
2564
|
"**Shortened paths:**",
|
|
2533
2565
|
"- Research phase determines the company is out of scope (not",
|
|
2534
2566
|
" relevant, insufficient public material) \u2192 research issue closes",
|
|
2535
2567
|
" with a justification and no downstream issues are created \u2192 **1 session**.",
|
|
2536
|
-
"- Short profile with no follow-ups needed
|
|
2568
|
+
"- Short profile with no follow-ups needed and no business-model",
|
|
2569
|
+
" context to match against \u2192 **2 sessions**.",
|
|
2570
|
+
"- Refresh that finds no material change \u2192 **1 session** (revision-",
|
|
2571
|
+
" history entry only, profile body unchanged).",
|
|
2537
2572
|
"",
|
|
2538
2573
|
"---",
|
|
2539
2574
|
"",
|
|
2540
2575
|
"## Configurable Paths",
|
|
2541
2576
|
"",
|
|
2542
2577
|
"The pipeline uses these placeholders. Consuming projects override the",
|
|
2543
|
-
"defaults by passing paths in the `/profile-company
|
|
2544
|
-
"or
|
|
2578
|
+
"defaults by passing paths in the `/profile-company`, `/match-company`,",
|
|
2579
|
+
"`/refresh-company`, or `/analyze-segment` skill invocations, or by",
|
|
2580
|
+
"extending this rule in their own `agentConfig.rules`.",
|
|
2545
2581
|
"",
|
|
2546
2582
|
"| Placeholder | Meaning | Default |",
|
|
2547
2583
|
"|-------------|---------|---------|",
|
|
2548
2584
|
"| `<COMPANY_ROOT>` | Root folder for company profiles | `docs/companies/` |",
|
|
2549
2585
|
"| `<PROFILES_DIR>` | Final company profile files | `<COMPANY_ROOT>/profiles/` |",
|
|
2550
2586
|
"| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<COMPANY_ROOT>/notes/` |",
|
|
2587
|
+
"| `<ANALYSIS_DIR>` | Segment-level competitive-analysis documents from Phase 6 | `<COMPANY_ROOT>/analysis/` |",
|
|
2551
2588
|
"| `<COMPANY_SLUG>` | Short kebab-case slug identifying the company | derived from the company name |",
|
|
2589
|
+
"| `<SEGMENT_SLUG>` | Short kebab-case slug identifying the industry segment | derived from the segment name |",
|
|
2590
|
+
"| `<BUSINESS_MODELS_ROOT>` | Where existing business-model canvases live (consumed by Phase 4) | `docs/src/content/docs/industry-research/` |",
|
|
2552
2591
|
"| `<PEOPLE_PROFILES_DIR>` | Where existing people profiles live (for duplicate detection during followup) | `docs/people/profiles/` |",
|
|
2553
2592
|
"| `<SOFTWARE_PROFILES_DIR>` | Where existing software profiles live (for duplicate detection during followup) | `docs/software/profiles/` |",
|
|
2554
2593
|
"",
|
|
2555
2594
|
"If `docs/src/content/docs/project-context.md` specifies a different company-research",
|
|
2556
2595
|
"tree (for example by reusing the research-pipeline deliverables",
|
|
2557
2596
|
"folder), prefer that. Otherwise fall back to the defaults above.",
|
|
2597
|
+
"Business-model canvases are managed by the `business-models` bundle \u2014",
|
|
2598
|
+
"this agent is a **read-only consumer** of `<BUSINESS_MODELS_ROOT>`,",
|
|
2599
|
+
"with the single exception of appending a bidirectional cross-link",
|
|
2600
|
+
"back to the matched profile (Phase 4, Step 6).",
|
|
2601
|
+
"",
|
|
2602
|
+
"---",
|
|
2603
|
+
"",
|
|
2604
|
+
"## Refresh Cadence",
|
|
2605
|
+
"",
|
|
2606
|
+
"Profiles go stale. Companies launch products, raise rounds, rotate",
|
|
2607
|
+
"leadership, or pivot. The pipeline supports a configurable refresh",
|
|
2608
|
+
"cadence so `company:refresh` issues can be filed on a schedule",
|
|
2609
|
+
"without hardcoding the interval:",
|
|
2610
|
+
"",
|
|
2611
|
+
"- **Default staleness threshold:** 180 days from the profile's",
|
|
2612
|
+
" `date` frontmatter.",
|
|
2613
|
+
"- **Override:** the invoking issue body may specify a `refresh_days: N`",
|
|
2614
|
+
" field, or the consuming project may set a project-wide default in",
|
|
2615
|
+
" `docs/src/content/docs/project-context.md` (look for a",
|
|
2616
|
+
" `## Refresh Cadence` section) or in `agentConfig.rules`.",
|
|
2617
|
+
"",
|
|
2618
|
+
"When the `/refresh-company` skill is invoked for a slug that already",
|
|
2619
|
+
"has a profile:",
|
|
2620
|
+
"",
|
|
2621
|
+
"- If the profile is **younger** than the staleness threshold, the",
|
|
2622
|
+
" skill exits with a message pointing to the existing profile. Pass",
|
|
2623
|
+
" `force: true` in the issue body to refresh anyway.",
|
|
2624
|
+
"- If the profile is **older** than the staleness threshold, the",
|
|
2625
|
+
" pipeline files a `company:refresh` issue and Phase 5 updates the",
|
|
2626
|
+
" existing file in place, preserving its slug and bumping the",
|
|
2627
|
+
" `date` frontmatter.",
|
|
2628
|
+
"",
|
|
2629
|
+
"Refresh mode never changes the profile's primary type without an",
|
|
2630
|
+
"explicit override in the refresh request \u2014 type changes are material",
|
|
2631
|
+
"and warrant a human review step.",
|
|
2558
2632
|
"",
|
|
2559
2633
|
"---",
|
|
2560
2634
|
"",
|
|
@@ -2563,7 +2637,8 @@ var companyProfileAnalystSubAgent = {
|
|
|
2563
2637
|
"Run this loop exactly once per session. Never start a second issue.",
|
|
2564
2638
|
"",
|
|
2565
2639
|
"1. Claim one open `type:company-profile` issue using phase priority:",
|
|
2566
|
-
" `company:research` > `company:draft` > `company:followup
|
|
2640
|
+
" `company:research` > `company:draft` > `company:followup` >",
|
|
2641
|
+
" `company:match` > `company:refresh` > `company:analyze`.",
|
|
2567
2642
|
"2. Transition `status:ready` \u2192 `status:in-progress` and create the",
|
|
2568
2643
|
" branch per your project's branch-naming convention.",
|
|
2569
2644
|
"3. Execute the phase handler that matches the issue's `company:*`",
|
|
@@ -2672,8 +2747,10 @@ var companyProfileAnalystSubAgent = {
|
|
|
2672
2747
|
" company_type: <one of the taxonomy values>",
|
|
2673
2748
|
" website: <primary URL>",
|
|
2674
2749
|
" date: YYYY-MM-DD",
|
|
2750
|
+
" refresh_days: <N, default 180>",
|
|
2675
2751
|
" parent_issue: <N>",
|
|
2676
2752
|
" notes: <NOTES_DIR>/<COMPANY_SLUG>.notes.md",
|
|
2753
|
+
" referencedIn: []",
|
|
2677
2754
|
" ---",
|
|
2678
2755
|
"",
|
|
2679
2756
|
" # <company name>",
|
|
@@ -2702,6 +2779,10 @@ var companyProfileAnalystSubAgent = {
|
|
|
2702
2779
|
" <stack hints from job listings, product docs, public engineering",
|
|
2703
2780
|
" content \u2014 each bullet cited>",
|
|
2704
2781
|
"",
|
|
2782
|
+
" ## Market Position",
|
|
2783
|
+
" <which segment(s) they play in, where they sit on the",
|
|
2784
|
+
" competitive map, who they compete with \u2014 cited>",
|
|
2785
|
+
"",
|
|
2705
2786
|
" ## Positioning / Differentiation",
|
|
2706
2787
|
" <how they describe themselves and how they differ from adjacent",
|
|
2707
2788
|
" companies \u2014 use their own language, cited, rather than inferred>",
|
|
@@ -2715,6 +2796,11 @@ var companyProfileAnalystSubAgent = {
|
|
|
2715
2796
|
" - **Products / software to evaluate:** <list of candidate product",
|
|
2716
2797
|
" names>",
|
|
2717
2798
|
"",
|
|
2799
|
+
" ## Revision History",
|
|
2800
|
+
" | Date | Changes |",
|
|
2801
|
+
" |------|---------|",
|
|
2802
|
+
" | YYYY-MM-DD | Initial profile |",
|
|
2803
|
+
"",
|
|
2718
2804
|
" ## Sources",
|
|
2719
2805
|
" - <source URL> \u2014 <date accessed>",
|
|
2720
2806
|
" ```",
|
|
@@ -2725,7 +2811,13 @@ var companyProfileAnalystSubAgent = {
|
|
|
2725
2811
|
" note in the draft issue's closing comment that no follow-up is",
|
|
2726
2812
|
" needed.",
|
|
2727
2813
|
"",
|
|
2728
|
-
"5. **
|
|
2814
|
+
"5. **File a `company:match` issue** (depending on this draft issue)",
|
|
2815
|
+
" so the profile gets enriched against the project's business-model",
|
|
2816
|
+
" canvases. Skip the match issue only when the invoking project has",
|
|
2817
|
+
" no business-model canvases at all (Phase 4 will detect and exit",
|
|
2818
|
+
" gracefully in that case).",
|
|
2819
|
+
"",
|
|
2820
|
+
"6. **Commit and push** the profile file. Close the draft issue.",
|
|
2729
2821
|
"",
|
|
2730
2822
|
"---",
|
|
2731
2823
|
"",
|
|
@@ -2821,12 +2913,321 @@ var companyProfileAnalystSubAgent = {
|
|
|
2821
2913
|
"",
|
|
2822
2914
|
"---",
|
|
2823
2915
|
"",
|
|
2916
|
+
"## Phase 4: Match (`company:match`)",
|
|
2917
|
+
"",
|
|
2918
|
+
"**Goal:** Enrich an existing profile with business-model and segment",
|
|
2919
|
+
"context from the adjacent business-model canvases and industry-",
|
|
2920
|
+
"segment descriptions already tracked in the project. Create",
|
|
2921
|
+
"bidirectional cross-links so both the profile and the matched",
|
|
2922
|
+
"business-model document reference each other.",
|
|
2923
|
+
"",
|
|
2924
|
+
"This phase is **enrichment of a known profile**, not entity",
|
|
2925
|
+
"deduplication \u2014 the profile already exists. It is triggered in two",
|
|
2926
|
+
"ways:",
|
|
2927
|
+
"",
|
|
2928
|
+
"1. **Downstream of draft.** Phase 2 files a `company:match` issue",
|
|
2929
|
+
" for every new profile once the draft is committed.",
|
|
2930
|
+
"2. **Downstream of a new business-model canvas.** When the",
|
|
2931
|
+
" `business-models` bundle lands a new canvas (or the orchestrator",
|
|
2932
|
+
" scans for profiles that should be re-matched), `company:match`",
|
|
2933
|
+
" issues are filed for each existing profile that might fit the new",
|
|
2934
|
+
" canvas.",
|
|
2935
|
+
"",
|
|
2936
|
+
"**Budget:** No web searches. Read existing docs, edit the profile,",
|
|
2937
|
+
"cross-link the matched business-model file. Anything that cannot be",
|
|
2938
|
+
"decided from the project's own documents is flagged in the profile's",
|
|
2939
|
+
"`## Risks / Open Questions` section, not resolved with a web search.",
|
|
2940
|
+
"",
|
|
2941
|
+
"### Steps",
|
|
2942
|
+
"",
|
|
2943
|
+
"1. **Read the target profile** at the path referenced in the issue",
|
|
2944
|
+
" body. The issue body must carry the profile path; if it does not,",
|
|
2945
|
+
" close the issue with `status:needs-attention` and stop.",
|
|
2946
|
+
"",
|
|
2947
|
+
"2. **Identify the profile's industry / segment context.** Read the",
|
|
2948
|
+
" profile's `## Summary`, `## Market Position`, and `referencedIn`",
|
|
2949
|
+
" frontmatter to determine which industry(ies) and segment(s) the",
|
|
2950
|
+
" company plays in.",
|
|
2951
|
+
"",
|
|
2952
|
+
"3. **Scan `<BUSINESS_MODELS_ROOT>` for candidate canvases.** Walk",
|
|
2953
|
+
" the directory tree looking for business-model documents in",
|
|
2954
|
+
" relevant segments. A typical layout is",
|
|
2955
|
+
" `<BUSINESS_MODELS_ROOT>/<industry>/segments/<segment>/business-model.md`,",
|
|
2956
|
+
" but consuming projects may use a different layout \u2014 accept any",
|
|
2957
|
+
" markdown file named `business-model*.md` (or matching the pattern",
|
|
2958
|
+
" the consuming project declares in `docs/src/content/docs/project-context.md`).",
|
|
2959
|
+
" If the directory does not exist or contains no canvases, exit",
|
|
2960
|
+
" gracefully: add a short note to the profile's `## Risks / Open",
|
|
2961
|
+
" Questions` section and close the issue.",
|
|
2962
|
+
"",
|
|
2963
|
+
"4. **For each candidate canvas, score the match.** For each canvas:",
|
|
2964
|
+
" - Read the Customer Segments, Key Activities, Value Propositions,",
|
|
2965
|
+
" and Revenue Streams sections (if present).",
|
|
2966
|
+
" - Decide whether the profiled company fits one of the customer",
|
|
2967
|
+
" segments (customer match), offers a competing value proposition",
|
|
2968
|
+
" (competitor match), supplies a key activity as a vendor (vendor",
|
|
2969
|
+
" match), or is named explicitly as a partner (partner match).",
|
|
2970
|
+
" - If the canvas documents size variations (SMB / mid-market /",
|
|
2971
|
+
" enterprise), pick the variation that matches the profiled",
|
|
2972
|
+
" company's size signals (headcount, funding, revenue).",
|
|
2973
|
+
" - Record matches only when the evidence is unambiguous \u2014 skip",
|
|
2974
|
+
" weak or inferred matches.",
|
|
2975
|
+
"",
|
|
2976
|
+
"5. **Enrich the profile.** Add or update a `## Business Model",
|
|
2977
|
+
" Context` section using the template below. Place it after",
|
|
2978
|
+
" `## Market Position` and before `## Positioning / Differentiation`",
|
|
2979
|
+
" so the synthesis flows naturally:",
|
|
2980
|
+
"",
|
|
2981
|
+
" ```markdown",
|
|
2982
|
+
" ## Business Model Context",
|
|
2983
|
+
"",
|
|
2984
|
+
" ### Matched Business Models",
|
|
2985
|
+
"",
|
|
2986
|
+
" | Business Model | Segment | Match Type | Size Variation |",
|
|
2987
|
+
" |----------------|---------|------------|----------------|",
|
|
2988
|
+
" | [<canvas title>](<relative path to business-model.md>) | <segment> | <customer / competitor / vendor / partner> | <SMB / Mid-Market / Enterprise or `n/a`> |",
|
|
2989
|
+
"",
|
|
2990
|
+
" ### Segment Classification",
|
|
2991
|
+
"",
|
|
2992
|
+
" - **Primary segment:** [<segment name>](<relative path to segment index>) \u2014 <one sentence on fit>",
|
|
2993
|
+
" - **Secondary segment(s):** <list or `n/a`>",
|
|
2994
|
+
"",
|
|
2995
|
+
" ### Size Classification",
|
|
2996
|
+
"",
|
|
2997
|
+
" Based on <headcount>, <revenue/funding>, and <any other size",
|
|
2998
|
+
" signal>, this company matches the **<SMB / Mid-Market /",
|
|
2999
|
+
" Enterprise>** variation in the <segment> business model.",
|
|
3000
|
+
" ```",
|
|
3001
|
+
"",
|
|
3002
|
+
" Use `_No matched business models in <BUSINESS_MODELS_ROOT>._` as",
|
|
3003
|
+
" the table body when Step 3 found candidates but Step 4 scored",
|
|
3004
|
+
" zero matches.",
|
|
3005
|
+
"",
|
|
3006
|
+
"6. **Update the matched business-model documents bidirectionally.**",
|
|
3007
|
+
" For every row in the matched-models table, append a cross-link",
|
|
3008
|
+
" to the canvas's own Traceability (or Sources) section \u2014 do not",
|
|
3009
|
+
" rewrite the canvas body. A single line is enough:",
|
|
3010
|
+
"",
|
|
3011
|
+
" ```markdown",
|
|
3012
|
+
" - **Profiled company:** [<company name>](<relative path to profile.md>) \u2014 match type: <customer / competitor / vendor / partner>",
|
|
3013
|
+
" ```",
|
|
3014
|
+
"",
|
|
3015
|
+
" If a canvas already lists this profile, do not duplicate the line.",
|
|
3016
|
+
" If the canvas has no Traceability or Sources section, skip the",
|
|
3017
|
+
" canvas and flag it in the profile's `## Risks / Open Questions`",
|
|
3018
|
+
" section rather than inventing a new section in someone else's",
|
|
3019
|
+
" document.",
|
|
3020
|
+
"",
|
|
3021
|
+
"7. **Update the profile's `referencedIn` frontmatter.** Add the",
|
|
3022
|
+
" relative paths of every matched business-model document and",
|
|
3023
|
+
" segment index so downstream audit tooling can traverse the link",
|
|
3024
|
+
" graph without re-scanning the tree.",
|
|
3025
|
+
"",
|
|
3026
|
+
"8. **Append a revision-history row.**",
|
|
3027
|
+
"",
|
|
3028
|
+
" ```markdown",
|
|
3029
|
+
" | YYYY-MM-DD | Matched to business models: <comma-separated segment list> |",
|
|
3030
|
+
" ```",
|
|
3031
|
+
"",
|
|
3032
|
+
"9. **Commit and push.** Close the match issue with a short comment",
|
|
3033
|
+
" summarizing the matched segments.",
|
|
3034
|
+
"",
|
|
3035
|
+
"---",
|
|
3036
|
+
"",
|
|
3037
|
+
"## Phase 5: Refresh (`company:refresh`)",
|
|
3038
|
+
"",
|
|
3039
|
+
"**Goal:** Re-verify an existing profile with a small number of",
|
|
3040
|
+
"targeted web searches for recent developments, then update the",
|
|
3041
|
+
"profile in place.",
|
|
3042
|
+
"",
|
|
3043
|
+
"**Budget:** 4\u20136 targeted web searches, focused on recent activity.",
|
|
3044
|
+
"Do not redo the full research-phase sweep.",
|
|
3045
|
+
"",
|
|
3046
|
+
"### Steps",
|
|
3047
|
+
"",
|
|
3048
|
+
"1. **Read the existing profile** at the path referenced in the issue",
|
|
3049
|
+
" body. If the profile file is missing, close the issue with",
|
|
3050
|
+
" `status:needs-attention` and stop.",
|
|
3051
|
+
"",
|
|
3052
|
+
"2. **Confirm the staleness threshold.** Compare the profile's `date`",
|
|
3053
|
+
" frontmatter against today's date and the `refresh_days`",
|
|
3054
|
+
" frontmatter (or the project default from the Refresh Cadence",
|
|
3055
|
+
" section above). If the profile is younger than the threshold and",
|
|
3056
|
+
" the issue body does not set `force: true`, close the issue with",
|
|
3057
|
+
" a short comment and stop \u2014 do not burn the search budget.",
|
|
3058
|
+
"",
|
|
3059
|
+
"3. **Run 4\u20136 targeted searches.** Focus on:",
|
|
3060
|
+
" - `<company name>` + recent news, press releases, or blog posts",
|
|
3061
|
+
" - Product launches, feature changes, or pricing updates",
|
|
3062
|
+
" - Funding rounds, acquisitions, or material ownership changes",
|
|
3063
|
+
" - Leadership changes (CEO, CTO, CPO, notable departures/arrivals)",
|
|
3064
|
+
" - New partnerships, certifications, or regulatory milestones",
|
|
3065
|
+
"",
|
|
3066
|
+
"4. **Update the profile in place.** Edit the affected sections with",
|
|
3067
|
+
" the new information. Cite every new claim. Preserve the slug and",
|
|
3068
|
+
" the original `parent_issue` field. Bump the `date` frontmatter to",
|
|
3069
|
+
" today's date.",
|
|
3070
|
+
"",
|
|
3071
|
+
"5. **Do not silently re-type the company.** If the refresh surfaces",
|
|
3072
|
+
" evidence that the company's primary type has changed (e.g., an",
|
|
3073
|
+
" industry-player that now sells a directly competing product),",
|
|
3074
|
+
" flag it in `## Risks / Open Questions` and stop \u2014 do **not**",
|
|
3075
|
+
" rewrite the `company_type` frontmatter without an explicit",
|
|
3076
|
+
" override in the refresh issue body (`retype: <new type>`).",
|
|
3077
|
+
"",
|
|
3078
|
+
"6. **Append a revision-history row.** Summarize the delta in one",
|
|
3079
|
+
" line:",
|
|
3080
|
+
"",
|
|
3081
|
+
" ```markdown",
|
|
3082
|
+
" | YYYY-MM-DD | Refreshed: <one-line summary of what changed> |",
|
|
3083
|
+
" ```",
|
|
3084
|
+
"",
|
|
3085
|
+
" When the search budget finds no material change, the row still",
|
|
3086
|
+
" appears so the next scheduled refresh knows this profile was",
|
|
3087
|
+
" reviewed:",
|
|
3088
|
+
"",
|
|
3089
|
+
" ```markdown",
|
|
3090
|
+
" | YYYY-MM-DD | Refreshed: no material change |",
|
|
3091
|
+
" ```",
|
|
3092
|
+
"",
|
|
3093
|
+
"7. **Update reference entries** (if the project tracks company",
|
|
3094
|
+
" references under research directories). If the company's",
|
|
3095
|
+
" relevance to a research area has shifted \u2014 for example, it is no",
|
|
3096
|
+
" longer a live competitor, or it now plays in a new segment \u2014",
|
|
3097
|
+
" update the corresponding entry under `referencedIn` and the",
|
|
3098
|
+
" research-area doc that links to this profile.",
|
|
3099
|
+
"",
|
|
3100
|
+
"8. **Commit and push.** Close the refresh issue with a short comment",
|
|
3101
|
+
" summarizing the delta (or `no material change`).",
|
|
3102
|
+
"",
|
|
3103
|
+
"---",
|
|
3104
|
+
"",
|
|
3105
|
+
"## Phase 6: Analyze (`company:analyze`)",
|
|
3106
|
+
"",
|
|
3107
|
+
"**Goal:** Produce a segment-level competitive analysis by",
|
|
3108
|
+
"synthesizing every profile in the target segment. The deliverable",
|
|
3109
|
+
"is one markdown document under `<ANALYSIS_DIR>` combining a",
|
|
3110
|
+
"feature-comparison matrix, a positioning map, and the strategic",
|
|
3111
|
+
"implications for the consuming project.",
|
|
3112
|
+
"",
|
|
3113
|
+
"**Budget:** No web searches. Pure synthesis from existing profiles",
|
|
3114
|
+
"and (optionally) existing product docs the consuming project",
|
|
3115
|
+
"maintains.",
|
|
3116
|
+
"",
|
|
3117
|
+
"### Steps",
|
|
3118
|
+
"",
|
|
3119
|
+
"1. **Read the segment scope from the issue body.** It must carry",
|
|
3120
|
+
" `<SEGMENT_SLUG>` plus the path of every profile to include (or a",
|
|
3121
|
+
" glob that resolves to them). If the issue body is ambiguous,",
|
|
3122
|
+
" close with `status:needs-attention` and stop.",
|
|
3123
|
+
"",
|
|
3124
|
+
"2. **Block on open draft issues.** Query for open",
|
|
3125
|
+
" `company:draft` issues whose title or body mentions the segment",
|
|
3126
|
+
" slug:",
|
|
3127
|
+
"",
|
|
3128
|
+
" ```bash",
|
|
3129
|
+
" gh issue list \\",
|
|
3130
|
+
" --label 'company:draft' --state open \\",
|
|
3131
|
+
" --search '<SEGMENT_SLUG> in:title,body' \\",
|
|
3132
|
+
" --json number,title --limit 200",
|
|
3133
|
+
" ```",
|
|
3134
|
+
"",
|
|
3135
|
+
" If the query returns any issues, this analyze issue must block on",
|
|
3136
|
+
" them. Add `Depends on: #<N>` lines for every open draft, apply",
|
|
3137
|
+
" `status:blocked`, remove `status:in-progress`, and stop \u2014 **do",
|
|
3138
|
+
" not publish a partial landscape**. The issue will be eligible",
|
|
3139
|
+
" again once the drafts close.",
|
|
3140
|
+
"",
|
|
3141
|
+
"3. **Read every in-scope profile.** Collect each profile's Summary,",
|
|
3142
|
+
" Offering, Classification, Market Position, Positioning /",
|
|
3143
|
+
" Differentiation, and Risks / Open Questions sections.",
|
|
3144
|
+
"",
|
|
3145
|
+
"4. **Derive a feature axis.** Build the feature axis from the",
|
|
3146
|
+
" union of bullets across each profile's Offering section (and, if",
|
|
3147
|
+
" present, a project-maintained feature taxonomy under",
|
|
3148
|
+
" `<BUSINESS_MODELS_ROOT>`). Do **not** invent features not",
|
|
3149
|
+
" represented in at least one profile or the project's taxonomy.",
|
|
3150
|
+
"",
|
|
3151
|
+
"5. **Write the analysis document** to",
|
|
3152
|
+
" `<ANALYSIS_DIR>/<SEGMENT_SLUG>.md` using the template below. Use",
|
|
3153
|
+
" `_Not available in profiles._` in any cell a profile does not",
|
|
3154
|
+
" document. Never fabricate a `Yes/No` from a missing field.",
|
|
3155
|
+
"",
|
|
3156
|
+
" ```markdown",
|
|
3157
|
+
" ---",
|
|
3158
|
+
' title: "<segment name> Competitive Analysis"',
|
|
3159
|
+
" slug: <SEGMENT_SLUG>",
|
|
3160
|
+
" segment: <segment name>",
|
|
3161
|
+
" date: YYYY-MM-DD",
|
|
3162
|
+
" status: draft",
|
|
3163
|
+
" profiles:",
|
|
3164
|
+
" - <relative path to profile 1>",
|
|
3165
|
+
" - <relative path to profile 2>",
|
|
3166
|
+
" ---",
|
|
3167
|
+
"",
|
|
3168
|
+
" # <segment name> Competitive Analysis",
|
|
3169
|
+
"",
|
|
3170
|
+
" ## Market Overview",
|
|
3171
|
+
" <landscape summary \u2014 total players, market structure, trends",
|
|
3172
|
+
" visible from the profiles>",
|
|
3173
|
+
"",
|
|
3174
|
+
" ## Feature Comparison Matrix",
|
|
3175
|
+
" | Feature | <Company A> | <Company B> | <Company C> |",
|
|
3176
|
+
" |---------|-------------|-------------|-------------|",
|
|
3177
|
+
" | <feature> | Yes / No / Partial | ... | ... |",
|
|
3178
|
+
"",
|
|
3179
|
+
" ## Pricing Comparison",
|
|
3180
|
+
" <pricing tiers across profiles, where disclosed>",
|
|
3181
|
+
"",
|
|
3182
|
+
" ## Positioning Map",
|
|
3183
|
+
" <where each player sits \u2014 by price vs. feature depth, or by",
|
|
3184
|
+
" segment focus. Textual description; link to an external diagram",
|
|
3185
|
+
" if the consuming project maintains one.>",
|
|
3186
|
+
"",
|
|
3187
|
+
" ## Strengths & Vulnerabilities",
|
|
3188
|
+
" | Company | Key Strength | Key Vulnerability |",
|
|
3189
|
+
" |---------|--------------|-------------------|",
|
|
3190
|
+
" | <company> | <strength> | <vulnerability> |",
|
|
3191
|
+
"",
|
|
3192
|
+
" ## Strategic Implications",
|
|
3193
|
+
" <which features matter most, where the consuming project can",
|
|
3194
|
+
" differentiate, what pricing the landscape supports, and which",
|
|
3195
|
+
" competitive threats to watch>",
|
|
3196
|
+
"",
|
|
3197
|
+
" ## Recommended Actions",
|
|
3198
|
+
" | Action | Priority | Rationale |",
|
|
3199
|
+
" |--------|----------|-----------|",
|
|
3200
|
+
" | <action> | High / Medium / Low | <why> |",
|
|
3201
|
+
"",
|
|
3202
|
+
" ## Sources",
|
|
3203
|
+
" - <relative path to profile 1>",
|
|
3204
|
+
" - <relative path to profile 2>",
|
|
3205
|
+
"",
|
|
3206
|
+
" ## Revision History",
|
|
3207
|
+
" | Date | Changes |",
|
|
3208
|
+
" |------|---------|",
|
|
3209
|
+
" | YYYY-MM-DD | Initial analysis |",
|
|
3210
|
+
" ```",
|
|
3211
|
+
"",
|
|
3212
|
+
"6. **Do not edit the underlying profiles.** `company:analyze` is a",
|
|
3213
|
+
" synthesis phase \u2014 profiles are **inputs only**. Any cross-link",
|
|
3214
|
+
" from a profile to the analysis document should be added by a",
|
|
3215
|
+
" follow-up `company:match` pass, not by this phase.",
|
|
3216
|
+
"",
|
|
3217
|
+
"7. **Commit and push.** Close the analyze issue with a short",
|
|
3218
|
+
" comment naming the analysis document path.",
|
|
3219
|
+
"",
|
|
3220
|
+
"---",
|
|
3221
|
+
"",
|
|
2824
3222
|
"## Output Boundaries",
|
|
2825
3223
|
"",
|
|
2826
3224
|
"This agent writes **only** to:",
|
|
2827
3225
|
"",
|
|
2828
3226
|
"- `<NOTES_DIR>/` \u2014 research-notes files (Phase 1)",
|
|
2829
|
-
"- `<PROFILES_DIR>/` \u2014 company profiles (Phase 2, updated in
|
|
3227
|
+
"- `<PROFILES_DIR>/` \u2014 company profiles (Phase 2, updated in Phases",
|
|
3228
|
+
" 3, 4, and 5)",
|
|
3229
|
+
"- `<ANALYSIS_DIR>/` \u2014 segment-level competitive-analysis documents",
|
|
3230
|
+
" (Phase 6)",
|
|
2830
3231
|
"",
|
|
2831
3232
|
"In Phase 3, this agent also **creates `people:research` and",
|
|
2832
3233
|
"`software:research` issues** for people and software products",
|
|
@@ -2835,18 +3236,33 @@ var companyProfileAnalystSubAgent = {
|
|
|
2835
3236
|
"`people-profile-analyst` and `software-profile-analyst` agents, which",
|
|
2836
3237
|
"pick up the issues this pipeline creates.",
|
|
2837
3238
|
"",
|
|
2838
|
-
"
|
|
2839
|
-
"
|
|
2840
|
-
"
|
|
2841
|
-
"
|
|
2842
|
-
"
|
|
2843
|
-
"
|
|
3239
|
+
"In Phase 4, this agent appends a single bidirectional cross-link",
|
|
3240
|
+
"line to matched business-model documents under",
|
|
3241
|
+
"`<BUSINESS_MODELS_ROOT>`. It never rewrites the canvas body, adds",
|
|
3242
|
+
"new canvas sections, or otherwise mutates business-model content \u2014",
|
|
3243
|
+
"that remains the responsibility of the `business-models` bundle.",
|
|
3244
|
+
"",
|
|
3245
|
+
"In Phase 5, this agent only updates an existing profile in place \u2014",
|
|
3246
|
+
"it never forks a new profile under a different slug.",
|
|
3247
|
+
"",
|
|
3248
|
+
"In Phase 6, this agent only writes a new segment-level analysis",
|
|
3249
|
+
"document. It never edits the underlying company profiles.",
|
|
3250
|
+
"",
|
|
3251
|
+
"The pipeline produces **company profiles, notes, and segment",
|
|
3252
|
+
"analyses**. Deeper research on people or products is delegated to",
|
|
3253
|
+
"downstream research pipelines via `people:research` and",
|
|
3254
|
+
"`software:research` issues \u2014 this agent never writes person",
|
|
3255
|
+
"profiles, software profiles, product evaluations, or",
|
|
3256
|
+
"requirement-style documents itself. Keep this boundary clean so",
|
|
3257
|
+
"the company-profile pipeline stays generic.",
|
|
2844
3258
|
"",
|
|
2845
3259
|
"---",
|
|
2846
3260
|
"",
|
|
2847
3261
|
"## Rules",
|
|
2848
3262
|
"",
|
|
2849
3263
|
"- **One company per session.** Never profile two companies back-to-back.",
|
|
3264
|
+
" `company:analyze` is the single exception \u2014 it synthesizes one",
|
|
3265
|
+
" segment per session, not one company.",
|
|
2850
3266
|
"- **Persist before closing.** Every phase must write its output file",
|
|
2851
3267
|
" before closing its issue.",
|
|
2852
3268
|
"- **Cite everything.** Profile claims without source citations do not",
|
|
@@ -2867,10 +3283,24 @@ var companyProfileAnalystSubAgent = {
|
|
|
2867
3283
|
" and products that are genuinely relevant to the framing of this",
|
|
2868
3284
|
" profile. Do not open issues for every name or product mentioned in",
|
|
2869
3285
|
" passing.",
|
|
2870
|
-
"- **Produce profiles, not requirement
|
|
3286
|
+
"- **Produce profiles and analyses, not requirement documents.** Do",
|
|
2871
3287
|
" not open `type:requirement` or formal evaluation issues from this",
|
|
2872
3288
|
" pipeline. Follow-up research is scoped through `people:research`",
|
|
2873
|
-
" and `software:research` only."
|
|
3289
|
+
" and `software:research` only.",
|
|
3290
|
+
"- **Match is read-mostly.** Phase 4 edits the target profile and",
|
|
3291
|
+
" appends one line to each matched business-model document. It never",
|
|
3292
|
+
" rewrites canvas bodies, never runs web searches, and never edits",
|
|
3293
|
+
" other profiles.",
|
|
3294
|
+
"- **Refresh respects the cadence.** Phase 5 exits early when the",
|
|
3295
|
+
" profile is younger than the staleness threshold and `force: true`",
|
|
3296
|
+
" is not set. It always appends a revision-history row so the next",
|
|
3297
|
+
" scheduled run knows the profile was reviewed.",
|
|
3298
|
+
"- **Analyze blocks on open drafts.** Phase 6 refuses to publish a",
|
|
3299
|
+
" partial landscape. If any `company:draft` issues for the target",
|
|
3300
|
+
" segment are still open, the analyze issue is marked",
|
|
3301
|
+
" `status:blocked` with `Depends on:` lines pointing at each draft.",
|
|
3302
|
+
"- **Refresh, don't fork.** When a profile exists and is past its",
|
|
3303
|
+
" cadence, update in place rather than creating a new slug."
|
|
2874
3304
|
].join("\n")
|
|
2875
3305
|
};
|
|
2876
3306
|
var profileCompanySkill = {
|
|
@@ -2915,8 +3345,8 @@ var profileCompanySkill = {
|
|
|
2915
3345
|
" company name, selected type, framing, and any overrides.",
|
|
2916
3346
|
"2. Execute Phase 1 (Research) of the company-profile-analyst agent.",
|
|
2917
3347
|
"3. Phase 1 creates the `company:draft` issue. Phase 2 may create a",
|
|
2918
|
-
" `company:followup` issue
|
|
2919
|
-
" `Depends on:` predecessor.",
|
|
3348
|
+
" `company:followup` issue **and** a `company:match` issue. Each",
|
|
3349
|
+
" downstream issue declares its `Depends on:` predecessor.",
|
|
2920
3350
|
"",
|
|
2921
3351
|
"## Output",
|
|
2922
3352
|
"",
|
|
@@ -2926,38 +3356,265 @@ var profileCompanySkill = {
|
|
|
2926
3356
|
" (handed off to the `people-profile` bundle)",
|
|
2927
3357
|
"- `software:research` issues for software products surfaced in the",
|
|
2928
3358
|
" profile (handed off to the `software-profile` bundle)",
|
|
3359
|
+
"- A `company:match` issue so the profile is enriched against the",
|
|
3360
|
+
" project's business-model canvases",
|
|
2929
3361
|
"- This pipeline produces **company profiles only** \u2014 it does not",
|
|
2930
3362
|
" write person profiles, software profiles, product evaluations, or",
|
|
2931
|
-
" comparative analyses itself."
|
|
3363
|
+
" comparative analyses itself. Segment-level analysis is produced by",
|
|
3364
|
+
" the separate `/analyze-segment` skill."
|
|
3365
|
+
].join("\n")
|
|
3366
|
+
};
|
|
3367
|
+
var matchCompanySkill = {
|
|
3368
|
+
name: "match-company",
|
|
3369
|
+
description: "Kick off a company-profile match (enrichment) cycle. Creates a company:match issue for an existing profile and dispatches Phase 4 (Match) in the company-profile-analyst agent. Match enriches the profile with business-model, segment, and size context from existing docs \u2014 no web searches.",
|
|
3370
|
+
disableModelInvocation: true,
|
|
3371
|
+
userInvocable: true,
|
|
3372
|
+
context: "fork",
|
|
3373
|
+
agent: "company-profile-analyst",
|
|
3374
|
+
platforms: { cursor: { exclude: true } },
|
|
3375
|
+
instructions: [
|
|
3376
|
+
"# Match Company",
|
|
3377
|
+
"",
|
|
3378
|
+
"Enrich an existing company profile against the project's",
|
|
3379
|
+
"business-model canvases, industry segments, and size descriptions.",
|
|
3380
|
+
"Creates a `company:match` issue for the target profile and",
|
|
3381
|
+
"dispatches Phase 4 (Match) in the company-profile-analyst agent.",
|
|
3382
|
+
"",
|
|
3383
|
+
"**This is enrichment of a known profile, not entity",
|
|
3384
|
+
"deduplication** \u2014 the profile already exists and must be passed by",
|
|
3385
|
+
"path.",
|
|
3386
|
+
"",
|
|
3387
|
+
"## Usage",
|
|
3388
|
+
"",
|
|
3389
|
+
"/match-company <path-to-profile>",
|
|
3390
|
+
"",
|
|
3391
|
+
"Optional extensions in the issue body:",
|
|
3392
|
+
"- `business_models_root: <path>` \u2014 override `<BUSINESS_MODELS_ROOT>`",
|
|
3393
|
+
" if the project's business-model canvases do not live at the",
|
|
3394
|
+
" default location",
|
|
3395
|
+
"- `only: <comma-separated list of segment slugs>` \u2014 match only",
|
|
3396
|
+
" against the listed segments (useful when a new canvas triggers a",
|
|
3397
|
+
" re-match)",
|
|
3398
|
+
"",
|
|
3399
|
+
"## Default Paths",
|
|
3400
|
+
"",
|
|
3401
|
+
"If the project has no override in `docs/src/content/docs/project-context.md` or",
|
|
3402
|
+
"`agentConfig.rules`, the agent reads canvases from:",
|
|
3403
|
+
"",
|
|
3404
|
+
"- `docs/src/content/docs/industry-research/`",
|
|
3405
|
+
"",
|
|
3406
|
+
"## Budget",
|
|
3407
|
+
"",
|
|
3408
|
+
"- **No web searches.** Phase 4 reads existing docs and edits the",
|
|
3409
|
+
" profile + one cross-link per matched canvas. Anything that cannot",
|
|
3410
|
+
" be decided from existing docs is flagged in the profile's",
|
|
3411
|
+
" `## Risks / Open Questions` section.",
|
|
3412
|
+
"",
|
|
3413
|
+
"## Steps",
|
|
3414
|
+
"",
|
|
3415
|
+
"1. Create a `company:match` issue with `type:company-profile`,",
|
|
3416
|
+
" `priority:medium`, and `status:ready`. Body must include the",
|
|
3417
|
+
" profile path and any overrides.",
|
|
3418
|
+
"2. Execute Phase 4 (Match) of the company-profile-analyst agent.",
|
|
3419
|
+
"",
|
|
3420
|
+
"## Output",
|
|
3421
|
+
"",
|
|
3422
|
+
"- The profile gains a `## Business Model Context` section",
|
|
3423
|
+
"- Each matched business-model canvas gains a single cross-link line",
|
|
3424
|
+
" in its Traceability / Sources section",
|
|
3425
|
+
"- The profile's `referencedIn` frontmatter is updated with matched",
|
|
3426
|
+
" paths",
|
|
3427
|
+
"- A revision-history row summarizing the matched segments"
|
|
3428
|
+
].join("\n")
|
|
3429
|
+
};
|
|
3430
|
+
var refreshCompanySkill = {
|
|
3431
|
+
name: "refresh-company",
|
|
3432
|
+
description: "Kick off a company-profile refresh cycle. Creates a company:refresh issue for an existing profile and dispatches Phase 5 (Refresh) in the company-profile-analyst agent. Refresh re-verifies the profile with 4\u20136 targeted web searches and updates it in place. Respects a configurable staleness threshold so profiles younger than the threshold exit early.",
|
|
3433
|
+
disableModelInvocation: true,
|
|
3434
|
+
userInvocable: true,
|
|
3435
|
+
context: "fork",
|
|
3436
|
+
agent: "company-profile-analyst",
|
|
3437
|
+
platforms: { cursor: { exclude: true } },
|
|
3438
|
+
instructions: [
|
|
3439
|
+
"# Refresh Company",
|
|
3440
|
+
"",
|
|
3441
|
+
"Re-verify an existing company profile with a small number of",
|
|
3442
|
+
"targeted web searches and update the profile in place. Creates a",
|
|
3443
|
+
"`company:refresh` issue for the target profile and dispatches",
|
|
3444
|
+
"Phase 5 (Refresh) in the company-profile-analyst agent.",
|
|
3445
|
+
"",
|
|
3446
|
+
"Refresh respects a configurable **staleness threshold** so scheduled",
|
|
3447
|
+
"refreshes do not burn search budget on profiles that are still",
|
|
3448
|
+
"fresh.",
|
|
3449
|
+
"",
|
|
3450
|
+
"## Usage",
|
|
3451
|
+
"",
|
|
3452
|
+
"/refresh-company <path-to-profile>",
|
|
3453
|
+
"",
|
|
3454
|
+
"Optional extensions in the issue body:",
|
|
3455
|
+
"- `refresh_days: <N>` \u2014 override the default 180-day staleness",
|
|
3456
|
+
" threshold for this run",
|
|
3457
|
+
"- `force: true` \u2014 refresh even if the profile is younger than the",
|
|
3458
|
+
" threshold",
|
|
3459
|
+
"- `retype: <taxonomy value>` \u2014 explicitly allow Phase 5 to change",
|
|
3460
|
+
" the profile's `company_type` when the refresh finds material",
|
|
3461
|
+
" evidence of a type change",
|
|
3462
|
+
"",
|
|
3463
|
+
"## Staleness Threshold",
|
|
3464
|
+
"",
|
|
3465
|
+
"Order of precedence (first match wins):",
|
|
3466
|
+
"",
|
|
3467
|
+
"1. `refresh_days` in the issue body (per-run override)",
|
|
3468
|
+
"2. `refresh_days` frontmatter on the profile itself",
|
|
3469
|
+
"3. Project-wide default declared under a `## Refresh Cadence`",
|
|
3470
|
+
" section in `docs/src/content/docs/project-context.md`",
|
|
3471
|
+
"4. Built-in default: **180 days**",
|
|
3472
|
+
"",
|
|
3473
|
+
"If the profile's `date` frontmatter plus the resolved threshold is",
|
|
3474
|
+
"in the future (i.e. the profile is still fresh) and `force: true`",
|
|
3475
|
+
"is not set, Phase 5 closes the refresh issue with a short comment",
|
|
3476
|
+
"and stops without running any searches.",
|
|
3477
|
+
"",
|
|
3478
|
+
"## Budget",
|
|
3479
|
+
"",
|
|
3480
|
+
"- **4\u20136 targeted web searches** focused on recent news, product",
|
|
3481
|
+
" launches, funding/acquisitions, leadership changes, and",
|
|
3482
|
+
" partnerships / certifications.",
|
|
3483
|
+
"",
|
|
3484
|
+
"## Steps",
|
|
3485
|
+
"",
|
|
3486
|
+
"1. Create a `company:refresh` issue with `type:company-profile`,",
|
|
3487
|
+
" `priority:medium`, and `status:ready`. Body must include the",
|
|
3488
|
+
" profile path and any overrides.",
|
|
3489
|
+
"2. Execute Phase 5 (Refresh) of the company-profile-analyst agent.",
|
|
3490
|
+
"",
|
|
3491
|
+
"## Output",
|
|
3492
|
+
"",
|
|
3493
|
+
"- The profile is updated in place (sections edited, `date` bumped,",
|
|
3494
|
+
" slug preserved)",
|
|
3495
|
+
"- A revision-history row summarizing the delta \u2014 or",
|
|
3496
|
+
" `Refreshed: no material change` when the search budget found",
|
|
3497
|
+
" nothing material",
|
|
3498
|
+
"- Reference entries updated if the company's relevance to a research",
|
|
3499
|
+
" area shifted"
|
|
3500
|
+
].join("\n")
|
|
3501
|
+
};
|
|
3502
|
+
var analyzeSegmentSkill = {
|
|
3503
|
+
name: "analyze-segment",
|
|
3504
|
+
description: "Kick off a segment-level competitive-analysis cycle. Creates a company:analyze issue for the target segment and dispatches Phase 6 (Analyze) in the company-profile-analyst agent. Analyze synthesizes every profile in the segment into one competitive-analysis document. Blocks on open company:draft issues for the segment.",
|
|
3505
|
+
disableModelInvocation: true,
|
|
3506
|
+
userInvocable: true,
|
|
3507
|
+
context: "fork",
|
|
3508
|
+
agent: "company-profile-analyst",
|
|
3509
|
+
platforms: { cursor: { exclude: true } },
|
|
3510
|
+
instructions: [
|
|
3511
|
+
"# Analyze Segment",
|
|
3512
|
+
"",
|
|
3513
|
+
"Produce a segment-level competitive analysis by synthesizing every",
|
|
3514
|
+
"company profile in the target segment into one markdown document.",
|
|
3515
|
+
"Creates a `company:analyze` issue and dispatches Phase 6 (Analyze)",
|
|
3516
|
+
"in the company-profile-analyst agent.",
|
|
3517
|
+
"",
|
|
3518
|
+
"**This is pure synthesis** \u2014 no web searches, no new profile work.",
|
|
3519
|
+
"All inputs must already exist under the profiles directory before",
|
|
3520
|
+
"you run this skill.",
|
|
3521
|
+
"",
|
|
3522
|
+
"## Usage",
|
|
3523
|
+
"",
|
|
3524
|
+
"/analyze-segment <segment-slug>",
|
|
3525
|
+
"",
|
|
3526
|
+
"Optional extensions in the issue body:",
|
|
3527
|
+
"- `profiles: <list of paths>` \u2014 explicit list of profile files to",
|
|
3528
|
+
" include; otherwise the agent discovers profiles by scanning for",
|
|
3529
|
+
" the segment slug in each profile's `referencedIn` frontmatter",
|
|
3530
|
+
"- `analysis_dir: <path>` \u2014 override `<ANALYSIS_DIR>` if the project",
|
|
3531
|
+
" stores analyses somewhere other than the default",
|
|
3532
|
+
"",
|
|
3533
|
+
"## Default Paths",
|
|
3534
|
+
"",
|
|
3535
|
+
"If the project has no override in `docs/src/content/docs/project-context.md` or",
|
|
3536
|
+
"`agentConfig.rules`, outputs land under:",
|
|
3537
|
+
"",
|
|
3538
|
+
"- `docs/companies/analysis/<segment-slug>.md`",
|
|
3539
|
+
"",
|
|
3540
|
+
"## Blocking Rule",
|
|
3541
|
+
"",
|
|
3542
|
+
"Phase 6 refuses to publish a partial landscape. If any",
|
|
3543
|
+
"`company:draft` issues whose title or body mention",
|
|
3544
|
+
"`<SEGMENT_SLUG>` are still open, the analyze issue is marked",
|
|
3545
|
+
"`status:blocked` with `Depends on: #<N>` lines pointing at each",
|
|
3546
|
+
"open draft, `status:in-progress` is removed, and Phase 6 exits",
|
|
3547
|
+
"without writing the analysis. The issue becomes eligible again",
|
|
3548
|
+
"once the drafts close.",
|
|
3549
|
+
"",
|
|
3550
|
+
"## Budget",
|
|
3551
|
+
"",
|
|
3552
|
+
"- **No web searches.** Pure synthesis from existing profiles (and",
|
|
3553
|
+
" optionally the project's own product docs).",
|
|
3554
|
+
"",
|
|
3555
|
+
"## Steps",
|
|
3556
|
+
"",
|
|
3557
|
+
"1. Create a `company:analyze` issue with `type:company-profile`,",
|
|
3558
|
+
" `priority:medium`, and `status:ready`. Body must include the",
|
|
3559
|
+
" segment slug and any overrides.",
|
|
3560
|
+
"2. Execute Phase 6 (Analyze) of the company-profile-analyst agent.",
|
|
3561
|
+
"",
|
|
3562
|
+
"## Output",
|
|
3563
|
+
"",
|
|
3564
|
+
"- One markdown document at `<ANALYSIS_DIR>/<SEGMENT_SLUG>.md`",
|
|
3565
|
+
" combining feature-comparison matrix, pricing comparison,",
|
|
3566
|
+
" positioning map, strengths & vulnerabilities, strategic",
|
|
3567
|
+
" implications, and recommended actions \u2014 every claim sourced back",
|
|
3568
|
+
" to the underlying profiles",
|
|
3569
|
+
"- This skill does **not** edit the underlying profiles. Cross-",
|
|
3570
|
+
" linking a profile back to the analysis is the job of a",
|
|
3571
|
+
" subsequent `company:match` pass."
|
|
2932
3572
|
].join("\n")
|
|
2933
3573
|
};
|
|
2934
3574
|
var companyProfileBundle = {
|
|
2935
3575
|
name: "company-profile",
|
|
2936
|
-
description: "Company research and profiling pipeline: research, draft profile, followup. Enabled by default; domain-neutral; filesystem-durable between phases. Phase 3 (Followup) hands surfaced people and software products off to the `people-profile` and `software-profile` bundles via `people:research` and `software:research` issues.",
|
|
3576
|
+
description: "Company research and profiling pipeline: research, draft profile, followup, match, refresh, analyze. Enabled by default; domain-neutral; filesystem-durable between phases. Phase 3 (Followup) hands surfaced people and software products off to the `people-profile` and `software-profile` bundles via `people:research` and `software:research` issues. Phase 4 (Match) enriches profiles against business-model canvases. Phase 5 (Refresh) re-verifies profiles on a configurable staleness cadence. Phase 6 (Analyze) synthesizes profiles in a segment into a competitive-analysis document.",
|
|
2937
3577
|
appliesWhen: () => true,
|
|
2938
3578
|
rules: [
|
|
2939
3579
|
{
|
|
2940
3580
|
name: "company-profile-workflow",
|
|
2941
|
-
description: "Describes the
|
|
3581
|
+
description: "Describes the 6-phase company-profile pipeline, the company:* label taxonomy, and the boundary against downstream research agents.",
|
|
2942
3582
|
scope: AGENT_RULE_SCOPE.ALWAYS,
|
|
2943
3583
|
content: [
|
|
2944
3584
|
"# Company Profile Workflow",
|
|
2945
3585
|
"",
|
|
2946
3586
|
"Use `/profile-company <company-name>` to kick off a company",
|
|
2947
|
-
"research and profiling pipeline. The pipeline runs in up to
|
|
2948
|
-
"phases \u2014 research, draft, followup
|
|
2949
|
-
"GitHub issue labeled `company:research`,
|
|
2950
|
-
"`company:followup
|
|
2951
|
-
"",
|
|
2952
|
-
"
|
|
2953
|
-
"
|
|
2954
|
-
"
|
|
2955
|
-
"
|
|
2956
|
-
"
|
|
3587
|
+
"research and profiling pipeline. The pipeline runs in up to 6",
|
|
3588
|
+
"phases \u2014 research, draft, followup, match, refresh, analyze \u2014",
|
|
3589
|
+
"each tracked by its own GitHub issue labeled `company:research`,",
|
|
3590
|
+
"`company:draft`, `company:followup`, `company:match`,",
|
|
3591
|
+
"`company:refresh`, or `company:analyze`. All issues carry",
|
|
3592
|
+
"`type:company-profile`.",
|
|
3593
|
+
"",
|
|
3594
|
+
"Three additional user-invocable skills drive the maintenance and",
|
|
3595
|
+
"synthesis phases independently:",
|
|
3596
|
+
"",
|
|
3597
|
+
"- `/match-company <path-to-profile>` \u2014 enrich an existing",
|
|
3598
|
+
" profile with business-model and segment context from the",
|
|
3599
|
+
" project's business-model canvases (Phase 4, no web searches).",
|
|
3600
|
+
"- `/refresh-company <path-to-profile>` \u2014 re-verify an existing",
|
|
3601
|
+
" profile with 4\u20136 targeted web searches and update it in place",
|
|
3602
|
+
" (Phase 5, respects a configurable staleness threshold).",
|
|
3603
|
+
"- `/analyze-segment <segment-slug>` \u2014 synthesize every profile",
|
|
3604
|
+
" in a segment into one competitive-analysis document (Phase 6,",
|
|
3605
|
+
" no web searches; blocks on open `company:draft` issues for",
|
|
3606
|
+
" the segment).",
|
|
3607
|
+
"",
|
|
3608
|
+
"The pipeline produces **company profiles, notes, and segment",
|
|
3609
|
+
"analyses**. Deeper research on notable people and software",
|
|
3610
|
+
"products surfaced while profiling is delegated to the",
|
|
3611
|
+
"`people-profile` and `software-profile` bundles via",
|
|
3612
|
+
"`people:research` and `software:research` issues opened during",
|
|
3613
|
+
"Phase 3 (Followup).",
|
|
2957
3614
|
"",
|
|
2958
3615
|
"See the `company-profile-analyst` agent definition for full",
|
|
2959
|
-
"workflow details, default paths, the company-type taxonomy,
|
|
2960
|
-
"phase-by-phase instructions."
|
|
3616
|
+
"workflow details, default paths, the company-type taxonomy, the",
|
|
3617
|
+
"staleness-threshold rules, and phase-by-phase instructions."
|
|
2961
3618
|
].join("\n"),
|
|
2962
3619
|
platforms: {
|
|
2963
3620
|
cursor: { exclude: true }
|
|
@@ -2965,7 +3622,12 @@ var companyProfileBundle = {
|
|
|
2965
3622
|
tags: ["workflow"]
|
|
2966
3623
|
}
|
|
2967
3624
|
],
|
|
2968
|
-
skills: [
|
|
3625
|
+
skills: [
|
|
3626
|
+
profileCompanySkill,
|
|
3627
|
+
matchCompanySkill,
|
|
3628
|
+
refreshCompanySkill,
|
|
3629
|
+
analyzeSegmentSkill
|
|
3630
|
+
],
|
|
2969
3631
|
subAgents: [companyProfileAnalystSubAgent],
|
|
2970
3632
|
labels: [
|
|
2971
3633
|
{
|
|
@@ -2987,6 +3649,21 @@ var companyProfileBundle = {
|
|
|
2987
3649
|
name: "company:followup",
|
|
2988
3650
|
color: "D4C5F9",
|
|
2989
3651
|
description: "Phase 3: enqueue follow-up research issues for people and products surfaced in the profile"
|
|
3652
|
+
},
|
|
3653
|
+
{
|
|
3654
|
+
name: "company:match",
|
|
3655
|
+
color: "FBCA04",
|
|
3656
|
+
description: "Phase 4: enrich a company profile with business-model, segment, and size context from existing docs"
|
|
3657
|
+
},
|
|
3658
|
+
{
|
|
3659
|
+
name: "company:refresh",
|
|
3660
|
+
color: "F9D0C4",
|
|
3661
|
+
description: "Phase 5: re-verify an existing company profile with targeted web searches and update it in place"
|
|
3662
|
+
},
|
|
3663
|
+
{
|
|
3664
|
+
name: "company:analyze",
|
|
3665
|
+
color: "5319E7",
|
|
3666
|
+
description: "Phase 6: synthesize every company profile in a segment into a competitive-analysis document"
|
|
2990
3667
|
}
|
|
2991
3668
|
]
|
|
2992
3669
|
};
|
|
@@ -5594,7 +6271,7 @@ var orchestratorBundle = {
|
|
|
5594
6271
|
// src/agent/bundles/people-profile.ts
|
|
5595
6272
|
var peopleProfileAnalystSubAgent = {
|
|
5596
6273
|
name: "people-profile-analyst",
|
|
5597
|
-
description: "Researches an individual person (colleague, customer contact, vendor contact, partner contact, industry expert, or connector) from public sources and produces a structured markdown profile cross-linked to companies, software, and meeting notes, then enqueues downstream `company:research` and `software:research` issues for unprofiled companies and software products surfaced during profiling. One person per session, tracked by people:* GitHub issue labels.",
|
|
6274
|
+
description: "Researches an individual person (colleague, customer contact, vendor contact, partner contact, industry expert, or connector) from public sources and produces a structured markdown profile cross-linked to companies, software, and meeting notes, then enqueues downstream `company:research` and `software:research` issues for unprofiled companies and software products surfaced during profiling. Also handles maintenance refreshes on a configurable staleness cadence (`people:refresh`). One person per session, tracked by people:* GitHub issue labels.",
|
|
5598
6275
|
model: AGENT_MODEL.POWERFUL,
|
|
5599
6276
|
maxTurns: 80,
|
|
5600
6277
|
platforms: { cursor: { exclude: true } },
|
|
@@ -5654,6 +6331,12 @@ var peopleProfileAnalystSubAgent = {
|
|
|
5654
6331
|
" the `software-profile` bundle via `software:research` issues.",
|
|
5655
6332
|
" Meeting notes remain link-only \u2014 this agent never creates",
|
|
5656
6333
|
" meeting-research issues.",
|
|
6334
|
+
"9. **Refresh is targeted re-verification, not re-research.**",
|
|
6335
|
+
" `people:refresh` runs a small number of targeted searches focused",
|
|
6336
|
+
" on the narrow set of facts that drift (role, employer, primary",
|
|
6337
|
+
" public channel) and updates the profile in place. It never",
|
|
6338
|
+
" re-runs the full research-phase sweep and never forks the profile",
|
|
6339
|
+
" under a new slug.",
|
|
5657
6340
|
"",
|
|
5658
6341
|
"---",
|
|
5659
6342
|
"",
|
|
@@ -5688,6 +6371,15 @@ var peopleProfileAnalystSubAgent = {
|
|
|
5688
6371
|
"\u2502 bounded notes \u2502 \u2502 the configured path \u2502 \u2502 company/software \u2502",
|
|
5689
6372
|
"\u2502 file \u2502 \u2502 \u2502 \u2502 research issues \u2502",
|
|
5690
6373
|
"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
|
|
6374
|
+
"",
|
|
6375
|
+
"\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510",
|
|
6376
|
+
"\u2502 4. REFRESH \u2502 (cadence-driven, or on-demand)",
|
|
6377
|
+
"\u2502 Re-verify an \u2502",
|
|
6378
|
+
"\u2502 existing profile \u2502",
|
|
6379
|
+
"\u2502 with targeted web \u2502",
|
|
6380
|
+
"\u2502 searches. Update \u2502",
|
|
6381
|
+
"\u2502 in place. \u2502",
|
|
6382
|
+
"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
|
|
5691
6383
|
"```",
|
|
5692
6384
|
"",
|
|
5693
6385
|
"**Issue labels encode the phase:**",
|
|
@@ -5697,13 +6389,13 @@ var peopleProfileAnalystSubAgent = {
|
|
|
5697
6389
|
"| `people:research` | 1. Research | Gather public sources. Write a bounded research-notes file. Create the draft issue. |",
|
|
5698
6390
|
"| `people:draft` | 2. Draft | Read the research notes. Write the structured profile to `<PROFILES_DIR>`. Create the followup issue if warranted. |",
|
|
5699
6391
|
"| `people:followup` | 3. Followup | Read the profile. Update cross-references to existing companies, software, and meeting notes. Enqueue `company:research` and `software:research` issues for unprofiled, genuinely-relevant entities surfaced in the profile. |",
|
|
6392
|
+
"| `people:refresh` | 4. Refresh | Read an existing profile. Run 3\u20135 targeted web searches for role, employer, and primary public channel changes. Update the profile in place and add a revision-history entry. |",
|
|
5700
6393
|
"",
|
|
5701
6394
|
"All issues also carry `type:people-profile` and a `status:*` label.",
|
|
5702
6395
|
"",
|
|
5703
6396
|
"**Issue count per person cycle:** 1 research + 1 draft + 0\u20131 followup =",
|
|
5704
|
-
"**2\u20133 sessions
|
|
5705
|
-
"
|
|
5706
|
-
"software products warrant downstream research.",
|
|
6397
|
+
"**2\u20133 sessions** on the initial cycle. `people:refresh` is an",
|
|
6398
|
+
"independent downstream cycle that runs on its own cadence.",
|
|
5707
6399
|
"",
|
|
5708
6400
|
"**Shortened paths:**",
|
|
5709
6401
|
"- Research phase determines the person is out of scope (not",
|
|
@@ -5711,14 +6403,17 @@ var peopleProfileAnalystSubAgent = {
|
|
|
5711
6403
|
" with a justification and no downstream issues are created \u2192 **1 session**.",
|
|
5712
6404
|
"- Short profile with no cross-references and no downstream",
|
|
5713
6405
|
" candidates \u2192 **2 sessions**.",
|
|
6406
|
+
"- Refresh that finds no material change \u2192 **1 session** (revision-",
|
|
6407
|
+
" history entry only, profile body unchanged).",
|
|
5714
6408
|
"",
|
|
5715
6409
|
"---",
|
|
5716
6410
|
"",
|
|
5717
6411
|
"## Configurable Paths",
|
|
5718
6412
|
"",
|
|
5719
6413
|
"The pipeline uses these placeholders. Consuming projects override the",
|
|
5720
|
-
"defaults by passing paths in the `/profile-person`
|
|
5721
|
-
"or by extending this rule in their own
|
|
6414
|
+
"defaults by passing paths in the `/profile-person` or `/refresh-person`",
|
|
6415
|
+
"skill invocations, or by extending this rule in their own",
|
|
6416
|
+
"`agentConfig.rules`.",
|
|
5722
6417
|
"",
|
|
5723
6418
|
"| Placeholder | Meaning | Default |",
|
|
5724
6419
|
"|-------------|---------|---------|",
|
|
@@ -5740,26 +6435,37 @@ var peopleProfileAnalystSubAgent = {
|
|
|
5740
6435
|
"## Refresh Cadence",
|
|
5741
6436
|
"",
|
|
5742
6437
|
"Profiles go stale. A person changes jobs, publishes new work, or",
|
|
5743
|
-
"shifts focus. The pipeline supports a configurable refresh cadence
|
|
5744
|
-
"",
|
|
5745
|
-
"
|
|
5746
|
-
"
|
|
5747
|
-
"
|
|
5748
|
-
" `
|
|
5749
|
-
"",
|
|
5750
|
-
"
|
|
5751
|
-
"
|
|
5752
|
-
"",
|
|
5753
|
-
"
|
|
5754
|
-
"
|
|
6438
|
+
"shifts focus. The pipeline supports a configurable refresh cadence",
|
|
6439
|
+
"so `people:refresh` issues can be filed on a schedule without",
|
|
6440
|
+
"hardcoding the interval:",
|
|
6441
|
+
"",
|
|
6442
|
+
"- **Default staleness threshold:** 180 days from the profile's",
|
|
6443
|
+
" `date` frontmatter.",
|
|
6444
|
+
"- **Override precedence** (first match wins):",
|
|
6445
|
+
" 1. `refresh_days` in the issue body (per-run override)",
|
|
6446
|
+
" 2. `refresh_days` frontmatter on the profile itself",
|
|
6447
|
+
" 3. Project-wide default declared under a `## Refresh Cadence`",
|
|
6448
|
+
" section in `docs/src/content/docs/project-context.md`",
|
|
6449
|
+
" 4. Built-in default: **180 days**",
|
|
6450
|
+
"",
|
|
6451
|
+
"When the `/refresh-person` skill is invoked for an existing profile:",
|
|
6452
|
+
"",
|
|
6453
|
+
"- If the profile is **younger** than the staleness threshold, the",
|
|
6454
|
+
" skill exits with a message pointing to the existing profile. Pass",
|
|
5755
6455
|
" `force: true` in the issue body to refresh anyway.",
|
|
5756
|
-
"- If the profile is **older** than the
|
|
5757
|
-
"
|
|
5758
|
-
"
|
|
6456
|
+
"- If the profile is **older** than the staleness threshold, the",
|
|
6457
|
+
" pipeline files a `people:refresh` issue and Phase 4 updates the",
|
|
6458
|
+
" existing file in place, preserving its slug and bumping the",
|
|
6459
|
+
" `date` frontmatter.",
|
|
6460
|
+
"",
|
|
6461
|
+
"The same precedence and `force: true` semantics apply when",
|
|
6462
|
+
"`/profile-person` is invoked for a slug that already has a profile:",
|
|
6463
|
+
"a fresh profile short-circuits; a stale profile is updated in place",
|
|
6464
|
+
"by Phase 2 rather than forked under a new slug.",
|
|
5759
6465
|
"",
|
|
5760
6466
|
"Refresh mode never changes the profile's role without an explicit",
|
|
5761
|
-
"override in the refresh request \u2014 role changes
|
|
5762
|
-
"warrant a human review step.",
|
|
6467
|
+
"override in the refresh request (`retype: <role>`) \u2014 role changes",
|
|
6468
|
+
"are material and warrant a human review step.",
|
|
5763
6469
|
"",
|
|
5764
6470
|
"---",
|
|
5765
6471
|
"",
|
|
@@ -5768,7 +6474,8 @@ var peopleProfileAnalystSubAgent = {
|
|
|
5768
6474
|
"Run this loop exactly once per session. Never start a second issue.",
|
|
5769
6475
|
"",
|
|
5770
6476
|
"1. Claim one open `type:people-profile` issue using phase priority:",
|
|
5771
|
-
" `people:research` > `people:draft` > `people:followup
|
|
6477
|
+
" `people:research` > `people:draft` > `people:followup` >",
|
|
6478
|
+
" `people:refresh`.",
|
|
5772
6479
|
"2. Transition `status:ready` \u2192 `status:in-progress` and create the",
|
|
5773
6480
|
" branch per your project's branch-naming convention.",
|
|
5774
6481
|
"3. Execute the phase handler that matches the issue's `people:*`",
|
|
@@ -5936,6 +6643,11 @@ var peopleProfileAnalystSubAgent = {
|
|
|
5936
6643
|
" <what the profile could not answer; flag anything the followup",
|
|
5937
6644
|
" phase should cross-reference>",
|
|
5938
6645
|
"",
|
|
6646
|
+
" ## Revision History",
|
|
6647
|
+
" | Date | Changes |",
|
|
6648
|
+
" |------|---------|",
|
|
6649
|
+
" | YYYY-MM-DD | Initial profile |",
|
|
6650
|
+
"",
|
|
5939
6651
|
" ## Sources",
|
|
5940
6652
|
" - <source URL> \u2014 <date accessed>",
|
|
5941
6653
|
" ```",
|
|
@@ -6081,12 +6793,87 @@ var peopleProfileAnalystSubAgent = {
|
|
|
6081
6793
|
"",
|
|
6082
6794
|
"---",
|
|
6083
6795
|
"",
|
|
6796
|
+
"## Phase 4: Refresh (`people:refresh`)",
|
|
6797
|
+
"",
|
|
6798
|
+
"**Goal:** Re-verify an existing profile against a narrow set of facts",
|
|
6799
|
+
"that tend to drift \u2014 current role, current employer, primary public",
|
|
6800
|
+
"channel (email, handle, personal site) \u2014 with a small number of",
|
|
6801
|
+
"targeted web searches, then update the profile in place.",
|
|
6802
|
+
"",
|
|
6803
|
+
"**Budget:** 3\u20135 targeted web searches focused on the narrow delta",
|
|
6804
|
+
"set. Do not redo the full research-phase sweep, do not re-gather the",
|
|
6805
|
+
"full background, and do not rewrite the profile body for facts that",
|
|
6806
|
+
"have not changed.",
|
|
6807
|
+
"",
|
|
6808
|
+
"### Steps",
|
|
6809
|
+
"",
|
|
6810
|
+
"1. **Read the existing profile** at the path referenced in the issue",
|
|
6811
|
+
" body. If the profile file is missing, close the issue with",
|
|
6812
|
+
" `status:needs-attention` and stop.",
|
|
6813
|
+
"",
|
|
6814
|
+
"2. **Confirm the staleness threshold.** Compare the profile's `date`",
|
|
6815
|
+
" frontmatter against today's date and the `refresh_days`",
|
|
6816
|
+
" frontmatter (or the project default from the Refresh Cadence",
|
|
6817
|
+
" section above). If the profile is younger than the threshold and",
|
|
6818
|
+
" the issue body does not set `force: true`, close the issue with",
|
|
6819
|
+
" a short comment and stop \u2014 do not burn the search budget.",
|
|
6820
|
+
"",
|
|
6821
|
+
"3. **Run 3\u20135 targeted searches.** Focus on the narrow delta set:",
|
|
6822
|
+
" - Current role / title at the current employer",
|
|
6823
|
+
" - Current employer (has the person changed jobs?)",
|
|
6824
|
+
" - Primary public channel (personal site URL, primary social",
|
|
6825
|
+
" handle, speaker inquiry form, public email if listed)",
|
|
6826
|
+
" - Optional: one search for notable recent public work (a new",
|
|
6827
|
+
" talk, post, or project) if the profile's Expertise Signals",
|
|
6828
|
+
" section has no entry from the last 12 months",
|
|
6829
|
+
"",
|
|
6830
|
+
"4. **Update the profile in place.** Edit only the affected sections",
|
|
6831
|
+
" (typically `## Current Position`, `## Contact Preferences`, and",
|
|
6832
|
+
" occasionally `## Expertise Signals`). Cite every new claim.",
|
|
6833
|
+
" Preserve the slug and the original `parent_issue` field. Bump the",
|
|
6834
|
+
" `date` frontmatter to today's date. Leave untouched sections",
|
|
6835
|
+
" untouched \u2014 refresh is a narrow delta, not a rewrite.",
|
|
6836
|
+
"",
|
|
6837
|
+
"5. **Do not silently re-type the person.** If the refresh surfaces",
|
|
6838
|
+
" evidence that the person's primary role has changed (e.g., a",
|
|
6839
|
+
" customer-contact who now works at your own organization and",
|
|
6840
|
+
" should become a colleague), flag it in `## Risks / Open Questions`",
|
|
6841
|
+
" and stop \u2014 do **not** rewrite the `role` frontmatter without an",
|
|
6842
|
+
" explicit override in the refresh issue body (`retype: <role>`).",
|
|
6843
|
+
"",
|
|
6844
|
+
"6. **Append a revision-history row.** Summarize the delta in one",
|
|
6845
|
+
" line:",
|
|
6846
|
+
"",
|
|
6847
|
+
" ```markdown",
|
|
6848
|
+
" | YYYY-MM-DD | Refreshed: <one-line summary of what changed> |",
|
|
6849
|
+
" ```",
|
|
6850
|
+
"",
|
|
6851
|
+
" When the search budget finds no material change, the row still",
|
|
6852
|
+
" appears so the next scheduled refresh knows this profile was",
|
|
6853
|
+
" reviewed:",
|
|
6854
|
+
"",
|
|
6855
|
+
" ```markdown",
|
|
6856
|
+
" | YYYY-MM-DD | Refreshed: no material change |",
|
|
6857
|
+
" ```",
|
|
6858
|
+
"",
|
|
6859
|
+
"7. **Respect privacy.** The narrow delta set is bounded to public",
|
|
6860
|
+
" professional facts. Never expand the refresh into private contact",
|
|
6861
|
+
" details, family information, or other non-professional data \u2014",
|
|
6862
|
+
" even if a search surfaces them. Privacy guardrails from Phase 1",
|
|
6863
|
+
" apply to every refresh.",
|
|
6864
|
+
"",
|
|
6865
|
+
"8. **Commit and push.** Close the refresh issue with a short comment",
|
|
6866
|
+
" summarizing the delta (or `no material change`).",
|
|
6867
|
+
"",
|
|
6868
|
+
"---",
|
|
6869
|
+
"",
|
|
6084
6870
|
"## Output Boundaries",
|
|
6085
6871
|
"",
|
|
6086
6872
|
"This agent writes **only** to:",
|
|
6087
6873
|
"",
|
|
6088
6874
|
"- `<NOTES_DIR>/` \u2014 research-notes files (Phase 1)",
|
|
6089
|
-
"- `<PROFILES_DIR>/` \u2014 person profiles (Phase 2, updated in
|
|
6875
|
+
"- `<PROFILES_DIR>/` \u2014 person profiles (Phase 2, updated in Phases",
|
|
6876
|
+
" 3 and 4)",
|
|
6090
6877
|
"",
|
|
6091
6878
|
"In Phase 3, this agent also **creates `company:research` and",
|
|
6092
6879
|
"`software:research` issues** for companies and software products",
|
|
@@ -6097,6 +6884,13 @@ var peopleProfileAnalystSubAgent = {
|
|
|
6097
6884
|
"which pick up the issues this pipeline creates. Meeting notes",
|
|
6098
6885
|
"remain link-only across all phases.",
|
|
6099
6886
|
"",
|
|
6887
|
+
"In Phase 4, this agent only updates an existing profile in place \u2014",
|
|
6888
|
+
"it never forks a new profile under a different slug and never",
|
|
6889
|
+
"enqueues downstream `company:research` or `software:research`",
|
|
6890
|
+
"issues. Cross-references surfaced during a refresh are flagged in",
|
|
6891
|
+
"`## Risks / Open Questions` for a follow-up `people:followup` pass",
|
|
6892
|
+
"to handle.",
|
|
6893
|
+
"",
|
|
6100
6894
|
"The pipeline produces **person profiles and notes only**. Deeper",
|
|
6101
6895
|
"research on companies and software products is delegated to",
|
|
6102
6896
|
"downstream research pipelines via `company:research` and",
|
|
@@ -6141,6 +6935,15 @@ var peopleProfileAnalystSubAgent = {
|
|
|
6141
6935
|
" not open `type:requirement` or formal evaluation issues from this",
|
|
6142
6936
|
" pipeline. Follow-up research is scoped through `company:research`",
|
|
6143
6937
|
" and `software:research` only.",
|
|
6938
|
+
"- **Refresh respects the cadence.** Phase 4 exits early when the",
|
|
6939
|
+
" profile is younger than the staleness threshold and `force: true`",
|
|
6940
|
+
" is not set. It always appends a revision-history row so the next",
|
|
6941
|
+
" scheduled run knows the profile was reviewed.",
|
|
6942
|
+
"- **Refresh is narrow, not a rewrite.** Phase 4 re-verifies role,",
|
|
6943
|
+
" employer, and primary public channel with 3\u20135 targeted searches",
|
|
6944
|
+
" and updates only the affected sections. It never re-runs the full",
|
|
6945
|
+
" research-phase sweep and never rewrites sections whose underlying",
|
|
6946
|
+
" facts have not changed.",
|
|
6144
6947
|
"- **Refresh, don't fork.** When a profile exists and is past its",
|
|
6145
6948
|
" cadence, update in place rather than creating a new slug."
|
|
6146
6949
|
].join("\n")
|
|
@@ -6219,23 +7022,110 @@ var profilePersonSkill = {
|
|
|
6219
7022
|
" other downstream artifacts itself."
|
|
6220
7023
|
].join("\n")
|
|
6221
7024
|
};
|
|
7025
|
+
var refreshPersonSkill = {
|
|
7026
|
+
name: "refresh-person",
|
|
7027
|
+
description: "Kick off a people-profile refresh cycle. Creates a people:refresh issue for an existing profile and dispatches Phase 4 (Refresh) in the people-profile-analyst agent. Refresh re-verifies the profile's narrow delta set (role, employer, primary public channel) with 3\u20135 targeted web searches and updates it in place. Respects a configurable staleness threshold so profiles younger than the threshold exit early.",
|
|
7028
|
+
disableModelInvocation: true,
|
|
7029
|
+
userInvocable: true,
|
|
7030
|
+
context: "fork",
|
|
7031
|
+
agent: "people-profile-analyst",
|
|
7032
|
+
platforms: { cursor: { exclude: true } },
|
|
7033
|
+
instructions: [
|
|
7034
|
+
"# Refresh Person",
|
|
7035
|
+
"",
|
|
7036
|
+
"Re-verify an existing person profile with a small number of",
|
|
7037
|
+
"targeted web searches and update the profile in place. Creates a",
|
|
7038
|
+
"`people:refresh` issue for the target profile and dispatches",
|
|
7039
|
+
"Phase 4 (Refresh) in the people-profile-analyst agent.",
|
|
7040
|
+
"",
|
|
7041
|
+
"Refresh respects a configurable **staleness threshold** so scheduled",
|
|
7042
|
+
"refreshes do not burn search budget on profiles that are still",
|
|
7043
|
+
"fresh.",
|
|
7044
|
+
"",
|
|
7045
|
+
"## Usage",
|
|
7046
|
+
"",
|
|
7047
|
+
"/refresh-person <path-to-profile>",
|
|
7048
|
+
"",
|
|
7049
|
+
"Optional extensions in the issue body:",
|
|
7050
|
+
"- `refresh_days: <N>` \u2014 override the default 180-day staleness",
|
|
7051
|
+
" threshold for this run",
|
|
7052
|
+
"- `force: true` \u2014 refresh even if the profile is younger than the",
|
|
7053
|
+
" threshold",
|
|
7054
|
+
"- `retype: <colleague | customer-contact | vendor-contact |",
|
|
7055
|
+
" partner-contact | industry-expert | connector>` \u2014 explicitly",
|
|
7056
|
+
" allow Phase 4 to change the profile's `role` when the refresh",
|
|
7057
|
+
" finds material evidence of a role-type change",
|
|
7058
|
+
"",
|
|
7059
|
+
"## Staleness Threshold",
|
|
7060
|
+
"",
|
|
7061
|
+
"Order of precedence (first match wins):",
|
|
7062
|
+
"",
|
|
7063
|
+
"1. `refresh_days` in the issue body (per-run override)",
|
|
7064
|
+
"2. `refresh_days` frontmatter on the profile itself",
|
|
7065
|
+
"3. Project-wide default declared under a `## Refresh Cadence`",
|
|
7066
|
+
" section in `docs/src/content/docs/project-context.md`",
|
|
7067
|
+
"4. Built-in default: **180 days**",
|
|
7068
|
+
"",
|
|
7069
|
+
"If the profile's `date` frontmatter plus the resolved threshold is",
|
|
7070
|
+
"in the future (i.e. the profile is still fresh) and `force: true`",
|
|
7071
|
+
"is not set, Phase 4 closes the refresh issue with a short comment",
|
|
7072
|
+
"and stops without running any searches.",
|
|
7073
|
+
"",
|
|
7074
|
+
"## Budget",
|
|
7075
|
+
"",
|
|
7076
|
+
"- **3\u20135 targeted web searches** focused on the narrow delta set:",
|
|
7077
|
+
" current role / title, current employer, primary public channel",
|
|
7078
|
+
" (personal site, handle, speaker inquiry form, public email).",
|
|
7079
|
+
"- Optional: one search for notable recent public work if the",
|
|
7080
|
+
" profile has no Expertise Signals entry from the last 12 months.",
|
|
7081
|
+
"",
|
|
7082
|
+
"## Privacy",
|
|
7083
|
+
"",
|
|
7084
|
+
"Privacy guardrails from Phase 1 apply to every refresh. Never",
|
|
7085
|
+
"record private contact details, family information, or other",
|
|
7086
|
+
"non-professional personal data \u2014 even if a search surfaces them.",
|
|
7087
|
+
"",
|
|
7088
|
+
"## Steps",
|
|
7089
|
+
"",
|
|
7090
|
+
"1. Create a `people:refresh` issue with `type:people-profile`,",
|
|
7091
|
+
" `priority:medium`, and `status:ready`. Body must include the",
|
|
7092
|
+
" profile path and any overrides.",
|
|
7093
|
+
"2. Execute Phase 4 (Refresh) of the people-profile-analyst agent.",
|
|
7094
|
+
"",
|
|
7095
|
+
"## Output",
|
|
7096
|
+
"",
|
|
7097
|
+
"- The profile is updated in place (affected sections edited,",
|
|
7098
|
+
" `date` bumped, slug preserved)",
|
|
7099
|
+
"- A revision-history row summarizing the delta \u2014 or",
|
|
7100
|
+
" `Refreshed: no material change` when the search budget found",
|
|
7101
|
+
" nothing material"
|
|
7102
|
+
].join("\n")
|
|
7103
|
+
};
|
|
6222
7104
|
var peopleProfileBundle = {
|
|
6223
7105
|
name: "people-profile",
|
|
6224
|
-
description: "People research and profiling pipeline: research, draft profile, followup. Enabled by default; domain-neutral; filesystem-durable between phases. Cross-references existing companies, software, and meeting notes, and Phase 3 (Followup) hands unprofiled, genuinely-relevant companies and software products off to the `company-profile` and `software-profile` bundles via `company:research` and `software:research` issues.",
|
|
7106
|
+
description: "People research and profiling pipeline: research, draft profile, followup, refresh. Enabled by default; domain-neutral; filesystem-durable between phases. Cross-references existing companies, software, and meeting notes, and Phase 3 (Followup) hands unprofiled, genuinely-relevant companies and software products off to the `company-profile` and `software-profile` bundles via `company:research` and `software:research` issues. Phase 4 (Refresh) re-verifies profiles on a configurable staleness cadence.",
|
|
6225
7107
|
appliesWhen: () => true,
|
|
6226
7108
|
rules: [
|
|
6227
7109
|
{
|
|
6228
7110
|
name: "people-profile-workflow",
|
|
6229
|
-
description: "Describes the
|
|
7111
|
+
description: "Describes the 4-phase people-profile pipeline, the people:* label taxonomy, the cross-reference model, the refresh cadence rules, and the boundary against downstream research agents.",
|
|
6230
7112
|
scope: AGENT_RULE_SCOPE.ALWAYS,
|
|
6231
7113
|
content: [
|
|
6232
7114
|
"# People Profile Workflow",
|
|
6233
7115
|
"",
|
|
6234
7116
|
"Use `/profile-person <person-name>` to kick off a person",
|
|
6235
|
-
"research and profiling pipeline. The pipeline runs in up to
|
|
6236
|
-
"phases \u2014 research, draft, followup \u2014 each tracked by
|
|
6237
|
-
"GitHub issue labeled `people:research`, `people:draft`,
|
|
6238
|
-
"`people:followup`. All issues carry
|
|
7117
|
+
"research and profiling pipeline. The pipeline runs in up to 4",
|
|
7118
|
+
"phases \u2014 research, draft, followup, refresh \u2014 each tracked by",
|
|
7119
|
+
"its own GitHub issue labeled `people:research`, `people:draft`,",
|
|
7120
|
+
"`people:followup`, or `people:refresh`. All issues carry",
|
|
7121
|
+
"`type:people-profile`.",
|
|
7122
|
+
"",
|
|
7123
|
+
"One additional user-invocable skill drives the maintenance",
|
|
7124
|
+
"phase independently:",
|
|
7125
|
+
"",
|
|
7126
|
+
"- `/refresh-person <path-to-profile>` \u2014 re-verify an existing",
|
|
7127
|
+
" profile with 3\u20135 targeted web searches and update it in",
|
|
7128
|
+
" place (Phase 4, respects a configurable staleness threshold).",
|
|
6239
7129
|
"",
|
|
6240
7130
|
"The pipeline produces **person profiles only**. Deeper research",
|
|
6241
7131
|
"on companies and software products surfaced while profiling is",
|
|
@@ -6254,7 +7144,7 @@ var peopleProfileBundle = {
|
|
|
6254
7144
|
tags: ["workflow"]
|
|
6255
7145
|
}
|
|
6256
7146
|
],
|
|
6257
|
-
skills: [profilePersonSkill],
|
|
7147
|
+
skills: [profilePersonSkill, refreshPersonSkill],
|
|
6258
7148
|
subAgents: [peopleProfileAnalystSubAgent],
|
|
6259
7149
|
labels: [
|
|
6260
7150
|
{
|
|
@@ -6276,6 +7166,11 @@ var peopleProfileBundle = {
|
|
|
6276
7166
|
name: "people:followup",
|
|
6277
7167
|
color: "D4C5F9",
|
|
6278
7168
|
description: "Phase 3: cross-link the profile to existing companies, software, and meeting notes, and enqueue follow-up research issues for unprofiled companies and software products"
|
|
7169
|
+
},
|
|
7170
|
+
{
|
|
7171
|
+
name: "people:refresh",
|
|
7172
|
+
color: "F9D0C4",
|
|
7173
|
+
description: "Phase 4: re-verify an existing person profile with targeted web searches and update it in place"
|
|
6279
7174
|
}
|
|
6280
7175
|
]
|
|
6281
7176
|
};
|