AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
Définir les contrats pour créer des plugins GlpiNg
Translation pending
AI summary · website and README
Developer toolsC#GitHub @GlpiNg-frOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Contrats pour écrire un plugin GlpiNg. Dans MonPlugin.csproj, empêchez la copie des assemblies fournies par l'hôte (sinon deux copies des contrats coexisteraient) : Point d'entrée (une seule classe publique implémentant IGlpiNgPlugin) : L'hôte charge plugins/ / .dll au démarrage (la racine du stockage est data/ par défaut) : le nom du dossier doit être celui de l'assembly. Redémarrez GlpiNg après installation.Read the full README ↗
Contrats pour écrire un plugin GlpiNg.
dotnet new razorclasslib -n MonPlugin
cd MonPlugin
dotnet add package GlpiNg.Plugins.Sdk
Dans MonPlugin.csproj, empêchez la copie des assemblies fournies par l'hôte (sinon deux
copies des contrats coexisteraient) :
<PackageReference Include="GlpiNg.Plugins.Sdk" Version="0.1.0" ExcludeAssets="runtime" />
Point d'entrée (une seule classe publique implémentant IGlpiNgPlugin) :
using GlpiNg.Modules.Abstractions.Menu;
using GlpiNg.Plugins;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
public sealed class MonPlugin : IGlpiNgPlugin
{
// Intervalle de versions de GlpiNg sur lequel ce plugin fonctionne. Les deux bornes sont
// incluses et facultatives (null = pas de borne). Hors intervalle, l'hôte n'appelle pas
// ConfigureServices : le plugin n'est pas chargé, et la raison s'affiche dans
// Configuration > Système.
public string? MinimumHostVersion => "1.0.0";
public string? MaximumHostVersion => null;
public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
services.AddSingleton<IMenuProvider, MonMenu>();
}
}
public sealed class MonMenu : IMenuProvider
{
public IReadOnlyList<MenuGroup> GetMenuGroups() =>
[
new("outils", "ti-briefcase", "Outils", [new("Mon plugin", "/plugins/mon-plugin", "ti-puzzle")]),
];
}
Une page (Pages/Index.razor) :
@page "/plugins/mon-plugin"
<h1>Bonjour depuis MonPlugin</h1>
dotnet publish -c Release -o <racine du stockage>/plugins/MonPlugin
L'hôte charge plugins/<Nom>/<Nom>.dll au démarrage (la racine du stockage est data/ par
défaut) : le nom du dossier doit être celui de l'assembly. Redémarrez GlpiNg après installation.
Un dossier wwwroot/ à la racine du plugin est publié à côté de sa DLL (les cibles MSBuild du
paquet s'en chargent) et servi sous /_content/{NomDeLAssembly}/ — le même chemin qu'ASP.NET Core
donne aux bibliothèques de classes Razor, pour qu'un plugin qui en deviendrait une garde ses liens.
<link rel="stylesheet" href="_content/MonPlugin/css/mon-plugin.css" />
Seul wwwroot/ est exposé : la DLL du plugin et ses dépendances, au niveau au-dessus, ne sont pas
accessibles par une requête. Poser <GlpiNgPluginStaticAssets>false</GlpiNgPluginStaticAssets>
désactive la copie si le projet gère ses fichiers autrement.