BIDIRECTIONAL-TEMPLATE-DISCOVERY.mdā¢13.5 kB
# Bidirectional Template-Based Discovery
**Versie:** 1.5.0
**Datum:** 17 oktober 2025
**Status:** ā ļø CRITICAL INSTRUCTION
**Impact:** Alle relationship discovery workflows
---
## šÆ Core Principle
**Templates zijn de brug tussen content en architectuur.**
Bij **ELKE** discovery in Sitecore MCP MOET je bidirectioneel navigeren via templates:
```
Content āā Template āā Related Content
```
**Dit is NIET optioneel. Dit is CRITICAL voor correcte Helix discovery.**
---
## ā ļø CRITICAL RULE
### Content Item Discovery
**Wanneer je een content item vindt:**
1. ā
**ALTIJD** de template analyseren
2. ā
**ALTIJD** zoeken naar andere content items met dezelfde template
3. ā
**ALTIJD** feature locaties zoeken (templates, renderings, resolvers)
### Template Discovery
**Wanneer je een template vindt:**
1. ā
**ALTIJD** zoeken naar alle content items die deze template gebruiken
2. ā
**ALTIJD** content distributie analyseren (sites, languages, locaties)
3. ā
**ALTIJD** usage statistics genereren
---
## š Bidirectional Flows
### Flow A: Content ā Template ā Related Content (Upward)
```typescript
// STAP 1: Get content item
const item = await sitecore_get_item({
path: '/sitecore/content/MySite/Home/Article1',
language: 'en'
});
// STAP 2: Extract template information
const templatePath = item.template.path;
// Result: "/sitecore/templates/Feature/Articles/Article"
const featureName = templatePath.split('/')[4];
// Result: "Articles"
const templateName = item.template.name;
// Result: "Article"
// STAP 3A: Search ALL content using same template (CRITICAL!)
const relatedContent = await sitecore_search({
templateName: templateName, // "Article"
rootPath: '/sitecore/content',
language: 'en',
maxItems: 100
});
// Result: Article1, Article2, Article3, ... (12 items found)
// STAP 3B: Search feature definition locations
const templateItems = await sitecore_search({
rootPath: `/sitecore/templates/Feature/${featureName}`,
language: 'en'
});
const renderingItems = await sitecore_search({
rootPath: `/sitecore/layout/Renderings/Feature/${featureName}`,
language: 'en'
});
const resolverItems = await sitecore_search({
rootPath: `/sitecore/system/Modules/Layout Service/Rendering Contents Resolvers/Feature/${featureName}`,
language: 'en'
});
```
**Output:**
```
š Content Item: Article1
Template: Article (Feature: Articles)
š Related Content (same template):
- Article1 (/sitecore/content/MySite/Home/Article1)
- Article2 (/sitecore/content/MySite/News/Article2)
- Article3 (/sitecore/content/MySite/Blog/Article3)
... (12 total)
š Feature Locations:
Templates: /sitecore/templates/Feature/Articles (5 items)
Renderings: /sitecore/layout/Renderings/Feature/Articles (3 items)
Resolvers: /sitecore/system/.../Feature/Articles (2 items)
```
---
### Flow B: Template ā Content (Downward)
```typescript
// STAP 1: Get template definition
const template = await sitecore_get_template({
templatePath: '/sitecore/templates/Feature/Articles/Article',
language: 'en'
});
// STAP 2: Extract template name
const templateName = template.name;
// Result: "Article"
// STAP 3: Search ALL content items using this template (CRITICAL!)
const contentInstances = await sitecore_search({
templateName: templateName,
rootPath: '/sitecore/content',
language: 'en',
maxItems: 200
});
// STAP 4: Analyze content distribution
const sites = {};
const languages = {};
const locations = [];
contentInstances.forEach(item => {
const siteName = item.path.split('/')[3];
sites[siteName] = (sites[siteName] || 0) + 1;
languages[item.language] = (languages[item.language] || 0) + 1;
locations.push(item.path);
});
const stats = {
totalItems: contentInstances.length,
sites: sites, // { MySite: 8, AnotherSite: 4 }
languages: languages, // { en: 10, nl: 2 }
locations: locations
};
```
**Output:**
```
š Template: Article
Path: /sitecore/templates/Feature/Articles/Article
š Usage Statistics:
Total Content Items: 12
By Site:
- MySite: 8 items
- AnotherSite: 4 items
By Language:
- en: 10 items
- nl: 2 items
Locations:
- /sitecore/content/MySite/Home/Article1
- /sitecore/content/MySite/News/Article2
- /sitecore/content/MySite/Blog/Article3
... (12 total)
```
---
## šÆ Complete Example: TestFeatures Module
### Scenario: Discover ALL TestFeatures Related Items
```typescript
// USER VRAAG: "Find everything related to TestFeatures"
// ==================================================
// FLOW A: Start met content item discovery
// ==================================================
// 1. Search content items with "TestFeatures" in name/path
const contentItems = await sitecore_search({
searchText: 'TestFeatures',
rootPath: '/sitecore/content',
language: 'en',
maxItems: 50
});
// Result: Found 3 content items
// - /sitecore/content/MySite/Home/TestItem1
// - /sitecore/content/MySite/Home/TestItem2
// - /sitecore/content/MySite/Features/TestItem3
// 2. Get first content item to analyze template
const firstItem = await sitecore_get_item({
path: contentItems[0].path,
language: 'en'
});
// firstItem.template.path = "/sitecore/templates/Feature/TestFeatures/TestFeature Item"
// firstItem.template.name = "TestFeature Item"
// 3. Search ALL content using same template (CRITICAL!)
const allTestFeatureContent = await sitecore_search({
templateName: 'TestFeature Item',
rootPath: '/sitecore/content',
language: 'en',
maxItems: 100
});
// Result: Found 12 items (not just the 3 with "TestFeatures" in name!)
// This discovers ALL content using this template, regardless of name
// ==================================================
// FLOW B: Template definition discovery
// ==================================================
// 4. Search template folder
const templates = await sitecore_search({
rootPath: '/sitecore/templates/Feature/TestFeatures',
language: 'en'
});
// Result: Found 5 templates
// - TestFeature Item
// - TestFeature Settings
// - TestFeature Data
// - _TestFeature Base
// - Data Templates/
// 5. For each template, search content usage (CRITICAL!)
for (const template of templates) {
const templateUsage = await sitecore_search({
templateName: template.name,
rootPath: '/sitecore/content',
language: 'en'
});
console.log(`Template "${template.name}" used by ${templateUsage.length} items`);
}
// Result:
// - TestFeature Item: 12 content items
// - TestFeature Settings: 1 content item
// - TestFeature Data: 0 content items (not used yet)
// - _TestFeature Base: 0 (base template, not directly instantiated)
// ==================================================
// Additional: Renderings and Resolvers
// ==================================================
// 6. Search renderings
const renderings = await sitecore_search({
rootPath: '/sitecore/layout/Renderings/Feature/TestFeatures',
language: 'en'
});
// 7. Search resolvers
const resolvers = await sitecore_search({
rootPath: '/sitecore/system/Modules/Layout Service/Rendering Contents Resolvers/Feature/TestFeatures',
language: 'en'
});
```
**Complete Output:**
```
šÆ TestFeatures Module - Complete Discovery
š Content Items (12 found):
Using Template "TestFeature Item":
- /sitecore/content/MySite/Home/TestItem1
- /sitecore/content/MySite/Home/TestItem2
- /sitecore/content/MySite/Features/TestItem3
- /sitecore/content/MySite/Data/TestData1
... (12 total)
Distribution:
- MySite: 10 items
- AnotherSite: 2 items
Languages:
- en: 10 items
- nl: 2 items
š Templates (5 found):
Location: /sitecore/templates/Feature/TestFeatures
- TestFeature Item (used by 12 content items)
- TestFeature Settings (used by 1 content item)
- TestFeature Data (not used)
- _TestFeature Base (base template)
- Data Templates/
š Renderings (3 found):
Location: /sitecore/layout/Renderings/Feature/TestFeatures
- TestFeature List
- TestFeature Detail
- TestFeature Navigation
š§ Resolvers (2 found):
Location: /sitecore/system/.../Feature/TestFeatures
- TestFeature List Resolver
- TestFeature Detail Resolver
š Helix Relationship Map:
Feature Module: TestFeatures
āāā Templates (5 items)
ā āāā Used by 13 content items total
āāā Renderings (3 items)
āāā Resolvers (2 items)
āāā Content Items (12 items)
āāā 2 sites
āāā 2 languages
```
---
## ā Common Mistakes (AVOID!)
### ā FOUT 1: Alleen naam-based search
```typescript
// FOUT: Zoekt alleen items met "TestFeatures" in naam
const items = await sitecore_search({
searchText: 'TestFeatures',
rootPath: '/sitecore/content'
});
// Miss: Content items met andere namen maar zelfde template!
```
**ā
CORRECT:**
```typescript
// 1. Zoek met naam
const namedItems = await sitecore_search({
searchText: 'TestFeatures',
rootPath: '/sitecore/content'
});
// 2. Get template van eerste item
const item = await sitecore_get_item({ path: namedItems[0].path });
// 3. Zoek ALLE items met zelfde template
const allItems = await sitecore_search({
templateName: item.template.name,
rootPath: '/sitecore/content'
});
```
---
### ā FOUT 2: Template niet analyseren
```typescript
// FOUT: Stopt na content item vinden
const item = await sitecore_get_item({
path: '/sitecore/content/MySite/TestItem'
});
// Miss: Geen related content, geen feature locations!
```
**ā
CORRECT:**
```typescript
// 1. Get item
const item = await sitecore_get_item({
path: '/sitecore/content/MySite/TestItem'
});
// 2. Search related content (same template)
const related = await sitecore_search({
templateName: item.template.name,
rootPath: '/sitecore/content'
});
// 3. Search feature locations
const feature = item.template.path.split('/')[4];
const templates = await sitecore_search({
rootPath: `/sitecore/templates/Feature/${feature}`
});
```
---
### ā FOUT 3: Template zonder content usage
```typescript
// FOUT: Template info zonder usage check
const template = await sitecore_get_template({
templatePath: '/sitecore/templates/Feature/Articles/Article'
});
// Miss: Hoeveel content items gebruiken dit? Waar?
```
**ā
CORRECT:**
```typescript
// 1. Get template
const template = await sitecore_get_template({
templatePath: '/sitecore/templates/Feature/Articles/Article'
});
// 2. Search ALL content using this template
const usage = await sitecore_search({
templateName: template.name,
rootPath: '/sitecore/content'
});
// 3. Analyze distribution
console.log(`Template used by ${usage.length} content items`);
```
---
## š Checklist
Bij **ELKE** discovery taak:
### Content Item Discovery
- [ ] Content item gevonden?
- [ ] Template geanalyseerd?
- [ ] Alle content met zelfde template gezocht?
- [ ] Feature locaties onderzocht?
- [ ] Helix map gegenereerd?
### Template Discovery
- [ ] Template gevonden?
- [ ] Alle content instances gezocht?
- [ ] Usage statistics gegenereerd?
- [ ] Distribution geanalyseerd (sites, languages)?
- [ ] Related templates onderzocht (base templates)?
### Feature Module Discovery
- [ ] Templates onderzocht?
- [ ] Renderings onderzocht?
- [ ] Resolvers onderzocht?
- [ ] Content items gezocht (per template)?
- [ ] Complete Helix map?
---
## š Learning Examples
### Example 1: Article Feature
```typescript
// Given: Article content item
// Task: Find all related items
// Step 1: Content ā Template
const article = await sitecore_get_item({
path: '/sitecore/content/MySite/News/Article1'
});
// template: "Article", feature: "Articles"
// Step 2: Template ā Related Content
const allArticles = await sitecore_search({
templateName: 'Article',
rootPath: '/sitecore/content'
});
// Result: 25 articles across 3 sites
// Step 3: Feature Locations
const articleTemplates = await sitecore_search({
rootPath: '/sitecore/templates/Feature/Articles'
});
// Result: Article, Article List, Article Category templates
// Complete map generated!
```
---
### Example 2: Navigation Feature
```typescript
// Given: Navigation template
// Task: Find all navigation instances
// Step 1: Template ā Content
const template = await sitecore_get_template({
templatePath: '/sitecore/templates/Feature/Navigation/Navigation'
});
// Step 2: Search content usage
const navItems = await sitecore_search({
templateName: 'Navigation',
rootPath: '/sitecore/content'
});
// Result: 15 navigation items
// Step 3: Analyze distribution
const sites = groupBy(navItems, item => item.path.split('/')[3]);
// Result: { MySite: 8, AnotherSite: 5, ThirdSite: 2 }
// Usage report generated!
```
---
## š Related Documentation
- **HELIX-RELATIONSHIP-DISCOVERY.md** - Complete Helix workflow
- **TESTFEATURES-MCP-WORKFLOW.md** - MCP tools workflow
- **.github/copilot-instructions.md** - AI assistant instructions
- **MCP-CONTEXT-INSTRUCTIONS.md** - Cross-IDE context
---
## ā
Success Criteria
**You know you're doing it right when:**
ā
Content discovery ALTIJD includes template analysis
ā
Template discovery ALTIJD includes content search
ā
Related content wordt ALTIJD gevonden (via template)
ā
Feature locations worden ALTIJD onderzocht
ā
Usage statistics worden ALTIJD gegenereerd
ā
Helix relationship maps zijn COMPLEET
ā
Geen orphaned items (content without template check)
ā
Geen incomplete discoveries (template without usage)
**Status: CRITICAL INSTRUCTION - ALWAYS FOLLOW** š