feat(cli): lock captures effective description; list shows it; new commands surface view with origin and collision reporting

This commit is contained in:
kj
2026-10-06 15:37:15 -03:00
parent 6028abe51c
commit 4014551aae
9 changed files with 266 additions and 4 deletions
+49
View File
@@ -100,3 +100,52 @@ Harness::it('destino explícito sobreescribe la regla', function () {
$dest = Destination::relative('src/Libs/Crypto.php', '/proj', '/proj/src', ['src/Libs/Crypto.php' => 'elsewhere/Crypto.php']);
eq('elsewhere/Crypto.php', $dest);
});
Harness::it('el lock persiste la descripción y tolera locks sin el campo', function () {
$dir = tmpdir();
$lock = Lock::empty();
$lock->setComponent('db:sql', [
'package' => 'db',
'version' => '1.0.0',
'mode' => 'copy',
'description' => 'SQL',
'files' => [],
]);
$lock->save($dir);
eq('SQL', Lock::load($dir)->component('db:sql')['description'], 'roundtrip de description');
$raw = json_decode((string) file_get_contents($dir . '/.duckbrain/lock.json'), true);
unset($raw['components']['db:sql']['description']);
file_put_contents($dir . '/.duckbrain/lock.json', json_encode($raw));
eq(null, Lock::load($dir)->component('db:sql')['description'], 'lock antiguo sin campo se lee tolerante');
rrmdir($dir);
});
Harness::it('add captura la descripción efectiva del catálogo en el lock', function () {
$root = tmpdir('proj');
$tool = tmpdir('tool');
write_file($tool . '/packages/mix/duckbrain.json', json_encode([
'name' => 'mix',
'version' => '1.0.0',
'description' => 'Descripción del paquete',
'components' => [
'own' => ['files' => ['src/Libs/Own.php'], 'description' => 'Descripción propia'],
'inh' => ['files' => ['src/Libs/Inh.php']],
],
'default' => ['own', 'inh'],
]));
write_file($tool . '/packages/mix/src/Libs/Own.php', "<?php\n");
write_file($tool . '/packages/mix/src/Libs/Inh.php', "<?php\n");
(new Toolbox\Installer($root, $tool, new Toolbox\Console()))->add(['mix'], ['yes' => true]);
$lock = Lock::load($root);
eq('Descripción propia', $lock->component('mix:own')['description'], 'propia gana en el lock');
eq('Descripción del paquete', $lock->component('mix:inh')['description'], 'sin propia, hereda del paquete');
rrmdir($root);
rrmdir($tool);
});