Skip to content

feat: add DA skill support#15712

Open
qfai wants to merge 32 commits intodevfrom
feature/agent-skills-support
Open

feat: add DA skill support#15712
qfai wants to merge 32 commits intodevfrom
feature/agent-skills-support

Conversation

@qfai
Copy link
Copy Markdown
Contributor

@qfai qfai commented Apr 15, 2026

Add skill support for declarative agents.

Original PR from sebastienlevert/microsoft-365-agents-toolkit:feature/agent-skills-support, cleaned up unrelated changes:

  • Reverted accidental removal of Files\ field in package.json
  • Reverted \checkCopilotAccess.title\ key rename in package.nls.json
  • Reset all localized NLS files to dev baseline (had bulk translation changes and merge conflict)

work item

sebastienlevert and others added 26 commits March 26, 2026 12:29
Add end-to-end support for agent skills in M365 Agents Toolkit:

- Manifest wrapper: AgentSkillElement, CRUD operations (add/remove/has/get),
  max 10 skills, x-agent_skills extension property with agent_skills fallback
- Packaging: bundle skill directories in createAppPackage, validate path
  boundary and SKILL.md existence
- Validation: skill folder/SKILL.md/frontmatter validation, error aggregation,
  telemetry, log formatting for CLI and VS Code
- FxCore.addSkill(): new/existing skill flows, SKILL.md template generation,
  path normalization, confirmation dialog
- Question flow: skill name, description, expose-to-copilot questions
- CLI: atk add skill command with options and telemetry
- VS Code: handler, command registration, telemetry events
- Localization: all English strings for prompts and messages
- Tests: 51 new unit tests across wrapper, packaging, validation, and command

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ore conflict

- Rename checkCopilotAccess.title to checkCopilotAccess in all 16 nls files
  to match the %teamstoolkit.commands.checkCopilotAccess% reference in package.json
- Remove redundant 'files' property from package.json since .vscodeignore
  is used for vsce packaging (newer vsce rejects having both)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add TreeViewCommand for addSkill below Add Action in the Development pane
- Add fx-extension.addSkill command entry in package.json with enablement
- Add localization keys (title, description, running, blockTooltip) across all 16 locales
- Remove diagnostic logging from localizeUtils.ts and treeViewCommand.ts
- Skill item shows only for declarative agent projects (isDeclarativeCopilotApp)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Replace ConfirmQuestion with SingleSelectQuestion (yes/no options)
- Update FxCore.addSkill to compare string 'yes' instead of boolean
- Add localization keys for yes/no options
- Update CLI option type from boolean to string
- Update tests accordingly - all 11 passing

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The addSkill flow had a showMessage() confirm dialog before proceeding,
which interrupted the quickpick-only UX. Remove it so the flow stays
entirely within the VS Code quickpick area.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds back the warn-level showMessage confirmation (matching addPlugin
pattern) that asks users to confirm before modifying files. This was
accidentally removed when the pre-action confirmation was stripped.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Allow uppercase letters in skill names (not just lowercase)
- Validate for duplicate skill names (check if folder already exists)
- Rename CLI flags: --name, --description, --expose-to-copilot, --from
- Update validation error messages and placeholder text

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
When adding an existing skill via --from, the name and description are
already in the SKILL.md file, so they shouldn't be required. Skip the
name/description prompts in the question flow when --from is provided.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
When importing an existing skill via --from:
- Validate folder name uses only letters, numbers, and hyphens
- Read SKILL.md frontmatter and verify the name matches the folder name
- Error out with clear messages if either check fails

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add AgentSkillsEnabled feature flag (default: false) following the
established pattern (like EmbeddedKnowledge before cleanup). Gates:
- VS Code tree view item (treeViewManager.ts)
- VS Code command enablement (package.json)
- VS Code context (extension.ts setContext)
- CLI 'atk add skill' command (add.ts)

Set TEAMSFX_AGENT_SKILLS=true to enable the feature.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add re-export of AgentSkillElement interface so it can be imported by
consumers and test files. Previously the type was imported from
generated-types and used internally but not re-exported, causing
TS2459 errors in the manifest test suite.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Use path.resolve(projectPath, teamsManifestPath) for manifest file
  resolution to handle both absolute and relative paths correctly
- Revert localized package.nls.*.json files (pipeline handles translations)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Update treeViewManager test to expect 9 items (Add Skill added)
- Apply prettier formatting to CopilotGptManifestUtils and test files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Merge upstream/dev to stay current
- Fix CopilotGptManifestUtils.ts formatting (CI lint-pr.sh)
- Add 5 new unit tests for addSkill coverage gaps:
  - copilotExtensions manifest format path
  - Skill outside appPackage validation
  - SKILL.md without name frontmatter
  - showMessage error handling
  - DA manifest with empty file property

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add 7 tests for addSkillQuestionNode (pattern validation, duplicates, conditions)
- Add 4 tests for logValidationErrors with skill errors (VSC + CLI)
- Add 1 test for validate driver with non-empty skillValidationResult
- Remove 3 unused NLS keys (expose.description, from.title, from.placeholder)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Test VSCode View Agent Manifest button triggers openFile
- Test CLI platform success message path
- Test logValidationErrors with undefined skillValidationResult (covers ?? [] partials)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Skill folder paths were resolved relative to the DA manifest file
location, which points to .generated/ during packaging. Since skill
folders don't support env var substitution, they only exist in the
original appPackage/ directory.

