diff --git a/.gitignore b/.gitignore index eab1f67..e85055c 100644 --- a/.gitignore +++ b/.gitignore @@ -331,10 +331,11 @@ ASALocalRun/ ## ## Visual Studio Code ## -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json +**/.vscode/* +!**/.vscode/extensions.json +!**/.vscode/format-report.json +!**/.vscode/launch.json +!**/.vscode/settings.json +!**/.vscode/tasks.json *.lnk diff --git a/Adaptation/.kanbn/board.css b/Adaptation/.kanbn/board.css new file mode 100644 index 0000000..8bc14b6 --- /dev/null +++ b/Adaptation/.kanbn/board.css @@ -0,0 +1,7 @@ +.kanbn-task-data-workload { + display: none; +} +.kanbn-task-data-relation { + display: block; + color: #198038; +} diff --git a/Adaptation/.kanbn/index.md b/Adaptation/.kanbn/index.md new file mode 100644 index 0000000..3385d3a --- /dev/null +++ b/Adaptation/.kanbn/index.md @@ -0,0 +1,21 @@ +--- +type: "kanbn" +created: 2023-07-07T15:37:56.040Z +updated: 2023-07-18T19:52:59.668Z +startedColumns: + - 'In Progress' +completedColumns: + - Done +dateFormat: mm/dd +taskTemplate: '^+^_${overdue ? ''^R'' : ''''}${name}^: ${relations ? (''\n^-^/^g'' + relations.reduce((accumulator, currentValue) => accumulator.task + currentValue.task + '' '', '''')) : ''''}' +--- + +# MET08RESIHGCV + +## Backlog + +## Todo + +## In Progress + +## Done diff --git a/Adaptation/.vscode/574749__2023-10-02 05-01-16-B.txt b/Adaptation/.vscode/574749__2023-10-02 05-01-16-B.txt deleted file mode 100644 index eeb993c..0000000 --- a/Adaptation/.vscode/574749__2023-10-02 05-01-16-B.txt +++ /dev/null @@ -1,9 +0,0 @@ --1.000;0.736_Point-1~HGCV1~23~574749~4628~~~~23-574749-4628~5PT MES~02/10/2023 05:00:24 AM~200.00~1.20~2.095E-002~N~PARALLEL~-5.00~-20.00~2500~2000.00 �~8IN4_10~8IN4_10~SSMDATA~4_108IN.PAT~ASTM: F723 - 82~6.067e+015~3.444e+000~3.829e+000~6.093e+015~3.568e+000~3.987e+000~4.702e-001~9.927e+000~1.210e+001~-1.000e+000~-1.000e+000~0.000e+000~8.204e-001~3.071e+000~3.489e+000~8.172e-001~3.179e+000~3.632e+000~9.000e+001~-1.000e+000~0.000e+000~1.650e+000~7.095e+001~9.181e+001~-1.000e+000~-1.000e+000~0.000e+000~1~5.927E+015~5.940E+015~0.434~-1.000~0.837~0.836~90.000~0.736~2~5.925E+015~5.953E+015~0.447~-1.000~0.838~0.834~90.000~0.129~3~6.311E+015~6.344E+015~0.509~-1.000~0.791~0.787~90.000~2.890~4~6.368E+015~6.402E+015~0.535~-1.000~0.784~0.780~90.000~2.321~5~5.924E+015~5.946E+015~0.439~-1.000~0.838~0.835~90.000~0.124~6~5.955E+015~5.983E+015~0.477~-1.000~0.834~0.830~90.000~2.910~7~6.353E+015~6.398E+015~0.540~-1.000~0.786~0.781~90.000~2.458~8~5.941E+015~5.964E+015~0.428~-1.000~0.835~0.833~90.000~0.847~9~5.898E+015~5.911E+015~0.423~-1.000~0.841~0.839~90.000~2.439~ - -1676307936 576471_2023-02-13 10-04-58.txt - -02/13/2023 10:05:38,,,UID000,Dir : 1676307936 576471_2023-02-13 10-04-58.txt, Size : 826 -02/13/2023 10:05:38,,,UID000,Read : 1676307936 576471_2023-02-13 10-04-58.txt, Size : 826 -02/13/2023 10:05:38,,HgCV,UID000,ImportHgCVData : Beginning ImportHgCVData -02/13/2023 10:05:38,,HgCV,UID001,ImportHgCVData : TableName or KeyID argument was missing in the ReadDataRow service. -02/13/2023 10:05:38,,,UID000,Delete : 1676307936 576471_2023-02-13 10-04-58.txt, Size : 826 \ No newline at end of file diff --git a/Adaptation/.vscode/574749__2023-10-02 05-01-16.txt b/Adaptation/.vscode/574749__2023-10-02 05-01-16.txt deleted file mode 100644 index 06cbc2a..0000000 --- a/Adaptation/.vscode/574749__2023-10-02 05-01-16.txt +++ /dev/null @@ -1 +0,0 @@ --1.000;0.736_Point-1 HGCV1 23 574749 4628 23-574749-4628 5PT MES 2/10/2023 5:00:24 AM 200.00 1.20 2.095E-002 N PARALLEL -5.00 -20.00 2500 2000.00 ? 8IN4_10 8IN4_10 SSMDATA 4_108IN.PAT ASTM: F723 - 82 6.067e+015 3.444e+000 3.829e+000 6.093e+015 3.568e+000 3.987e+000 4.702e-001 9.927e+000 1.210e+001 -1.000e+000 -1.000e+000 0.000e+000 8.204e-001 3.071e+000 3.489e+000 8.172e-001 3.179e+000 3.632e+000 9.000e+001 -1.000e+000 0.000e+000 1.650e+000 7.095e+001 9.181e+001 -1.000e+000 -1.000e+000 0.000e+000 1 5.927E+015 5.940E+015 0.434 -1.000 0.837 0.836 90.000 0.736 2 5.925E+015 5.953E+015 0.447 -1.000 0.838 0.834 90.000 0.129 3 6.311E+015 6.344E+015 0.509 -1.000 0.791 0.787 90.000 2.890 4 6.368E+015 6.402E+015 0.535 -1.000 0.784 0.780 90.000 2.321 5 5.924E+015 5.946E+015 0.439 -1.000 0.838 0.835 90.000 0.124 6 5.955E+015 5.983E+015 0.477 -1.000 0.834 0.830 90.000 2.910 7 6.353E+015 6.398E+015 0.540 -1.000 0.786 0.781 90.000 2.458 8 5.941E+015 5.964E+015 0.428 -1.000 0.835 0.833 90.000 0.847 9 5.898E+015 5.911E+015 0.423 -1.000 0.841 0.839 90.000 2.439 diff --git a/Adaptation/.vscode/RDS.js b/Adaptation/.vscode/RDS.js deleted file mode 100644 index 1e310fa..0000000 --- a/Adaptation/.vscode/RDS.js +++ /dev/null @@ -1,20 +0,0 @@ -// (self.length != 0) ? -// self : -// (getContextData('2', 'cds.PROCESS_JOBID', '') == '-') ? -// self : -// getContextData('2', 'cds.PROCESS_JOBID', '') - -// (self.length != 0) ? -// self : -// getContextData('2', 'cds.MID', '') - -'-', 1, '-' - -getValue(self, self.length, getContextData('2', 'cds.MID', '')); - -function getValue(value, length, mid) { - if (length !== 0 || mid === '-') - return value; - else - return mid; -} \ No newline at end of file diff --git a/Adaptation/.vscode/Reactor.js b/Adaptation/.vscode/Reactor.js deleted file mode 100644 index a3230fc..0000000 --- a/Adaptation/.vscode/Reactor.js +++ /dev/null @@ -1,24 +0,0 @@ -// (self.length != 0) ? -// self : -// (getContextData('2', 'cds.PROCESS_JOBID', '') == '-') ? -// self : -// getContextData('2', 'cds.PROCESS_JOBID', '') - -getValue(self, self.length, $('dcp.HGCV3/pcl/MesEntity', ''), $('dcp.HGCV3/pcl/Pattern', ''), $('dcp.HGCV3/pcl/Lot', ''), getContextData('2', 'cds.PROCESS_JOBID', '')); - -function getValue(value, length, mesEntity, pattern, lot, processJobId) { - if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('EP') > -1) - return mesEntity; - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('LO') > -1) - return mesEntity; - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('MI') > -1) - return mesEntity; - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('HI') > -1) - return mesEntity; - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('TH') > -1) - return mesEntity; - else if (length === 0) - return processJobId; - else - return value; -} \ No newline at end of file diff --git a/Adaptation/.vscode/Variation.js b/Adaptation/.vscode/Variation.js deleted file mode 100644 index be5ec3a..0000000 --- a/Adaptation/.vscode/Variation.js +++ /dev/null @@ -1,43 +0,0 @@ -getVariation($('dcp.HGCV3/pcl/Pattern', ''), $('dcp.HGCV3/pcl/Lot', ''), $('dcp.HGCV3/pcl/RhoAvgMean', '')); - -function getVariation(pattern, lot, rhoAvgMean) { - var fourPP = 1; - var mid4pp = 1; - var thin4pp = 1; - var low4pp = 1787; - var thickness = 1; - var high4pp = 7767; - var epiPro4pp = 3163; - var midThickness = 1; - var thinThickness = 1; - var lowThickness = 15.46; - var highThickness = 20.01; - var epiProThickness = 20.28; - if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('EP') > -1) { - fourPP = epiPro4pp; - thickness = epiProThickness; - } - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('LO') > -1) { - fourPP = low4pp; - thickness = lowThickness; - } - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('MI') > -1) { - fourPP = mid4pp; - thickness = midThickness; - } - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('HI') > -1) { - fourPP = high4pp; - thickness = highThickness; - } - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('TH') > -1) { - fourPP = thin4pp; - thickness = thinThickness; - } - /* =(ABS(C9-H6)/C9)*100 */ - var resistivity = thickness * fourPP * 0.0001; - var variation = (Math.abs(resistivity - rhoAvgMean) / resistivity) * 100; - if (thickness === 1 || fourPP === 1) - return null; - else - return variation; -} \ No newline at end of file diff --git a/Adaptation/.vscode/psn.js b/Adaptation/.vscode/psn.js deleted file mode 100644 index 38c6448..0000000 --- a/Adaptation/.vscode/psn.js +++ /dev/null @@ -1,24 +0,0 @@ -// (self.length != 0) ? -// self : -// (getContextData('2', 'cds.PRODUCT', '') == '-') ? -// self : -// getContextData('2', 'cds.PRODUCT', '') - -getValue(self, self.length, getContextData('2', 'cds.PRODUCT', ''), $('dcp.HGCV3/pcl/Pattern', ''), $('dcp.HGCV3/pcl/Lot', '')); - -function getValue(value, length, product, pattern, lot) { - if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('EP') > -1) - return 'EpiPro'; - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('LO') > -1) - return 'Low'; - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('MI') > -1) - return 'Mid'; - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('HI') > -1) - return 'High'; - else if (pattern === 'ONEPT.PAT' && lot.toUpperCase().indexOf('TH') > -1) - return 'Thin'; - else if (length === 0) - return product; - else - return value; -} \ No newline at end of file diff --git a/Adaptation/.vscode/settings.json b/Adaptation/.vscode/settings.json index 19967c4..e37ac17 100644 --- a/Adaptation/.vscode/settings.json +++ b/Adaptation/.vscode/settings.json @@ -1,4 +1,7 @@ { + "[markdown]": { + "editor.wordWrap": "off" + }, "cSpell.words": [ "Ccomp", "EQPT", diff --git a/Adaptation/.vscode/tasks.json b/Adaptation/.vscode/tasks.json new file mode 100644 index 0000000..01befef --- /dev/null +++ b/Adaptation/.vscode/tasks.json @@ -0,0 +1,82 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "Format", + "command": "dotnet", + "type": "process", + "args": [ + "format", + "--report", + ".vscode", + "--verbosity", + "detailed", + "--severity", + "warn" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "Nuget Clear", + "command": "dotnet", + "type": "process", + "args": [ + "nuget", + "locals", + "all", + "--clear" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "MSBuild for EAF Deployment Packages", + "command": "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe", + "type": "process", + "args": [ + "/target:Build", + "/restore:True", + "/p:RestoreSources=https://api.nuget.org/v3/index.json%3Bhttps://packagemanagement.eu.infineon.com:4430/api/v2/%3Bhttps://tfs.intra.infineon.com/tfs/ManufacturingIT/_packaging/eaf/nuget/v3/index.json%3Bhttps://localhost/v3/index.json", + "/detailedsummary", + "/consoleloggerparameters:PerformanceSummary;ErrorsOnly;", + "/property:Configuration=Debug;TargetFrameworkVersion=v4.8", + "../MET08RESIHGCV.csproj" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "File-Folder-Helper AOT s M .Kanbn Tasks", + "type": "shell", + "command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s M T:/MET08RESIHGCV/06_SourceCode/MET08RESIHGCV/Adaptation -s T:/MET08RESIHGCV/06_SourceCode/MET08RESIHGCV/Adaptation/.kanbn/tasks", + "problemMatcher": [] + }, + { + "label": "Kanbn Console", + "type": "npm", + "script": "kanbn.board", + "problemMatcher": [] + }, + { + "label": "Kanbn Write Boad", + "type": "shell", + "command": "& kanbn board -j | L:/Git/kanbn2md/kanbn2md.exe >.kanbn/board.md", + "problemMatcher": [] + }, + { + "label": "Kanbn Write json", + "type": "npm", + "script": "kanbn.board.json", + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/OpenInsight/FileRead.cs b/Adaptation/FileHandlers/OpenInsight/FileRead.cs index 7af8c4e..9b0929b 100644 --- a/Adaptation/FileHandlers/OpenInsight/FileRead.cs +++ b/Adaptation/FileHandlers/OpenInsight/FileRead.cs @@ -189,13 +189,19 @@ public class FileRead : Shared.FileRead, IFileRead { bool isDummyRun = false; List<(Shared.Properties.IScopeInfo, string)> collection = new(); - string successDirectory = _FileConnectorConfiguration.AlternateTargetFolder; - string parentParent = GetParentParent(_FileConnectorConfiguration.SourceFileLocation); - if (parentParent.Contains(_CellInstanceName)) - parentParent = Path.GetDirectoryName(parentParent); - string duplicateDirectory = Path.Combine(parentParent, "Data"); + string duplicateDirectory = Path.Combine(_FileConnectorConfiguration.SourceFileLocation, _CellInstanceName); if (!Directory.Exists(duplicateDirectory)) _ = Directory.CreateDirectory(duplicateDirectory); + string successDirectory = _FileConnectorConfiguration.AlternateTargetFolder; + if (!Directory.Exists(Path.Combine(duplicateDirectory, "1"))) + { + string parentParent = GetParentParent(_FileConnectorConfiguration.SourceFileLocation); + if (parentParent.Contains(_CellInstanceName)) + parentParent = Path.GetDirectoryName(parentParent); + duplicateDirectory = Path.Combine(parentParent, "Data"); + if (!Directory.Exists(duplicateDirectory)) + _ = Directory.CreateDirectory(duplicateDirectory); + } string duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath)); if (descriptions.Any() && tests.Any()) { diff --git a/Adaptation/FileHandlers/OpenInsightMetrologyViewer/WSRequest.cs b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/WSRequest.cs index 5c917bc..940c586 100644 --- a/Adaptation/FileHandlers/OpenInsightMetrologyViewer/WSRequest.cs +++ b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/WSRequest.cs @@ -29,7 +29,7 @@ public class WSRequest public string GradeMean { get; set; } public string GradeRadialGradient { get; set; } public string GradeStdDev { get; set; } - public string Id { get; set; } + public int Id { get; set; } public string Layer { get; set; } public string Lot { get; set; } public string Model { get; set; } @@ -79,7 +79,7 @@ public class WSRequest #pragma warning restore IDE0060 { ProcessDataStandardFormat = processDataStandardFormat; - Id = string.Empty; + Id = -1; Details = new List(); CellName = logistics.MesEntity; pcl.Description x = descriptions[0]; diff --git a/Adaptation/FileHandlers/pcl/FileRead.cs b/Adaptation/FileHandlers/pcl/FileRead.cs index 8ae6286..03a5ae0 100644 --- a/Adaptation/FileHandlers/pcl/FileRead.cs +++ b/Adaptation/FileHandlers/pcl/FileRead.cs @@ -106,7 +106,7 @@ public class FileRead : Shared.FileRead, IFileRead private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) { Tuple> results = new(string.Empty, null, null, new List()); - _TickOffset ??= new FileInfo(reportFullPath).LastWriteTime.Ticks - dateTime.Ticks; + _TickOffset ??= 0; // new FileInfo(reportFullPath).LastWriteTime.Ticks - dateTime.Ticks; _Logistics = new Logistics(this, _TickOffset.Value, reportFullPath, useSplitForMID: true); SetFileParameterLotIDToLogisticsMID(); if (_Logistics.FileInfo.Length < _MinFileLength) diff --git a/Adaptation/MET08RESIHGCV.Tests.csproj b/Adaptation/MET08RESIHGCV.Tests.csproj index 2d4afa0..a763079 100644 --- a/Adaptation/MET08RESIHGCV.Tests.csproj +++ b/Adaptation/MET08RESIHGCV.Tests.csproj @@ -10,7 +10,7 @@ false 10.0 disable - win-x64 + win-x86 net7.0 diff --git a/Adaptation/Shared/FileRead.cs b/Adaptation/Shared/FileRead.cs index 90ed6e6..f66b29b 100644 --- a/Adaptation/Shared/FileRead.cs +++ b/Adaptation/Shared/FileRead.cs @@ -260,10 +260,11 @@ public class FileRead : Properties.IFileRead return results; } - protected static string GetTupleFile(Logistics logistics, List descriptions, Properties.IScopeInfo scopeInfo, string duplicateDirectory) where T : Properties.IDescription + protected static string GetTupleFile(Logistics logistics, List descriptions, Properties.IScopeInfo scopeInfo, string duplicateDirectory, string duplicateFile) where T : Properties.IDescription { string result; string rds; + string fileName; string dateValue; string rdsPlaceholder = "%RDS%"; string mesEntityPlaceholder = "%MesEntity%"; @@ -285,7 +286,11 @@ public class FileRead : Properties.IFileRead continue; datePlaceholder = string.Concat('%', segment, '%'); } - result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileName.Replace(rdsPlaceholder, rds).Replace(mesEntityPlaceholder, logistics.MesEntity).Replace(datePlaceholder, dateValue)); + fileName = scopeInfo.FileName.Replace(rdsPlaceholder, rds).Replace(mesEntityPlaceholder, logistics.MesEntity).Replace(datePlaceholder, dateValue); + if (!duplicateFile.Contains("Viewer")) + result = Path.Combine(duplicateDirectory, fileName); + else + result = Path.Combine(duplicateDirectory, $"Viewer_{fileName}"); } if (result.Contains('%')) throw new Exception("Placeholder exists!"); @@ -318,7 +323,7 @@ public class FileRead : Properties.IFileRead else if (!scopeInfo.FileName.Contains('%')) tupleFile = string.Concat(duplicateDirectory, @"\", fileName, "_", scopeInfo.FileNameWithoutExtension, ".pdsfc"); else - tupleFile = GetTupleFile(logistics, descriptions, scopeInfo, duplicateDirectory); + tupleFile = GetTupleFile(logistics, descriptions, scopeInfo, duplicateDirectory, duplicateFile); tupleFileName = Path.GetFileNameWithoutExtension(tupleFile).Split('.')[0]; duplicateFiles.Add(tupleFile); if (_IsEAFHosted) diff --git a/Adaptation/package.json b/Adaptation/package.json index 9ee1a89..18c52a4 100644 --- a/Adaptation/package.json +++ b/Adaptation/package.json @@ -19,14 +19,8 @@ "HA-Extract.Staging.v2_47_0-HGCV3-Staging__v2_47_1__HGCV3__pcl637812984345592512__MinFileLength": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_0 & ClassName~HGCV3 & Name~Staging__v2_47_1__HGCV3__pcl637812984345592512__MinFileLength\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", "HB-Extract.Staging.v2_47_1-MET08RESIHGCV-Staging__v2_47_1__MET08RESIHGCV__OpenInsight638054470203066399__IqsSql": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~MET08RESIHGCV & Name~Staging__v2_47_1__MET08RESIHGCV__OpenInsight638054470203066399__IqsSql\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", "Alpha": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "nuget-clear": "dotnet nuget locals all --clear", - "build": "dotnet build --runtime win-x64 --self-contained", - "build-Package-Management": "dotnet build --runtime win-x64 --self-contained --source https://packagemanagement.eu.infineon.com:4430/api/v2/", - "build-nuget-And-Package-Management": "dotnet build --runtime win-x64 --self-contained --source https://api.nuget.org/v3/index.json --source https://packagemanagement.eu.infineon.com:4430/api/v2/", - "build-All-Sources": "dotnet build --runtime win-x64 --self-contained --source https://api.nuget.org/v3/index.json --source https://packagemanagement.eu.infineon.com:4430/api/v2/ --source https://tfs.intra.infineon.com/tfs/ManufacturingIT/_packaging/eaf/nuget/v3/index.json --source http://192.168.0.73:5002/v3/index.json", - "dotnet-format": "dotnet format --report .vscode --verbosity detailed --severity warn", - "MSBuild": "\"C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe\" /target:Build /restore:True /p:RestoreSources=https://api.nuget.org/v3/index.json%3Bhttps://packagemanagement.eu.infineon.com:4430/api/v2/%3Bhttps://tfs.intra.infineon.com/tfs/ManufacturingIT/_packaging/eaf/nuget/v3/index.json /detailedsummary /consoleloggerparameters:PerformanceSummary;ErrorsOnly; /property:Configuration=Debug;TargetFrameworkVersion=v4.8 ../MET08RESIHGCV.csproj", - "pull": "git pull", + "kanbn.board": "kanbn board", + "kanbn.board.json": "kanbn board -j > .kanbn/board.json", "garbage-collect": "git gc" } } \ No newline at end of file