@codedrifters/configulator 0.0.205 → 0.0.206

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 CHANGED
@@ -1034,6 +1034,20 @@ declare const meetingAnalysisBundle: AgentRuleBundle;
1034
1034
  ******************************************************************************/
1035
1035
  declare const orchestratorBundle: AgentRuleBundle;
1036
1036
 
1037
+ /**
1038
+ * People-profile bundle — opt-in only.
1039
+ *
1040
+ * Consuming projects enable it explicitly with
1041
+ * `includeBundles: ["people-profile"]`. `appliesWhen` always returns
1042
+ * `false` so the bundle never auto-detects — person research is a
1043
+ * deliberate project-level choice, not a universal default.
1044
+ *
1045
+ * Ships a sub-agent (`people-profile-analyst`), a user-invocable skill
1046
+ * (`/profile-person`), and `type:people-profile` plus `people:*` phase
1047
+ * labels.
1048
+ */
1049
+ declare const peopleProfileBundle: AgentRuleBundle;
1050
+
1037
1051
  /**
1038
1052
  * PNPM bundle — auto-detected when the PnpmWorkspace component is present.
1039
1053
  */
@@ -3443,4 +3457,4 @@ declare const COMPLETE_JOB_ID = "complete";
3443
3457
  */
3444
3458
  declare function addBuildCompleteJob(buildWorkflow: BuildWorkflow): void;
3445
3459
 
3446
- export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AgentConfig, type AgentConfigOptions, type AgentModel, type AgentPlatform, type AgentPlatformOverrides, type AgentProcedure, type AgentRule, type AgentRuleBundle, type AgentRuleScope, type AgentSkill, type AgentSubAgent, type AgentSubAgentPlatformOverrides, type ApproveMergeUpgradeOptions, AstroConfig, type AstroConfigOptions, type AstroIntegrationSpec, AstroOutput, AstroProject, type AstroProjectOptions, type AwsAccount, AwsCdkProject, type AwsCdkProjectOptions, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, type AwsDeploymentTargetOptions, type AwsLocalDeploymentConfig, type AwsOrganization, type AwsRegion, AwsTeardownWorkflow, type AwsTeardownWorkflowOptions, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, type CiDeploymentConfig, type ClassTypeOptions, type ClaudeAutoModeConfig, type ClaudeHookAction, type ClaudeHookEntry, type ClaudeHooksConfig, type ClaudePermissionsConfig, type ClaudeRuleTarget, type ClaudeSandboxConfig, type ClaudeSettingsConfig, type CopilotHandoff, type CursorHookAction, type CursorHooksConfig, type CursorSettingsConfig, DEFAULT_PRIORITY_LABELS, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, type DeployWorkflowOptions, type DeploymentMetadata, type GitBranch, type GitHubBoardMetadata, type GitHubProjectMetadata, type GitHubSprintMetadata, type IDependencyResolver, JsiiFaker, type LabelDefinition, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, type McpServerConfig, type McpTransport, type MergeMethod, MonorepoProject, type MonorepoProjectOptions, type OrganizationMetadata, PROD_DEPLOY_NAME, PnpmWorkspace, type PnpmWorkspaceOptions, ProjectMetadata, type ProjectMetadataOptions, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, type RemoteCacheOptions, type RepositoryMetadata, ResetTask, type ResetTaskOptions, type ResolvedProjectMetadata, type SlackMetadata, type StarlightEditLink, type StarlightLogo, StarlightProject, type StarlightProjectOptions, type StarlightSidebarItem, type StarlightSocialLink, type SyncLabelsOptions, type TemplateResolveResult, TestRunner, TurboRepo, type TurboRepoOptions, TurboRepoTask, type TurboRepoTaskOptions, TypeScriptConfig, TypeScriptProject, type TypeScriptProjectOptions, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, type VersionKey, Vitest, type VitestConfigOptions, type VitestOptions, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, awsCdkBundle, baseBundle, companyProfileBundle, getLatestEligibleVersion, githubWorkflowBundle, jestBundle, meetingAnalysisBundle, orchestratorBundle, pnpmBundle, prReviewBundle, projenBundle, requirementsAnalystBundle, researchPipelineBundle, resolveModelAlias, resolveTemplateVariables, slackBundle, turborepoBundle, typescriptBundle, vitestBundle };
3460
+ export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AgentConfig, type AgentConfigOptions, type AgentModel, type AgentPlatform, type AgentPlatformOverrides, type AgentProcedure, type AgentRule, type AgentRuleBundle, type AgentRuleScope, type AgentSkill, type AgentSubAgent, type AgentSubAgentPlatformOverrides, type ApproveMergeUpgradeOptions, AstroConfig, type AstroConfigOptions, type AstroIntegrationSpec, AstroOutput, AstroProject, type AstroProjectOptions, type AwsAccount, AwsCdkProject, type AwsCdkProjectOptions, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, type AwsDeploymentTargetOptions, type AwsLocalDeploymentConfig, type AwsOrganization, type AwsRegion, AwsTeardownWorkflow, type AwsTeardownWorkflowOptions, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, type CiDeploymentConfig, type ClassTypeOptions, type ClaudeAutoModeConfig, type ClaudeHookAction, type ClaudeHookEntry, type ClaudeHooksConfig, type ClaudePermissionsConfig, type ClaudeRuleTarget, type ClaudeSandboxConfig, type ClaudeSettingsConfig, type CopilotHandoff, type CursorHookAction, type CursorHooksConfig, type CursorSettingsConfig, DEFAULT_PRIORITY_LABELS, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, type DeployWorkflowOptions, type DeploymentMetadata, type GitBranch, type GitHubBoardMetadata, type GitHubProjectMetadata, type GitHubSprintMetadata, type IDependencyResolver, JsiiFaker, type LabelDefinition, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, type McpServerConfig, type McpTransport, type MergeMethod, MonorepoProject, type MonorepoProjectOptions, type OrganizationMetadata, PROD_DEPLOY_NAME, PnpmWorkspace, type PnpmWorkspaceOptions, ProjectMetadata, type ProjectMetadataOptions, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, type RemoteCacheOptions, type RepositoryMetadata, ResetTask, type ResetTaskOptions, type ResolvedProjectMetadata, type SlackMetadata, type StarlightEditLink, type StarlightLogo, StarlightProject, type StarlightProjectOptions, type StarlightSidebarItem, type StarlightSocialLink, type SyncLabelsOptions, type TemplateResolveResult, TestRunner, TurboRepo, type TurboRepoOptions, TurboRepoTask, type TurboRepoTaskOptions, TypeScriptConfig, TypeScriptProject, type TypeScriptProjectOptions, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, type VersionKey, Vitest, type VitestConfigOptions, type VitestOptions, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, awsCdkBundle, baseBundle, companyProfileBundle, getLatestEligibleVersion, githubWorkflowBundle, jestBundle, meetingAnalysisBundle, orchestratorBundle, peopleProfileBundle, pnpmBundle, prReviewBundle, projenBundle, requirementsAnalystBundle, researchPipelineBundle, resolveModelAlias, resolveTemplateVariables, slackBundle, turborepoBundle, typescriptBundle, vitestBundle };
package/lib/index.d.ts CHANGED
@@ -1083,6 +1083,20 @@ declare const meetingAnalysisBundle: AgentRuleBundle;
1083
1083
  ******************************************************************************/
