Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

All notable changes to the Microsoft Agent 365 Customer Implementation Guide are documented here.

## 1.0.1 - 2026-09-09

- Added `interactiveKind: guide` catalog metadata so the catalog labels this resource an "Interactive guide". Guide content is unchanged.

## 1.0.0 - 2026-09-09

- Published the self-contained customer implementation guide.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ author:
- "Pratik Bhusal"
- "Manas Biswas"
- "Alejandro Lopez"
version: 1.0.0
version: 1.0.1
published: 2026-09-09
updated: 2026-09-09
tags:
Expand All @@ -16,6 +16,7 @@ tags:
- governance
- security
format: interactive
interactiveKind: guide
featured: false
status: active
whatItIs: >-
Expand Down
9 changes: 9 additions & 0 deletions copilot-agent-strategy/copilot-agents-guide/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Changelog

All notable changes to the Copilot Agents Guide are documented here.

## 4.0.1 - 2026-09-09

- Added `interactiveKind: guide` catalog metadata so the catalog labels this resource an "Interactive guide". Guide content is unchanged.

Earlier version history is available in the repository Git log.
5 changes: 3 additions & 2 deletions copilot-agent-strategy/copilot-agents-guide/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ summary: >-
Compare Microsoft Copilot agent approaches, availability, licensing, FastTrack scope, and common
scenarios.
author: Microsoft FastTrack
version: 4.0.0
version: 4.0.1
published: "2025-10-28"
updated: "2026-08-21"
updated: "2026-09-09"
tags:
- guide
- decision
- planning
format: interactive
interactiveKind: guide
featured: true
whatItIs: >-
A self-contained interactive guide to Microsoft-built agent experiences, Agents in SharePoint,
Expand Down
1 change: 1 addition & 0 deletions docs/CATALOG-METADATA.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ prerequisites:
| --- | --- | --- |
| `tags` | string list | Lowercase discovery terms. Prefer a few specific tags over many broad ones. |
| `format` | enum | One of `ps1`, `bundle`, `declarative`, `interactive`, `pptx`, `pbix`, or `md`. This replaces the former `artifact` label. |
| `interactiveKind` | enum | Only for `format: interactive`. Set `guide` for a walkthrough or implementation/decision guide, or `tool` for a calculator or utility. Defaults to `tool`, which the catalog labels "Interactive tool"; `guide` is labeled "Interactive guide". |
| `featured` | boolean | Use sparingly for resources selected for catalog promotion. Default is `false`. |
| `status` | enum | `active`, `preview`, or `archived`. Default is `active`. |
| `url` | HTTPS URL | Optional GitHub or destination URL. When omitted, the generator derives a GitHub URL from the resource path. |
Expand Down
16 changes: 9 additions & 7 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -1355,7 +1355,7 @@
<span class="stat-chip">Updated weekly</span>
</div>
<h1 class="display-title">Tools &amp; templates for Microsoft 365</h1>
<p class="hero-subtitle">Browse agents, analytics, and strategy resources &mdash; no coding required.</p>
<p class="hero-subtitle">Browse agents, analytics, and guides &mdash; no coding required.</p>
</div>
<div class="hero-search">
<div class="search-container">
Expand Down Expand Up @@ -1573,7 +1573,7 @@ <h3>Related resources</h3>
{ id: 'all', label: 'All', desc: 'Browse everything' },
{ id: 'script', label: 'Scripts', colorVar: '--type-script', desc: 'PowerShell automation' },
{ id: 'agent', label: 'Agents', colorVar: '--type-agent', desc: 'Ready-to-use AI assistants' },
{ id: 'strategy', label: 'Strategy', colorVar: '--type-strategy', desc: 'Planning tools & guides' },
{ id: 'strategy', label: 'Guides & planning', colorVar: '--type-strategy', desc: 'Implementation guides, planning tools & walkthroughs' },
{ id: 'analytics', label: 'Analytics', colorVar: '--type-analytics', desc: 'Power BI & reporting' },
{ id: 'prompt', label: 'Prompts', colorVar: '--type-prompt', desc: 'Copilot prompt templates' },
{ id: 'skill', label: 'Skills', colorVar: '--type-skill', desc: 'Interactive SME skills' }
Expand Down Expand Up @@ -1652,13 +1652,15 @@ <h3>Related resources</h3>
return t && t.colorVar ? `var(${t.colorVar}-bg)` : 'var(--surface-hover)';
};

const formatArtifact = (artifact) => {
const formatArtifact = (artifact, resource) => {
if (artifact === 'interactive') {
return resource && resource.interactiveKind === 'guide' ? 'Interactive guide' : 'Interactive tool';
}
const map = {
'pbix': '.pbix · Power BI',
'ps1': '.ps1 · PowerShell',
'pptx': '.pptx · Slides',
'md': '.md · Doc',
'interactive': 'interactive · Web tool',
'bundle': 'bundle · Agent',
'declarative': 'declarative · Agent'
};
Expand Down Expand Up @@ -2176,8 +2178,8 @@ <h2 class="card-title">
</span>` : ''}
</div>
<div class="card-artifact-container">
<div class="card-artifact" aria-label="Format: ${data.artifact}">
${star} ${formatArtifact(data.artifact)}
<div class="card-artifact" aria-label="Format: ${formatArtifact(data.artifact, data)}">
${star} ${formatArtifact(data.artifact, data)}
</div>
<div class="compact-date">${formatDate(data.updated)}</div>
<div class="card-link-out">View details <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"/></svg></div>
Expand Down Expand Up @@ -2443,7 +2445,7 @@ <h3>Browse all 54 scripts &rarr;</h3>

// Detail content
document.getElementById('detailDesc').textContent = resource.description;
const fmt = formatArtifact(resource.artifact);
const fmt = formatArtifact(resource.artifact, resource);
const fallbackWhat = `This ${typeDef.label.toLowerCase()} is part of the ${resource.subcategory} category. It is provided as ${fmt} to assist with FastTrack deployments.`;
renderMarkdownish(document.getElementById('detailWhatItIs'), resource.whatItIs || fallbackWhat);

Expand Down
8 changes: 8 additions & 0 deletions tools/catalog-build/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const excludedSegments = new Set(['archive', '_sample_templates', 'samples']);
const allowedTypes = new Set(['script', 'agent', 'strategy', 'analytics', 'prompt', 'skill']);
const allowedFormats = new Set(['ps1', 'bundle', 'declarative', 'interactive', 'pptx', 'pbix', 'md']);
const allowedStatuses = new Set(['active', 'preview', 'archived']);
const allowedInteractiveKinds = new Set(['guide', 'tool']);
const semverPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
const datePattern = /^\d{4}-\d{2}-\d{2}$/;

Expand Down Expand Up @@ -133,6 +134,12 @@ function validate(data, file) {
if (data.format !== undefined && !allowedFormats.has(data.format)) add('format', `must be one of: ${[...allowedFormats].join(', ')}`);
if (data.featured !== undefined && typeof data.featured !== 'boolean') add('featured', 'must be true or false');
if (data.status !== undefined && !allowedStatuses.has(data.status)) add('status', `must be one of: ${[...allowedStatuses].join(', ')}`);
if (data.interactiveKind !== undefined && !allowedInteractiveKinds.has(data.interactiveKind)) {
add('interactiveKind', `must be one of: ${[...allowedInteractiveKinds].join(', ')}`);
}
if (data.interactiveKind !== undefined && data.format !== 'interactive') {
add('interactiveKind', 'is only allowed when format is interactive');
}
if (data.whatItIs !== undefined && !isNonEmptyString(data.whatItIs)) add('whatItIs', 'must be a non-empty string');
if (data.whyUseIt !== undefined && !isStringList(data.whyUseIt)) add('whyUseIt', 'must be a non-empty list of strings');
if (data.howToUse !== undefined && !isNonEmptyString(data.howToUse)) add('howToUse', 'must be a non-empty Markdown string');
Expand Down Expand Up @@ -177,6 +184,7 @@ function createResource(data, file, updated) {
format: data.format ?? 'md',
featured: data.featured ?? false,
status: data.status ?? 'active',
interactiveKind: data.interactiveKind,
author: data.author,
version: data.version,
published: data.published,
Expand Down