Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
24212bd
docs(openspec): change proposals — adopt-integration-leaves mcp-full-…
rubenvdlinde Aug 18, 2026
95ff8c3
chore(release): 0.1.141-unstable.20260820130046 [skip ci]
github-actions[bot] Aug 20, 2026
98333a5
Merge pull request #580 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
35a943c
chore(release): 0.1.141-unstable.20260820201847 [skip ci]
github-actions[bot] Aug 20, 2026
3539cb0
Merge pull request #583 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
6a2d172
chore(release): 0.1.141-unstable.20260820203911 [skip ci]
github-actions[bot] Aug 20, 2026
b7cb07a
Merge pull request #584 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
5689d7e
chore(release): 0.1.141-unstable.20260820205557 [skip ci]
github-actions[bot] Aug 20, 2026
3115b37
Merge pull request #585 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
743ba4b
chore(release): 0.1.141-unstable.20260820212102 [skip ci]
github-actions[bot] Aug 20, 2026
4f03776
fix(manifest): process and audit fields are no longer editable inputs
rubenvdlinde Aug 20, 2026
609d9b2
Merge pull request #586 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
d0bdc09
chore(release): 0.1.141-unstable.20260820214311 [skip ci]
github-actions[bot] Aug 20, 2026
9d49b71
Merge pull request #588 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
9a6e9e5
chore(release): 0.1.141-unstable.20260820220515 [skip ci]
github-actions[bot] Aug 20, 2026
54c4b8a
Merge pull request #589 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
fc64d96
Merge pull request #587 from ConductionNL/fix/lock-process-fields
rubenvdlinde Aug 20, 2026
71cb9a0
chore(release): 0.1.141-unstable.20260820223149 [skip ci]
github-actions[bot] Aug 20, 2026
068755c
Merge pull request #590 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
0c1e103
chore(release): 0.1.141-unstable.20260820224848 [skip ci]
github-actions[bot] Aug 20, 2026
aa50152
Merge pull request #592 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
c74a3a9
build(deps-dev): move the whole stylelint family to 17 as one upgrade
rubenvdlinde Aug 20, 2026
4f75670
chore(release): 0.1.141-unstable.20260820231107 [skip ci]
github-actions[bot] Aug 20, 2026
7dd42a7
Merge pull request #594 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
3b98ca4
chore(release): 0.1.141-unstable.20260820233952 [skip ci]
github-actions[bot] Aug 20, 2026
bafaf3c
Merge pull request #595 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 20, 2026
fa4ecea
chore(release): 0.1.141-unstable.20260821000125 [skip ci]
github-actions[bot] Aug 21, 2026
036a897
Merge pull request #593 from ConductionNL/chore/stylelint-17-coupled
rubenvdlinde Aug 21, 2026
95d44cb
Merge pull request #596 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
1ef96a2
chore(release): 0.1.141-unstable.20260821002227 [skip ci]
github-actions[bot] Aug 21, 2026
c3086f4
Merge pull request #598 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
ed1a773
chore(release): 0.1.141-unstable.20260821004639 [skip ci]
github-actions[bot] Aug 21, 2026
0e8550d
Merge pull request #599 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
de3924f
chore(release): 0.1.141-unstable.20260821010037 [skip ci]
github-actions[bot] Aug 21, 2026
36df9fc
Merge pull request #600 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
228c60b
chore(release): 0.1.141-unstable.20260821011425 [skip ci]
github-actions[bot] Aug 21, 2026
4d8f60a
Merge pull request #601 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
003cdf5
chore(release): 0.1.141-unstable.20260821012736 [skip ci]
github-actions[bot] Aug 21, 2026
e20f819
Merge pull request #602 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
231bfe2
chore(release): 0.1.141-unstable.20260821014525 [skip ci]
github-actions[bot] Aug 21, 2026
f736052
Merge pull request #603 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
249246c
chore(release): 0.1.141-unstable.20260821015458 [skip ci]
github-actions[bot] Aug 21, 2026
5719054
Merge pull request #604 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
c33308f
chore(release): 0.1.141-unstable.20260821020326 [skip ci]
github-actions[bot] Aug 21, 2026
2b7ed1a
Merge pull request #605 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
340ed2a
chore(release): 0.1.141-unstable.20260821022249 [skip ci]
github-actions[bot] Aug 21, 2026
bc2dd06
Merge pull request #606 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
7c737b5
chore(release): 0.1.141-unstable.20260821024223 [skip ci]
github-actions[bot] Aug 21, 2026
7316056
Merge pull request #607 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
6933bbb
chore(release): 0.1.141-unstable.20260821025313 [skip ci]
github-actions[bot] Aug 21, 2026
7210a42
Merge pull request #608 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
8569683
chore(release): 0.1.141-unstable.20260821030426 [skip ci]
github-actions[bot] Aug 21, 2026
baf46d3
Merge pull request #609 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
22f0241
chore(release): 0.1.141-unstable.20260821031723 [skip ci]
github-actions[bot] Aug 21, 2026
bbcef2a
Merge pull request #610 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
91062c2
chore(release): 0.1.141-unstable.20260821033058 [skip ci]
github-actions[bot] Aug 21, 2026
3a37cbc
Merge pull request #611 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
c69f4ee
chore(release): 0.1.141-unstable.20260821034217 [skip ci]
github-actions[bot] Aug 21, 2026
98db1e8
Merge pull request #612 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
692b859
chore(release): 0.1.141-unstable.20260821035333 [skip ci]
github-actions[bot] Aug 21, 2026
30f766e
Merge pull request #613 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
c25af32
chore(release): 0.1.141-unstable.20260821040505 [skip ci]
github-actions[bot] Aug 21, 2026
1c649cd
Merge pull request #614 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
5c61693
chore(release): 0.1.141-unstable.20260821041656 [skip ci]
github-actions[bot] Aug 21, 2026
a57e90b
Merge pull request #615 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
4ca2fed
chore(release): 0.1.141-unstable.20260821042832 [skip ci]
github-actions[bot] Aug 21, 2026
60626fe
Merge pull request #616 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
24a0095
chore(release): 0.1.141-unstable.20260821044543 [skip ci]
github-actions[bot] Aug 21, 2026
b5b738e
Merge pull request #617 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
29f588e
chore(release): 0.1.141-unstable.20260821050743 [skip ci]
github-actions[bot] Aug 21, 2026
b40f2b1
Merge pull request #653 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
1c0b9cb
chore(release): 0.1.141-unstable.20260821052417 [skip ci]
github-actions[bot] Aug 21, 2026
bbd7253
Merge pull request #689 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
08ed7cf
chore(release): 0.1.141-unstable.20260821053703 [skip ci]
github-actions[bot] Aug 21, 2026
e847c4c
Merge pull request #690 from ConductionNL/release/v0.1.141-unstable.2…
rubenvdlinde Aug 21, 2026
bcece50
chore(deps): refresh the shared Conduction locks (#692)
rubenvdlinde Aug 21, 2026
3f6beb9
chore(deps): refresh the shared Conduction locks (#694)
rubenvdlinde Aug 21, 2026
646c301
fix(tests): opt into the OpenRegister contract — fixes 130 standalone…
rubenvdlinde Aug 22, 2026
53692a1
chore(quality): migrate to PHPStan 2 — 35 findings to zero, plus a mi…
rubenvdlinde Aug 22, 2026
fe82198
chore(deps): refresh the shared Conduction locks (#706)
rubenvdlinde Aug 22, 2026
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
20 changes: 10 additions & 10 deletions appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,25 +50,25 @@ Vrij en open source onder de EUPL-licentie.

**Ondersteuning:** Voor ondersteuning, neem contact op via support@conduction.nl. Voor een Service Level Agreement (SLA), neem contact op via sales@conduction.nl.
]]></description>
<version>0.1.141-unstable.20260820125107</version>
<version>0.1.141-unstable.20260821053703</version>
<licence>EUPL-1.2</licence>
<author mail="info@conduction.nl" homepage="https://www.conduction.nl/">Conduction</author>
<namespace>SoftwareCatalog</namespace>
<documentation>
<user>https://codeberg.org/Conduction/softwarecatalog</user>
<admin>https://codeberg.org/Conduction/softwarecatalog</admin>
<developer>https://codeberg.org/Conduction/softwarecatalog</developer>
<user>https://github.com/ConductionNL/stackiq</user>
<admin>https://github.com/ConductionNL/stackiq</admin>
<developer>https://github.com/ConductionNL/stackiq</developer>
</documentation>
<category>organization</category>
<category>tools</category>
<category>integration</category>
<website>https://codeberg.org/Conduction/softwarecatalog</website>
<bugs>https://codeberg.org/Conduction/softwarecatalog/issues</bugs>
<repository>https://codeberg.org/Conduction/softwarecatalog</repository>
<website>https://github.com/ConductionNL/stackiq</website>
<bugs>https://github.com/ConductionNL/stackiq/issues</bugs>
<repository>https://github.com/ConductionNL/stackiq</repository>

<screenshot>https://codeberg.org/Conduction/softwarecatalog/raw/branch/main/img/screenshot-dashboard.png</screenshot>
<screenshot>https://codeberg.org/Conduction/softwarecatalog/raw/branch/main/img/screenshot-applications.png</screenshot>
<screenshot>https://codeberg.org/Conduction/softwarecatalog/raw/branch/main/img/screenshot-connections.png</screenshot>
<screenshot>https://raw.githubusercontent.com/ConductionNL/stackiq/main/img/screenshot-dashboard.png</screenshot>
<screenshot>https://raw.githubusercontent.com/ConductionNL/stackiq/main/img/screenshot-applications.png</screenshot>
<screenshot>https://raw.githubusercontent.com/ConductionNL/stackiq/main/img/screenshot-connections.png</screenshot>

<dependencies>
<!--
Expand Down
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,15 @@
},
"require-dev": {
"conduction/coding-standard": "^1.0",
"conduction/hydra-gates": "^1.0",
"conduction/hydra-gates": "^1.8.2",
"cyclonedx/cyclonedx-php-composer": "^6.2",
"edgedesign/phpqa": "^1.27",
"guzzlehttp/guzzle": "^7.8",
"nextcloud/ocp": "^34.0",
"phpcsstandards/phpcsextra": "^1.4",
"phpmd/phpmd": "^2.15",
"phpmetrics/phpmetrics": "^2.8",
"phpstan/phpstan": "^1.10",
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^10.5",
"roave/security-advisories": "dev-latest",
"squizlabs/php_codesniffer": "^3.9",
Expand Down
40 changes: 23 additions & 17 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion lib/Controller/OrganisationMembersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,9 @@ private function authorizeMaintainer(string $organisationUuid): ?JSONResponse {
*
* @return \OCA\OpenRegister\Service\OrganisationService The service instance.
*
* @throws \Throwable When OpenRegister is unavailable.
* No `@throws`: the body is a plain property read. If OpenRegister is
* unavailable the failure happens in the container while CONSTRUCTING this
* controller, not here.
*/
private function getOrganisationService(): \OCA\OpenRegister\Service\OrganisationService {
return $this->organisationService;
Expand Down
8 changes: 5 additions & 3 deletions lib/Controller/SettingsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ public function index(): JSONResponse {

try {
$user = $this->userSession->getUser();
$isAdmin = $user !== null && $this->groupManager->isAdmin($user->getUID());
$isAdmin = $this->groupManager->isAdmin($user->getUID());

// Delegate all business logic to service.
$data = $this->settingsService->getAllSettings();
Expand Down Expand Up @@ -1577,10 +1577,12 @@ private function parseArchiMateFileUpload(): ?array {
* @spec openspec/changes/method-decomposition/tasks.md#task-3
*/
private function resolveArchiMateMethod(array $options): array {
// No method_exists() probe: ArchiMateService declares
// importArchiMateFileFromPathOptimized(), so only the request parameter
// decides which path runs.
$useOptimized = $this->request->getParam('useOptimized', 'true') === 'true';
$hasOptimized = method_exists($this->archiMateService, 'importArchiMateFileFromPathOptimized');

if ($useOptimized === true && $hasOptimized === true) {
if ($useOptimized === true) {
$this->logger->info('Using OPTIMIZED ArchiMate import method.');
return $this->archiMateService->importArchiMateFileFromPathOptimized($options);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Service/ArchiMateExportService.php
Original file line number Diff line number Diff line change
Expand Up @@ -1209,7 +1209,7 @@ private function addObjectDirectlyToXmlWithProperties(
$xmlData = $this->cleanObjectDataForXml(object: $object, propDefMap: $propertyDefinitionMap);
}

if (is_array($xmlData) === true && empty($xmlData) === false) {
if (empty($xmlData) === false) {
if ($sectionName === 'views') {
$this->addViewDataToXmlNode(viewNode: $objectNode, viewData: $xmlData);
} else {
Expand Down
65 changes: 32 additions & 33 deletions lib/Service/ArchiMateImportService.php
Original file line number Diff line number Diff line change
Expand Up @@ -368,11 +368,11 @@ public function importArchiMateFileFromPathOptimized(array $options = []): array

// PERFORMANCE OPTIMIZATION: Clean up memory after XML parsing.
$memoryCleanupTime = 0;
if (self::PERFORMANCE_OPTIMIZATIONS['memory_cleanup'] !== false) {
$memCleanupStart = microtime(true);
$this->cleanupMemory();
$memoryCleanupTime = microtime(true) - $memCleanupStart;
}
// PERFORMANCE_OPTIMIZATIONS['memory_cleanup'] is a class constant set
// to true, so this was never conditional.
$memCleanupStart = microtime(true);
$this->cleanupMemory();
$memoryCleanupTime = microtime(true) - $memCleanupStart;

// STEP 2: Extract model identifier.
$modelIdStartTime = microtime(true);
Expand Down Expand Up @@ -1254,7 +1254,7 @@ private function createSectionObject(string $section, string $identifier, array
// Fallback: Use AMEF identifier as both ID and extract clean UUID for slug.
$objectId = $identifier;
// Extract clean UUID from AMEF identifier (remove "id-" prefix if present).
if ($identifier !== false && str_starts_with($identifier, 'id-') === true) {
if (str_starts_with($identifier, 'id-') === true) {
$slug = substr($identifier, 3);
// Remove "id-" prefix.
} else {
Expand Down Expand Up @@ -1735,9 +1735,10 @@ private function saveObjectsInParallelBatches(array $objects, ObjectServiceInter
}//end try

// Memory cleanup between chunks.
if (self::PERFORMANCE_OPTIMIZATIONS['memory_cleanup'] !== false) {
$this->cleanupMemory();
}
// PERFORMANCE_OPTIMIZATIONS['memory_cleanup'] is a class constant set
// to true, so this was never conditional. Flip the constant and the
// compiler will point you back here.
$this->cleanupMemory();
}//end foreach

// Store the aggregated result for statistics calculation.
Expand Down Expand Up @@ -2047,7 +2048,7 @@ private function getAmefRegisterId(): ?int {
}

// Validate and normalize to positive int.
if ($rawRegisterId !== null && $rawRegisterId !== '' && is_numeric((string)$rawRegisterId) === true) {
if ($rawRegisterId !== '' && is_numeric((string)$rawRegisterId) === true) {
$registerId = (int)$rawRegisterId;
if ($registerId > 0) {
return $registerId;
Expand Down Expand Up @@ -2549,10 +2550,8 @@ private function findItemsInSection(array $sectionData, string $sectionName): ar
// OPTIMIZATION: Removed debug logging from section processing.
$items = [];

// Safety check: ensure sectionData is an array.
if (is_array($sectionData) === false) {
return [];
}
// No is_array() safety check: $sectionData is declared array, so PHP
// rejects anything else at the call boundary before this could run.

// Get section structure configuration from AMEF config.
$config = $this->getSectionStructureConfig(sectionName: $sectionName);
Expand Down Expand Up @@ -4033,7 +4032,7 @@ private function processStandardVersionRelationship(
$standardId = $source;
}

if ($versionId !== false && $standardId === true) {
if ($standardId === true) {
$stdVersionRelMap[$versionId] = $standardId;
}
}//end processStandaardVersieRelationship()
Expand Down Expand Up @@ -4084,7 +4083,7 @@ private function processRelationshipImmediate(
$standardId = $source;
}

if ($refCompId !== false && $standardId === true) {
if ($standardId === true) {
// Initialize arrays if not exists.
if (isset($gemmaRelationshipMap[$refCompId]) === false) {
$gemmaRelationshipMap[$refCompId] = [
Expand Down Expand Up @@ -4800,7 +4799,7 @@ private function transformSectionObjectsBatch(
// AMEF identifier becomes slug.
} else {
// Fallback: extract clean UUID from AMEF identifier for slug.
if ($identifier !== false && str_starts_with($identifier, 'id-') === true) {
if (str_starts_with($identifier, 'id-') === true) {
$object['@self']['slug'] = substr($identifier, 3);
// Remove "id-" prefix.
} else {
Expand All @@ -4809,7 +4808,7 @@ private function transformSectionObjectsBatch(
}
} else {
// No properties to flatten, use AMEF identifier logic.
if ($identifier !== false && str_starts_with($identifier, 'id-') === true) {
if (str_starts_with($identifier, 'id-') === true) {
$object['@self']['slug'] = substr($identifier, 3);
// Remove "id-" prefix.
} else {
Expand Down Expand Up @@ -4988,7 +4987,9 @@ private function flattenPropertiesBatch(array &$object, array $properties, array
continue;
}

if ($value !== null && isset($propDefMap[$defRef]) === true) {
// No isset($propDefMap[$defRef]) re-check: the loop above only
// reaches here for a $defRef the map already has.
if ($value !== null) {
$propertyName = $propDefMap[$defRef];
$camelCaseName = $this->convertToCamelCase(propertyName: $propertyName);
$object[$camelCaseName] = $value;
Expand Down Expand Up @@ -5022,13 +5023,14 @@ private function flattenPropertiesBatch(array &$object, array $properties, array
);
}
} else {
// 'mapping_exists' is always true here — the map lookup already
// succeeded, so a null $value is the only way into this branch.
$this->logger->warning(
'Property value is null or mapping missing',
'Property value is null',
[
'object_id' => $object['identifier'] ?? 'unknown',
'property_def_ref' => $defRef,
'value' => $value,
'mapping_exists' => isset($propDefMap[$defRef]) === true,
]
);
}//end if
Expand Down Expand Up @@ -5720,10 +5722,8 @@ private function calculateObjectStatistics(array $normalizedData): array {
$sectionKey = 'elements';
}//end if

if (isset($statistics[$sectionKey]) === false) {
continue;
// Skip unknown section types.
}
// No "skip unknown section types" guard: the branch above pins
// $sectionKey to a key $statistics always has, so it never fired.

// Determine if this object was created, updated, or had errors.
$objectId = $object['@self']['id'] ?? $object['identifier'] ?? null;
Expand Down Expand Up @@ -5809,14 +5809,13 @@ private function calculateObjectStatistics(array $normalizedData): array {
'total_errors' => 0,
];

foreach ($statistics as $section => $sectionStats) {
if ($section !== 'omschrijving') {
// Skip summary section itself.
$summary['total_objects_created'] += $sectionStats['created'];
$summary['total_objects_updated'] += $sectionStats['updated'];
$summary['total_objects_unchanged'] += $sectionStats['unchanged'];
$summary['total_errors'] += count($sectionStats['errors']);
}
// No "skip the summary section" guard: `omschrijving` is written into
// $statistics on the line AFTER this loop, so the loop can never see it.
foreach ($statistics as $sectionStats) {
$summary['total_objects_created'] += $sectionStats['created'];
$summary['total_objects_updated'] += $sectionStats['updated'];
$summary['total_objects_unchanged'] += $sectionStats['unchanged'];
$summary['total_errors'] += count($sectionStats['errors']);
}

$statistics['omschrijving'] = $summary;
Expand Down
Loading
Loading