1084
1084
  declare const orchestratorBundle: AgentRuleBundle;
1085
1085
 
1086
+ /**
1087
+ * People-profile bundle — opt-in only.
1088
+ *
1089
+ * Consuming projects enable it explicitly with
1090
+ * `includeBundles: ["people-profile"]`. `appliesWhen` always returns
1091
+ * `false` so the bundle never auto-detects — person research is a
1092
+ * deliberate project-level choice, not a universal default.
1093
+ *
1094
+ * Ships a sub-agent (`people-profile-analyst`), a user-invocable skill
1095
+ * (`/profile-person`), and `type:people-profile` plus `people:*` phase
1096
+ * labels.
1097
+ */
1098
+ declare const peopleProfileBundle: AgentRuleBundle;
1099
+
1086
1100
  /**
1087
1101
  * PNPM bundle — auto-detected when the PnpmWorkspace component is present.
1088
1102
  */
@@ -3492,5 +3506,5 @@ declare const COMPLETE_JOB_ID = "complete";
3492
3506
  */
3493
3507
  declare function addBuildCompleteJob(buildWorkflow: BuildWorkflow): void;
3494
3508
 
3495
- export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AgentConfig, AstroConfig, AstroOutput, AstroProject, AwsCdkProject, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, AwsTeardownWorkflow, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, DEFAULT_PRIORITY_LABELS, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, JsiiFaker, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, MonorepoProject, PROD_DEPLOY_NAME, PnpmWorkspace, ProjectMetadata, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, ResetTask, StarlightProject, TestRunner, TurboRepo, TurboRepoTask, TypeScriptConfig, TypeScriptProject, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, Vitest, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, awsCdkBundle, baseBundle, companyProfileBundle, getLatestEligibleVersion, githubWorkflowBundle, jestBundle, meetingAnalysisBundle, orchestratorBundle, pnpmBundle, prReviewBundle, projenBundle, requirementsAnalystBundle, researchPipelineBundle, resolveModelAlias, resolveTemplateVariables, slackBundle, turborepoBundle, typescriptBundle, vitestBundle };
3509
+ export { AGENT_MODEL, AGENT_PLATFORM, AGENT_RULE_SCOPE, AgentConfig, AstroConfig, AstroOutput, AstroProject, AwsCdkProject, AwsDeployWorkflow, AwsDeploymentConfig, AwsDeploymentTarget, AwsTeardownWorkflow, BUILT_IN_BUNDLES, CLAUDE_RULE_TARGET, COMPLETE_JOB_ID, DEFAULT_PRIORITY_LABELS, DEFAULT_STATUS_LABELS, DEFAULT_TEARDOWN_BRANCH_PATTERNS, DEFAULT_TYPE_LABELS, JsiiFaker, MCP_TRANSPORT, MERGE_METHODS, MIMIMUM_RELEASE_AGE, MINIMUM_RELEASE_AGE, MonorepoProject, PROD_DEPLOY_NAME, PnpmWorkspace, ProjectMetadata, ROOT_CI_TASK_NAME, ROOT_TURBO_TASK_NAME, ResetTask, StarlightProject, TestRunner, TurboRepo, TurboRepoTask, TypeScriptConfig, TypeScriptProject, VERSION, VERSION_KEYS_SKIP, VERSION_NPM_PACKAGES, VSCodeConfig, Vitest, addApproveMergeUpgradeWorkflow, addBuildCompleteJob, addSyncLabelsWorkflow, awsCdkBundle, baseBundle, companyProfileBundle, getLatestEligibleVersion, githubWorkflowBundle, jestBundle, meetingAnalysisBundle, orchestratorBundle, peopleProfileBundle, pnpmBundle, prReviewBundle, projenBundle, requirementsAnalystBundle, researchPipelineBundle, resolveModelAlias, resolveTemplateVariables, slackBundle, turborepoBundle, typescriptBundle, vitestBundle };
3496
3510
  export type { AgentConfigOptions, AgentModel, AgentPlatform, AgentPlatformOverrides, AgentProcedure, AgentRule, AgentRuleBundle, AgentRuleScope, AgentSkill, AgentSubAgent, AgentSubAgentPlatformOverrides, ApproveMergeUpgradeOptions, AstroConfigOptions, AstroIntegrationSpec, AstroProjectOptions, AwsAccount, AwsCdkProjectOptions, AwsDeploymentTargetOptions, AwsLocalDeploymentConfig, AwsOrganization, AwsRegion, AwsTeardownWorkflowOptions, CiDeploymentConfig, ClassTypeOptions, ClaudeAutoModeConfig, ClaudeHookAction, ClaudeHookEntry, ClaudeHooksConfig, ClaudePermissionsConfig, ClaudeRuleTarget, ClaudeSandboxConfig, ClaudeSettingsConfig, CopilotHandoff, CursorHookAction, CursorHooksConfig, CursorSettingsConfig, DeployWorkflowOptions, DeploymentMetadata, GitBranch, GitHubBoardMetadata, GitHubProjectMetadata, GitHubSprintMetadata, IDependencyResolver, LabelDefinition, McpServerConfig, McpTransport, MergeMethod, MonorepoProjectOptions, OrganizationMetadata, PnpmWorkspaceOptions, ProjectMetadataOptions, RemoteCacheOptions, RepositoryMetadata, ResetTaskOptions, ResolvedProjectMetadata, SlackMetadata, StarlightEditLink, StarlightLogo, StarlightProjectOptions, StarlightSidebarItem, StarlightSocialLink, SyncLabelsOptions, TemplateResolveResult, TurboRepoOptions, TurboRepoTaskOptions, TypeScriptProjectOptions, VersionKey, VitestConfigOptions, VitestOptions };
package/lib/index.js CHANGED
@@ -228,6 +228,7 @@ __export(index_exports, {
228
228
  jestBundle: () => jestBundle,
229
229
  meetingAnalysisBundle: () => meetingAnalysisBundle,
230
230
  orchestratorBundle: () => orchestratorBundle,
231
+ peopleProfileBundle: () => peopleProfileBundle,
231
232
  pnpmBundle: () => pnpmBundle,
232
233
  prReviewBundle: () => prReviewBundle,
233
234
  projenBundle: () => projenBundle,
@@ -2715,6 +2716,555 @@ var orchestratorBundle = {
2715
2716
  }
2716
2717
  };
2717
2718
 
2719
+ // src/agent/bundles/people-profile.ts
2720
+ var peopleProfileAnalystSubAgent = {
2721
+ name: "people-profile-analyst",
2722
+ 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. One person per session, tracked by people:* GitHub issue labels.",
2723
+ model: AGENT_MODEL.POWERFUL,
2724
+ maxTurns: 80,
2725
+ platforms: { cursor: { exclude: true } },
2726
+ prompt: [
2727
+ "# People Profile Analyst Agent",
2728
+ "",
2729
+ "You research a single person from public sources and write a",
2730
+ "structured markdown profile. Each profile cycle runs across a small",
2731
+ "sequence of GitHub issues \u2014 one per phase \u2014 and produces a single",
2732
+ "profile file on disk plus cross-references to related entities",
2733
+ "(companies, software, meeting notes) already tracked elsewhere in",
2734
+ "the project.",
2735
+ "",
2736
+ "This agent is **domain-neutral**. It makes no assumptions about what",
2737
+ "the consuming project sells, which industry it serves, or which",
2738
+ "people matter to it. All domain-specific vocabulary, output",
2739
+ "locations, cross-reference targets, and profile-template overrides",
2740
+ "come from the invoking issue body or the consuming project's",
2741
+ "configuration.",
2742
+ "",
2743
+ "Follow your project's shared agent conventions (`AGENTS.md`,",
2744
+ "`CLAUDE.md`, or equivalent) for all commit, branch, and PR rules.",
2745
+ "",
2746
+ "---",
2747
+ "",
2748
+ ...PROJECT_CONTEXT_READER_SECTION,
2749
+ "## Design Principles",
2750
+ "",
2751
+ "1. **One person per session.** Never profile two people in a single",
2752
+ " session, even if they came up together (e.g. co-founders).",
2753
+ "2. **Public sources only.** Use the person's own public writing,",
2754
+ " company bios, conference talks, public interviews, and similar",
2755
+ " public material. Do not attempt to access gated or paywalled",
2756
+ " content unless the invoking issue body explicitly authorizes it.",
2757
+ "3. **Filesystem durability.** The profile file is the deliverable. It",
2758
+ " is committed to disk before the profile issue closes. Downstream",
2759
+ " phases read from disk \u2014 never rely on session memory.",
2760
+ "4. **Generic over specific.** No hardcoded role types, taxonomies, or",
2761
+ " relationship assumptions. Use the generic person-role taxonomy",
2762
+ " below and let consuming projects override it.",
2763
+ "5. **Cite everything.** Every non-trivial factual claim in the",
2764
+ " profile must carry a source citation (URL plus access date).",
2765
+ "6. **Respect privacy.** Profile only public, professional information.",
2766
+ " Never capture home addresses, personal phone numbers, family",
2767
+ " details, health information, or other private data even when",
2768
+ " encountered in public sources.",
2769
+ "7. **Cross-reference, don't duplicate.** When the profile mentions a",
2770
+ " company, software product, or meeting already tracked by the",
2771
+ " consuming project, link to the existing artifact rather than",
2772
+ " duplicating its content. Do not create downstream research",
2773
+ " issues for these cross-references \u2014 only link.",
2774
+ "",
2775
+ "---",
2776
+ "",
2777
+ "## Person Role Taxonomy",
2778
+ "",
2779
+ "Pick exactly one role per person profile. The taxonomy is",
2780
+ "deliberately generic \u2014 consuming projects override it via",
2781
+ "`agentConfig.rules` if they need a domain-specific refinement.",
2782
+ "",
2783
+ "| Role | Use for |",
2784
+ "|------|---------|",
2785
+ "| `colleague` | People inside your own organization worth tracking (teammates, cross-functional partners, leadership). |",
2786
+ "| `customer-contact` | Named individuals at existing or prospective customer accounts. |",
2787
+ "| `vendor-contact` | Named individuals at vendors, suppliers, or software providers you depend on. |",
2788
+ "| `partner-contact` | Named individuals at strategic, channel, or integration partners. |",
2789
+ "| `industry-expert` | Analysts, researchers, journalists, or well-known practitioners whose work shapes the market. |",
2790
+ "| `connector` | People who primarily provide introductions, referrals, or access across networks \u2014 advisors, investors acting as connectors, community hubs. |",
2791
+ "",
2792
+ "If the person plausibly fits two roles, prefer the one that reflects",
2793
+ "the **reason the profile was requested**, and note the secondary",
2794
+ "role in the profile body.",
2795
+ "",
2796
+ "---",
2797
+ "",
2798
+ "## State Machine Overview",
2799
+ "",
2800
+ "```",
2801
+ "\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",
2802
+ "\u2502 1. RESEARCH \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 2. DRAFT PROFILE \u2502\u2500\u2500\u2500\u2500\u25B6\u2502 3. FOLLOWUP \u2502",
2803
+ "\u2502 Collect public \u2502 \u2502 Write the structured \u2502 \u2502 Cross-link the \u2502",
2804
+ "\u2502 sources into a \u2502 \u2502 markdown profile to \u2502 \u2502 profile to existing\u2502",
2805
+ "\u2502 bounded notes \u2502 \u2502 the configured path \u2502 \u2502 companies, software\u2502",
2806
+ "\u2502 file \u2502 \u2502 \u2502 \u2502 and meeting notes \u2502",
2807
+ "\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",
2808
+ "```",
2809
+ "",
2810
+ "**Issue labels encode the phase:**",
2811
+ "",
2812
+ "| Label | Phase | Session work |",
2813
+ "|-------|-------|-------------|",
2814
+ "| `people:research` | 1. Research | Gather public sources. Write a bounded research-notes file. Create the draft issue. |",
2815
+ "| `people:draft` | 2. Draft | Read the research notes. Write the structured profile to `<PROFILES_DIR>`. Create the followup issue if warranted. |",
2816
+ "| `people:followup` | 3. Followup | Read the profile. Update cross-references to existing companies, software, and meeting notes. No new downstream issues. |",
2817
+ "",
2818
+ "All issues also carry `type:people-profile` and a `status:*` label.",
2819
+ "",
2820
+ "**Issue count per person cycle:** 1 research + 1 draft + 0\u20131 followup =",
2821
+ "**2\u20133 sessions**. The followup phase is skipped when the profile did",
2822
+ "not surface any cross-references worth linking.",
2823
+ "",
2824
+ "**Shortened paths:**",
2825
+ "- Research phase determines the person is out of scope (not",
2826
+ " relevant, insufficient public material) \u2192 research issue closes",
2827
+ " with a justification and no downstream issues are created \u2192 **1 session**.",
2828
+ "- Short profile with no cross-references needed \u2192 **2 sessions**.",
2829
+ "",
2830
+ "---",
2831
+ "",
2832
+ "## Configurable Paths",
2833
+ "",
2834
+ "The pipeline uses these placeholders. Consuming projects override the",
2835
+ "defaults by passing paths in the `/profile-person` skill invocation",
2836
+ "or by extending this rule in their own `agentConfig.rules`.",
2837
+ "",
2838
+ "| Placeholder | Meaning | Default |",
2839
+ "|-------------|---------|---------|",
2840
+ "| `<PEOPLE_ROOT>` | Root folder for person profiles | `docs/people/` |",
2841
+ "| `<PROFILES_DIR>` | Final person profile files | `<PEOPLE_ROOT>/profiles/` |",
2842
+ "| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<PEOPLE_ROOT>/notes/` |",
2843
+ "| `<PERSON_SLUG>` | Short kebab-case slug identifying the person | derived from the person's name |",
2844
+ "| `<COMPANIES_DIR>` | Where existing company profiles live (for cross-references) | `docs/companies/profiles/` |",
2845
+ "| `<SOFTWARE_DIR>` | Where existing software profiles live (for cross-references) | `docs/software/profiles/` |",
2846
+ "| `<MEETINGS_DIR>` | Where meeting notes live (for cross-references) | `docs/meetings/` |",
2847
+ "",
2848
+ "If `docs/project-context.md` specifies a different people-research",
2849
+ "tree or cross-reference target, prefer that. Otherwise fall back to",
2850
+ "the defaults above. Cross-reference directories are read-only \u2014 this",
2851
+ "agent never writes into them.",
2852
+ "",
2853
+ "---",
2854
+ "",
2855
+ "## Refresh Cadence",
2856
+ "",
2857
+ "Profiles go stale. A person changes jobs, publishes new work, or",
2858
+ "shifts focus. The pipeline supports a configurable refresh cadence:",
2859
+ "",
2860
+ "- **Default cadence:** 180 days from the profile's `date` frontmatter.",
2861
+ "- **Override:** the invoking issue body may specify a `refresh_days: N`",
2862
+ " field, or the consuming project may set a project-wide default in",
2863
+ " `docs/project-context.md`.",
2864
+ "",
2865
+ "When the `/profile-person` skill is invoked for a slug that already",
2866
+ "has a profile:",
2867
+ "",
2868
+ "- If the profile is **younger** than the refresh cadence, the skill",
2869
+ " exits with a message pointing to the existing profile. Pass",
2870
+ " `force: true` in the issue body to refresh anyway.",
2871
+ "- If the profile is **older** than the refresh cadence, the pipeline",
2872
+ " proceeds in update-in-place mode: Phase 2 edits the existing file,",
2873
+ " preserves its slug, and bumps the `date` frontmatter.",
2874
+ "",
2875
+ "Refresh mode never changes the profile's role without an explicit",
2876
+ "override in the refresh request \u2014 role changes are material and",
2877
+ "warrant a human review step.",
2878
+ "",
2879
+ "---",
2880
+ "",
2881
+ "## Agent Loop",
2882
+ "",
2883
+ "Run this loop exactly once per session. Never start a second issue.",
2884
+ "",
2885
+ "1. Claim one open `type:people-profile` issue using phase priority:",
2886
+ " `people:research` > `people:draft` > `people:followup`.",
2887
+ "2. Transition `status:ready` \u2192 `status:in-progress` and create the",
2888
+ " branch per your project's branch-naming convention.",
2889
+ "3. Execute the phase handler that matches the issue's `people:*`",
2890
+ " label.",
2891
+ "4. Commit, push, open a PR (if applicable), and close the issue per",
2892
+ " your project's PR workflow.",
2893
+ "",
2894
+ "---",
2895
+ "",
2896
+ "## Phase 1: Research (`people:research`)",
2897
+ "",
2898
+ "**Goal:** Gather public sources into a bounded research-notes file.",
2899
+ "",
2900
+ "**Budget:** Public web search only, unless the issue body authorizes",
2901
+ "additional sources. Write one notes file. Do not write the profile",
2902
+ "in this phase.",
2903
+ "",
2904
+ "### Steps",
2905
+ "",
2906
+ "1. **Read the issue body.** It should include:",
2907
+ " - The person's name and primary affiliation (company) if known",
2908
+ " - The requested role from the taxonomy above",
2909
+ " - The reason the profile was requested (framing \u2014 what does the",
2910
+ " invoking project want to learn?)",
2911
+ " - Optional: `<PERSON_SLUG>` override, custom output paths,",
2912
+ " `refresh_days` override, `force: true` for out-of-cadence refresh",
2913
+ "",
2914
+ "2. **Derive `<PERSON_SLUG>`** if not supplied \u2014 a 2\u20134 word kebab-case",
2915
+ " summary of the person's name. Disambiguate against any existing",
2916
+ " slug under `<PROFILES_DIR>/` or `<NOTES_DIR>/` by appending a",
2917
+ " company or role qualifier (e.g. `jane-doe-acme`).",
2918
+ "",
2919
+ "3. **Check for an existing profile.** If `<PROFILES_DIR>/<PERSON_SLUG>.md`",
2920
+ " exists, read its `date` frontmatter and apply the refresh cadence",
2921
+ " rules above before proceeding.",
2922
+ "",
2923
+ "4. **Gather sources.** Prioritize in this order:",
2924
+ " - The person's own public writing (personal site, blog, newsletter)",
2925
+ " - Their current employer's bio / leadership page",
2926
+ " - Public conference talks, podcast appearances, and interviews",
2927
+ " - Public directories that the invoking issue body authorizes",
2928
+ " (LinkedIn, GitHub, company profiles, Crunchbase)",
2929
+ " - Public contributions (open-source repos, published papers)",
2930
+ "",
2931
+ "5. **Write a research-notes file** to",
2932
+ " `<NOTES_DIR>/<PERSON_SLUG>.notes.md`:",
2933
+ "",
2934
+ " ```markdown",
2935
+ " ---",
2936
+ ' title: "Research Notes: <person name>"',
2937
+ " slug: <PERSON_SLUG>",
2938
+ " role: <one of the taxonomy values>",
2939
+ " primary_company: <company name if known>",
2940
+ " date: YYYY-MM-DD",
2941
+ " parent_issue: <N>",
2942
+ " ---",
2943
+ "",
2944
+ " # Research Notes: <person name>",
2945
+ "",
2946
+ " ## Framing",
2947
+ " <why this person was requested and what to learn>",
2948
+ "",
2949
+ " ## Raw Findings",
2950
+ " - <finding> \u2014 source: <citation>",
2951
+ "",
2952
+ " ## Candidate Cross-References",
2953
+ " - **Companies mentioned:** <list of company names>",
2954
+ " - **Software mentioned:** <list of product names>",
2955
+ " - **Meetings mentioned:** <list of meeting identifiers>",
2956
+ "",
2957
+ " ## Open Questions",
2958
+ " <anything the notes could not answer from public sources>",
2959
+ "",
2960
+ " ## Sources",
2961
+ " - <source URL or file path> \u2014 <date accessed>",
2962
+ " ```",
2963
+ "",
2964
+ "6. **Create the `people:draft` issue** with `Depends on: #<research-issue>`.",
2965
+ " Its body references the notes file path, the requested role, and",
2966
+ " any refresh-mode flags.",
2967
+ "",
2968
+ "7. **Commit and push** the notes file. Close the research issue.",
2969
+ "",
2970
+ "---",
2971
+ "",
2972
+ "## Phase 2: Draft Profile (`people:draft`)",
2973
+ "",
2974
+ "**Goal:** Write the structured person profile from the research notes.",
2975
+ "",
2976
+ "**Budget:** No new web searches unless explicitly needed to fill a",
2977
+ "gap the notes flagged. Write one profile file.",
2978
+ "",
2979
+ "### Steps",
2980
+ "",
2981
+ "1. **Read the research-notes file** referenced in the issue body.",
2982
+ "",
2983
+ "2. **Check for duplicates / refresh.** If `<PROFILES_DIR>/<PERSON_SLUG>.md`",
2984
+ " already exists:",
2985
+ " - In refresh mode, open the existing file and update in place,",
2986
+ " preserving the slug and bumping the `date` frontmatter.",
2987
+ " - Otherwise, flag a naming collision and stop \u2014 never silently",
2988
+ " overwrite a non-trivial existing profile.",
2989
+ "",
2990
+ "3. **Write the profile** to `<PROFILES_DIR>/<PERSON_SLUG>.md` using",
2991
+ " the template below. All sections are required; use",
2992
+ " `_Not available in public sources._` when a section cannot be",
2993
+ " filled from the notes.",
2994
+ "",
2995
+ " ```markdown",
2996
+ " ---",
2997
+ ' title: "<person name>"',
2998
+ " slug: <PERSON_SLUG>",
2999
+ " role: <one of the taxonomy values>",
3000
+ " primary_company: <company name>",
3001
+ " date: YYYY-MM-DD",
3002
+ " refresh_days: <N, default 180>",
3003
+ " parent_issue: <N>",
3004
+ " notes: <NOTES_DIR>/<PERSON_SLUG>.notes.md",
3005
+ " ---",
3006
+ "",
3007
+ " # <person name>",
3008
+ "",
3009
+ " ## Summary",
3010
+ " <2\u20134 sentence elevator description: who they are, what they do,",
3011
+ " why they matter to this project>",
3012
+ "",
3013
+ " ## Classification",
3014
+ " - **Primary role:** <taxonomy value>",
3015
+ " - **Secondary role (if any):** <taxonomy value or `n/a`>",
3016
+ " - **Relevance to this project:** <1\u20132 sentences tying the person",
3017
+ " back to the framing from the notes>",
3018
+ "",
3019
+ " ## Current Position",
3020
+ " - **Company:** <primary company \u2014 link to company profile if tracked>",
3021
+ " - **Title:** <current title>",
3022
+ " - **Tenure:** <since YYYY, if known>",
3023
+ " - **Focus areas:** <what they work on day-to-day>",
3024
+ "",
3025
+ " ## Background",
3026
+ " - **Prior roles:** <short reverse-chronological list>",
3027
+ " - **Education / credentials:** <if publicly disclosed>",
3028
+ " - **Notable contributions:** <open-source, publications, talks>",
3029
+ "",
3030
+ " ## Expertise Signals",
3031
+ " <topics they write or speak about \u2014 each bullet cited to a public",
3032
+ " source>",
3033
+ "",
3034
+ " ## Positioning / Point of View",
3035
+ " <how they describe their own work and views \u2014 use their own",
3036
+ " language, cited, rather than inferred>",
3037
+ "",
3038
+ " ## Cross-References",
3039
+ " - **Companies:** <links to `<COMPANIES_DIR>/*.md` for companies",
3040
+ " already tracked by this project>",
3041
+ " - **Software:** <links to `<SOFTWARE_DIR>/*.md` for software",
3042
+ " already tracked by this project>",
3043
+ " - **Meetings:** <links to `<MEETINGS_DIR>/*.md` for meeting notes",
3044
+ " this person participated in>",
3045
+ "",
3046
+ " ## Contact Preferences",
3047
+ " <public channels only \u2014 company email if listed, social handles,",
3048
+ " speaker inquiry forms. Never private contact info.>",
3049
+ "",
3050
+ " ## Risks / Open Questions",
3051
+ " <what the profile could not answer; flag anything the followup",
3052
+ " phase should cross-reference>",
3053
+ "",
3054
+ " ## Sources",
3055
+ " - <source URL> \u2014 <date accessed>",
3056
+ " ```",
3057
+ "",
3058
+ "4. **Decide whether a followup issue is warranted.** Create a",
3059
+ " `people:followup` issue (depending on this draft issue) only if",
3060
+ " the profile's Candidate Cross-References lists at least one",
3061
+ " company, software product, or meeting already tracked by the",
3062
+ " consuming project. Otherwise, note in the draft issue's closing",
3063
+ " comment that no followup is needed.",
3064
+ "",
3065
+ "5. **Commit and push** the profile file. Close the draft issue.",
3066
+ "",
3067
+ "---",
3068
+ "",
3069
+ "## Phase 3: Followup (`people:followup`)",
3070
+ "",
3071
+ "**Goal:** Populate the profile's `## Cross-References` section with",
3072
+ "links to existing artifacts \u2014 companies, software, meetings \u2014 that",
3073
+ "the consuming project already tracks.",
3074
+ "",
3075
+ "**Budget:** No new web searches. No new downstream research issues.",
3076
+ "Read the candidate cross-references, resolve them against the",
3077
+ "configured directories, update the profile.",
3078
+ "",
3079
+ "### Steps",
3080
+ "",
3081
+ "1. **Read the profile file** referenced in the issue body.",
3082
+ "",
3083
+ "2. **Resolve company cross-references.** For each company named in",
3084
+ " the profile's research notes or body text, look for a matching",
3085
+ " file under `<COMPANIES_DIR>/`. If found, link it under",
3086
+ " `## Cross-References > Companies`. If not found, leave a TODO",
3087
+ " comment naming the company \u2014 the invoking project's team decides",
3088
+ " whether to kick off a separate company-profile pipeline.",
3089
+ "",
3090
+ "3. **Resolve software cross-references.** Same pattern against",
3091
+ " `<SOFTWARE_DIR>/`. Link what matches; leave TODOs for what",
3092
+ " doesn't.",
3093
+ "",
3094
+ "4. **Resolve meeting cross-references.** For meetings the person",
3095
+ " participated in, look for a matching file under `<MEETINGS_DIR>/`",
3096
+ " by date or slug. Link matches; leave TODOs otherwise.",
3097
+ "",
3098
+ "5. **Do not open downstream issues.** This pipeline emits no",
3099
+ " `company:research`, `research:scope`, or similar issues. Cross-",
3100
+ " references are link-only; downstream research is a separate",
3101
+ " human decision.",
3102
+ "",
3103
+ "6. **Commit and push** the updated profile. Close the followup issue.",
3104
+ "",
3105
+ "---",
3106
+ "",
3107
+ "## Output Boundaries",
3108
+ "",
3109
+ "This agent writes **only** to:",
3110
+ "",
3111
+ "- `<NOTES_DIR>/` \u2014 research-notes files (Phase 1)",
3112
+ "- `<PROFILES_DIR>/` \u2014 person profiles (Phase 2, updated in Phase 3)",
3113
+ "",
3114
+ "The pipeline produces **profiles and notes only**. It does not",
3115
+ "create new companies, software evaluations, meeting notes, or any",
3116
+ "other downstream artifacts \u2014 it only links to those that already",
3117
+ "exist under the configured cross-reference directories. Keep this",
3118
+ "boundary clean so the people-profile pipeline stays generic and",
3119
+ "cheap to run.",
3120
+ "",
3121
+ "---",
3122
+ "",
3123
+ "## Rules",
3124
+ "",
3125
+ "- **One person per session.** Never profile two people back-to-back.",
3126
+ "- **Persist before closing.** Every phase must write its output file",
3127
+ " before closing its issue.",
3128
+ "- **Cite everything.** Profile claims without source citations do not",
3129
+ " belong in the deliverable.",
3130
+ "- **Respect privacy.** Never record private contact details, family",
3131
+ " information, or other non-professional personal data, even when",
3132
+ " encountered in a public source.",
3133
+ "- **Cross-reference, don't duplicate.** Link to existing company,",
3134
+ " software, and meeting artifacts rather than re-describing them.",
3135
+ "- **No downstream issue creation.** Phase 3 emits no new research,",
3136
+ " profile, or requirement issues. Only link.",
3137
+ "- **Refresh, don't fork.** When a profile exists and is past its",
3138
+ " cadence, update in place rather than creating a new slug."
3139
+ ].join("\n")
3140
+ };
3141
+ var profilePersonSkill = {
3142
+ name: "profile-person",
3143
+ description: "Kick off a people-profile pipeline. Creates a people:research issue for the given person and dispatches Phase 1 (Research) in the people-profile-analyst agent.",
3144
+ disableModelInvocation: true,
3145
+ userInvocable: true,
3146
+ context: "fork",
3147
+ agent: "people-profile-analyst",
3148
+ platforms: { cursor: { exclude: true } },
3149
+ instructions: [
3150
+ "# Profile Person",
3151
+ "",
3152
+ "Kick off a people-profile pipeline. Creates a `people:research`",
3153
+ "issue carrying the person's name, role, primary affiliation, and",
3154
+ "framing, then dispatches Phase 1 (Research) in the",
3155
+ "people-profile-analyst agent.",
3156
+ "",
3157
+ "## Usage",
3158
+ "",
3159
+ "/profile-person <person-name>",
3160
+ "",
3161
+ "Optional extensions in the issue body:",
3162
+ "- `role: <colleague | customer-contact | vendor-contact |",
3163
+ " partner-contact | industry-expert | connector>` \u2014 override the",
3164
+ " default role inference",
3165
+ "- `company: <name>` \u2014 primary company affiliation if not obvious",
3166
+ " from the name",
3167
+ "- `framing: <text>` \u2014 why this profile was requested and what to learn",
3168
+ "- `slug: <kebab-case>` \u2014 override the derived person slug",
3169
+ "- `refresh_days: <N>` \u2014 override the default 180-day refresh cadence",
3170
+ "- `force: true` \u2014 refresh even if the profile is younger than the",
3171
+ " cadence window",
3172
+ "- `sources: <list>` \u2014 additional authorized sources beyond public web",
3173
+ "",
3174
+ "## Default Paths",
3175
+ "",
3176
+ "If the project has no override in `docs/project-context.md` or",
3177
+ "`agentConfig.rules`, outputs land under:",
3178
+ "",
3179
+ "- `docs/people/notes/<slug>.notes.md`",
3180
+ "- `docs/people/profiles/<slug>.md`",
3181
+ "",
3182
+ "Cross-references are resolved against:",
3183
+ "",
3184
+ "- `docs/companies/profiles/`",
3185
+ "- `docs/software/profiles/`",
3186
+ "- `docs/meetings/`",
3187
+ "",
3188
+ "## Steps",
3189
+ "",
3190
+ "1. Create a `people:research` issue with `type:people-profile`,",
3191
+ " `priority:medium`, and `status:ready`. Body must include the",
3192
+ " person's name, selected role, primary company, framing, and any",
3193
+ " overrides.",
3194
+ "2. Execute Phase 1 (Research) of the people-profile-analyst agent.",
3195
+ "3. Phase 1 creates the `people:draft` issue. Phase 2 may create a",
3196
+ " `people:followup` issue. Each downstream issue declares its",
3197
+ " `Depends on:` predecessor.",
3198
+ "",
3199
+ "## Output",
3200
+ "",
3201
+ "- A research-notes file under the project's notes directory",
3202
+ "- A single person profile under the profiles directory",
3203
+ "- Cross-references to existing companies, software, and meetings",
3204
+ " tracked elsewhere in the project",
3205
+ "- This pipeline produces **profiles only** \u2014 it does not create",
3206
+ " companies, software, meetings, or any other downstream artifacts."
3207
+ ].join("\n")
3208
+ };
3209
+ var peopleProfileBundle = {
3210
+ name: "people-profile",
3211
+ description: "People research and profiling pipeline: research, draft profile, followup. Opt-in only; domain-neutral; filesystem-durable between phases; cross-references existing companies, software, and meeting notes without creating new downstream issues.",
3212
+ appliesWhen: () => false,
3213
+ rules: [
3214
+ {
3215
+ name: "people-profile-workflow",
3216
+ description: "Describes the 3-phase people-profile pipeline, the people:* label taxonomy, the cross-reference model, and the boundary against downstream research agents.",
3217
+ scope: AGENT_RULE_SCOPE.ALWAYS,
3218
+ content: [
3219
+ "# People Profile Workflow",
3220
+ "",
3221
+ "Use `/profile-person <person-name>` to kick off a person",
3222
+ "research and profiling pipeline. The pipeline runs in up to 3",
3223
+ "phases \u2014 research, draft, followup \u2014 each tracked by its own",
3224
+ "GitHub issue labeled `people:research`, `people:draft`, or",
3225
+ "`people:followup`. All issues carry `type:people-profile`.",
3226
+ "",
3227
+ "The pipeline produces **person profiles only**. Cross-references",
3228
+ "to companies, software products, and meeting notes are link-only",
3229
+ "\u2014 the followup phase never creates new downstream research,",
3230
+ "profile, or requirement issues.",
3231
+ "",
3232
+ "See the `people-profile-analyst` agent definition for full",
3233
+ "workflow details, default paths, the person-role taxonomy, the",
3234
+ "refresh cadence rules, and phase-by-phase instructions."
3235
+ ].join("\n"),
3236
+ platforms: {
3237
+ cursor: { exclude: true }
3238
+ },
3239
+ tags: ["workflow"]
3240
+ }
3241
+ ],
3242
+ skills: [profilePersonSkill],
3243
+ subAgents: [peopleProfileAnalystSubAgent],
3244
+ labels: [
3245
+ {
3246
+ name: "type:people-profile",
3247
+ color: "0E8A16",
3248
+ description: "Work that produces or maintains a person profile or its research notes"
3249
+ },
3250
+ {
3251
+ name: "people:research",
3252
+ color: "C5DEF5",
3253
+ description: "Phase 1: gather public sources about a person into a research-notes file"
3254
+ },
3255
+ {
3256
+ name: "people:draft",
3257
+ color: "BFDADC",
3258
+ description: "Phase 2: write the structured person profile from research notes"
3259
+ },
3260
+ {
3261
+ name: "people:followup",
3262
+ color: "D4C5F9",
3263
+ description: "Phase 3: cross-link the profile to existing companies, software, and meeting notes"
3264
+ }
3265
+ ]
3266
+ };
3267
+
2718
3268
  // src/pnpm/pnpm-workspace.ts
2719
3269
  var import_path = require("path");
2720
3270
  var import_projen = require("projen");
@@ -5093,7 +5643,8 @@ var BUILT_IN_BUNDLES = [
5093
5643
  prReviewBundle,
5094
5644
  requirementsAnalystBundle,
5095
5645
  researchPipelineBundle,
5096
- companyProfileBundle
5646
+ companyProfileBundle,
5647
+ peopleProfileBundle
5097
5648
  ];
5098
5649
 
5099
5650
  // src/agent/bundles/scope.ts
@@ -8619,6 +9170,7 @@ var TypeScriptConfig = class extends import_projen22.Component {
8619
9170
  jestBundle,
8620
9171
  meetingAnalysisBundle,
8621
9172
  orchestratorBundle,
9173
+ peopleProfileBundle,
8622
9174
  pnpmBundle,
8623
9175
  prReviewBundle,
8624
9176
  projenBundle,