Resolve skill folders relative to appDirectory instead, matching the
pattern used by embedded knowledge files.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add ability to import skills from .zip files via UI (source type picker +
file dialog) and CLI (--from flag with .zip path). Includes:

- New SkillSourceType and SkillFromZipFile questions
- importSkillFromZip method with security validation (path traversal,
  zip bomb protection), layout detection, and atomic extraction
- NLS strings for UI labels and error messages
- 8 new tests covering zip import happy path and error cases

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Restore 'files' field in package.json (was accidentally removed)
- Restore 'checkCopilotAccess.title' key name in package.nls.json

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
These files had unrelated bulk translation changes and a merge conflict.
Skill-related translations should be added separately.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
qfai and others added 2 commits April 16, 2026 16:08
AdmZip.writeZip() normalizes ../../../etc/passwd to etc/passwd on disk.
Use fs.writeFile with toBuffer() to preserve raw traversal entry names.
Also remove duplicate validateInputs stub (already in beforeEach).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…S import

AdmZip.addFile() normalizes '../../../etc/passwd' to 'etc/passwd' at creation
time, so both writeZip() and toBuffer() produce a normalized entry. A real
malicious zip crafted externally preserves the raw traversal path. Construct
the ZIP binary manually to verify our entryName.includes('..') check works.

Also remove unused TOOLS import from test file.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 16, 2026

Codecov Report

❌ Patch coverage is 93.50282% with 23 lines in your changes missing coverage. Please review.
✅ Project coverage is 93.00%. Comparing base (0a63a75) to head (974ce8c).
⚠️ Report is 10 commits behind head on dev.

Files with missing lines Patch % Lines
packages/fx-core/src/core/FxCore.ts 94.77% 7 Missing and 1 partial ⚠️
packages/cli/src/commands/models/addSkill.ts 54.54% 5 Missing ⚠️
...vscode-extension/src/handlers/lifecycleHandlers.ts 33.33% 4 Missing ⚠️
...ckages/vscode-extension/src/handlers/sharedOpts.ts 0.00% 2 Missing ⚠️
packages/cli/src/commands/models/add.ts 75.00% 0 Missing and 1 partial ⚠️
...t/driver/teamsApp/utils/CopilotGptManifestUtils.ts 98.57% 0 Missing and 1 partial ⚠️
.../fx-core/src/component/driver/teamsApp/validate.ts 88.88% 0 Missing and 1 partial ⚠️
...ges/vscode-extension/src/telemetry/extTelemetry.ts 0.00% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff            @@
##              dev   #15712    +/-   ##
========================================
  Coverage   92.99%   93.00%            
========================================
  Files         623      625     +2     
  Lines       38539    38892   +353     
  Branches     7030     7265   +235     
========================================
+ Hits        35840    36172   +332     
- Misses       1959     1977    +18     
- Partials      740      743     +3     
Files with missing lines Coverage Δ
packages/cli/src/telemetry/cliTelemetryEvents.ts 100.00% <100.00%> (ø)
packages/fx-core/src/common/featureFlags.ts 100.00% <100.00%> (ø)
.../src/component/driver/teamsApp/createAppPackage.ts 97.80% <100.00%> (+0.09%) ⬆️
...e/src/component/driver/teamsApp/utils/telemetry.ts 100.00% <100.00%> (ø)
...kages/fx-core/src/component/utils/fileOperation.ts 96.42% <100.00%> (+0.13%) ⬆️
packages/fx-core/src/question/index.ts 97.22% <100.00%> (+0.07%) ⬆️
packages/fx-core/src/question/inputs/index.ts 100.00% <100.00%> (ø)
...es/fx-core/src/question/options/AddSkillOptions.ts 100.00% <100.00%> (ø)
packages/fx-core/src/question/options/index.ts 100.00% <100.00%> (ø)
packages/fx-core/src/question/other.ts 94.90% <100.00%> (+0.32%) ⬆️
... and 14 more

... and 5 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

…test.ts

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
VS Code only populates quickPick.selectedItems on explicit mouse clicks.
Pressing Enter fires onDidAccept with selectedItems=[] while activeItems
holds the keyboard-focused item. Add an activeItems fallback so Enter key
navigation works correctly when selecting a manifest/file in the singleFile
QuickPick (e.g. the Teams App manifest step in 'Add Skill').

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@sebastienlevert
Copy link
Copy Markdown
Contributor

@qfai My branch was updated with new requirements. Please refresh this one with the latest.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants