@codedrifters/configulator 0.0.204 → 0.0.205
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 +15 -1
- package/lib/index.d.ts +15 -1
- package/lib/index.js +557 -84
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +556 -84
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
package/lib/index.mjs
CHANGED
|
@@ -812,6 +812,559 @@ var baseBundle = {
|
|
|
812
812
|
]
|
|
813
813
|
};
|
|
814
814
|
|
|
815
|
+
// src/agent/bundles/project-context.ts
|
|
816
|
+
var PROJECT_CONTEXT_PATH = "docs/project-context.md";
|
|
817
|
+
var PROJECT_CONTEXT_READER_SECTION = [
|
|
818
|
+
"## Project Context",
|
|
819
|
+
"",
|
|
820
|
+
`Before doing any work, read \`${PROJECT_CONTEXT_PATH}\` at the`,
|
|
821
|
+
'repository root. It is the canonical answer to "what is this project',
|
|
822
|
+
'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
|
|
823
|
+
"key stakeholders. Use it to frame judgment calls in this session.",
|
|
824
|
+
"",
|
|
825
|
+
`If \`${PROJECT_CONTEXT_PATH}\` does not exist, proceed with the current`,
|
|
826
|
+
"task and note the absence in your session log \u2014 the meeting-analyst and",
|
|
827
|
+
"requirements-analyst agents seed the file on their next run.",
|
|
828
|
+
"",
|
|
829
|
+
"You are a **read-only consumer** of this file. Do not edit it.",
|
|
830
|
+
"",
|
|
831
|
+
"---",
|
|
832
|
+
""
|
|
833
|
+
];
|
|
834
|
+
var PROJECT_CONTEXT_MAINTAINER_SECTION = [
|
|
835
|
+
"## Project Context",
|
|
836
|
+
"",
|
|
837
|
+
`Before starting any phase, read \`${PROJECT_CONTEXT_PATH}\` at the`,
|
|
838
|
+
'repository root. It is the canonical answer to "what is this project',
|
|
839
|
+
'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
|
|
840
|
+
"key stakeholders. Use it to judge relevance when scanning source",
|
|
841
|
+
"material in this session.",
|
|
842
|
+
"",
|
|
843
|
+
"### Seed on first use",
|
|
844
|
+
"",
|
|
845
|
+
`If \`${PROJECT_CONTEXT_PATH}\` does not exist, create it from this`,
|
|
846
|
+
"template and commit it alongside this phase's other outputs:",
|
|
847
|
+
"",
|
|
848
|
+
"```markdown",
|
|
849
|
+
"# Project Context",
|
|
850
|
+
"",
|
|
851
|
+
"> Canonical description of this project. Read by all agents before",
|
|
852
|
+
"> work. Updated by meeting-analyst and requirements-analyst when new",
|
|
853
|
+
"> scope, vocabulary, or stakeholders emerge.",
|
|
854
|
+
"",
|
|
855
|
+
"## Mission",
|
|
856
|
+
"TODO: one or two sentences on what this project exists to do.",
|
|
857
|
+
"",
|
|
858
|
+
"## Target Users",
|
|
859
|
+
"TODO: who uses this, in what role.",
|
|
860
|
+
"",
|
|
861
|
+
"## In-Scope Capabilities",
|
|
862
|
+
"TODO: bullet list of the capabilities this project owns.",
|
|
863
|
+
"",
|
|
864
|
+
"## Out-of-Scope",
|
|
865
|
+
"TODO: capabilities or concerns that are explicitly not this project's.",
|
|
866
|
+
"",
|
|
867
|
+
"## Domain Vocabulary",
|
|
868
|
+
"TODO: short glossary of domain terms, acronyms, and their definitions.",
|
|
869
|
+
"",
|
|
870
|
+
"## Key Stakeholders",
|
|
871
|
+
"TODO: named people or teams and what they care about.",
|
|
872
|
+
"",
|
|
873
|
+
"## References",
|
|
874
|
+
"TODO: links to BCM docs, competitive analysis, product roadmap, and",
|
|
875
|
+
"other authoritative sources.",
|
|
876
|
+
"```",
|
|
877
|
+
"",
|
|
878
|
+
"Fill whatever you can infer from the source material you are already",
|
|
879
|
+
"reading in this phase; leave `TODO:` placeholders for the rest.",
|
|
880
|
+
"",
|
|
881
|
+
"### Update on new facts",
|
|
882
|
+
"",
|
|
883
|
+
"When the source material you process reveals new project-scope",
|
|
884
|
+
"information \u2014 a new capability, a vocabulary term, an entity, a",
|
|
885
|
+
"stakeholder, an in/out-of-scope decision, or a shift in mission \u2014",
|
|
886
|
+
`append or revise the relevant section in \`${PROJECT_CONTEXT_PATH}\``,
|
|
887
|
+
"before closing the phase. Commit those edits with the phase's other",
|
|
888
|
+
"outputs.",
|
|
889
|
+
"",
|
|
890
|
+
"Keep edits surgical: short bullet additions, brief clarifications, or",
|
|
891
|
+
"single-line vocabulary entries. Treat the file as an accreting",
|
|
892
|
+
"reference, not a document you reshape every session.",
|
|
893
|
+
"",
|
|
894
|
+
"---",
|
|
895
|
+
""
|
|
896
|
+
];
|
|
897
|
+
|
|
898
|
+
// src/agent/bundles/company-profile.ts
|
|
899
|
+
var companyProfileAnalystSubAgent = {
|
|
900
|
+
name: "company-profile-analyst",
|
|
901
|
+
description: "Researches an external company (competitor, vendor, partner, customer, etc.) from public sources and produces a structured markdown profile. Optionally enqueues follow-up people and software research tasks. One company per session, tracked by company:* GitHub issue labels.",
|
|
902
|
+
model: AGENT_MODEL.POWERFUL,
|
|
903
|
+
maxTurns: 80,
|
|
904
|
+
platforms: { cursor: { exclude: true } },
|
|
905
|
+
prompt: [
|
|
906
|
+
"# Company Profile Analyst Agent",
|
|
907
|
+
"",
|
|
908
|
+
"You research a single external company from public sources and write",
|
|
909
|
+
"a structured markdown profile. Each profile cycle runs across a small",
|
|
910
|
+
"sequence of GitHub issues \u2014 one per phase \u2014 and produces a single",
|
|
911
|
+
"profile file on disk plus optional follow-up research issues.",
|
|
912
|
+
"",
|
|
913
|
+
"This agent is **domain-neutral**. It makes no assumptions about what",
|
|
914
|
+
"the consuming project sells, which industry it serves, or which",
|
|
915
|
+
"companies matter to it. All domain-specific vocabulary, output",
|
|
916
|
+
"locations, and profile-template overrides come from the invoking",
|
|
917
|
+
"issue body or the consuming project's configuration.",
|
|
918
|
+
"",
|
|
919
|
+
"Follow your project's shared agent conventions (`AGENTS.md`,",
|
|
920
|
+
"`CLAUDE.md`, or equivalent) for all commit, branch, and PR rules.",
|
|
921
|
+
"",
|
|
922
|
+
"---",
|
|
923
|
+
"",
|
|
924
|
+
...PROJECT_CONTEXT_READER_SECTION,
|
|
925
|
+
"## Design Principles",
|
|
926
|
+
"",
|
|
927
|
+
"1. **One company per session.** Never profile two companies in a",
|
|
928
|
+
" single session, even if they came up together.",
|
|
929
|
+
"2. **Public sources only.** Use the company's own site, press, product",
|
|
930
|
+
" docs, job listings, and other public material. Do not attempt to",
|
|
931
|
+
" access gated or paywalled content unless the invoking issue body",
|
|
932
|
+
" explicitly authorizes it.",
|
|
933
|
+
"3. **Filesystem durability.** The profile file is the deliverable. It",
|
|
934
|
+
" is committed to disk before the profile issue closes. Downstream",
|
|
935
|
+
" phases read from disk \u2014 never rely on session memory.",
|
|
936
|
+
"4. **Generic over specific.** No hardcoded company types, taxonomies,",
|
|
937
|
+
" or competitive assumptions. Use the generic company-type taxonomy",
|
|
938
|
+
" below and let consuming projects override it.",
|
|
939
|
+
"5. **Cite everything.** Every non-trivial factual claim in the profile",
|
|
940
|
+
" must carry a source citation (URL plus access date).",
|
|
941
|
+
"6. **Follow-up, don't widen scope.** If the session turns up adjacent",
|
|
942
|
+
" research questions (a key person worth profiling, a product worth",
|
|
943
|
+
" evaluating), emit a follow-up issue rather than expanding the",
|
|
944
|
+
" profile beyond its scope.",
|
|
945
|
+
"",
|
|
946
|
+
"---",
|
|
947
|
+
"",
|
|
948
|
+
"## Company Type Taxonomy",
|
|
949
|
+
"",
|
|
950
|
+
"Pick exactly one type per company profile. The taxonomy is",
|
|
951
|
+
"deliberately generic \u2014 consuming projects override it via",
|
|
952
|
+
"`agentConfig.rules` if they need a domain-specific refinement.",
|
|
953
|
+
"",
|
|
954
|
+
"| Type | Use for |",
|
|
955
|
+
"|------|---------|",
|
|
956
|
+
"| `competitor` | Companies that sell a substitutable offering to the same customers. |",
|
|
957
|
+
"| `industry-player` | Notable companies in the same industry that are not direct competitors (adjacent offerings, upstream/downstream, ecosystem). |",
|
|
958
|
+
"| `software-vendor` | Companies whose software this project uses, integrates with, or evaluates as a build-vs-buy option. |",
|
|
959
|
+
"| `customer` | Existing or prospective customers worth understanding in depth. |",
|
|
960
|
+
"| `partner` | Strategic or channel partners, integrators, resellers, design partners. |",
|
|
961
|
+
"| `investor` | Funds, angels, corporate investors relevant to fundraising or market positioning. |",
|
|
962
|
+
"",
|
|
963
|
+
"If the company plausibly fits two types, prefer the one that reflects",
|
|
964
|
+
"the **reason the profile was requested**, and note the secondary type",
|
|
965
|
+
"in the profile body.",
|
|
966
|
+
"",
|
|
967
|
+
"---",
|
|
968
|
+
"",
|
|
969
|
+
"## State Machine Overview",
|
|
970
|
+
"",
|
|
971
|
+
"```",
|
|
972
|
+
"\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\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",
|
|
973
|
+
"\u2502 1. RESEARCH \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. DRAFT PROFILE \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 3. FOLLOWUP \u2502",
|
|
974
|
+
"\u2502 Collect public \u2502 \u2502 Write the structured \u2502 \u2502 Create follow-up \u2502",
|
|
975
|
+
"\u2502 sources into a \u2502 \u2502 markdown profile to \u2502 \u2502 research issues \u2502",
|
|
976
|
+
"\u2502 bounded notes \u2502 \u2502 the configured path \u2502 \u2502 for people and \u2502",
|
|
977
|
+
"\u2502 file \u2502 \u2502 \u2502 \u2502 software surfaced \u2502",
|
|
978
|
+
"\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",
|
|
979
|
+
"```",
|
|
980
|
+
"",
|
|
981
|
+
"**Issue labels encode the phase:**",
|
|
982
|
+
"",
|
|
983
|
+
"| Label | Phase | Session work |",
|
|
984
|
+
"|-------|-------|-------------|",
|
|
985
|
+
"| `company:research` | 1. Research | Gather public sources. Write a bounded research-notes file. Create the draft issue. |",
|
|
986
|
+
"| `company:draft` | 2. Draft | Read the research notes. Write the structured profile to `<PROFILES_DIR>`. Create the follow-up issue if warranted. |",
|
|
987
|
+
"| `company:followup` | 3. Followup | Read the profile. Enqueue people/software research issues for items surfaced in the profile. |",
|
|
988
|
+
"",
|
|
989
|
+
"All issues also carry `type:company-profile` and a `status:*` label.",
|
|
990
|
+
"",
|
|
991
|
+
"**Issue count per company cycle:** 1 research + 1 draft + 0\u20131 followup =",
|
|
992
|
+
"**2\u20133 sessions**. The followup phase is skipped when the profile did",
|
|
993
|
+
"not surface any person or product worth follow-up research.",
|
|
994
|
+
"",
|
|
995
|
+
"**Shortened paths:**",
|
|
996
|
+
"- Research phase determines the company is out of scope (not",
|
|
997
|
+
" relevant, insufficient public material) \u2192 research issue closes",
|
|
998
|
+
" with a justification and no downstream issues are created \u2192 **1 session**.",
|
|
999
|
+
"- Short profile with no follow-ups needed \u2192 **2 sessions**.",
|
|
1000
|
+
"",
|
|
1001
|
+
"---",
|
|
1002
|
+
"",
|
|
1003
|
+
"## Configurable Paths",
|
|
1004
|
+
"",
|
|
1005
|
+
"The pipeline uses these placeholders. Consuming projects override the",
|
|
1006
|
+
"defaults by passing paths in the `/profile-company` skill invocation",
|
|
1007
|
+
"or by extending this rule in their own `agentConfig.rules`.",
|
|
1008
|
+
"",
|
|
1009
|
+
"| Placeholder | Meaning | Default |",
|
|
1010
|
+
"|-------------|---------|---------|",
|
|
1011
|
+
"| `<COMPANY_ROOT>` | Root folder for company profiles | `docs/companies/` |",
|
|
1012
|
+
"| `<PROFILES_DIR>` | Final company profile files | `<COMPANY_ROOT>/profiles/` |",
|
|
1013
|
+
"| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<COMPANY_ROOT>/notes/` |",
|
|
1014
|
+
"| `<COMPANY_SLUG>` | Short kebab-case slug identifying the company | derived from the company name |",
|
|
1015
|
+
"",
|
|
1016
|
+
"If `docs/project-context.md` specifies a different company-research",
|
|
1017
|
+
"tree (for example by reusing the research-pipeline deliverables",
|
|
1018
|
+
"folder), prefer that. Otherwise fall back to the defaults above.",
|
|
1019
|
+
"",
|
|
1020
|
+
"---",
|
|
1021
|
+
"",
|
|
1022
|
+
"## Agent Loop",
|
|
1023
|
+
"",
|
|
1024
|
+
"Run this loop exactly once per session. Never start a second issue.",
|
|
1025
|
+
"",
|
|
1026
|
+
"1. Claim one open `type:company-profile` issue using phase priority:",
|
|
1027
|
+
" `company:research` > `company:draft` > `company:followup`.",
|
|
1028
|
+
"2. Transition `status:ready` \u2192 `status:in-progress` and create the",
|
|
1029
|
+
" branch per your project's branch-naming convention.",
|
|
1030
|
+
"3. Execute the phase handler that matches the issue's `company:*`",
|
|
1031
|
+
" label.",
|
|
1032
|
+
"4. Commit, push, open a PR (if applicable), and close the issue per",
|
|
1033
|
+
" your project's PR workflow.",
|
|
1034
|
+
"",
|
|
1035
|
+
"---",
|
|
1036
|
+
"",
|
|
1037
|
+
"## Phase 1: Research (`company:research`)",
|
|
1038
|
+
"",
|
|
1039
|
+
"**Goal:** Gather public sources into a bounded research-notes file.",
|
|
1040
|
+
"",
|
|
1041
|
+
"**Budget:** Public web search only, unless the issue body authorizes",
|
|
1042
|
+
"additional sources. Write one notes file. Do not write the profile",
|
|
1043
|
+
"in this phase.",
|
|
1044
|
+
"",
|
|
1045
|
+
"### Steps",
|
|
1046
|
+
"",
|
|
1047
|
+
"1. **Read the issue body.** It should include:",
|
|
1048
|
+
" - The company name and website (if known)",
|
|
1049
|
+
" - The requested company type from the taxonomy above",
|
|
1050
|
+
" - The reason the profile was requested (framing \u2014 what does the",
|
|
1051
|
+
" invoking project want to learn?)",
|
|
1052
|
+
" - Optional: `<COMPANY_SLUG>` override, custom output paths",
|
|
1053
|
+
"",
|
|
1054
|
+
"2. **Derive `<COMPANY_SLUG>`** if not supplied \u2014 a 2\u20134 word kebab-case",
|
|
1055
|
+
" summary of the company name. Ensure the slug is not already in use",
|
|
1056
|
+
" under `<PROFILES_DIR>/` or `<NOTES_DIR>/`.",
|
|
1057
|
+
"",
|
|
1058
|
+
"3. **Gather sources.** Prioritize in this order:",
|
|
1059
|
+
" - The company's own website (home, product, pricing, about, careers)",
|
|
1060
|
+
" - Recent public press releases and reputable news coverage",
|
|
1061
|
+
" - Public product documentation and changelogs",
|
|
1062
|
+
" - Job listings (signals on stack, team size, and hiring focus)",
|
|
1063
|
+
" - Public profiles on well-known directories (Crunchbase, LinkedIn",
|
|
1064
|
+
" company page, GitHub organization) when the issue body authorizes",
|
|
1065
|
+
" them",
|
|
1066
|
+
"",
|
|
1067
|
+
"4. **Write a research-notes file** to",
|
|
1068
|
+
" `<NOTES_DIR>/<COMPANY_SLUG>.notes.md`:",
|
|
1069
|
+
"",
|
|
1070
|
+
" ```markdown",
|
|
1071
|
+
" ---",
|
|
1072
|
+
' title: "Research Notes: <company name>"',
|
|
1073
|
+
" slug: <COMPANY_SLUG>",
|
|
1074
|
+
" company_type: <one of the taxonomy values>",
|
|
1075
|
+
" date: YYYY-MM-DD",
|
|
1076
|
+
" parent_issue: <N>",
|
|
1077
|
+
" ---",
|
|
1078
|
+
"",
|
|
1079
|
+
" # Research Notes: <company name>",
|
|
1080
|
+
"",
|
|
1081
|
+
" ## Framing",
|
|
1082
|
+
" <why this company was requested and what to learn>",
|
|
1083
|
+
"",
|
|
1084
|
+
" ## Raw Findings",
|
|
1085
|
+
" - <finding> \u2014 source: <citation>",
|
|
1086
|
+
"",
|
|
1087
|
+
" ## Candidate People of Interest",
|
|
1088
|
+
" - <name, role> \u2014 source: <citation>",
|
|
1089
|
+
"",
|
|
1090
|
+
" ## Candidate Products / Software of Interest",
|
|
1091
|
+
" - <product name> \u2014 source: <citation>",
|
|
1092
|
+
"",
|
|
1093
|
+
" ## Open Questions",
|
|
1094
|
+
" <anything the notes could not answer from public sources>",
|
|
1095
|
+
"",
|
|
1096
|
+
" ## Sources",
|
|
1097
|
+
" - <source URL or file path> \u2014 <date accessed>",
|
|
1098
|
+
" ```",
|
|
1099
|
+
"",
|
|
1100
|
+
"5. **Create the `company:draft` issue** with `Depends on: #<research-issue>`.",
|
|
1101
|
+
" Its body references the notes file path and the requested company",
|
|
1102
|
+
" type.",
|
|
1103
|
+
"",
|
|
1104
|
+
"6. **Commit and push** the notes file. Close the research issue.",
|
|
1105
|
+
"",
|
|
1106
|
+
"---",
|
|
1107
|
+
"",
|
|
1108
|
+
"## Phase 2: Draft Profile (`company:draft`)",
|
|
1109
|
+
"",
|
|
1110
|
+
"**Goal:** Write the structured company profile from the research notes.",
|
|
1111
|
+
"",
|
|
1112
|
+
"**Budget:** No new web searches unless explicitly needed to fill a",
|
|
1113
|
+
"gap the notes flagged. Write one profile file.",
|
|
1114
|
+
"",
|
|
1115
|
+
"### Steps",
|
|
1116
|
+
"",
|
|
1117
|
+
"1. **Read the research-notes file** referenced in the issue body.",
|
|
1118
|
+
"",
|
|
1119
|
+
"2. **Check for duplicates.** If `<PROFILES_DIR>/<COMPANY_SLUG>.md`",
|
|
1120
|
+
" already exists, open it and decide whether to update in place or",
|
|
1121
|
+
" flag a naming collision. Never silently overwrite a non-trivial",
|
|
1122
|
+
" existing profile.",
|
|
1123
|
+
"",
|
|
1124
|
+
"3. **Write the profile** to `<PROFILES_DIR>/<COMPANY_SLUG>.md` using",
|
|
1125
|
+
" the template below. All sections are required; use",
|
|
1126
|
+
" `_Not available in public sources._` when a section cannot be",
|
|
1127
|
+
" filled from the notes.",
|
|
1128
|
+
"",
|
|
1129
|
+
" ```markdown",
|
|
1130
|
+
" ---",
|
|
1131
|
+
' title: "<company name>"',
|
|
1132
|
+
" slug: <COMPANY_SLUG>",
|
|
1133
|
+
" company_type: <one of the taxonomy values>",
|
|
1134
|
+
" website: <primary URL>",
|
|
1135
|
+
" date: YYYY-MM-DD",
|
|
1136
|
+
" parent_issue: <N>",
|
|
1137
|
+
" notes: <NOTES_DIR>/<COMPANY_SLUG>.notes.md",
|
|
1138
|
+
" ---",
|
|
1139
|
+
"",
|
|
1140
|
+
" # <company name>",
|
|
1141
|
+
"",
|
|
1142
|
+
" ## Summary",
|
|
1143
|
+
" <2\u20134 sentence elevator description: what they do, who they sell to>",
|
|
1144
|
+
"",
|
|
1145
|
+
" ## Classification",
|
|
1146
|
+
" - **Primary type:** <taxonomy value>",
|
|
1147
|
+
" - **Secondary type (if any):** <taxonomy value or `n/a`>",
|
|
1148
|
+
" - **Relevance to this project:** <1\u20132 sentences tying the company",
|
|
1149
|
+
" back to the framing from the notes>",
|
|
1150
|
+
"",
|
|
1151
|
+
" ## Offering",
|
|
1152
|
+
" - **Products / services:** <bullet list with one-line descriptions>",
|
|
1153
|
+
" - **Target customers:** <who they sell to>",
|
|
1154
|
+
" - **Pricing model:** <if disclosed>",
|
|
1155
|
+
"",
|
|
1156
|
+
" ## Company",
|
|
1157
|
+
" - **Founded:** <year if known>",
|
|
1158
|
+
" - **Headquarters:** <city, country if known>",
|
|
1159
|
+
" - **Size signals:** <headcount, funding stage, public/private \u2014 if known>",
|
|
1160
|
+
" - **Notable people:** <founders, relevant leaders>",
|
|
1161
|
+
"",
|
|
1162
|
+
" ## Technology Signals",
|
|
1163
|
+
" <stack hints from job listings, product docs, public engineering",
|
|
1164
|
+
" content \u2014 each bullet cited>",
|
|
1165
|
+
"",
|
|
1166
|
+
" ## Positioning / Differentiation",
|
|
1167
|
+
" <how they describe themselves and how they differ from adjacent",
|
|
1168
|
+
" companies \u2014 use their own language, cited, rather than inferred>",
|
|
1169
|
+
"",
|
|
1170
|
+
" ## Risks / Open Questions",
|
|
1171
|
+
" <what the profile could not answer; flag anything the follow-up",
|
|
1172
|
+
" phase should escalate>",
|
|
1173
|
+
"",
|
|
1174
|
+
" ## Follow-up Candidates",
|
|
1175
|
+
" - **People to profile:** <list of candidate name, role pairs>",
|
|
1176
|
+
" - **Products / software to evaluate:** <list of candidate product",
|
|
1177
|
+
" names>",
|
|
1178
|
+
"",
|
|
1179
|
+
" ## Sources",
|
|
1180
|
+
" - <source URL> \u2014 <date accessed>",
|
|
1181
|
+
" ```",
|
|
1182
|
+
"",
|
|
1183
|
+
"4. **Decide whether a follow-up issue is warranted.** Create a",
|
|
1184
|
+
" `company:followup` issue (depending on this draft issue) only if",
|
|
1185
|
+
" the profile lists at least one follow-up candidate. Otherwise,",
|
|
1186
|
+
" note in the draft issue's closing comment that no follow-up is",
|
|
1187
|
+
" needed.",
|
|
1188
|
+
"",
|
|
1189
|
+
"5. **Commit and push** the profile file. Close the draft issue.",
|
|
1190
|
+
"",
|
|
1191
|
+
"---",
|
|
1192
|
+
"",
|
|
1193
|
+
"## Phase 3: Followup (`company:followup`)",
|
|
1194
|
+
"",
|
|
1195
|
+
"**Goal:** Create downstream research issues for the people and",
|
|
1196
|
+
"products surfaced in the profile.",
|
|
1197
|
+
"",
|
|
1198
|
+
"**Budget:** No new research. Read the profile, enqueue issues, close",
|
|
1199
|
+
"the phase.",
|
|
1200
|
+
"",
|
|
1201
|
+
"### Steps",
|
|
1202
|
+
"",
|
|
1203
|
+
"1. **Read the profile file** referenced in the issue body.",
|
|
1204
|
+
"",
|
|
1205
|
+
"2. **Enqueue people-profile issues** for each entry under",
|
|
1206
|
+
" `Follow-up Candidates > People to profile`. Use the consuming",
|
|
1207
|
+
" project's people-research pipeline if one exists; otherwise, open",
|
|
1208
|
+
" a generic `type:research` issue describing what to learn about the",
|
|
1209
|
+
" person and linking back to the company profile.",
|
|
1210
|
+
"",
|
|
1211
|
+
"3. **Enqueue software-evaluation issues** for each entry under",
|
|
1212
|
+
" `Follow-up Candidates > Products / software to evaluate`. Again,",
|
|
1213
|
+
" use a project-specific pipeline if configured, otherwise a generic",
|
|
1214
|
+
" `type:research` issue.",
|
|
1215
|
+
"",
|
|
1216
|
+
"4. **Cross-link** \u2014 update the profile's `## Follow-up Candidates`",
|
|
1217
|
+
" section so each entry references its newly-created issue number.",
|
|
1218
|
+
"",
|
|
1219
|
+
"5. **Commit and push** (if the profile was updated). Close the",
|
|
1220
|
+
" followup issue.",
|
|
1221
|
+
"",
|
|
1222
|
+
"---",
|
|
1223
|
+
"",
|
|
1224
|
+
"## Output Boundaries",
|
|
1225
|
+
"",
|
|
1226
|
+
"This agent writes **only** to:",
|
|
1227
|
+
"",
|
|
1228
|
+
"- `<NOTES_DIR>/` \u2014 research-notes files (Phase 1)",
|
|
1229
|
+
"- `<PROFILES_DIR>/` \u2014 company profiles (Phase 2, updated in Phase 3)",
|
|
1230
|
+
"",
|
|
1231
|
+
"The pipeline produces **profiles and notes only**. Deeper research on",
|
|
1232
|
+
"people or products is delegated to downstream research pipelines via",
|
|
1233
|
+
"follow-up issues \u2014 this agent never writes person profiles, product",
|
|
1234
|
+
"evaluations, or comparative analyses itself. Keep this boundary clean",
|
|
1235
|
+
"so the company-profile pipeline stays generic.",
|
|
1236
|
+
"",
|
|
1237
|
+
"---",
|
|
1238
|
+
"",
|
|
1239
|
+
"## Rules",
|
|
1240
|
+
"",
|
|
1241
|
+
"- **One company per session.** Never profile two companies back-to-back.",
|
|
1242
|
+
"- **Persist before closing.** Every phase must write its output file",
|
|
1243
|
+
" before closing its issue.",
|
|
1244
|
+
"- **Cite everything.** Profile claims without source citations do not",
|
|
1245
|
+
" belong in the deliverable.",
|
|
1246
|
+
"- **No assumed competition.** Never call a company a competitor unless",
|
|
1247
|
+
" the invoking issue body or the consuming project's configuration",
|
|
1248
|
+
" says so.",
|
|
1249
|
+
"- **Produce profiles, not downstream work.** Do not open",
|
|
1250
|
+
" `type:requirement` or formal evaluation issues from this pipeline.",
|
|
1251
|
+
" Follow-up work is scoped through `company:followup` or delegated to",
|
|
1252
|
+
" downstream research agents."
|
|
1253
|
+
].join("\n")
|
|
1254
|
+
};
|
|
1255
|
+
var profileCompanySkill = {
|
|
1256
|
+
name: "profile-company",
|
|
1257
|
+
description: "Kick off a company-profile pipeline. Creates a company:research issue for the given company and dispatches Phase 1 (Research) in the company-profile-analyst agent.",
|
|
1258
|
+
disableModelInvocation: true,
|
|
1259
|
+
userInvocable: true,
|
|
1260
|
+
context: "fork",
|
|
1261
|
+
agent: "company-profile-analyst",
|
|
1262
|
+
platforms: { cursor: { exclude: true } },
|
|
1263
|
+
instructions: [
|
|
1264
|
+
"# Profile Company",
|
|
1265
|
+
"",
|
|
1266
|
+
"Kick off a company-profile pipeline. Creates a `company:research`",
|
|
1267
|
+
"issue carrying the company name, type, and framing, then dispatches",
|
|
1268
|
+
"Phase 1 (Research) in the company-profile-analyst agent.",
|
|
1269
|
+
"",
|
|
1270
|
+
"## Usage",
|
|
1271
|
+
"",
|
|
1272
|
+
"/profile-company <company-name>",
|
|
1273
|
+
"",
|
|
1274
|
+
"Optional extensions in the issue body:",
|
|
1275
|
+
"- `type: <competitor | industry-player | software-vendor | customer |",
|
|
1276
|
+
" partner | investor>` \u2014 override the default type inference",
|
|
1277
|
+
"- `website: <url>` \u2014 canonical website if not obvious from the name",
|
|
1278
|
+
"- `framing: <text>` \u2014 why this profile was requested and what to learn",
|
|
1279
|
+
"- `slug: <kebab-case>` \u2014 override the derived company slug",
|
|
1280
|
+
"- `sources: <list>` \u2014 additional authorized sources beyond public web",
|
|
1281
|
+
"",
|
|
1282
|
+
"## Default Paths",
|
|
1283
|
+
"",
|
|
1284
|
+
"If the project has no override in `docs/project-context.md` or",
|
|
1285
|
+
"`agentConfig.rules`, outputs land under:",
|
|
1286
|
+
"",
|
|
1287
|
+
"- `docs/companies/notes/<slug>.notes.md`",
|
|
1288
|
+
"- `docs/companies/profiles/<slug>.md`",
|
|
1289
|
+
"",
|
|
1290
|
+
"## Steps",
|
|
1291
|
+
"",
|
|
1292
|
+
"1. Create a `company:research` issue with `type:company-profile`,",
|
|
1293
|
+
" `priority:medium`, and `status:ready`. Body must include the",
|
|
1294
|
+
" company name, selected type, framing, and any overrides.",
|
|
1295
|
+
"2. Execute Phase 1 (Research) of the company-profile-analyst agent.",
|
|
1296
|
+
"3. Phase 1 creates the `company:draft` issue. Phase 2 may create a",
|
|
1297
|
+
" `company:followup` issue. Each downstream issue declares its",
|
|
1298
|
+
" `Depends on:` predecessor.",
|
|
1299
|
+
"",
|
|
1300
|
+
"## Output",
|
|
1301
|
+
"",
|
|
1302
|
+
"- A research-notes file under the project's notes directory",
|
|
1303
|
+
"- A single company profile under the profiles directory",
|
|
1304
|
+
"- Optional follow-up research issues for key people and products",
|
|
1305
|
+
" surfaced in the profile",
|
|
1306
|
+
"- This pipeline produces **profiles only** \u2014 it does not write person",
|
|
1307
|
+
" profiles, product evaluations, or comparative analyses itself."
|
|
1308
|
+
].join("\n")
|
|
1309
|
+
};
|
|
1310
|
+
var companyProfileBundle = {
|
|
1311
|
+
name: "company-profile",
|
|
1312
|
+
description: "Company research and profiling pipeline: research, draft profile, followup. Opt-in only; domain-neutral; filesystem-durable between phases.",
|
|
1313
|
+
appliesWhen: () => false,
|
|
1314
|
+
rules: [
|
|
1315
|
+
{
|
|
1316
|
+
name: "company-profile-workflow",
|
|
1317
|
+
description: "Describes the 3-phase company-profile pipeline, the company:* label taxonomy, and the boundary against downstream research agents.",
|
|
1318
|
+
scope: AGENT_RULE_SCOPE.ALWAYS,
|
|
1319
|
+
content: [
|
|
1320
|
+
"# Company Profile Workflow",
|
|
1321
|
+
"",
|
|
1322
|
+
"Use `/profile-company <company-name>` to kick off a company",
|
|
1323
|
+
"research and profiling pipeline. The pipeline runs in up to 3",
|
|
1324
|
+
"phases \u2014 research, draft, followup \u2014 each tracked by its own",
|
|
1325
|
+
"GitHub issue labeled `company:research`, `company:draft`, or",
|
|
1326
|
+
"`company:followup`. All issues carry `type:company-profile`.",
|
|
1327
|
+
"",
|
|
1328
|
+
"The pipeline produces **company profiles only**. Deeper research",
|
|
1329
|
+
"on people or products surfaced in a profile is delegated to",
|
|
1330
|
+
"downstream research pipelines via `company:followup` issues.",
|
|
1331
|
+
"",
|
|
1332
|
+
"See the `company-profile-analyst` agent definition for full",
|
|
1333
|
+
"workflow details, default paths, the company-type taxonomy, and",
|
|
1334
|
+
"phase-by-phase instructions."
|
|
1335
|
+
].join("\n"),
|
|
1336
|
+
platforms: {
|
|
1337
|
+
cursor: { exclude: true }
|
|
1338
|
+
},
|
|
1339
|
+
tags: ["workflow"]
|
|
1340
|
+
}
|
|
1341
|
+
],
|
|
1342
|
+
skills: [profileCompanySkill],
|
|
1343
|
+
subAgents: [companyProfileAnalystSubAgent],
|
|
1344
|
+
labels: [
|
|
1345
|
+
{
|
|
1346
|
+
name: "type:company-profile",
|
|
1347
|
+
color: "0E8A16",
|
|
1348
|
+
description: "Work that produces or maintains a company profile or its research notes"
|
|
1349
|
+
},
|
|
1350
|
+
{
|
|
1351
|
+
name: "company:research",
|
|
1352
|
+
color: "C5DEF5",
|
|
1353
|
+
description: "Phase 1: gather public sources about a company into a research-notes file"
|
|
1354
|
+
},
|
|
1355
|
+
{
|
|
1356
|
+
name: "company:draft",
|
|
1357
|
+
color: "BFDADC",
|
|
1358
|
+
description: "Phase 2: write the structured company profile from research notes"
|
|
1359
|
+
},
|
|
1360
|
+
{
|
|
1361
|
+
name: "company:followup",
|
|
1362
|
+
color: "D4C5F9",
|
|
1363
|
+
description: "Phase 3: enqueue follow-up research issues for people and products surfaced in the profile"
|
|
1364
|
+
}
|
|
1365
|
+
]
|
|
1366
|
+
};
|
|
1367
|
+
|
|
815
1368
|
// src/agent/bundles/github-workflow.ts
|
|
816
1369
|
import { GitHub } from "projen/lib/github";
|
|
817
1370
|
var githubWorkflowBundle = {
|
|
@@ -1025,89 +1578,6 @@ var jestBundle = {
|
|
|
1025
1578
|
}
|
|
1026
1579
|
};
|
|
1027
1580
|
|
|
1028
|
-
// src/agent/bundles/project-context.ts
|
|
1029
|
-
var PROJECT_CONTEXT_PATH = "docs/project-context.md";
|
|
1030
|
-
var PROJECT_CONTEXT_READER_SECTION = [
|
|
1031
|
-
"## Project Context",
|
|
1032
|
-
"",
|
|
1033
|
-
`Before doing any work, read \`${PROJECT_CONTEXT_PATH}\` at the`,
|
|
1034
|
-
'repository root. It is the canonical answer to "what is this project',
|
|
1035
|
-
'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
|
|
1036
|
-
"key stakeholders. Use it to frame judgment calls in this session.",
|
|
1037
|
-
"",
|
|
1038
|
-
`If \`${PROJECT_CONTEXT_PATH}\` does not exist, proceed with the current`,
|
|
1039
|
-
"task and note the absence in your session log \u2014 the meeting-analyst and",
|
|
1040
|
-
"requirements-analyst agents seed the file on their next run.",
|
|
1041
|
-
"",
|
|
1042
|
-
"You are a **read-only consumer** of this file. Do not edit it.",
|
|
1043
|
-
"",
|
|
1044
|
-
"---",
|
|
1045
|
-
""
|
|
1046
|
-
];
|
|
1047
|
-
var PROJECT_CONTEXT_MAINTAINER_SECTION = [
|
|
1048
|
-
"## Project Context",
|
|
1049
|
-
"",
|
|
1050
|
-
`Before starting any phase, read \`${PROJECT_CONTEXT_PATH}\` at the`,
|
|
1051
|
-
'repository root. It is the canonical answer to "what is this project',
|
|
1052
|
-
'about?" \u2014 mission, domain vocabulary, in/out-of-scope capabilities, and',
|
|
1053
|
-
"key stakeholders. Use it to judge relevance when scanning source",
|
|
1054
|
-
"material in this session.",
|
|
1055
|
-
"",
|
|
1056
|
-
"### Seed on first use",
|
|
1057
|
-
"",
|
|
1058
|
-
`If \`${PROJECT_CONTEXT_PATH}\` does not exist, create it from this`,
|
|
1059
|
-
"template and commit it alongside this phase's other outputs:",
|
|
1060
|
-
"",
|
|
1061
|
-
"```markdown",
|
|
1062
|
-
"# Project Context",
|
|
1063
|
-
"",
|
|
1064
|
-
"> Canonical description of this project. Read by all agents before",
|
|
1065
|
-
"> work. Updated by meeting-analyst and requirements-analyst when new",
|
|
1066
|
-
"> scope, vocabulary, or stakeholders emerge.",
|
|
1067
|
-
"",
|
|
1068
|
-
"## Mission",
|
|
1069
|
-
"TODO: one or two sentences on what this project exists to do.",
|
|
1070
|
-
"",
|
|
1071
|
-
"## Target Users",
|
|
1072
|
-
"TODO: who uses this, in what role.",
|
|
1073
|
-
"",
|
|
1074
|
-
"## In-Scope Capabilities",
|
|
1075
|
-
"TODO: bullet list of the capabilities this project owns.",
|
|
1076
|
-
"",
|
|
1077
|
-
"## Out-of-Scope",
|
|
1078
|
-
"TODO: capabilities or concerns that are explicitly not this project's.",
|
|
1079
|
-
"",
|
|
1080
|
-
"## Domain Vocabulary",
|
|
1081
|
-
"TODO: short glossary of domain terms, acronyms, and their definitions.",
|
|
1082
|
-
"",
|
|
1083
|
-
"## Key Stakeholders",
|
|
1084
|
-
"TODO: named people or teams and what they care about.",
|
|
1085
|
-
"",
|
|
1086
|
-
"## References",
|
|
1087
|
-
"TODO: links to BCM docs, competitive analysis, product roadmap, and",
|
|
1088
|
-
"other authoritative sources.",
|
|
1089
|
-
"```",
|
|
1090
|
-
"",
|
|
1091
|
-
"Fill whatever you can infer from the source material you are already",
|
|
1092
|
-
"reading in this phase; leave `TODO:` placeholders for the rest.",
|
|
1093
|
-
"",
|
|
1094
|
-
"### Update on new facts",
|
|
1095
|
-
"",
|
|
1096
|
-
"When the source material you process reveals new project-scope",
|
|
1097
|
-
"information \u2014 a new capability, a vocabulary term, an entity, a",
|
|
1098
|
-
"stakeholder, an in/out-of-scope decision, or a shift in mission \u2014",
|
|
1099
|
-
`append or revise the relevant section in \`${PROJECT_CONTEXT_PATH}\``,
|
|
1100
|
-
"before closing the phase. Commit those edits with the phase's other",
|
|
1101
|
-
"outputs.",
|
|
1102
|
-
"",
|
|
1103
|
-
"Keep edits surgical: short bullet additions, brief clarifications, or",
|
|
1104
|
-
"single-line vocabulary entries. Treat the file as an accreting",
|
|
1105
|
-
"reference, not a document you reshape every session.",
|
|
1106
|
-
"",
|
|
1107
|
-
"---",
|
|
1108
|
-
""
|
|
1109
|
-
];
|
|
1110
|
-
|
|
1111
1581
|
// src/agent/bundles/meeting-analysis.ts
|
|
1112
1582
|
var meetingAnalystSubAgent = {
|
|
1113
1583
|
name: "meeting-analyst",
|
|
@@ -4552,7 +5022,8 @@ var BUILT_IN_BUNDLES = [
|
|
|
4552
5022
|
orchestratorBundle,
|
|
4553
5023
|
prReviewBundle,
|
|
4554
5024
|
requirementsAnalystBundle,
|
|
4555
|
-
researchPipelineBundle
|
|
5025
|
+
researchPipelineBundle,
|
|
5026
|
+
companyProfileBundle
|
|
4556
5027
|
];
|
|
4557
5028
|
|
|
4558
5029
|
// src/agent/bundles/scope.ts
|
|
@@ -8084,6 +8555,7 @@ export {
|
|
|
8084
8555
|
addSyncLabelsWorkflow,
|
|
8085
8556
|
awsCdkBundle,
|
|
8086
8557
|
baseBundle,
|
|
8558
|
+
companyProfileBundle,
|
|
8087
8559
|
getLatestEligibleVersion,
|
|
8088
8560
|
githubWorkflowBundle,
|
|
8089
8561
|
jestBundle,
|