{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.contextura.io/projecten/1.json",
  "title": "projecten.json (register v1 en v2)",
  "description": "Het lokale register van de werkplek: welke projecten er zijn, hun groep, brain, koppelingen en geheimen-tool. Versie 2 voegt de werkplek zelf, de partijen en github.eigenaar toe; normaliseerRegistry leest versie 1 in de vorm van versie 2. Gecontroleerd door controleerRegister; een afwijking is een waarschuwing (nog geen fout). Eigen velden mogen.",
  "type": "object",
  "required": [
    "projecten"
  ],
  "properties": {
    "versie": {
      "enum": [
        1,
        2
      ],
      "description": "Ontbreekt bij versie 1."
    },
    "eigenaar": {
      "type": "string",
      "description": "Versie 1: GitHub-eigenaar van de repo's (plaatshouder {{eigenaar}}). In versie 2: github.eigenaar."
    },
    "github": {
      "type": "object",
      "properties": {
        "eigenaar": {
          "type": "string",
          "description": "GitHub-eigenaar van de repo's; plaatshouder {{eigenaar}}."
        }
      }
    },
    "werkplek": {
      "type": "object",
      "required": [
        "id",
        "soort",
        "eigenaar"
      ],
      "description": "Versie 2: deze omgeving.",
      "properties": {
        "id": {
          "type": "string"
        },
        "naam": {
          "type": "string"
        },
        "soort": {
          "enum": [
            "toestel",
            "dienst",
            "organisatie"
          ]
        },
        "installatie": {
          "type": "string",
          "description": "De installatie die deze werkplek maakte, bv. de naam van het gereedschap of het product."
        },
        "standaard": {
          "type": "boolean",
          "description": "De standaardwerkplek: klantmateriaal standaard aan, sessienamen zonder achtervoegsel."
        },
        "eigenaar": {
          "$ref": "#/$defs/partijId"
        },
        "leden": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "partij",
              "rol"
            ],
            "properties": {
              "partij": {
                "$ref": "#/$defs/partijId"
              },
              "rol": {
                "enum": [
                  "lid",
                  "lezer"
                ]
              }
            }
          }
        }
      }
    },
    "partijen": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "soort"
        ],
        "properties": {
          "id": {
            "$ref": "#/$defs/partijId"
          },
          "soort": {
            "enum": [
              "persoon",
              "gezin",
              "bedrijf"
            ]
          },
          "naam": {
            "type": "string"
          },
          "leden": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/partijId"
            }
          }
        }
      }
    },
    "vaults": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Kluis per groepsnaam (prive, werk)."
    },
    "geheimen": {
      "type": "object",
      "properties": {
        "tool": {
          "type": "string"
        },
        "verwijzing": {
          "type": "string"
        },
        "laden": {
          "type": "string"
        },
        "lezen": {
          "type": "string"
        },
        "cli": {
          "type": "string"
        },
        "serviceaccounts": {
          "type": "object",
          "additionalProperties": {
            "type": "object",
            "required": [
              "kluis",
              "bewaarnaam"
            ],
            "properties": {
              "kluis": {
                "type": "string"
              },
              "bewaarnaam": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "koppelingen": {
      "type": "object",
      "description": "Gedeelde koppelingen van de werkplek (bv. agenda)."
    },
    "werkruimteKopieen": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Extra plaatsen waar sync-workspace het workspace-bestand neerzet."
    },
    "hulpmiddelen": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Volledig pad van gereedschap buiten PATH."
    },
    "accountkoppelingen": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/koppeling"
      }
    },
    "verbruik": {
      "type": "object",
      "description": "Bronnen voor verbruik en kosten (bv. anthropic, github, vast; gratis: gratis diensten zonder meting, als risico)."
    },
    "projecten": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "naam",
          "groep"
        ],
        "properties": {
          "naam": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]*$"
          },
          "map": {
            "type": "string"
          },
          "repo": {
            "type": "string",
            "pattern": "^[^/\\s]+/[^/\\s]+$"
          },
          "groep": {
            "enum": [
              "machinerie",
              "kennis",
              "prive",
              "werk",
              "persona",
              "archief"
            ]
          },
          "klant": {
            "type": "string"
          },
          "vault": {
            "type": "string"
          },
          "smaak": {
            "type": "string"
          },
          "sync": {
            "type": "boolean"
          },
          "brain": {
            "type": "string",
            "description": "Naam van een project met groep kennis."
          },
          "remote": {
            "type": "boolean",
            "description": "Oud: true is sessie altijd. Gebruik sessie."
          },
          "sessie": {
            "enum": [
              "altijd",
              "op-vraag",
              "cloud"
            ],
            "description": "Waar de sessie draait: altijd (vaste Remote Control-sessie op de laptop), op-vraag (alleen met sessies --project), cloud (claude --cloud, zonder laptop en zonder geheimen). Wint van remote."
          },
          "sporen": {
            "type": "object",
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                {
                  "type": "object",
                  "required": [
                    "hubs"
                  ],
                  "properties": {
                    "beschrijving": {
                      "type": "string"
                    },
                    "hubs": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "todo": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "De lijsten van de to-do's die bij dit spoor horen."
                    },
                    "rest": {
                      "type": "boolean",
                      "description": "Dit spoor krijgt wat bij geen ander spoor hoort."
                    }
                  }
                }
              ]
            }
          },
          "persona": {
            "type": "object"
          },
          "koppelingen": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/koppeling"
            }
          },
          "eigenaar": {
            "$ref": "#/$defs/partijId",
            "description": "Versie 2: eigenaar van de brain of het project."
          },
          "rechten": {
            "enum": [
              "lezen",
              "schrijven"
            ]
          },
          "laag": {
            "type": "boolean",
            "description": "Versie 2: deze werkplek synct de laag naar deze repo (alleen op een toestel)."
          },
          "filter": {
            "type": "object",
            "properties": {
              "herkomst": {
                "type": "object",
                "properties": {
                  "client": {
                    "enum": [
                      "aan",
                      "uit"
                    ]
                  }
                }
              },
              "bundels": {
                "type": [
                  "object",
                  "null"
                ]
              }
            }
          }
        }
      }
    }
  },
  "$defs": {
    "koppeling": {
      "type": "object",
      "required": [
        "systeem",
        "soort",
        "rechten",
        "waar"
      ],
      "properties": {
        "systeem": {
          "type": "string"
        },
        "soort": {
          "enum": [
            "api",
            "mcp",
            "cli",
            "browser",
            "connector"
          ]
        },
        "rechten": {
          "enum": [
            "lezen",
            "schrijven",
            "lezen+schrijven"
          ]
        },
        "waar": {
          "enum": [
            "pc",
            "server",
            "cloud"
          ]
        },
        "categorie": {
          "type": "string"
        },
        "geheim": {
          "type": "string"
        },
        "herken": {
          "type": "object",
          "properties": {
            "mcp": {
              "type": "string"
            },
            "domein": {
              "type": "string"
            },
            "opdracht": {
              "type": "string"
            }
          }
        }
      }
    },
    "partijId": {
      "type": "string",
      "pattern": "^(persoon|gezin|bedrijf):[a-z0-9][a-z0-9-]*$"
    }
  }
}
