Public Access
Initialize meeting assistant
This commit is contained in:
+482
@@ -0,0 +1,482 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from `dotnet new gitignore`
|
||||
|
||||
# dotenv files
|
||||
.env
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# Tye
|
||||
.tye/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
# but not Directory.Build.rsp, as it configures directory-level build defaults
|
||||
!Directory.Build.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.tlog
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
|
||||
*.vbp
|
||||
|
||||
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
|
||||
*.dsw
|
||||
*.dsp
|
||||
|
||||
# Visual Studio 6 technical files
|
||||
*.ncb
|
||||
*.aps
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# Visual Studio History (VSHistory) files
|
||||
.vshistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
# VS Code files for those working on multiple tools
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
*.code-workspace
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Windows Installer files from build outputs
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# JetBrains Rider
|
||||
*.sln.iml
|
||||
.idea/
|
||||
|
||||
##
|
||||
## Visual studio for Mac
|
||||
##
|
||||
|
||||
|
||||
# globs
|
||||
Makefile.in
|
||||
*.userprefs
|
||||
*.usertasks
|
||||
config.make
|
||||
config.status
|
||||
aclocal.m4
|
||||
install-sh
|
||||
autom4te.cache/
|
||||
*.tar.gz
|
||||
tarballs/
|
||||
test-results/
|
||||
|
||||
# content below from: https://github.com/github/gitignore/blob/main/Global/macOS.gitignore
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
# content below from: https://github.com/github/gitignore/blob/main/Global/Windows.gitignore
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
# Vim temporary swap files
|
||||
*.swp
|
||||
@@ -0,0 +1,78 @@
|
||||
# Repository Instructions
|
||||
|
||||
## Project Orientation
|
||||
|
||||
Meeting Assistant is a spec-driven .NET service for capturing, transcribing, summarizing, and enriching meetings without depending on a specific meeting platform API. When starting work in this repository, read `README.md` first for the current runtime architecture, then read the OpenSpec documents so you understand the current scope and capabilities before changing code:
|
||||
|
||||
- `README.md`
|
||||
- `openspec/config.yaml`
|
||||
- all specs under `openspec/specs`
|
||||
- all active change specs under `openspec/changes/*/specs`
|
||||
- active change `proposal.md`, `design.md`, and `tasks.md` only when more context is needed
|
||||
|
||||
Do not treat implementation code as the only source of truth. Requirements belong in OpenSpec changes.
|
||||
|
||||
## Start Work Checklist
|
||||
|
||||
Before editing specs or code, do the following:
|
||||
|
||||
1. Run `git status --short` and note existing user or agent changes.
|
||||
2. Identify whether there is an active OpenSpec change relevant to the request.
|
||||
3. Read the relevant specs before reading implementation details.
|
||||
4. Decide whether the request belongs to an existing change or needs a new change.
|
||||
5. State that decision and the reason before editing requirements or code.
|
||||
|
||||
## Development Cycle
|
||||
|
||||
Use the `$tdd` skill for feature work and bug fixes. Work in small vertical slices:
|
||||
|
||||
1. Add or update the relevant OpenSpec requirement/scenario.
|
||||
2. Add one failing behavior test through the public interface.
|
||||
3. Implement the minimum code needed to pass that test.
|
||||
4. Repeat for the next behavior.
|
||||
5. Refactor only after tests are green.
|
||||
6. Run the relevant tests and `openspec validate <change-id> --strict`.
|
||||
|
||||
Tests should describe observable behavior and avoid coupling to implementation details.
|
||||
|
||||
For feature/spec work, keep the active OpenSpec `tasks.md` current enough that another agent can resume the work. Add or update task entries for meaningful behavior changes, but skip task churn for tiny documentation, config, or mechanical maintenance edits.
|
||||
|
||||
## OpenSpec Change Policy
|
||||
|
||||
If the user explicitly asks to create a new change, create one.
|
||||
|
||||
If the user does not explicitly say whether to create a new change, decide from context:
|
||||
|
||||
- If an open change is already being worked in the current session and the user's request concerns that same behavior, treat it as part of that change.
|
||||
- If there is no open change, create a new OpenSpec change for behavior or requirement changes unless the request is very small or not a spec change.
|
||||
- Documentation-only edits, deployment variable fixes, build plumbing, and similarly narrow maintenance work usually do not need a new spec change.
|
||||
- Bug fixes should still start with a failing test. The required behavior should be added as an addendum to the original spec/change that defined the intended behavior, rather than as an unrelated new requirement.
|
||||
|
||||
When in doubt, make the reasoning explicit before editing specs or code.
|
||||
|
||||
## Change Completion
|
||||
|
||||
A spec/change is not considered done merely because code is merged, tests pass, or `openspec validate` succeeds. A change is ready to be accepted or archived only after the agent has verified the intended behavior through the most direct operational surface available.
|
||||
|
||||
For Meeting Assistant, prefer verification through:
|
||||
|
||||
- local application endpoints
|
||||
- generated or updated meeting note files
|
||||
- transcription and summarization behavior tests
|
||||
- application logs proving the end-to-end flow
|
||||
|
||||
If production or end-to-end verification is not possible, state exactly why and what lower-level verification was performed instead.
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
Keep source and deployment ownership separate:
|
||||
|
||||
- `Manuel/meeting-assistant` owns application source, tests, build configuration, container image publishing, and OpenSpec source changes.
|
||||
- A future deployment repository, if created, should own Docker Compose, Traefik labels, secrets/variables, networks, and live image tag selection.
|
||||
|
||||
Before finishing code changes, run the narrowest useful test command first. For broader changes, run:
|
||||
|
||||
```powershell
|
||||
dotnet test MeetingAssistant.slnx
|
||||
openspec validate <change-id> --strict
|
||||
```
|
||||
@@ -0,0 +1,30 @@
|
||||
using System.Net;
|
||||
using System.Net.Http.Json;
|
||||
using Microsoft.AspNetCore.Mvc.Testing;
|
||||
|
||||
namespace MeetingAssistant.Tests;
|
||||
|
||||
public sealed class HealthEndpointTests : IClassFixture<WebApplicationFactory<Program>>
|
||||
{
|
||||
private readonly WebApplicationFactory<Program> factory;
|
||||
|
||||
public HealthEndpointTests(WebApplicationFactory<Program> factory)
|
||||
{
|
||||
this.factory = factory;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task HealthEndpointReportsServiceStatus()
|
||||
{
|
||||
using var client = factory.CreateClient();
|
||||
|
||||
using var response = await client.GetAsync("/health");
|
||||
var body = await response.Content.ReadFromJsonAsync<HealthResponse>();
|
||||
|
||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||
Assert.Equal("meeting-assistant", body?.Service);
|
||||
Assert.Equal("ok", body?.Status);
|
||||
}
|
||||
|
||||
private sealed record HealthResponse(string Service, string Status);
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.4" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.8" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
|
||||
<PackageReference Include="xunit" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Using Include="Xunit" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\MeetingAssistant\MeetingAssistant.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,4 @@
|
||||
<Solution>
|
||||
<Project Path="MeetingAssistant.Tests/MeetingAssistant.Tests.csproj" />
|
||||
<Project Path="MeetingAssistant/MeetingAssistant.csproj" />
|
||||
</Solution>
|
||||
@@ -0,0 +1,9 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,12 @@
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
var app = builder.Build();
|
||||
|
||||
app.MapGet("/health", () => Results.Ok(new
|
||||
{
|
||||
service = "meeting-assistant",
|
||||
status = "ok"
|
||||
}));
|
||||
|
||||
app.Run();
|
||||
|
||||
public partial class Program;
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:5090",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "https://localhost:7206;http://localhost:5090",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
# Meeting Assistant
|
||||
|
||||
Meeting Assistant is a .NET 10 server application for capturing and enriching meetings.
|
||||
|
||||
Its core purpose is to work with any kind of meeting, including in-person meetings. Integrations with platforms such as Teams, Zoom, or similar tools may augment the experience later, but the system must not depend on those product APIs for its primary meeting flow.
|
||||
|
||||
The application is intended to:
|
||||
|
||||
- create an Obsidian markdown note before transcription starts
|
||||
- keep meeting metadata, user notes, detected context, and generated output in that note
|
||||
- transcribe meetings with speaker attribution
|
||||
- generate summaries, decisions, and next steps
|
||||
- build and maintain a project knowledge base from meetings and future context sources
|
||||
- use Microsoft Agent Framework-based agents to reason over meeting and project context
|
||||
- give agents tools for project lookup, keyword lookup, retrieval-augmented generation, and controlled project file updates when the user or project context allows it
|
||||
|
||||
## Repository Status
|
||||
|
||||
This repository currently contains the initial .NET 10 application skeleton, a health endpoint, and the first OpenSpec change for version 1.
|
||||
|
||||
## Local Development
|
||||
|
||||
Restore, build, and test:
|
||||
|
||||
```powershell
|
||||
dotnet restore MeetingAssistant.slnx
|
||||
dotnet build MeetingAssistant.slnx
|
||||
dotnet test MeetingAssistant.slnx
|
||||
```
|
||||
|
||||
Run the server:
|
||||
|
||||
```powershell
|
||||
dotnet run --project MeetingAssistant
|
||||
```
|
||||
|
||||
The initial health endpoint is:
|
||||
|
||||
```text
|
||||
GET /health
|
||||
```
|
||||
|
||||
## Spec Workflow
|
||||
|
||||
This repository is OpenSpec-driven. Before changing behavior, read:
|
||||
|
||||
1. `README.md`
|
||||
2. `openspec/config.yaml`
|
||||
3. existing specs in `openspec/specs`
|
||||
4. active change specs in `openspec/changes/*/specs`
|
||||
|
||||
The initial active change is:
|
||||
|
||||
```text
|
||||
openspec/changes/define-meeting-assistant-v1
|
||||
```
|
||||
|
||||
Validate it with:
|
||||
|
||||
```powershell
|
||||
openspec validate define-meeting-assistant-v1 --strict
|
||||
```
|
||||
@@ -0,0 +1,58 @@
|
||||
## Context
|
||||
|
||||
Meeting Assistant is a local/server-side .NET 10 application that helps capture and process meetings. It should work for any meeting format, including in-person conversations, and should not require direct APIs from meeting products such as Teams or Zoom.
|
||||
|
||||
The central artifact is an Obsidian markdown note created before transcription begins. The user can add attendees, project context, meeting purpose, and live notes while the meeting is happening. Meeting Assistant can add discovered context to the same note, then later append or link summaries, next steps, and knowledge base updates.
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:**
|
||||
|
||||
- Establish a .NET 10 application skeleton and OpenSpec workflow.
|
||||
- Model a platform-independent meeting session flow.
|
||||
- Create a meeting note before transcription starts.
|
||||
- Preserve user-authored notes as first-class input to summarization.
|
||||
- Transcribe meeting audio with speaker attribution.
|
||||
- Generate summaries, decisions, and next steps.
|
||||
- Maintain project knowledge from meeting output and additional future sources.
|
||||
- Let agents retrieve project context and keyword context.
|
||||
- Allow guarded project file updates when the project context or user explicitly permits them.
|
||||
|
||||
**Non-Goals:**
|
||||
|
||||
- Build a Teams, Zoom, or calendar-specific integration in version 1.
|
||||
- Require cloud transcription APIs.
|
||||
- Define the final Obsidian vault path or note template completely in this first change.
|
||||
- Implement unrestricted autonomous file edits.
|
||||
|
||||
## Decisions
|
||||
|
||||
1. Build the source application as ASP.NET Core on .NET 10.
|
||||
- Rationale: It matches the requested runtime and keeps the application service-oriented.
|
||||
|
||||
2. Make the Obsidian markdown note the session anchor.
|
||||
- Rationale: The user can enrich the meeting context before and during transcription, and agents can work from a durable human-readable artifact.
|
||||
|
||||
3. Treat meeting-platform APIs as optional augmentation.
|
||||
- Rationale: The assistant must be usable for in-person meetings and for platforms where no integration is available or desired.
|
||||
|
||||
4. Keep project knowledge as a generic capability.
|
||||
- Rationale: Meeting-derived knowledge should later combine with other sources without coupling the design to transcripts only.
|
||||
|
||||
5. Require explicit guardrails for project file mutation.
|
||||
- Rationale: Agents may update project files, but only when the project is known and the user or project context permits edits.
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- [Risk] Speaker attribution quality depends on the selected transcription pipeline. -> Mitigation: keep attribution requirements observable and provider-independent.
|
||||
- [Risk] The Obsidian note may become too dense. -> Mitigation: separate metadata, user notes, assistant context, transcript references, and generated outputs into clear sections.
|
||||
- [Risk] Agent file updates could affect the wrong project. -> Mitigation: require explicit project binding before mutation tools are available.
|
||||
- [Risk] Retrieval can surface stale or irrelevant project context. -> Mitigation: include source references and update timestamps in retrieved context.
|
||||
|
||||
## Open Questions
|
||||
|
||||
- What exact Obsidian vault folder should hold meeting notes?
|
||||
- What metadata fields are required before transcription can start?
|
||||
- Which transcription provider should be used first?
|
||||
- Which storage backend should hold embeddings and project knowledge?
|
||||
- What approval model should govern agent project file edits?
|
||||
@@ -0,0 +1,29 @@
|
||||
## Why
|
||||
|
||||
Meeting Assistant should provide a meeting capture workflow that is not tied to a specific online meeting provider. The first version needs to establish the platform-independent core: meeting notes, metadata capture, transcription with speaker attribution, generated summaries and next steps, and a project knowledge base that agents can use for later retrieval and controlled project work.
|
||||
|
||||
## What Changes
|
||||
|
||||
- Create Meeting Assistant as a .NET 10 server application in `Manuel/meeting-assistant`.
|
||||
- Establish OpenSpec as the source of truth for behavior changes.
|
||||
- Define the version 1 meeting flow around Obsidian markdown notes created before transcription starts.
|
||||
- Require the core flow to support in-person meetings and not depend on Teams, Zoom, or similar APIs.
|
||||
- Add requirements for speaker-attributed transcription, summaries, decisions, and next steps.
|
||||
- Define project context capture and retrieval as first-class capabilities.
|
||||
- Define a guarded agent tool model for project lookup and controlled project file changes.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `meeting-session`: creation and lifecycle of meeting notes and metadata.
|
||||
- `meeting-transcription`: platform-independent transcription with speaker attribution.
|
||||
- `meeting-summary`: generated summaries, decisions, and next steps.
|
||||
- `project-knowledge`: project context, retrieval, and knowledge base updates from meetings.
|
||||
- `agent-project-tools`: agent tools for lookup, retrieval, and controlled project file updates.
|
||||
|
||||
## Impact
|
||||
|
||||
- New .NET 10 solution, service project, tests, README, and OpenSpec structure.
|
||||
- Version 1 behavior is documented before feature implementation.
|
||||
- Future platform integrations remain optional augmentations instead of hard dependencies.
|
||||
@@ -0,0 +1,19 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Agents can use project context tools
|
||||
Meeting Assistant SHALL expose tools that allow agents to look up project information, retrieve keyword-relevant context, and inspect meeting-derived knowledge.
|
||||
|
||||
#### Scenario: Agent looks up meeting project context
|
||||
- **WHEN** a meeting note identifies a project
|
||||
- **THEN** the agent can retrieve relevant project context through Meeting Assistant tools
|
||||
|
||||
### Requirement: Agents can only mutate project files with explicit project binding
|
||||
Meeting Assistant SHALL only expose project file mutation tools when the target project is known and mutation is permitted by user instruction or project context.
|
||||
|
||||
#### Scenario: Project mutation is permitted
|
||||
- **WHEN** the user or project context permits file updates for a known project
|
||||
- **THEN** the agent can use controlled tools to change files in that project
|
||||
|
||||
#### Scenario: Project mutation is not permitted
|
||||
- **WHEN** the target project is missing or mutation permission is absent
|
||||
- **THEN** Meeting Assistant does not expose project file mutation tools for that request
|
||||
@@ -0,0 +1,30 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Meeting Assistant creates a note before transcription
|
||||
Meeting Assistant SHALL create an Obsidian markdown note for a meeting session before transcription starts.
|
||||
|
||||
The note SHALL be the durable anchor for meeting metadata, user notes, assistant-discovered context, transcript references, summaries, decisions, and next steps.
|
||||
|
||||
#### Scenario: Session starts
|
||||
- **WHEN** the user starts a new meeting session
|
||||
- **THEN** Meeting Assistant creates a markdown note in the configured meetings folder before starting transcription
|
||||
|
||||
#### Scenario: User adds context before transcription
|
||||
- **WHEN** the note exists before transcription starts
|
||||
- **THEN** the user can add attendees, project context, meeting purpose, and other notes to that file
|
||||
|
||||
### Requirement: Meeting notes preserve user-authored content
|
||||
Meeting Assistant SHALL preserve user-authored meeting notes and include them as input when generating summaries, decisions, and next steps.
|
||||
|
||||
#### Scenario: User writes notes during the meeting
|
||||
- **WHEN** the user updates the meeting note while the meeting is active
|
||||
- **THEN** Meeting Assistant keeps that content and incorporates it into generated meeting outputs
|
||||
|
||||
### Requirement: Meeting sessions are platform independent
|
||||
Meeting Assistant SHALL support meeting sessions that do not originate from Teams, Zoom, or any other meeting software API.
|
||||
|
||||
Meeting software integrations MAY augment the meeting experience, but they SHALL NOT be required for the primary meeting capture, transcription, or summary flow.
|
||||
|
||||
#### Scenario: In-person meeting is captured
|
||||
- **WHEN** the user starts transcription for an in-person meeting
|
||||
- **THEN** Meeting Assistant captures and processes the meeting without requiring a meeting platform integration
|
||||
@@ -0,0 +1,12 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Meeting Assistant generates meeting outputs
|
||||
Meeting Assistant SHALL generate a summary, decisions, and next steps from the meeting transcript, metadata, user notes, and assistant-discovered context.
|
||||
|
||||
#### Scenario: Meeting processing completes
|
||||
- **WHEN** transcription and context collection have completed
|
||||
- **THEN** Meeting Assistant generates a summary, decisions, and next steps for the meeting note
|
||||
|
||||
#### Scenario: User notes conflict with transcript interpretation
|
||||
- **WHEN** user-authored notes provide context that changes the interpretation of the transcript
|
||||
- **THEN** Meeting Assistant considers those notes during summary and next-step generation
|
||||
@@ -0,0 +1,14 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Meeting Assistant transcribes meetings with speaker attribution
|
||||
Meeting Assistant SHALL transcribe meeting audio and associate transcript segments with speakers when speaker attribution is available.
|
||||
|
||||
The transcription contract SHALL remain independent of the meeting source so that local audio, in-person meetings, and future meeting-platform integrations can use the same downstream processing.
|
||||
|
||||
#### Scenario: Speaker-attributed transcript is produced
|
||||
- **WHEN** meeting audio is transcribed and speaker attribution is available
|
||||
- **THEN** the transcript contains ordered speaker-attributed segments
|
||||
|
||||
#### Scenario: Speaker attribution is unavailable
|
||||
- **WHEN** meeting audio is transcribed but speaker attribution is unavailable
|
||||
- **THEN** Meeting Assistant keeps the transcript and marks speaker identity as unknown rather than discarding the meeting
|
||||
@@ -0,0 +1,14 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Meeting Assistant maintains project knowledge
|
||||
Meeting Assistant SHALL maintain project knowledge based on meeting content and future generic information sources.
|
||||
|
||||
Project knowledge SHALL support retrieval by project context and relevant keywords.
|
||||
|
||||
#### Scenario: Meeting has project context
|
||||
- **WHEN** a meeting note identifies a project
|
||||
- **THEN** Meeting Assistant can associate transcript-derived and summary-derived knowledge with that project
|
||||
|
||||
#### Scenario: Agent retrieves project context
|
||||
- **WHEN** an agent needs context for a meeting or follow-up task
|
||||
- **THEN** Meeting Assistant can retrieve relevant project knowledge and source references
|
||||
@@ -0,0 +1,38 @@
|
||||
## 1. Repository Setup
|
||||
|
||||
- [x] 1.1 Create the Gitea repository and clone it to `C:\Manuel\meeting-assistant`.
|
||||
- [x] 1.2 Add .NET 10 solution, service project, and test project.
|
||||
- [x] 1.3 Add repository README and agent instructions.
|
||||
- [x] 1.4 Add OpenSpec config and the version 1 proposal/design/specs.
|
||||
|
||||
## 2. Meeting Session Notes
|
||||
|
||||
- [ ] 2.1 Define the Obsidian meeting note location and naming convention.
|
||||
- [ ] 2.2 Add a meeting note template with metadata, attendees, purpose, project context, user notes, assistant context, transcript, summary, decisions, and next steps.
|
||||
- [ ] 2.3 Implement meeting session creation that writes the initial note before transcription starts.
|
||||
- [ ] 2.4 Add tests proving user-authored notes remain preserved and included in later processing.
|
||||
|
||||
## 3. Transcription
|
||||
|
||||
- [ ] 3.1 Select the first transcription provider.
|
||||
- [ ] 3.2 Add provider-independent transcription contracts.
|
||||
- [ ] 3.3 Implement transcription ingestion for platform-independent audio input.
|
||||
- [ ] 3.4 Add speaker attribution handling and tests.
|
||||
|
||||
## 4. Summary and Next Steps
|
||||
|
||||
- [ ] 4.1 Define the summary, decisions, and next steps output structure.
|
||||
- [ ] 4.2 Implement summary generation from transcript plus user notes.
|
||||
- [ ] 4.3 Append or link generated outputs from the meeting note.
|
||||
|
||||
## 5. Project Knowledge and Agent Tools
|
||||
|
||||
- [ ] 5.1 Define project binding metadata for meetings.
|
||||
- [ ] 5.2 Define project knowledge storage and retrieval requirements.
|
||||
- [ ] 5.3 Add agent tools for project lookup and keyword lookup.
|
||||
- [ ] 5.4 Define and implement guardrails for project file mutation tools.
|
||||
|
||||
## 6. Verification
|
||||
|
||||
- [x] 6.1 Run `dotnet test MeetingAssistant.slnx`.
|
||||
- [x] 6.2 Run `openspec validate define-meeting-assistant-v1 --strict`.
|
||||
@@ -0,0 +1,10 @@
|
||||
schema: spec-driven
|
||||
|
||||
context: |
|
||||
Meeting Assistant is Manuel's meeting capture and knowledge system.
|
||||
Tech stack: .NET 10 for source services.
|
||||
Source repository: Manuel/meeting-assistant.
|
||||
The primary meeting flow must work without depending on Teams, Zoom, or any other meeting platform API.
|
||||
The application creates and maintains Obsidian markdown meeting notes before, during, and after transcription.
|
||||
Meeting notes hold metadata, user notes, discovered context, transcript references, summaries, decisions, and next steps.
|
||||
The system should transcribe meetings with speaker attribution and use Microsoft Agent Framework-based agents for summarization, project lookup, retrieval, and controlled project file updates.
|
||||
Reference in New Issue
Block a user