@codedrifters/configulator 0.0.344 → 0.0.346

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.js CHANGED
@@ -245,6 +245,7 @@ __export(index_exports, {
245
245
  DEFAULT_PROGRESS_FILES_FORMAT: () => DEFAULT_PROGRESS_FILES_FORMAT,
246
246
  DEFAULT_PROGRESS_FILES_STALE_AFTER_HOURS: () => DEFAULT_PROGRESS_FILES_STALE_AFTER_HOURS,
247
247
  DEFAULT_PROGRESS_FILES_STATE_DIR: () => DEFAULT_PROGRESS_FILES_STATE_DIR,
248
+ DEFAULT_REQUIREMENT_CATEGORY_DIRS: () => DEFAULT_REQUIREMENT_CATEGORY_DIRS,
248
249
  DEFAULT_REQUIRE_PRODUCT_CONTEXT: () => DEFAULT_REQUIRE_PRODUCT_CONTEXT,
249
250
  DEFAULT_RESOLVED_ISSUE_DEFAULTS: () => DEFAULT_RESOLVED_ISSUE_DEFAULTS,
250
251
  DEFAULT_SAMPLE_COMPILER_OPTIONS: () => DEFAULT_SAMPLE_COMPILER_OPTIONS,
@@ -2013,6 +2014,19 @@ function assertValidBundlePathPatterns(value) {
2013
2014
  }
2014
2015
 
2015
2016
  // src/agent/bundles/paths.ts
2017
+ var DEFAULT_REQUIREMENT_CATEGORY_DIRS = Object.freeze({
2018
+ business: "business",
2019
+ functional: "functional",
2020
+ nonFunctional: "non-functional",
2021
+ technical: "technical",
2022
+ architecturalDecisions: "architectural-decisions",
2023
+ security: "security",
2024
+ data: "data",
2025
+ integration: "integration",
2026
+ operational: "operational",
2027
+ ux: "ux",
2028
+ multiTenancy: "multi-tenancy"
2029
+ });
2016
2030
  var DEFAULT_AGENT_PATHS = Object.freeze({
2017
2031
  docsRoot: "docs/src/content/docs",
2018
2032
  researchRoot: "docs/research",
@@ -2024,7 +2038,8 @@ var DEFAULT_AGENT_PATHS = Object.freeze({
2024
2038
  peopleRoot: "docs/src/content/docs/profiles/people",
2025
2039
  companiesRoot: "docs/src/content/docs/profiles/companies",
2026
2040
  softwareRoot: "docs/src/content/docs/profiles/software",
2027
- industriesRoot: "docs/src/content/docs/profiles/industries"
2041
+ industriesRoot: "docs/src/content/docs/profiles/industries",
2042
+ requirementCategoryDirs: DEFAULT_REQUIREMENT_CATEGORY_DIRS
2028
2043
  });
2029
2044
  function resolveAgentPaths(paths) {
2030
2045
  const docsRoot = paths?.docsRoot ?? DEFAULT_AGENT_PATHS.docsRoot;
@@ -2038,6 +2053,20 @@ function resolveAgentPaths(paths) {
2038
2053
  const companiesRoot = paths?.companiesRoot ?? `${profilesRoot}/companies`;
2039
2054
  const softwareRoot = paths?.softwareRoot ?? `${profilesRoot}/software`;
2040
2055
  const industriesRoot = paths?.industriesRoot ?? `${profilesRoot}/industries`;
2056
+ const categoryOverrides = paths?.requirementCategoryDirs;
2057
+ const requirementCategoryDirs = {
2058
+ business: categoryOverrides?.business ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.business,
2059
+ functional: categoryOverrides?.functional ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.functional,
2060
+ nonFunctional: categoryOverrides?.nonFunctional ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.nonFunctional,
2061
+ technical: categoryOverrides?.technical ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.technical,
2062
+ architecturalDecisions: categoryOverrides?.architecturalDecisions ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.architecturalDecisions,
2063
+ security: categoryOverrides?.security ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.security,
2064
+ data: categoryOverrides?.data ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.data,
2065
+ integration: categoryOverrides?.integration ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.integration,
2066
+ operational: categoryOverrides?.operational ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.operational,
2067
+ ux: categoryOverrides?.ux ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.ux,
2068
+ multiTenancy: categoryOverrides?.multiTenancy ?? DEFAULT_REQUIREMENT_CATEGORY_DIRS.multiTenancy
2069
+ };
2041
2070
  return {
2042
2071
  docsRoot,
2043
2072
  researchRoot,
@@ -2049,7 +2078,8 @@ function resolveAgentPaths(paths) {
2049
2078
  peopleRoot,
2050
2079
  companiesRoot,
2051
2080
  softwareRoot,
2052
- industriesRoot
2081
+ industriesRoot,
2082
+ requirementCategoryDirs
2053
2083
  };
2054
2084
  }
2055
2085
 
@@ -6493,7 +6523,7 @@ function buildScanBusinessModelsSkill(paths, issueDefaults) {
6493
6523
  "Optional extensions in the issue body:",
6494
6524
  "- `plan: <path>` \u2014 path to the industry-discovery plan file that",
6495
6525
  " cleared this industry for downstream research (e.g.",
6496
- " `docs/industries/plans/<slug>.plan.md`)",
6526
+ ` \`${paths.industriesRoot}/plans/<slug>.plan.md\`)`,
6497
6527
  "- `sources: <list>` \u2014 additional authorized input paths",
6498
6528
  "- `exclude: <segment list>` \u2014 segments already covered to skip",
6499
6529
  "- `slug: <kebab-case>` \u2014 override the derived industry slug",
@@ -6893,15 +6923,15 @@ function buildCompanyProfileAnalystSubAgent(paths, issueDefaults, tier) {
6893
6923
  "",
6894
6924
  "| Placeholder | Meaning | Default |",
6895
6925
  "|-------------|---------|---------|",
6896
- "| `<COMPANY_ROOT>` | Root folder for company profiles | `docs/companies/` |",
6926
+ `| \`<COMPANY_ROOT>\` | Root folder for company profiles | \`${paths.companiesRoot}/\` |`,
6897
6927
  "| `<PROFILES_DIR>` | Final company profile files | `<COMPANY_ROOT>/profiles/` |",
6898
6928
  "| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<COMPANY_ROOT>/notes/` |",
6899
6929
  "| `<ANALYSIS_DIR>` | Segment-level competitive-analysis documents from Phase 6 | `<COMPANY_ROOT>/analysis/` |",
6900
6930
  "| `<COMPANY_SLUG>` | Short kebab-case slug identifying the company | derived from the company name |",
6901
6931
  "| `<SEGMENT_SLUG>` | Short kebab-case slug identifying the industry segment | derived from the segment name |",
6902
6932
  `| \`<BUSINESS_MODELS_ROOT>\` | Where existing business-model canvases live (consumed by Phase 4) | \`${paths.docsRoot}/industry-research/\` |`,
6903
- "| `<PEOPLE_PROFILES_DIR>` | Where existing people profiles live (for duplicate detection during followup) | `docs/people/profiles/` |",
6904
- "| `<SOFTWARE_PROFILES_DIR>` | Where existing software profiles live (for duplicate detection during followup) | `docs/software/profiles/` |",
6933
+ `| \`<PEOPLE_PROFILES_DIR>\` | Where existing people profiles live (for duplicate detection during followup) | \`${paths.peopleRoot}/profiles/\` |`,
6934
+ `| \`<SOFTWARE_PROFILES_DIR>\` | Where existing software profiles live (for duplicate detection during followup) | \`${paths.softwareRoot}/profiles/\` |`,
6905
6935
  "",
6906
6936
  `If \`${paths.docsRoot}/project-context.md\` specifies a different company-research`,
6907
6937
  "tree (for example by reusing the research-pipeline deliverables",
@@ -7724,8 +7754,8 @@ function buildProfileCompanySkill(paths, issueDefaults) {
7724
7754
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
7725
7755
  "`agentConfig.rules`, outputs land under:",
7726
7756
  "",
7727
- "- `docs/companies/notes/<slug>.notes.md`",
7728
- "- `docs/companies/profiles/<slug>.md`",
7757
+ `- \`${paths.companiesRoot}/notes/<slug>.notes.md\``,
7758
+ `- \`${paths.companiesRoot}/profiles/<slug>.md\``,
7729
7759
  "",
7730
7760
  "## Steps",
7731
7761
  "",
@@ -7930,7 +7960,7 @@ function buildAnalyzeSegmentSkill(paths, issueDefaults) {
7930
7960
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
7931
7961
  "`agentConfig.rules`, outputs land under:",
7932
7962
  "",
7933
- "- `docs/companies/analysis/<segment-slug>.md`",
7963
+ `- \`${paths.companiesRoot}/analysis/<segment-slug>.md\``,
7934
7964
  "",
7935
7965
  "## Blocking Rule",
7936
7966
  "",
@@ -8362,7 +8392,7 @@ function buildCustomerProfileAnalystSubAgent(paths, issueDefaults, tier) {
8362
8392
  "| `<COMPETITORS_DIR>` | Per-archetype competitor analyses | `<CUSTOMER_ROOT>/competitors/` |",
8363
8393
  "| `<COMPETITORS_PAGE>` | One-archetype competitor-analysis page | `<COMPETITORS_DIR>/<ARCHETYPE_SLUG>.md` |",
8364
8394
  "| `<DISCOVERY_DIR>` | Discovery reports written during Phase 1 | `<researchRoot>/customer/` |",
8365
- "| `<MATRIX_FILE>` | Shared software-profile feature-matrix file | `docs/software/feature-matrix.md` |",
8395
+ `| \`<MATRIX_FILE>\` | Shared software-profile feature-matrix file | \`${paths.softwareRoot}/feature-matrix.md\` |`,
8366
8396
  "| `<SCOPE_SLUG>` | Short kebab-case slug identifying the discovery scope | derived from the discover issue |",
8367
8397
  "| `<ARCHETYPE_SLUG>` | Short kebab-case slug identifying one archetype | derived from the profile issue |",
8368
8398
  "",
@@ -8995,7 +9025,7 @@ function buildAnalyzeCustomerCompetitorsSkill(paths, issueDefaults) {
8995
9025
  "",
8996
9026
  "Optional extensions:",
8997
9027
  "- `matrix_file: <path>` \u2014 override for the shared feature-matrix",
8998
- " file. Defaults to `docs/software/feature-matrix.md`.",
9028
+ ` file. Defaults to \`${paths.softwareRoot}/feature-matrix.md\`.`,
8999
9029
  "",
9000
9030
  "## Default Paths",
9001
9031
  "",
@@ -10841,7 +10871,7 @@ function buildIndustryDiscoveryAnalystSubAgent(paths, issueDefaults) {
10841
10871
  "",
10842
10872
  "| Placeholder | Meaning | Default |",
10843
10873
  "|-------------|---------|---------|",
10844
- "| `<INDUSTRY_ROOT>` | Root folder for all industry-discovery outputs | `docs/industries/` |",
10874
+ `| \`<INDUSTRY_ROOT>\` | Root folder for all industry-discovery outputs | \`${paths.industriesRoot}/\` |`,
10845
10875
  "| `<CANDIDATES_DIR>` | Candidate-list files (Phase 1) | `<INDUSTRY_ROOT>/candidates/` |",
10846
10876
  "| `<EVALUATIONS_DIR>` | Evaluation files with per-candidate scores (Phase 2) | `<INDUSTRY_ROOT>/evaluations/` |",
10847
10877
  "| `<PLANS_DIR>` | Plan files summarizing downstream research (Phase 3) | `<INDUSTRY_ROOT>/plans/` |",
@@ -11162,9 +11192,9 @@ function buildDiscoverIndustriesSkill(paths, issueDefaults) {
11162
11192
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
11163
11193
  "`agentConfig.rules`, outputs land under:",
11164
11194
  "",
11165
- "- `docs/industries/candidates/<slug>.candidates.md`",
11166
- "- `docs/industries/evaluations/<slug>.evaluation.md`",
11167
- "- `docs/industries/plans/<slug>.plan.md`",
11195
+ `- \`${paths.industriesRoot}/candidates/<slug>.candidates.md\``,
11196
+ `- \`${paths.industriesRoot}/evaluations/<slug>.evaluation.md\``,
11197
+ `- \`${paths.industriesRoot}/plans/<slug>.plan.md\``,
11168
11198
  "",
11169
11199
  "## Steps",
11170
11200
  "",
@@ -16795,13 +16825,13 @@ function buildPeopleProfileAnalystSubAgent(paths, issueDefaults, tier) {
16795
16825
  "",
16796
16826
  "| Placeholder | Meaning | Default |",
16797
16827
  "|-------------|---------|---------|",
16798
- "| `<PEOPLE_ROOT>` | Root folder for person profiles | `docs/people/` |",
16828
+ `| \`<PEOPLE_ROOT>\` | Root folder for person profiles | \`${paths.peopleRoot}/\` |`,
16799
16829
  "| `<PROFILES_DIR>` | Final person profile files | `<PEOPLE_ROOT>/profiles/` |",
16800
16830
  "| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<PEOPLE_ROOT>/notes/` |",
16801
16831
  "| `<PERSON_SLUG>` | Short kebab-case slug identifying the person | derived from the person's name |",
16802
- "| `<COMPANIES_DIR>` | Where existing company profiles live (for cross-references and duplicate detection during followup) | `docs/companies/profiles/` |",
16803
- "| `<SOFTWARE_DIR>` | Where existing software profiles live (for cross-references and duplicate detection during followup) | `docs/software/profiles/` |",
16804
- "| `<MEETINGS_DIR>` | Where meeting notes live (for cross-references) | `docs/meetings/` |",
16832
+ `| \`<COMPANIES_DIR>\` | Where existing company profiles live (for cross-references and duplicate detection during followup) | \`${paths.companiesRoot}/profiles/\` |`,
16833
+ `| \`<SOFTWARE_DIR>\` | Where existing software profiles live (for cross-references and duplicate detection during followup) | \`${paths.softwareRoot}/profiles/\` |`,
16834
+ `| \`<MEETINGS_DIR>\` | Where meeting notes live (for cross-references) | \`${paths.meetingsRoot}/\` |`,
16805
16835
  "",
16806
16836
  `If \`${paths.docsRoot}/project-context.md\` specifies a different people-research`,
16807
16837
  "tree or cross-reference target, prefer that. Otherwise fall back to",
@@ -17373,14 +17403,14 @@ function buildProfilePersonSkill(paths, issueDefaults) {
17373
17403
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
17374
17404
  "`agentConfig.rules`, outputs land under:",
17375
17405
  "",
17376
- "- `docs/people/notes/<slug>.notes.md`",
17377
- "- `docs/people/profiles/<slug>.md`",
17406
+ `- \`${paths.peopleRoot}/notes/<slug>.notes.md\``,
17407
+ `- \`${paths.peopleRoot}/profiles/<slug>.md\``,
17378
17408
  "",
17379
17409
  "Cross-references are resolved against:",
17380
17410
  "",
17381
- "- `docs/companies/profiles/`",
17382
- "- `docs/software/profiles/`",
17383
- "- `docs/meetings/`",
17411
+ `- \`${paths.companiesRoot}/profiles/\``,
17412
+ `- \`${paths.softwareRoot}/profiles/\``,
17413
+ `- \`${paths.meetingsRoot}/\``,
17384
17414
  "",
17385
17415
  "## Steps",
17386
17416
  "",
@@ -21139,7 +21169,7 @@ function buildRequirementsAnalystSubAgent(paths, issueDefaults) {
21139
21169
  `| \`<COMPETITIVE_ROOT>\` | Competitive analysis docs | \`${paths.docsRoot}/business-strategy/competitive/\` |`,
21140
21170
  `| \`<PRODUCT_ROOT>\` | Product roadmap / entity taxonomy | \`${paths.docsRoot}/product/\` |`,
21141
21171
  `| \`<MEETINGS_ROOT>\` | Meeting extracts | \`${paths.docsRoot}/research/meetings/\` |`,
21142
- `| \`<RESEARCH_REQUIREMENTS_ROOT>\` | Scan reports and proposals | \`${paths.docsRoot}/research/requirements/\` |`,
21172
+ `| \`<RESEARCH_REQUIREMENTS_ROOT>\` | Scan reports and proposals | \`${paths.researchRequirementsRoot}/\` |`,
21143
21173
  `| \`<REQUIREMENTS_ROOT>\` | Final requirement documents (owned by requirements-writer) | \`${paths.requirementsRoot}/\` |`,
21144
21174
  "| `<PREFIX>` | Project-specific requirement ID prefix | e.g. `VRTX`, `ACME` |",
21145
21175
  "",
@@ -21560,7 +21590,7 @@ function buildRequirementsAnalystBundle(paths = DEFAULT_AGENT_PATHS, issueDefaul
21560
21590
  var requirementsAnalystBundle = buildRequirementsAnalystBundle();
21561
21591
 
21562
21592
  // src/agent/bundles/requirements-writer.ts
21563
- var TEMPLATE_BR = `---
21593
+ var templateBr = (paths) => `---
21564
21594
  title: "BR-NNN: [Business Requirement Title]"
21565
21595
  ---
21566
21596
 
@@ -21629,9 +21659,9 @@ Other business requirements, external factors, or organizational decisions this
21629
21659
 
21630
21660
  ## Traceability
21631
21661
 
21632
- - **Decomposes into:** [FR-NNN](../functional/FR-NNN-slug.md), [FR-NNN](../functional/FR-NNN-slug.md)
21633
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
21634
- - **Related:** [SEC-NNN](../security/SEC-NNN-slug.md)
21662
+ - **Decomposes into:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md), [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
21663
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
21664
+ - **Related:** [SEC-NNN](../${paths.requirementCategoryDirs.security}/SEC-NNN-slug.md)
21635
21665
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
21636
21666
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
21637
21667
 
@@ -21667,7 +21697,7 @@ Other business requirements, external factors, or organizational decisions this
21667
21697
  |---|---|---|
21668
21698
  | YYYY-MM-DD | [Name] | Initial draft |
21669
21699
  `;
21670
- var TEMPLATE_FR = `---
21700
+ var templateFr = (paths) => `---
21671
21701
  title: "FR-NNN: [Functional Requirement Title]"
21672
21702
  ---
21673
21703
 
@@ -21768,9 +21798,9 @@ What data is created, read, updated, or deleted by this feature. Reference DR do
21768
21798
 
21769
21799
  ## Traceability
21770
21800
 
21771
- - **Implements:** [BR-NNN](../business/BR-NNN-slug.md)
21772
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
21773
- - **Related:** [INT-NNN](../integration/INT-NNN-slug.md)
21801
+ - **Implements:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
21802
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
21803
+ - **Related:** [INT-NNN](../${paths.requirementCategoryDirs.integration}/INT-NNN-slug.md)
21774
21804
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
21775
21805
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
21776
21806
 
@@ -21806,7 +21836,7 @@ What data is created, read, updated, or deleted by this feature. Reference DR do
21806
21836
  |---|---|---|
21807
21837
  | YYYY-MM-DD | [Name] | Initial draft |
21808
21838
  `;
21809
- var TEMPLATE_NFR = `---
21839
+ var templateNfr = (paths) => `---
21810
21840
  title: "NFR-NNN: [Non-Functional Requirement Title]"
21811
21841
  ---
21812
21842
 
@@ -21868,9 +21898,9 @@ How compliance with this requirement will be monitored in production. Reference
21868
21898
 
21869
21899
  ## Traceability
21870
21900
 
21871
- - **Supports:** [BR-NNN](../business/BR-NNN-slug.md)
21872
- - **Constrains:** [FR-NNN](../functional/FR-NNN-slug.md)
21873
- - **Monitored by:** [OPS-NNN](../operational/OPS-NNN-slug.md)
21901
+ - **Supports:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
21902
+ - **Constrains:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
21903
+ - **Monitored by:** [OPS-NNN](../${paths.requirementCategoryDirs.operational}/OPS-NNN-slug.md)
21874
21904
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
21875
21905
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
21876
21906
 
@@ -21906,7 +21936,7 @@ How compliance with this requirement will be monitored in production. Reference
21906
21936
  |---|---|---|
21907
21937
  | YYYY-MM-DD | [Name] | Initial draft |
21908
21938
  `;
21909
- var TEMPLATE_TR = `---
21939
+ var templateTr = (paths) => `---
21910
21940
  title: "TR-NNN: [Technical Requirement Title]"
21911
21941
  ---
21912
21942
 
@@ -22019,9 +22049,9 @@ Other technologies this choice interacts with, and any known compatibility const
22019
22049
 
22020
22050
  ## Traceability
22021
22051
 
22022
- - **Justified by:** [ADR-NNN](../architectural-decisions/ADR-NNN-slug.md)
22023
- - **Supports:** [FR-NNN](../functional/FR-NNN-slug.md)
22024
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22052
+ - **Justified by:** [ADR-NNN](../${paths.requirementCategoryDirs.architecturalDecisions}/ADR-NNN-slug.md)
22053
+ - **Supports:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
22054
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22025
22055
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22026
22056
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22027
22057
 
@@ -22057,7 +22087,7 @@ Other technologies this choice interacts with, and any known compatibility const
22057
22087
  |---|---|---|
22058
22088
  | YYYY-MM-DD | [Name] | Initial draft |
22059
22089
  `;
22060
- var TEMPLATE_ADR = `---
22090
+ var templateAdr = (paths) => `---
22061
22091
  title: "ADR-NNN: [Decision Title]"
22062
22092
  ---
22063
22093
 
@@ -22147,8 +22177,8 @@ High-level guidance for implementing this decision. Detailed implementation goes
22147
22177
 
22148
22178
  ## Traceability
22149
22179
 
22150
- - **Supports:** [BR-NNN](../business/BR-NNN-slug.md)
22151
- - **Implemented by:** [TR-NNN](../technical/TR-NNN-slug.md)
22180
+ - **Supports:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
22181
+ - **Implemented by:** [TR-NNN](../${paths.requirementCategoryDirs.technical}/TR-NNN-slug.md)
22152
22182
  - **Related:** [ADR-NNN](ADR-NNN-slug.md)
22153
22183
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22154
22184
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
@@ -22185,7 +22215,7 @@ High-level guidance for implementing this decision. Detailed implementation goes
22185
22215
  |---|---|---|
22186
22216
  | YYYY-MM-DD | [Name] | Initial draft |
22187
22217
  `;
22188
- var TEMPLATE_SEC = `---
22218
+ var templateSec = (paths) => `---
22189
22219
  title: "SEC-NNN: [Security Requirement Title]"
22190
22220
  ---
22191
22221
 
@@ -22257,10 +22287,10 @@ How compliance with this security requirement will be verified.
22257
22287
 
22258
22288
  ## Traceability
22259
22289
 
22260
- - **Protects:** [FR-NNN](../functional/FR-NNN-slug.md)
22261
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22262
- - **Implements:** [BR-NNN](../business/BR-NNN-slug.md)
22263
- - **Related data:** [DR-NNN](../data/DR-NNN-slug.md)
22290
+ - **Protects:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
22291
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22292
+ - **Implements:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
22293
+ - **Related data:** [DR-NNN](../${paths.requirementCategoryDirs.data}/DR-NNN-slug.md)
22264
22294
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22265
22295
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22266
22296
 
@@ -22296,7 +22326,7 @@ How compliance with this security requirement will be verified.
22296
22326
  |---|---|---|
22297
22327
  | YYYY-MM-DD | [Name] | Initial draft |
22298
22328
  `;
22299
- var TEMPLATE_DR = `---
22329
+ var templateDr = (paths) => `---
22300
22330
  title: "DR-NNN: [Data Requirement Title]"
22301
22331
  ---
22302
22332
 
@@ -22372,9 +22402,9 @@ How this data is classified and what handling rules apply based on that classifi
22372
22402
 
22373
22403
  ## Traceability
22374
22404
 
22375
- - **Supports:** [FR-NNN](../functional/FR-NNN-slug.md)
22376
- - **Protected by:** [SEC-NNN](../security/SEC-NNN-slug.md)
22377
- - **Stored per:** [TR-NNN](../technical/TR-NNN-slug.md)
22405
+ - **Supports:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
22406
+ - **Protected by:** [SEC-NNN](../${paths.requirementCategoryDirs.security}/SEC-NNN-slug.md)
22407
+ - **Stored per:** [TR-NNN](../${paths.requirementCategoryDirs.technical}/TR-NNN-slug.md)
22378
22408
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22379
22409
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22380
22410
 
@@ -22410,7 +22440,7 @@ How this data is classified and what handling rules apply based on that classifi
22410
22440
  |---|---|---|
22411
22441
  | YYYY-MM-DD | [Name] | Initial draft |
22412
22442
  `;
22413
- var TEMPLATE_INT = `---
22443
+ var templateInt = (paths) => `---
22414
22444
  title: "INT-NNN: [Integration Requirement Title]"
22415
22445
  ---
22416
22446
 
@@ -22503,9 +22533,9 @@ What happens when this integration is unavailable. How does the system degrade g
22503
22533
 
22504
22534
  ## Traceability
22505
22535
 
22506
- - **Enables:** [FR-NNN](../functional/FR-NNN-slug.md)
22507
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22508
- - **Secured by:** [SEC-NNN](../security/SEC-NNN-slug.md)
22536
+ - **Enables:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
22537
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22538
+ - **Secured by:** [SEC-NNN](../${paths.requirementCategoryDirs.security}/SEC-NNN-slug.md)
22509
22539
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22510
22540
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22511
22541
 
@@ -22541,7 +22571,7 @@ What happens when this integration is unavailable. How does the system degrade g
22541
22571
  |---|---|---|
22542
22572
  | YYYY-MM-DD | [Name] | Initial draft |
22543
22573
  `;
22544
- var TEMPLATE_OPS = `---
22574
+ var templateOps = (paths) => `---
22545
22575
  title: "OPS-NNN: [Operational Requirement Title]"
22546
22576
  ---
22547
22577
 
@@ -22617,9 +22647,9 @@ If this applies to an existing system, document the current operational posture.
22617
22647
 
22618
22648
  ## Traceability
22619
22649
 
22620
- - **Monitors:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22621
- - **Supports:** [BR-NNN](../business/BR-NNN-slug.md)
22622
- - **Uses:** [TR-NNN](../technical/TR-NNN-slug.md)
22650
+ - **Monitors:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22651
+ - **Supports:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
22652
+ - **Uses:** [TR-NNN](../${paths.requirementCategoryDirs.technical}/TR-NNN-slug.md)
22623
22653
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22624
22654
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22625
22655
 
@@ -22655,7 +22685,7 @@ If this applies to an existing system, document the current operational posture.
22655
22685
  |---|---|---|
22656
22686
  | YYYY-MM-DD | [Name] | Initial draft |
22657
22687
  `;
22658
- var TEMPLATE_UX = `---
22688
+ var templateUx = (paths) => `---
22659
22689
  title: "UX-NNN: [UX Requirement Title]"
22660
22690
  ---
22661
22691
 
@@ -22733,9 +22763,9 @@ Reference to the project's design system, component library, or style guide if o
22733
22763
 
22734
22764
  ## Traceability
22735
22765
 
22736
- - **Enhances:** [FR-NNN](../functional/FR-NNN-slug.md)
22737
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22738
- - **Supports:** [BR-NNN](../business/BR-NNN-slug.md)
22766
+ - **Enhances:** [FR-NNN](../${paths.requirementCategoryDirs.functional}/FR-NNN-slug.md)
22767
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22768
+ - **Supports:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
22739
22769
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22740
22770
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22741
22771
 
@@ -22771,7 +22801,7 @@ Reference to the project's design system, component library, or style guide if o
22771
22801
  |---|---|---|
22772
22802
  | YYYY-MM-DD | [Name] | Initial draft |
22773
22803
  `;
22774
- var TEMPLATE_MT = `---
22804
+ var templateMt = (paths) => `---
22775
22805
  title: "MT-NNN: [Multi-Tenancy Requirement Title]"
22776
22806
  ---
22777
22807
 
@@ -22850,9 +22880,9 @@ How the system prevents one tenant from degrading the experience of others.
22850
22880
 
22851
22881
  ## Traceability
22852
22882
 
22853
- - **Implements:** [BR-NNN](../business/BR-NNN-slug.md)
22854
- - **Secured by:** [SEC-NNN](../security/SEC-NNN-slug.md)
22855
- - **Constrained by:** [NFR-NNN](../non-functional/NFR-NNN-slug.md)
22883
+ - **Implements:** [BR-NNN](../${paths.requirementCategoryDirs.business}/BR-NNN-slug.md)
22884
+ - **Secured by:** [SEC-NNN](../${paths.requirementCategoryDirs.security}/SEC-NNN-slug.md)
22885
+ - **Constrained by:** [NFR-NNN](../${paths.requirementCategoryDirs.nonFunctional}/NFR-NNN-slug.md)
22856
22886
  - **Depends on (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [platform/industry requirement this depends on]
22857
22887
  - **Enables (cross-tier):** [XX-NNN](../category/XX-NNN-slug.md) \u2014 [customer-workflow/consumer-app requirement this enables]
22858
22888
 
@@ -22923,7 +22953,7 @@ Use [\`_template-{PREFIX}.md\`](../templates/_template-{PREFIX}.md) for all new
22923
22953
  - Every document must include YAML frontmatter with a \`title\` field
22924
22954
  - Every document must include a \`## Traceability\` section
22925
22955
  `;
22926
- var TEMPLATE_REQUIREMENTS_README = `---
22956
+ var templateRequirementsReadme = (paths) => `---
22927
22957
  title: "[Project Name] \u2014 Requirements Documentation"
22928
22958
  ---
22929
22959
 
@@ -22933,17 +22963,17 @@ This directory contains the structured requirements taxonomy for [Project Name].
22933
22963
 
22934
22964
  | Category | Prefix | Directory | Purpose |
22935
22965
  |---|---|---|---|
22936
- | Business Requirements | BR | [\`business/\`](business/README.md) | Strategic intent, stakeholders, success metrics |
22937
- | Functional Requirements | FR | [\`functional/\`](functional/README.md) | User stories, flows, acceptance criteria |
22938
- | Non-Functional Requirements | NFR | [\`non-functional/\`](non-functional/README.md) | Performance, scalability, availability targets |
22939
- | Technical Requirements | TR | [\`technical/\`](technical/README.md) | Technology choices, framework decisions |
22940
- | Architectural Decisions | ADR | [\`architectural-decisions/\`](architectural-decisions/README.md) | Context, decision, consequences (standard ADR format) |
22941
- | Security & Compliance | SEC | [\`security/\`](security/README.md) | Auth, encryption, audit, regulatory |
22942
- | Data Requirements | DR | [\`data/\`](data/README.md) | Data models, retention, classification, RPO/RTO |
22943
- | Integration Requirements | INT | [\`integration/\`](integration/README.md) | APIs, third-party systems, protocols |
22944
- | Operational Requirements | OPS | [\`operational/\`](operational/README.md) | Deployment, monitoring, alerting, logging |
22945
- | UX Requirements | UX | [\`ux/\`](ux/README.md) | Accessibility, responsiveness, i18n |
22946
- | Multi-Tenancy & Licensing | MT | [\`multi-tenancy/\`](multi-tenancy/README.md) | Tenant isolation, feature gating, billing |
22966
+ | Business Requirements | BR | [\`${paths.requirementCategoryDirs.business}/\`](${paths.requirementCategoryDirs.business}/README.md) | Strategic intent, stakeholders, success metrics |
22967
+ | Functional Requirements | FR | [\`${paths.requirementCategoryDirs.functional}/\`](${paths.requirementCategoryDirs.functional}/README.md) | User stories, flows, acceptance criteria |
22968
+ | Non-Functional Requirements | NFR | [\`${paths.requirementCategoryDirs.nonFunctional}/\`](${paths.requirementCategoryDirs.nonFunctional}/README.md) | Performance, scalability, availability targets |
22969
+ | Technical Requirements | TR | [\`${paths.requirementCategoryDirs.technical}/\`](${paths.requirementCategoryDirs.technical}/README.md) | Technology choices, framework decisions |
22970
+ | Architectural Decisions | ADR | [\`${paths.requirementCategoryDirs.architecturalDecisions}/\`](${paths.requirementCategoryDirs.architecturalDecisions}/README.md) | Context, decision, consequences (standard ADR format) |
22971
+ | Security & Compliance | SEC | [\`${paths.requirementCategoryDirs.security}/\`](${paths.requirementCategoryDirs.security}/README.md) | Auth, encryption, audit, regulatory |
22972
+ | Data Requirements | DR | [\`${paths.requirementCategoryDirs.data}/\`](${paths.requirementCategoryDirs.data}/README.md) | Data models, retention, classification, RPO/RTO |
22973
+ | Integration Requirements | INT | [\`${paths.requirementCategoryDirs.integration}/\`](${paths.requirementCategoryDirs.integration}/README.md) | APIs, third-party systems, protocols |
22974
+ | Operational Requirements | OPS | [\`${paths.requirementCategoryDirs.operational}/\`](${paths.requirementCategoryDirs.operational}/README.md) | Deployment, monitoring, alerting, logging |
22975
+ | UX Requirements | UX | [\`${paths.requirementCategoryDirs.ux}/\`](${paths.requirementCategoryDirs.ux}/README.md) | Accessibility, responsiveness, i18n |
22976
+ | Multi-Tenancy & Licensing | MT | [\`${paths.requirementCategoryDirs.multiTenancy}/\`](${paths.requirementCategoryDirs.multiTenancy}/README.md) | Tenant isolation, feature gating, billing |
22947
22977
 
22948
22978
  Each directory contains a \`README.md\` with detailed guidance on what belongs in that category (and what doesn't), common disambiguation tips, and project-specific context. When unsure where a requirement belongs, start with the category README.
22949
22979
 
@@ -23009,9 +23039,9 @@ Example:
23009
23039
  \`\`\`markdown
23010
23040
  ## Traceability
23011
23041
 
23012
- - **Implements:** [FR-001](../functional/FR-001-user-registration.md)
23013
- - **Constrained by:** [NFR-001](../non-functional/NFR-001-uptime-sla.md)
23014
- - **Related:** [SEC-001](../security/SEC-001-multi-tenant-auth.md)
23042
+ - **Implements:** [FR-001](../${paths.requirementCategoryDirs.functional}/FR-001-user-registration.md)
23043
+ - **Constrained by:** [NFR-001](../${paths.requirementCategoryDirs.nonFunctional}/NFR-001-uptime-sla.md)
23044
+ - **Related:** [SEC-001](../${paths.requirementCategoryDirs.security}/SEC-001-multi-tenant-auth.md)
23015
23045
  \`\`\`
23016
23046
 
23017
23047
  ### Link Types
@@ -23405,35 +23435,70 @@ var WRITE_REQUIREMENT_EVALS_JSON = JSON.stringify(
23405
23435
  null,
23406
23436
  2
23407
23437
  );
23408
- var REQUIREMENTS_WRITER_REFERENCE_FILES = [
23409
- { path: "_references/templates/_template-BR.md", content: TEMPLATE_BR },
23410
- { path: "_references/templates/_template-FR.md", content: TEMPLATE_FR },
23411
- { path: "_references/templates/_template-NFR.md", content: TEMPLATE_NFR },
23412
- { path: "_references/templates/_template-TR.md", content: TEMPLATE_TR },
23413
- { path: "_references/templates/_template-ADR.md", content: TEMPLATE_ADR },
23414
- { path: "_references/templates/_template-SEC.md", content: TEMPLATE_SEC },
23415
- { path: "_references/templates/_template-DR.md", content: TEMPLATE_DR },
23416
- { path: "_references/templates/_template-INT.md", content: TEMPLATE_INT },
23417
- { path: "_references/templates/_template-OPS.md", content: TEMPLATE_OPS },
23418
- { path: "_references/templates/_template-UX.md", content: TEMPLATE_UX },
23419
- { path: "_references/templates/_template-MT.md", content: TEMPLATE_MT },
23420
- {
23421
- path: "_references/templates/_template-category-README.md",
23422
- content: TEMPLATE_CATEGORY_README
23423
- },
23424
- {
23425
- path: "_references/templates/_template-requirements-README.md",
23426
- content: TEMPLATE_REQUIREMENTS_README
23427
- },
23428
- {
23429
- path: "_references/standards-and-frameworks.md",
23430
- content: STANDARDS_AND_FRAMEWORKS
23431
- },
23432
- {
23433
- path: "evals/evals.json",
23434
- content: WRITE_REQUIREMENT_EVALS_JSON
23435
- }
23436
- ];
23438
+ function buildRequirementsWriterReferenceFiles(paths) {
23439
+ return [
23440
+ {
23441
+ path: "_references/templates/_template-BR.md",
23442
+ content: templateBr(paths)
23443
+ },
23444
+ {
23445
+ path: "_references/templates/_template-FR.md",
23446
+ content: templateFr(paths)
23447
+ },
23448
+ {
23449
+ path: "_references/templates/_template-NFR.md",
23450
+ content: templateNfr(paths)
23451
+ },
23452
+ {
23453
+ path: "_references/templates/_template-TR.md",
23454
+ content: templateTr(paths)
23455
+ },
23456
+ {
23457
+ path: "_references/templates/_template-ADR.md",
23458
+ content: templateAdr(paths)
23459
+ },
23460
+ {
23461
+ path: "_references/templates/_template-SEC.md",
23462
+ content: templateSec(paths)
23463
+ },
23464
+ {
23465
+ path: "_references/templates/_template-DR.md",
23466
+ content: templateDr(paths)
23467
+ },
23468
+ {
23469
+ path: "_references/templates/_template-INT.md",
23470
+ content: templateInt(paths)
23471
+ },
23472
+ {
23473
+ path: "_references/templates/_template-OPS.md",
23474
+ content: templateOps(paths)
23475
+ },
23476
+ {
23477
+ path: "_references/templates/_template-UX.md",
23478
+ content: templateUx(paths)
23479
+ },
23480
+ {
23481
+ path: "_references/templates/_template-MT.md",
23482
+ content: templateMt(paths)
23483
+ },
23484
+ {
23485
+ path: "_references/templates/_template-category-README.md",
23486
+ content: TEMPLATE_CATEGORY_README
23487
+ },
23488
+ {
23489
+ path: "_references/templates/_template-requirements-README.md",
23490
+ content: templateRequirementsReadme(paths)
23491
+ },
23492
+ {
23493
+ path: "_references/standards-and-frameworks.md",
23494
+ content: STANDARDS_AND_FRAMEWORKS
23495
+ },
23496
+ {
23497
+ path: "evals/evals.json",
23498
+ content: WRITE_REQUIREMENT_EVALS_JSON
23499
+ }
23500
+ ];
23501
+ }
23437
23502
  function buildRequirementsWriterSubAgent(paths) {
23438
23503
  return {
23439
23504
  name: "requirements-writer",
@@ -23633,13 +23698,13 @@ function buildRequirementsWriterSubAgent(paths) {
23633
23698
  "1. Write the requirement itself (FR, DR, INT, OPS, etc.) with full",
23634
23699
  " detail.",
23635
23700
  "2. Where the requirement needs a technology decision, add a note:",
23636
- ' *"Technology selection pending \u2014 see [ADR-NNN](../architectural-decisions/ADR-NNN-slug.md)"*.',
23701
+ ` *"Technology selection pending \u2014 see [ADR-NNN](../${paths.requirementCategoryDirs.architecturalDecisions}/ADR-NNN-slug.md)"*.`,
23637
23702
  "3. Create the corresponding ADR or TR as `Proposed` with options,",
23638
23703
  " pros/cons, and recommendation.",
23639
23704
  '4. In the ADR/TR open items, add: *"Human decision required.',
23640
23705
  ' Dependent requirements: [list]"*.',
23641
23706
  "5. In the original requirement's open items, add a cross-reference:",
23642
- ' *"Blocked by [ADR-NNN](../architectural-decisions/ADR-NNN-slug.md) \u2014',
23707
+ ` *"Blocked by [ADR-NNN](../${paths.requirementCategoryDirs.architecturalDecisions}/ADR-NNN-slug.md) \u2014`,
23643
23708
  ' technology selection pending human review."*',
23644
23709
  "",
23645
23710
  "This creates a clear chain: the requirement is understood, the",
@@ -23726,9 +23791,9 @@ function buildRequirementsWriterSubAgent(paths) {
23726
23791
  "```markdown",
23727
23792
  "## Traceability",
23728
23793
  "",
23729
- "- **Implements:** [BR-001](../business/BR-001-self-service-onboarding.md)",
23730
- "- **Constrained by:** [NFR-001](../non-functional/NFR-001-api-response-times.md)",
23731
- "- **Related:** [SEC-001](../security/SEC-001-authentication-framework.md)",
23794
+ `- **Implements:** [BR-001](../${paths.requirementCategoryDirs.business}/BR-001-self-service-onboarding.md)`,
23795
+ `- **Constrained by:** [NFR-001](../${paths.requirementCategoryDirs.nonFunctional}/NFR-001-api-response-times.md)`,
23796
+ `- **Related:** [SEC-001](../${paths.requirementCategoryDirs.security}/SEC-001-authentication-framework.md)`,
23732
23797
  "```",
23733
23798
  "",
23734
23799
  "### Link Types",
@@ -23788,7 +23853,7 @@ function buildRequirementsWriterSubAgent(paths) {
23788
23853
  "",
23789
23854
  "Number each item within its subsection. Assign a priority. Call out",
23790
23855
  "interdependencies with open items in other documents using the",
23791
- "format: `-> Depends on: [FR-001 Open Item #2](../functional/FR-001-slug.md#open-items)`.",
23856
+ `format: \`-> Depends on: [FR-001 Open Item #2](../${paths.requirementCategoryDirs.functional}/FR-001-slug.md#open-items)\`.`,
23792
23857
  "",
23793
23858
  "The `## Open Items` section is **not optional** \u2014 it appears in every",
23794
23859
  'document, even if a subsection is empty (write "None identified.").',
@@ -24047,7 +24112,7 @@ function buildWriteRequirementSkill(paths, issueDefaults) {
24047
24112
  context: "fork",
24048
24113
  agent: "requirements-writer",
24049
24114
  platforms: { cursor: { exclude: true } },
24050
- referenceFiles: REQUIREMENTS_WRITER_REFERENCE_FILES,
24115
+ referenceFiles: buildRequirementsWriterReferenceFiles(paths),
24051
24116
  instructions: [
24052
24117
  "# Write Requirement",
24053
24118
  "",
@@ -24359,7 +24424,7 @@ function buildRequirementsReviewerSubAgent(paths, issueDefaults) {
24359
24424
  "1. **Full audit** \u2014 every requirement document under",
24360
24425
  " `<REQUIREMENTS_ROOT>` across all categories",
24361
24426
  "2. **Category audit** \u2014 every document in one category directory",
24362
- " (e.g., all FRs under `<REQUIREMENTS_ROOT>/functional/`)",
24427
+ ` (e.g., all FRs under \`<REQUIREMENTS_ROOT>/${paths.requirementCategoryDirs.functional}/\`)`,
24363
24428
  "3. **Single document** \u2014 one specific requirement file",
24364
24429
  "4. **Targeted check** \u2014 one or more checks from the catalog below,",
24365
24430
  ' run across the documents in scope (e.g., "check all traceability',
@@ -24787,7 +24852,7 @@ function buildRequirementsReviewerSubAgent(paths, issueDefaults) {
24787
24852
  "",
24788
24853
  "Each finding must cite the file path and the specific check that",
24789
24854
  'produced it (e.g., "Check 4: Cross-Reference Integrity \u2014 target',
24790
- "file `../security/SEC-007-audit-logs.md` does not exist on",
24855
+ `file \`../${paths.requirementCategoryDirs.security}/SEC-007-audit-logs.md\` does not exist on`,
24791
24856
  'disk").',
24792
24857
  "",
24793
24858
  "---",
@@ -26401,13 +26466,13 @@ function buildSoftwareProfileAnalystSubAgent(paths, issueDefaults, tier) {
26401
26466
  "",
26402
26467
  "| Placeholder | Meaning | Default |",
26403
26468
  "|-------------|---------|---------|",
26404
- "| `<SOFTWARE_ROOT>` | Root folder for software profiles | `docs/software/` |",
26469
+ `| \`<SOFTWARE_ROOT>\` | Root folder for software profiles | \`${paths.softwareRoot}/\` |`,
26405
26470
  "| `<PROFILES_DIR>` | Final software profile files | `<SOFTWARE_ROOT>/profiles/` |",
26406
26471
  "| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<SOFTWARE_ROOT>/notes/` |",
26407
26472
  "| `<MATRIX_FILE>` | Shared feature-matrix file | `<SOFTWARE_ROOT>/feature-matrix.md` |",
26408
26473
  "| `<PRODUCT_SLUG>` | Short kebab-case slug identifying the product | derived from the product name |",
26409
- "| `<COMPANY_PROFILES_DIR>` | Where existing company profiles live (for duplicate detection during followup) | `docs/companies/profiles/` |",
26410
- "| `<PEOPLE_PROFILES_DIR>` | Where existing people profiles live (for duplicate detection during followup) | `docs/people/profiles/` |",
26474
+ `| \`<COMPANY_PROFILES_DIR>\` | Where existing company profiles live (for duplicate detection during followup) | \`${paths.companiesRoot}/profiles/\` |`,
26475
+ `| \`<PEOPLE_PROFILES_DIR>\` | Where existing people profiles live (for duplicate detection during followup) | \`${paths.peopleRoot}/profiles/\` |`,
26411
26476
  `| \`<BCM_DOC_ROOT>\` | Root folder for BCM capability-model documents (used by Phase 4 to locate capabilities) | \`${paths.bcmRoot}/\` |`,
26412
26477
  "| `<BCM_CAPABILITY_MAP>` | Capability-map file that lists the L1/L2/L3 hierarchy | `<BCM_DOC_ROOT>/capability-map.md` |",
26413
26478
  "| `<UNMAPPED_THRESHOLD>` | Minimum number of unmapped features on a single profile that triggers a `bcm:outline` follow-up for that feature cluster | `1` (every unmapped feature triggers a `bcm:outline`) |",
@@ -27077,9 +27142,9 @@ function buildProfileSoftwareSkill(paths, issueDefaults) {
27077
27142
  `If the project has no override in \`${paths.docsRoot}/project-context.md\` or`,
27078
27143
  "`agentConfig.rules`, outputs land under:",
27079
27144
  "",
27080
- "- `docs/software/notes/<slug>.notes.md`",
27081
- "- `docs/software/profiles/<slug>.md`",
27082
- "- `docs/software/feature-matrix.md` (shared across all products)",
27145
+ `- \`${paths.softwareRoot}/notes/<slug>.notes.md\``,
27146
+ `- \`${paths.softwareRoot}/profiles/<slug>.md\``,
27147
+ `- \`${paths.softwareRoot}/feature-matrix.md\` (shared across all products)`,
27083
27148
  "",
27084
27149
  "## Steps",
27085
27150
  "",
@@ -27165,7 +27230,7 @@ function buildMapSoftwareSkill(paths, issueDefaults) {
27165
27230
  `- \`${paths.bcmRoot}/\` \u2014 BCM capability-model documents`,
27166
27231
  `- \`${paths.bcmRoot}/capability-map.md\` \u2014 capability map`,
27167
27232
  "",
27168
- "and writes back to `docs/software/profiles/<slug>.md` under the",
27233
+ `and writes back to \`${paths.softwareRoot}/profiles/<slug>.md\` under the`,
27169
27234
  "`## Capability Mapping` section only. No other section of the",
27170
27235
  "profile is rewritten.",
27171
27236
  "",
@@ -29323,7 +29388,7 @@ var VERSION = {
29323
29388
  /**
29324
29389
  * Version of Projen to use.
29325
29390
  */
29326
- PROJEN_VERSION: "0.99.70",
29391
+ PROJEN_VERSION: "0.99.71",
29327
29392
  /**
29328
29393
  * Version of `actions/setup-node` to use in GitHub workflows.
29329
29394
  * Tracks the version projen currently emits (see node_modules/projen/lib/github/workflows.js).
@@ -37821,6 +37886,7 @@ export const collections = {
37821
37886
  DEFAULT_PROGRESS_FILES_FORMAT,
37822
37887
  DEFAULT_PROGRESS_FILES_STALE_AFTER_HOURS,
37823
37888
  DEFAULT_PROGRESS_FILES_STATE_DIR,
37889
+ DEFAULT_REQUIREMENT_CATEGORY_DIRS,
37824
37890
  DEFAULT_REQUIRE_PRODUCT_CONTEXT,
37825
37891
  DEFAULT_RESOLVED_ISSUE_DEFAULTS,
37826
37892
  DEFAULT_SAMPLE_COMPILER_OPTIONS,