From 1bb3ed070394ad017bd0dc60d915eaf531dd88df Mon Sep 17 00:00:00 2001 From: luizk Date: Wed, 11 Oct 2017 15:11:05 -0300 Subject: [PATCH 01/20] =?UTF-8?q?Adicionando=20psr4=20e=20o=20autoload=20p?= =?UTF-8?q?ara=20utiliza=C3=A7=C3=A3o=20com=20tecnologias=20mais=20atuais?= =?UTF-8?q?=20como=20o=20comphoser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Itaucripto.php | 657 ++++++++++++++++++++++++------------------------- composer.json | 18 ++ 2 files changed, 338 insertions(+), 337 deletions(-) create mode 100644 composer.json diff --git a/Itaucripto.php b/Itaucripto.php index 72de9e8..9d0dd28 100644 --- a/Itaucripto.php +++ b/Itaucripto.php @@ -1,4 +1,7 @@ sbox = array(); + $this->key = array(); + + $this->numPed = ""; + $this->tipPag = ""; + $this->codEmp = ""; + } + + //$dados, $chave + private function Algoritmo($paramString1, $paramString2) { + $paramString2 = strtoupper($paramString2); + + $k = 0; + $m = 0; + + $str = ""; + $this->Inicializa($paramString2); + + for ($j = 1; $j <= strlen($paramString1); $j++) { + $k = ($k + 1) % 256; + $m = ($m + $this->sbox[$k]) % 256; + $i = $this->sbox[$k]; + $this->sbox[$k] = $this->sbox[$m]; + $this->sbox[$m] = $i; + + $n = $this->sbox[(($this->sbox[$k] + $this->sbox[$m]) % 256)]; + + $i1 = (ord(substr($paramString1, ($j - 1), 1)) ^ $n); + + $str = $str . chr($i1); + } + + return $str; + } + + private function PreencheBranco($paramString, $paramInt) { + $str = $paramString . ""; + + while (strlen($str) < $paramInt) { + $str = $str . " "; + } + + return substr($str, 0, $paramInt); + } + + private function PreencheZero($paramString, $paramInt) { + $str = $paramString . ""; + + while (strlen($str) < $paramInt) { + $str = "0" . $str; + } + + return substr($str, 0, $paramInt); + } + + private function Inicializa($paramString) { + $m = strlen($paramString); + + for ($j = 0; $j <= 255; $j++) { + $this->key[$j] = substr($paramString, ($j % $m), 1); + $this->sbox[$j] = $j; + } + + $k = 0; + + for ($j = 0; $j <= 255; $j++) { + $k = ($k + $this->sbox[$j] + ord($this->key[$j])) % 256; + $i = $this->sbox[$j]; + $this->sbox[$j] = $this->sbox[$k]; + $this->sbox[$k] = $i; + } + } + + //Função criada para substituir o Math.random() do Java + //Retorna um número entre 0.0 e 0.9999999999 (equivalente ao Double do Java, mas com menor precisão) + private function JavaRandom() { + return rand(0, 999999999) / 1000000000; + } + + //Retira as letras acentuadas e substitui pelas não acentuadas + private function TiraAcento($str) { + return strtr(utf8_decode($str), utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'), 'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy'); + } + + private function Converte($paramString) { + $c = chr(floor(26.0 * $this->JavaRandom() + 65.0)); + $str = "" . $c; + + for ($i = 0; $i < strlen($paramString); $i++) { + $k = substr($paramString, $i, 1); + $j = ord($k); + $str = $str . $j; + $c = chr(floor(26.0 * $this->JavaRandom() + 65.0)); + $str = $str . $c; + } + + return $str; + } + + private function Desconverte($paramString) { + $str1 = ""; + + for ($i = 0; $i < strlen($paramString); $i++) { + $str2 = ""; + + $c = substr($paramString, $i, 1); + + while (is_numeric($c)) { + $str2 = $str2 . substr($paramString, $i, 1); + $i += 1; + $c = substr($paramString, $i, 1); + } + + if ($str2 != "") { + $j = $str2 + 0; + $str1 = $str1 . chr($j); + } + } + + return $str1; + } + + //$codEmp,$pedido,$valor,$observacao,$chave,$nomeSacado,$codigoInscricao,$numeroInscricao,$enderecoSacado,$bairroSacado,$cepSacado,$cidadeSacado,$estadoSacado,$dataVencimento,$urlRetorna,$obsAd1,$obsAd2,$obsAd3 + public function geraDados($paramString1, $paramString2, $paramString3, $paramString4, $paramString5, $paramString6, $paramString7, $paramString8, $paramString9, $paramString10, $paramString11, $paramString12, $paramString13, $paramString14, $paramString15, $paramString16, $paramString17, $paramString18) { + $paramString1 = strtoupper($paramString1); + $paramString5 = strtoupper($paramString5); + + if (strlen($paramString1) != $this->TAM_COD_EMP) { + return "Erro: tamanho do codigo da empresa diferente de 26 posições."; + } + + if (strlen($paramString5) != $this->TAM_CHAVE) { + return "Erro: tamanho da chave da chave diferente de 16 posições."; + } + + if ((strlen($paramString2) < 1) || (strlen($paramString2) > 8)) { + return "Erro: número do pedido inválido."; + } + + if (is_numeric($paramString2)) { + $paramString2 = $this->PreencheZero($paramString2, 8); + } else { + return "Erro: numero do pedido não é numérico."; + } + + if ((strlen($paramString3) < 1) || (strlen($paramString3) > 11)) { + return "Erro: valor da compra inválido."; + } + + $i = strpos($paramString3, ','); + + if ($i !== FALSE) { + $str3 = substr($paramString3, ($i + 1)); + + if (!is_numeric($str3)) { + return "Erro: valor decimal não é numérico."; + } + + if (strlen($str3) != 2) { + return "Erro: valor decimal da compra deve possuir 2 posições após a virgula."; + } + + $paramString3 = substr($paramString3, 0, strlen($paramString3) - 3) . $str3; + } else { + if (!is_numeric($paramString3)) { + return "Erro: valor da compra não é numérico."; + } + + if (strlen($paramString3) > 8) { + return "Erro: valor da compra deve possuir no máximo 8 posições antes da virgula."; + } + + $paramString3 = $paramString3 . "00"; + } + + $paramString3 = $this->PreencheZero($paramString3, 10); + + $paramString7 = trim($paramString7); + + if (($paramString7 != "02") && ($paramString7 != "01") && ($paramString7 != "")) { + return "Erro: código de inscrição inválido."; + } + + if (($paramString8 != "") && (!is_numeric($paramString8)) && (strlen($paramString8) > 14)) { + return "Erro: número de inscrição inválido."; + } + + if (($paramString11 != "") && ((!is_numeric($paramString11)) || (strlen($paramString11) != 8))) { + return "Erro: cep inválido."; + } + + if (($paramString14 != "") && ((!is_numeric($paramString14)) || (strlen($paramString14) != 8))) { + return "Erro: data de vencimento inválida."; + } + + if (strlen($paramString16) > 60) { + return "Erro: observação adicional 1 inválida."; + } -class Itaucripto -{ - public $sbox; - public $key; - public $codEmp; - public $numPed; - public $tipPag; - public $CHAVE_ITAU = "SEGUNDA12345ITAU"; - public $TAM_COD_EMP = 26; - public $TAM_CHAVE = 16; - public $dados; - - function __construct() - { - $this->sbox = array(); - $this->key = array(); - - $this->numPed = ""; - $this->tipPag = ""; - $this->codEmp = ""; - } - - //$dados, $chave - private function Algoritmo($paramString1, $paramString2) - { - $paramString2 = strtoupper($paramString2); - - $k = 0; - $m = 0; - - $str = ""; - $this->Inicializa($paramString2); - - for ($j = 1; $j <= strlen($paramString1); $j++) { - $k = ($k + 1) % 256; - $m = ($m + $this->sbox[$k]) % 256; - $i = $this->sbox[$k]; - $this->sbox[$k] = $this->sbox[$m]; - $this->sbox[$m] = $i; - - $n = $this->sbox[(($this->sbox[$k] + $this->sbox[$m]) % 256)]; - - $i1 = (ord(substr($paramString1, ($j - 1), 1)) ^ $n); - - $str = $str . chr($i1); - } - - return $str; - } - - private function PreencheBranco($paramString, $paramInt) - { - $str = $paramString . ""; - - while (strlen($str) < $paramInt) { - $str = $str . " "; - } - - return substr($str, 0, $paramInt); - } - - private function PreencheZero($paramString, $paramInt) - { - $str = $paramString . ""; - - while (strlen($str) < $paramInt) { - $str = "0" . $str; - } - - return substr($str, 0, $paramInt); - } - - private function Inicializa($paramString) - { - $m = strlen($paramString); - - for ($j = 0; $j <= 255; $j++) { - $this->key[$j] = substr($paramString, ($j % $m), 1); - $this->sbox[$j] = $j; - } - - $k = 0; - - for ($j = 0; $j <= 255; $j++) { - $k = ($k + $this->sbox[$j] + ord($this->key[$j])) % 256; - $i = $this->sbox[$j]; - $this->sbox[$j] = $this->sbox[$k]; - $this->sbox[$k] = $i; - } - } - - //Função criada para substituir o Math.random() do Java - //Retorna um número entre 0.0 e 0.9999999999 (equivalente ao Double do Java, mas com menor precisão) - private function JavaRandom() - { - return rand(0, 999999999) / 1000000000; - } - - //Retira as letras acentuadas e substitui pelas não acentuadas - private function TiraAcento($str) - { - return strtr(utf8_decode($str),utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy'); - } - - private function Converte($paramString) - { - $c = chr(floor(26.0 * $this->JavaRandom() + 65.0)); - $str = "" . $c; - - for ($i = 0; $i < strlen($paramString); $i++) { - $k = substr($paramString, $i, 1); - $j = ord($k); - $str = $str . $j; - $c = chr(floor(26.0 * $this->JavaRandom() + 65.0)); - $str = $str . $c; - } - - return $str; - } - - private function Desconverte($paramString) - { - $str1 = ""; - - for ($i = 0; $i < strlen($paramString); $i++) { - $str2 = ""; + if (strlen($paramString17) > 60) { + return "Erro: observação adicional 2 inválida."; + } - $c = substr($paramString, $i, 1); - - while (is_numeric($c)) { - $str2 = $str2 . substr($paramString, $i, 1); - $i += 1; - $c = substr($paramString, $i, 1); - } - - if ($str2 != "") { - $j = $str2 + 0; - $str1 = $str1 . chr($j); - } - } - - return $str1; - } - - //$codEmp,$pedido,$valor,$observacao,$chave,$nomeSacado,$codigoInscricao,$numeroInscricao,$enderecoSacado,$bairroSacado,$cepSacado,$cidadeSacado,$estadoSacado,$dataVencimento,$urlRetorna,$obsAd1,$obsAd2,$obsAd3 - public function geraDados($paramString1, $paramString2, $paramString3, $paramString4, $paramString5, $paramString6, $paramString7, $paramString8, $paramString9, $paramString10, $paramString11, $paramString12, $paramString13, $paramString14, $paramString15, $paramString16, $paramString17, $paramString18) - { - $paramString1 = strtoupper($paramString1); - $paramString5 = strtoupper($paramString5); - - if (strlen($paramString1) != $this->TAM_COD_EMP) { - return "Erro: tamanho do codigo da empresa diferente de 26 posições."; - } - - if (strlen($paramString5) != $this->TAM_CHAVE) { - return "Erro: tamanho da chave da chave diferente de 16 posições."; - } - - if ((strlen($paramString2) < 1) || (strlen($paramString2) > 8)) { - return "Erro: número do pedido inválido."; - } - - if (is_numeric($paramString2)) { - $paramString2 = $this->PreencheZero($paramString2, 8); - } else { - return "Erro: numero do pedido não é numérico."; - } - - if ((strlen($paramString3) < 1) || (strlen($paramString3) > 11)) { - return "Erro: valor da compra inválido."; - } - - $i = strpos($paramString3, ','); - - if ($i !== FALSE) { - $str3 = substr($paramString3, ($i + 1)); - - if (!is_numeric($str3)) { - return "Erro: valor decimal não é numérico."; - } - - if (strlen($str3) != 2) { - return "Erro: valor decimal da compra deve possuir 2 posições após a virgula."; - } - - $paramString3 = substr($paramString3, 0, strlen($paramString3) - 3) . $str3; - } else { - if (!is_numeric($paramString3)) { - return "Erro: valor da compra não é numérico."; - } - - if (strlen($paramString3) > 8) { - return "Erro: valor da compra deve possuir no máximo 8 posições antes da virgula."; - } - - $paramString3 = $paramString3 . "00"; - } - - $paramString3 = $this->PreencheZero($paramString3, 10); - - $paramString7 = trim($paramString7); - - if (($paramString7 != "02") && ($paramString7 != "01") && ($paramString7 != "")) { - return "Erro: código de inscrição inválido."; - } - - if (($paramString8 != "") && (!is_numeric($paramString8)) && (strlen($paramString8) > 14)) { - return "Erro: número de inscrição inválido."; - } - - if (($paramString11 != "") && ((!is_numeric($paramString11)) || (strlen($paramString11) != 8))) { - return "Erro: cep inválido."; - } - - if (($paramString14 != "") && ((!is_numeric($paramString14)) || (strlen($paramString14) != 8))) { - return "Erro: data de vencimento inválida."; - } - - if (strlen($paramString16) > 60) { - return "Erro: observação adicional 1 inválida."; - } - - if (strlen($paramString17) > 60) { - return "Erro: observação adicional 2 inválida."; - } + if (strlen($paramString18) > 60) { + return "Erro: observação adicional 3 inválida."; + } - if (strlen($paramString18) > 60) { - return "Erro: observação adicional 3 inválida."; - } + //Retira os acentos + $paramString4 = $this->TiraAcento($paramString4); + $paramString6 = $this->TiraAcento($paramString6); + $paramString9 = $this->TiraAcento($paramString9); + $paramString10 = $this->TiraAcento($paramString10); + $paramString12 = $this->TiraAcento($paramString12); + $paramString16 = $this->TiraAcento($paramString16); + $paramString17 = $this->TiraAcento($paramString17); + $paramString18 = $this->TiraAcento($paramString18); - //Retira os acentos - $paramString4 = $this->TiraAcento($paramString4); - $paramString6 = $this->TiraAcento($paramString6); - $paramString9 = $this->TiraAcento($paramString9); - $paramString10 = $this->TiraAcento($paramString10); - $paramString12 = $this->TiraAcento($paramString12); - $paramString16 = $this->TiraAcento($paramString16); - $paramString17 = $this->TiraAcento($paramString17); - $paramString18 = $this->TiraAcento($paramString18); + $paramString4 = $this->PreencheBranco($paramString4, 40); + $paramString6 = $this->PreencheBranco($paramString6, 30); + $paramString7 = $this->PreencheBranco($paramString7, 2); + $paramString8 = $this->PreencheBranco($paramString8, 14); + $paramString9 = $this->PreencheBranco($paramString9, 40); + $paramString10 = $this->PreencheBranco($paramString10, 15); + $paramString11 = $this->PreencheBranco($paramString11, 8); + $paramString12 = $this->PreencheBranco($paramString12, 15); + $paramString13 = $this->PreencheBranco($paramString13, 2); + $paramString14 = $this->PreencheBranco($paramString14, 8); + $paramString15 = $this->PreencheBranco($paramString15, 60); + $paramString16 = $this->PreencheBranco($paramString16, 60); + $paramString17 = $this->PreencheBranco($paramString17, 60); + $paramString18 = $this->PreencheBranco($paramString18, 60); - $paramString4 = $this->PreencheBranco($paramString4, 40); - $paramString6 = $this->PreencheBranco($paramString6, 30); - $paramString7 = $this->PreencheBranco($paramString7, 2); - $paramString8 = $this->PreencheBranco($paramString8, 14); - $paramString9 = $this->PreencheBranco($paramString9, 40); - $paramString10 = $this->PreencheBranco($paramString10, 15); - $paramString11 = $this->PreencheBranco($paramString11, 8); - $paramString12 = $this->PreencheBranco($paramString12, 15); - $paramString13 = $this->PreencheBranco($paramString13, 2); - $paramString14 = $this->PreencheBranco($paramString14, 8); - $paramString15 = $this->PreencheBranco($paramString15, 60); - $paramString16 = $this->PreencheBranco($paramString16, 60); - $paramString17 = $this->PreencheBranco($paramString17, 60); - $paramString18 = $this->PreencheBranco($paramString18, 60); + $str1 = $this->Algoritmo($paramString2 . $paramString3 . $paramString4 . $paramString6 . $paramString7 . $paramString8 . $paramString9 . $paramString10 . $paramString11 . $paramString12 . $paramString13 . $paramString14 . $paramString15 . $paramString16 . $paramString17 . $paramString18, $paramString5); - $str1 = $this->Algoritmo($paramString2 . $paramString3 . $paramString4 . $paramString6 . $paramString7 . $paramString8 . $paramString9 . $paramString10 . $paramString11 . $paramString12 . $paramString13 . $paramString14 . $paramString15 . $paramString16 . $paramString17 . $paramString18, $paramString5); + $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); - $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); + return $this->Converte($str2); + } - return $this->Converte($str2); - } + public function geraCripto($paramString1, $paramString2, $paramString3) { + if (strlen($paramString1) != $this->TAM_COD_EMP) { + return "Erro: tamanho do codigo da empresa diferente de 26 posições."; + } - public function geraCripto($paramString1, $paramString2, $paramString3) - { - if (strlen($paramString1) != $this->TAM_COD_EMP) { - return "Erro: tamanho do codigo da empresa diferente de 26 posições."; - } + if (strlen($paramString3) != $this->TAM_CHAVE) { + return "Erro: tamanho da chave da chave diferente de 16 posições."; + } - if (strlen($paramString3) != $this->TAM_CHAVE) { - return "Erro: tamanho da chave da chave diferente de 16 posições."; - } + $paramString2 = trim($paramString2); - $paramString2 = trim($paramString2); + if ($paramString2 == "") { + return "Erro: código do sacado inválido."; + } - if ($paramString2 == "") { - return "Erro: código do sacado inválido."; - } + $str1 = $this->Algoritmo($paramString2, $paramString3); - $str1 = $this->Algoritmo($paramString2, $paramString3); + $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); - $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); + return $this->Converte($str2); + } - return $this->Converte($str2); - } + public function geraConsulta($paramString1, $paramString2, $paramString3, $paramString4) { + if (strlen($paramString1) != $this->TAM_COD_EMP) { + return "Erro: tamanho do codigo da empresa diferente de 26 posições."; + } - public function geraConsulta($paramString1, $paramString2, $paramString3, $paramString4) - { - if (strlen($paramString1) != $this->TAM_COD_EMP) { - return "Erro: tamanho do codigo da empresa diferente de 26 posições."; - } + if (strlen($paramString4) != $this->TAM_CHAVE) { + return "Erro: tamanho da chave da chave diferente de 16 posições."; + } - if (strlen($paramString4) != $this->TAM_CHAVE) { - return "Erro: tamanho da chave da chave diferente de 16 posições."; - } + if ((strlen($paramString2) < 1) || (strlen($paramString2) > 8)) { + return "Erro: número do pedido inválido."; + } - if ((strlen($paramString2) < 1) || (strlen($paramString2) > 8)) { - return "Erro: número do pedido inválido."; - } + if (is_numeric($paramString2)) { + $paramString2 = $this->PreencheZero($paramString2, 8); + } else { + return "Erro: numero do pedido não é numérico."; + } - if (is_numeric($paramString2)) { - $paramString2 = $this->PreencheZero($paramString2, 8); - } else { - return "Erro: numero do pedido não é numérico."; - } + if (($paramString3 != "0") && ($paramString3 != "1")) { + return "Erro: formato inválido."; + } - if (($paramString3 != "0") && ($paramString3 != "1")) { - return "Erro: formato inválido."; - } + $str1 = $this->Algoritmo($paramString2 . $paramString3, $paramString4); - $str1 = $this->Algoritmo($paramString2 . $paramString3, $paramString4); + $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); - $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); + return $this->Converte($str2); + } - return $this->Converte($str2); - } + //$dados, $chave + public function decripto($paramString1, $paramString2) { + //A chave precisa sempre estar em maiusculo + $paramString2 = strtoupper($paramString2); - //$dados, $chave - public function decripto($paramString1, $paramString2) - { - //A chave precisa sempre estar em maiusculo - $paramString2 = strtoupper($paramString2); + $paramString1 = $this->Desconverte($paramString1); - $paramString1 = $this->Desconverte($paramString1); + $str = $this->Algoritmo($paramString1, $paramString2); - $str = $this->Algoritmo($paramString1, $paramString2); + $this->codEmp = substr($str, 0, 26); - $this->codEmp = substr($str, 0, 26); + $this->numPed = substr($str, 26, 8); - $this->numPed = substr($str, 26, 8); + $this->tipPag = substr($str, 34, 2); - $this->tipPag = substr($str, 34, 2); + return $str; + } - return $str; - } + public function retornaCodEmp() { + return $this->codEmp; + } - public function retornaCodEmp() - { - return $this->codEmp; - } + public function retornaPedido() { + return $this->numPed; + } - public function retornaPedido() - { - return $this->numPed; - } + public function retornaTipPag() { + return $this->tipPag; + } - public function retornaTipPag() - { - return $this->tipPag; - } + public function geraDadosGenerico($paramString1, $paramString2, $paramString3) { + $paramString1 = strtoupper($paramString1); + $paramString3 = strtoupper($paramString3); - public function geraDadosGenerico($paramString1, $paramString2, $paramString3) - { - $paramString1 = strtoupper($paramString1); - $paramString3 = strtoupper($paramString3); + if (strlen($paramString1) != $this->TAM_COD_EMP) { + return "Erro: tamanho do codigo da empresa diferente de 26 posições."; + } - if (strlen($paramString1) != $this->TAM_COD_EMP) - { - return "Erro: tamanho do codigo da empresa diferente de 26 posições."; - } + if (strlen($paramString3) != $this->TAM_CHAVE) { + return "Erro: tamanho da chave da chave diferente de 16 posições."; + } - if (strlen($paramString3) != $this->TAM_CHAVE) - { - return "Erro: tamanho da chave da chave diferente de 16 posições."; - } + if (strlen($paramString2) < 1) { + return "Erro: sem dados."; + } - if (strlen($paramString2) < 1) - { - return "Erro: sem dados."; - } + $str1 = $this->Algoritmo($paramString2, $paramString3); - $str1 = $this->Algoritmo($paramString2, $paramString3); + $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); - $str2 = $this->Algoritmo($paramString1 . $str1, $this->CHAVE_ITAU); + return $this->Converte($str2); + } - return $this->Converte($str2); - } } ?> \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..b96fa1a --- /dev/null +++ b/composer.json @@ -0,0 +1,18 @@ +{ + "name": "gabrielrcouto/php-itaucripto", + "description": "PHP ITAUCRIPTO", + "type": "project", + "license": "BSD-3-Clause", + "keywords": [ + "itau", + "cripto" + ], + "homepage": "https://github.com/gabrielrcouto/php-itaucripto", + "require": { + }, + "autoload": { + "psr-4": { + "Itaucripto\\": "" + } + } +} From 98d87e8d2be239874636882cdd8dc2b61fdc7b9f Mon Sep 17 00:00:00 2001 From: luizk Date: Wed, 11 Oct 2017 15:20:59 -0300 Subject: [PATCH 02/20] =?UTF-8?q?Adicionando=20psr4=20e=20o=20autoload=20p?= =?UTF-8?q?ara=20utiliza=C3=A7=C3=A3o=20com=20tecnologias=20mais=20atuais?= =?UTF-8?q?=20como=20o=20comphoser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index b96fa1a..59957fc 100644 --- a/composer.json +++ b/composer.json @@ -15,4 +15,4 @@ "Itaucripto\\": "" } } -} +} \ No newline at end of file From 8bdb3851526b234fd245ea024dd61a1f6eac23ce Mon Sep 17 00:00:00 2001 From: luizk Date: Wed, 11 Oct 2017 15:26:47 -0300 Subject: [PATCH 03/20] =?UTF-8?q?Adicionando=20psr4=20e=20o=20autoload=20p?= =?UTF-8?q?ara=20utiliza=C3=A7=C3=A3o=20com=20tecnologias=20mais=20atuais?= =?UTF-8?q?=20como=20o=20comphoser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 59957fc..e0990d6 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "gabrielrcouto/php-itaucripto", + "name": "ControleOnline/php-itaucripto", "description": "PHP ITAUCRIPTO", "type": "project", "license": "BSD-3-Clause", @@ -7,7 +7,7 @@ "itau", "cripto" ], - "homepage": "https://github.com/gabrielrcouto/php-itaucripto", + "homepage": "https://github.com/ControleOnline/php-itaucripto", "require": { }, "autoload": { From a1d67e6cce11fe2cd9dfc25ef7ba42ed3e76f249 Mon Sep 17 00:00:00 2001 From: luizk Date: Wed, 11 Oct 2017 22:36:57 -0300 Subject: [PATCH 04/20] =?UTF-8?q?Adicionando=20psr4=20e=20o=20autoload=20p?= =?UTF-8?q?ara=20utiliza=C3=A7=C3=A3o=20com=20tecnologias=20mais=20atuais?= =?UTF-8?q?=20como=20o=20comphoser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Itaucripto.php | 2 -- composer.json | 5 ++++- teste.php | 13 ++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Itaucripto.php b/Itaucripto.php index 9d0dd28..69caced 100644 --- a/Itaucripto.php +++ b/Itaucripto.php @@ -369,5 +369,3 @@ public function geraDadosGenerico($paramString1, $paramString2, $paramString3) { } } - -?> \ No newline at end of file diff --git a/composer.json b/composer.json index e0990d6..dfc6070 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,9 @@ "autoload": { "psr-4": { "Itaucripto\\": "" - } + }, + "classmap": [ + "Itaucripto.php" + ] } } \ No newline at end of file diff --git a/teste.php b/teste.php index a83527f..44d294c 100644 --- a/teste.php +++ b/teste.php @@ -8,23 +8,22 @@ $pedido = "1234"; $valor = "1,99"; - $observacao = "Essa uma observao"; - $nomeSacado = "Jos Antnio"; + $observacao = "Essa � uma observa��o"; + $nomeSacado = "Jos� Ant�nio"; $codigoInscricao = "01"; $numeroInscricao = "82938674341"; - $enderecoSacado = "Rua das Hortncias"; + $enderecoSacado = "Rua das Hort�ncias"; $bairroSacado = "Jardim das Flores"; $cepSacado = "13080040"; $cidadeSacado = "Campinas"; $estadoSacado = "SP"; $dataVencimento = "31122013"; $urlRetorna = "retorno/retorno.php"; - $obsAd1 = "Aqui vai a observao 1"; - $obsAd2 = "Aqui vai a observao 2"; - $obsAd3 = "Aqui vai a observao 3"; + $obsAd1 = "Aqui vai a observa��o 1"; + $obsAd2 = "Aqui vai a observa��o 2"; + $obsAd3 = "Aqui vai a observa��o 3"; $dados = $cripto->geraDados($codEmp,$pedido,$valor,$observacao,$chave,$nomeSacado,$codigoInscricao,$numeroInscricao,$enderecoSacado,$bairroSacado,$cepSacado,$cidadeSacado,$estadoSacado,$dataVencimento,$urlRetorna,$obsAd1,$obsAd2,$obsAd3); echo $dados; -?> \ No newline at end of file From 0822ffc55a5ae27269f15eeea101fe3ead7bab76 Mon Sep 17 00:00:00 2001 From: luizk Date: Wed, 11 Oct 2017 22:45:42 -0300 Subject: [PATCH 05/20] CHange to psr-0 --- composer.json | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index dfc6070..65176db 100644 --- a/composer.json +++ b/composer.json @@ -11,11 +11,8 @@ "require": { }, "autoload": { - "psr-4": { - "Itaucripto\\": "" - }, - "classmap": [ - "Itaucripto.php" - ] + "psr-0": { + "Itaucripto\\": "./" + } } } \ No newline at end of file From ce26962abaa4e28bbddcb32d89de87a266f7602f Mon Sep 17 00:00:00 2001 From: luizk Date: Wed, 11 Oct 2017 22:51:03 -0300 Subject: [PATCH 06/20] CHange to psr-0 --- composer.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 65176db..828923f 100644 --- a/composer.json +++ b/composer.json @@ -10,9 +10,12 @@ "homepage": "https://github.com/ControleOnline/php-itaucripto", "require": { }, - "autoload": { - "psr-0": { - "Itaucripto\\": "./" - } + "autoload": { + "psr-4": { + "Itaucripto\\": "" + }, + "classmap": [ + "Itaucripto.php" + ] } } \ No newline at end of file From 70a76742d1d0a857b65ea2aff4cc880ded068529 Mon Sep 17 00:00:00 2001 From: luizk Date: Wed, 11 Oct 2017 23:00:44 -0300 Subject: [PATCH 07/20] Change to psr-0 --- composer.json | 2 +- Itaucripto.php => utaucripto.php | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename Itaucripto.php => utaucripto.php (100%) diff --git a/composer.json b/composer.json index 828923f..872eb0c 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "Itaucripto\\": "" }, "classmap": [ - "Itaucripto.php" + "itaucripto.php" ] } } \ No newline at end of file diff --git a/Itaucripto.php b/utaucripto.php similarity index 100% rename from Itaucripto.php rename to utaucripto.php From 24a7b7df36cf7941d69c2cf26193b37ff1f38bd2 Mon Sep 17 00:00:00 2001 From: luizk Date: Wed, 11 Oct 2017 23:00:55 -0300 Subject: [PATCH 08/20] Change to psr-0 --- utaucripto.php => itaucripto.php | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename utaucripto.php => itaucripto.php (100%) diff --git a/utaucripto.php b/itaucripto.php similarity index 100% rename from utaucripto.php rename to itaucripto.php From 65b7e455dd9f3f19ed78a5290051312b94edb12d Mon Sep 17 00:00:00 2001 From: luizk Date: Wed, 11 Oct 2017 23:04:54 -0300 Subject: [PATCH 09/20] Change to psr-0 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 872eb0c..0de070a 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "ControleOnline/php-itaucripto", + "name": "controleonline/php-itaucripto", "description": "PHP ITAUCRIPTO", "type": "project", "license": "BSD-3-Clause", From d655bab666976f64d66f7c48687a16b117201bcc Mon Sep 17 00:00:00 2001 From: luizkim Date: Sat, 15 Aug 2026 03:43:19 +0000 Subject: [PATCH 10/20] chore(ci): add manager-worker orchestrator (canonical) --- .github/workflows/manager-worker.yml | 144 +++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 .github/workflows/manager-worker.yml diff --git a/.github/workflows/manager-worker.yml b/.github/workflows/manager-worker.yml new file mode 100644 index 0000000..c5ffa44 --- /dev/null +++ b/.github/workflows/manager-worker.yml @@ -0,0 +1,144 @@ +name: Manager Worker + +on: + push: + branches: [master, dev, staging] + +permissions: + contents: read + issues: write + pull-requests: write + +# Orquestrador: Manager resolve/cria issue e decide quais workers invocar. +# Padrão de branch da org = master (não usar main). +jobs: + manager: + name: Manager — resolve + plano de workers + runs-on: ubuntu-latest + outputs: + issue_number: ${{ steps.mgr.outputs.issue_number }} + created: ${{ steps.mgr.outputs.created }} + run_qa: ${{ steps.mgr.outputs.run_qa }} + run_security: ${{ steps.mgr.outputs.run_security }} + run_docs: ${{ steps.mgr.outputs.run_docs }} + run_gates: ${{ steps.mgr.outputs.run_gates }} + base_branch: ${{ steps.mgr.outputs.base_branch }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Manager subworker + id: mgr + uses: ./.github/actions/workers/manager + with: + gh_token: ${{ secrets.GH_TOKEN }} + branch: ${{ github.ref_name }} + + # Workers invocados pelo plano do Manager (paralelo quando ambos true) + qa: + name: QA (invocado pelo Manager) + needs: manager + if: needs.manager.outputs.run_qa == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/workers/qa + with: + gh_token: ${{ secrets.GH_TOKEN }} + issue_number: ${{ needs.manager.outputs.issue_number }} + base_branch: ${{ needs.manager.outputs.base_branch }} + + security: + name: Security (invocado pelo Manager) + needs: manager + if: needs.manager.outputs.run_security == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/workers/security + with: + gh_token: ${{ secrets.GH_TOKEN }} + issue_number: ${{ needs.manager.outputs.issue_number }} + base_branch: ${{ needs.manager.outputs.base_branch }} + + technical-documenter: + name: Technical Documenter (invocado pelo Manager) + needs: manager + if: needs.manager.outputs.run_docs == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/workers/technical-documenter + with: + gh_token: ${{ secrets.GH_TOKEN }} + issue_number: ${{ needs.manager.outputs.issue_number }} + base_branch: ${{ needs.manager.outputs.base_branch }} + + # master: se faltar gate do quarteto → tags + workers faltantes + master-gates: + name: Master gates (quarteto) + needs: manager + if: needs.manager.outputs.run_gates == 'true' + runs-on: ubuntu-latest + outputs: + need_qa: ${{ steps.check.outputs.need_qa }} + need_security: ${{ steps.check.outputs.need_security }} + need_docs: ${{ steps.check.outputs.need_docs }} + steps: + - uses: actions/checkout@v4 + - name: Inspect quarteto e tags + id: check + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + ISSUE: ${{ needs.manager.outputs.issue_number }} + REPO: ${{ github.repository }} + run: | + set -euo pipefail + LABELS=$(gh issue view "$ISSUE" --repo "$REPO" --json labels --jq '[.labels[].name] | join(",")') + echo "Labels: $LABELS" + + need_qa=false + need_security=false + need_docs=false + + echo "$LABELS" | grep -q 'qa:accepted' || need_qa=true + echo "$LABELS" | grep -q 'security:accepted' || need_security=true + echo "$LABELS" | grep -q 'agent:technical-documenter:done' || need_docs=true + + echo "need_qa=$need_qa" >> "$GITHUB_OUTPUT" + echo "need_security=$need_security" >> "$GITHUB_OUTPUT" + echo "need_docs=$need_docs" >> "$GITHUB_OUTPUT" + + [ "$need_qa" = true ] && gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:qa" || true + [ "$need_security" = true ] && gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:security" || true + [ "$need_docs" = true ] && gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:technical-documenter" || true + + gh issue comment "$ISSUE" --repo "$REPO" --body \ + "Master gates (Manager): need_qa=$need_qa need_security=$need_security need_docs=$need_docs" + + master-qa: + name: QA (master gap via Manager) + needs: [manager, master-gates] + if: needs.master-gates.outputs.need_qa == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/workers/qa + with: + gh_token: ${{ secrets.GH_TOKEN }} + issue_number: ${{ needs.manager.outputs.issue_number }} + base_branch: master + + master-security: + name: Security (master gap via Manager) + needs: [manager, master-gates] + if: needs.master-gates.outputs.need_security == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/workers/security + with: + gh_token: ${{ secrets.GH_TOKEN }} + issue_number: ${{ needs.manager.outputs.issue_number }} + base_branch: master From b76972f62be94209e30838c8a61af5ff976d9f18 Mon Sep 17 00:00:00 2001 From: luizkim Date: Sat, 15 Aug 2026 03:43:20 +0000 Subject: [PATCH 11/20] chore(ci): add manager subworker composite action --- .github/actions/workers/manager/action.yml | 147 +++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 .github/actions/workers/manager/action.yml diff --git a/.github/actions/workers/manager/action.yml b/.github/actions/workers/manager/action.yml new file mode 100644 index 0000000..8348868 --- /dev/null +++ b/.github/actions/workers/manager/action.yml @@ -0,0 +1,147 @@ +name: Manager Subworker +description: Resolve/cria issue, aplica labels e decide quais workers invocar (padrão de branch = master) +inputs: + gh_token: + description: PAT (GH_TOKEN) + required: true + branch: + description: Branch do push (master|dev|staging) + required: true +outputs: + issue_number: + description: Número da issue fonte + value: ${{ steps.resolve.outputs.issue_number }} + created: + description: true se a issue foi criada agora + value: ${{ steps.resolve.outputs.created }} + found: + description: true se issue veio do commit + value: ${{ steps.resolve.outputs.found }} + run_qa: + description: Manager decide invocar QA + value: ${{ steps.resolve.outputs.run_qa }} + run_security: + description: Manager decide invocar Security + value: ${{ steps.resolve.outputs.run_security }} + run_docs: + description: Manager decide invocar Technical Documenter + value: ${{ steps.resolve.outputs.run_docs }} + run_gates: + description: Manager decide checar quarteto em master + value: ${{ steps.resolve.outputs.run_gates }} + base_branch: + description: Branch canônico (sempre master se veio main) + value: ${{ steps.resolve.outputs.base_branch }} +runs: + using: composite + steps: + - name: Resolve issue, labels e plano de workers + id: resolve + shell: bash + env: + GH_TOKEN: ${{ inputs.gh_token }} + BRANCH_IN: ${{ inputs.branch }} + REPO: ${{ github.repository }} + SHA: ${{ github.sha }} + MSG: ${{ github.event.head_commit.message }} + BEFORE: ${{ github.event.before }} + run: | + set -euo pipefail + + # Padrão da org: master (nunca main como branch de trabalho) + BRANCH="$BRANCH_IN" + if [ "$BRANCH" = "main" ]; then + echo "AVISO: branch main detectada — tratando como master (padrão org)" + BRANCH="master" + fi + echo "base_branch=$BRANCH" >> "$GITHUB_OUTPUT" + + MESSAGES=$(git log --pretty=format:"%s %b" "${BEFORE}..${SHA}" 2>/dev/null || git log -1 --pretty=format:"%s %b") + ISSUE_REF=$(echo "$MESSAGES" | grep -oE '([A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+)?#([0-9]+)' | head -1 || true) + + if [ -n "$ISSUE_REF" ]; then + NUM=$(echo "$ISSUE_REF" | grep -oE '[0-9]+$') + echo "found=true" >> "$GITHUB_OUTPUT" + echo "created=false" >> "$GITHUB_OUTPUT" + echo "issue_number=$NUM" >> "$GITHUB_OUTPUT" + echo "Issue fonte: #$NUM" + else + echo "Push sem issue → Manager cria issue" + TITLE="ops: orquestração automática (push ${BRANCH} ${SHA:0:7})" + BODY=$(cat <> "$GITHUB_OUTPUT" + echo "created=true" >> "$GITHUB_OUTPUT" + echo "issue_number=$NUM" >> "$GITHUB_OUTPUT" + echo "Issue criada: #$NUM" + fi + + # Manager decide quais workers invocar + run_qa=false + run_security=false + run_docs=false + run_gates=false + + case "$BRANCH" in + master) + run_docs=true + run_gates=true + gh issue edit "$NUM" --repo "$REPO" --add-label "agent:technical-documenter" || true + ;; + dev) + run_qa=true + run_security=true + gh issue edit "$NUM" --repo "$REPO" --add-label "agent:qa" --add-label "agent:security" --add-label "agent:developer:done" || true + ;; + staging) + run_qa=true + run_security=true + gh issue edit "$NUM" --repo "$REPO" --add-label "agent:qa" --add-label "agent:security" || true + ;; + esac + + echo "run_qa=$run_qa" >> "$GITHUB_OUTPUT" + echo "run_security=$run_security" >> "$GITHUB_OUTPUT" + echo "run_docs=$run_docs" >> "$GITHUB_OUTPUT" + echo "run_gates=$run_gates" >> "$GITHUB_OUTPUT" + + gh issue comment "$NUM" --repo "$REPO" --body \ + "**Manager** orquestrou push \`${BRANCH}\`: run_qa=$run_qa run_security=$run_security run_docs=$run_docs run_gates=$run_gates. Workers serão invocados a seguir." From d6c7201d8f7684a4a41b113c0008402c0665fc33 Mon Sep 17 00:00:00 2001 From: luizkim Date: Sat, 15 Aug 2026 03:43:21 +0000 Subject: [PATCH 12/20] chore(ci): add qa subworker composite action --- .github/actions/workers/qa/action.yml | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/actions/workers/qa/action.yml diff --git a/.github/actions/workers/qa/action.yml b/.github/actions/workers/qa/action.yml new file mode 100644 index 0000000..1b5f774 --- /dev/null +++ b/.github/actions/workers/qa/action.yml @@ -0,0 +1,55 @@ +name: QA Worker +description: Marca Copilot como QA na issue (fonte agents-mcp) +inputs: + gh_token: + required: true + issue_number: + required: true + base_branch: + default: dev +runs: + using: composite + steps: + - name: Assign Copilot as QA + shell: bash + env: + GH_TOKEN: ${{ inputs.gh_token }} + ISSUE: ${{ inputs.issue_number }} + REPO: ${{ github.repository }} + BASE: ${{ inputs.base_branch }} + run: | + set -euo pipefail + CUSTOM_INSTRUCTIONS='Atue 100% como QA do ControleOnline. +Leia e siga OBRIGATORIAMENTE: +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/qa/agent.md + +Também leia: +- agents/skills/shared/operations/copilot-cooperation.md +- agents/skills/shared/quality/ (se existir) +- agents/skills/by-role/qa/README.md + +Regras: +- Execute checklist de QA na issue +- Labels: agent:qa → qa:accepted ou qa:rejected +- NÃO implemente código de produto +- Comente evidência objetiva do teste' + + gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:qa" || true + + gh api --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "/repos/${REPO}/issues/${ISSUE}/assignees" \ + --input - < Date: Sat, 15 Aug 2026 03:43:22 +0000 Subject: [PATCH 13/20] chore(ci): add security subworker composite action --- .github/actions/workers/security/action.yml | 55 +++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/actions/workers/security/action.yml diff --git a/.github/actions/workers/security/action.yml b/.github/actions/workers/security/action.yml new file mode 100644 index 0000000..9b648f4 --- /dev/null +++ b/.github/actions/workers/security/action.yml @@ -0,0 +1,55 @@ +name: Security Worker +description: Marca Copilot como Security na issue (fonte agents-mcp) +inputs: + gh_token: + required: true + issue_number: + required: true + base_branch: + default: dev +runs: + using: composite + steps: + - name: Assign Copilot as Security + shell: bash + env: + GH_TOKEN: ${{ inputs.gh_token }} + ISSUE: ${{ inputs.issue_number }} + REPO: ${{ github.repository }} + BASE: ${{ inputs.base_branch }} + run: | + set -euo pipefail + CUSTOM_INSTRUCTIONS='Atue 100% como Security do ControleOnline. +Leia e siga OBRIGATORIAMENTE: +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/security/agent.md + +Também leia: +- agents/skills/shared/operations/copilot-cooperation.md +- agents/skills/shared/security/security-guardrails.md +- agents/skills/by-role/security/README.md + +Regras: +- Execute checklist de Security na issue +- Labels: agent:security → security:accepted ou security:rejected +- NÃO implemente código de produto +- Comente evidência objetiva da análise' + + gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:security" || true + + gh api --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "/repos/${REPO}/issues/${ISSUE}/assignees" \ + --input - < Date: Sat, 15 Aug 2026 03:43:23 +0000 Subject: [PATCH 14/20] chore(ci): add technical-documenter subworker composite action --- .../workers/technical-documenter/action.yml | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/actions/workers/technical-documenter/action.yml diff --git a/.github/actions/workers/technical-documenter/action.yml b/.github/actions/workers/technical-documenter/action.yml new file mode 100644 index 0000000..8f960c8 --- /dev/null +++ b/.github/actions/workers/technical-documenter/action.yml @@ -0,0 +1,55 @@ +name: Technical Documenter Worker +description: Marca Copilot como technical-documenter na issue (fonte agents-mcp) +inputs: + gh_token: + required: true + issue_number: + required: true + base_branch: + default: master +runs: + using: composite + steps: + - name: Assign Copilot as technical-documenter + shell: bash + env: + GH_TOKEN: ${{ inputs.gh_token }} + ISSUE: ${{ inputs.issue_number }} + REPO: ${{ github.repository }} + BASE: ${{ inputs.base_branch }} + run: | + set -euo pipefail + CUSTOM_INSTRUCTIONS='Atue 100% como technical-documenter do ControleOnline. +Leia e siga OBRIGATORIAMENTE: +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/technical-documenter/agent.md + +Também leia: +- agents/skills/shared/operations/copilot-cooperation.md +- agents/skills/shared/documentation/documentation-governance.md +- agents/skills/by-role/technical-documenter/README.md + +Regras: +- Wiki técnica é fonte primária +- Labels: agent:technical-documenter e agent:technical-documenter:done +- NÃO implemente código de produto +- Ao terminar: aplique agent:technical-documenter:done e remova agent:technical-documenter' + + gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:technical-documenter" || true + + gh api --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "/repos/${REPO}/issues/${ISSUE}/assignees" \ + --input - < Date: Sat, 15 Aug 2026 04:08:05 +0000 Subject: [PATCH 15/20] =?UTF-8?q?fix(ci):=20workers=20m=C3=ADnimos=20?= =?UTF-8?q?=E2=80=94=20regras=20s=C3=B3=20no=20agents-mcp=20(#142)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/workers/qa/action.yml | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/actions/workers/qa/action.yml b/.github/actions/workers/qa/action.yml index 1b5f774..9d14525 100644 --- a/.github/actions/workers/qa/action.yml +++ b/.github/actions/workers/qa/action.yml @@ -1,5 +1,5 @@ name: QA Worker -description: Marca Copilot como QA na issue (fonte agents-mcp) +description: Assign Copilot as QA — rules live only in agents-mcp inputs: gh_token: required: true @@ -19,20 +19,16 @@ runs: BASE: ${{ inputs.base_branch }} run: | set -euo pipefail + # Regras 100% no agents-mcp — não copiar checklist/labels aqui CUSTOM_INSTRUCTIONS='Atue 100% como QA do ControleOnline. -Leia e siga OBRIGATORIAMENTE: +Leia e siga OBRIGATORIAMENTE (fonte canônica única): https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/qa/agent.md Também leia: -- agents/skills/shared/operations/copilot-cooperation.md -- agents/skills/shared/quality/ (se existir) -- agents/skills/by-role/qa/README.md +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/shared/operations/copilot-cooperation.md +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/by-role/qa/README.md -Regras: -- Execute checklist de QA na issue -- Labels: agent:qa → qa:accepted ou qa:rejected -- NÃO implemente código de produto -- Comente evidência objetiva do teste' +Não use regras embutidas neste assignment; a fonte acima prevalece.' gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:qa" || true @@ -40,7 +36,7 @@ Regras: -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ "/repos/${REPO}/issues/${ISSUE}/assignees" \ - --input - < Date: Sat, 15 Aug 2026 04:08:06 +0000 Subject: [PATCH 16/20] =?UTF-8?q?fix(ci):=20workers=20m=C3=ADnimos=20?= =?UTF-8?q?=E2=80=94=20regras=20s=C3=B3=20no=20agents-mcp=20(#142)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/workers/security/action.yml | 22 +++++++++------------ 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/actions/workers/security/action.yml b/.github/actions/workers/security/action.yml index 9b648f4..296432d 100644 --- a/.github/actions/workers/security/action.yml +++ b/.github/actions/workers/security/action.yml @@ -1,5 +1,5 @@ name: Security Worker -description: Marca Copilot como Security na issue (fonte agents-mcp) +description: Assign Copilot as Security — rules live only in agents-mcp inputs: gh_token: required: true @@ -19,20 +19,16 @@ runs: BASE: ${{ inputs.base_branch }} run: | set -euo pipefail + # Regras 100% no agents-mcp — não copiar checklist/labels aqui CUSTOM_INSTRUCTIONS='Atue 100% como Security do ControleOnline. -Leia e siga OBRIGATORIAMENTE: +Leia e siga OBRIGATORIAMENTE (fonte canônica única): https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/security/agent.md Também leia: -- agents/skills/shared/operations/copilot-cooperation.md -- agents/skills/shared/security/security-guardrails.md -- agents/skills/by-role/security/README.md +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/shared/operations/copilot-cooperation.md +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/by-role/security/README.md -Regras: -- Execute checklist de Security na issue -- Labels: agent:security → security:accepted ou security:rejected -- NÃO implemente código de produto -- Comente evidência objetiva da análise' +Não use regras embutidas neste assignment; a fonte acima prevalece.' gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:security" || true @@ -40,7 +36,7 @@ Regras: -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ "/repos/${REPO}/issues/${ISSUE}/assignees" \ - --input - < Date: Sat, 15 Aug 2026 04:08:08 +0000 Subject: [PATCH 17/20] =?UTF-8?q?fix(ci):=20workers=20m=C3=ADnimos=20?= =?UTF-8?q?=E2=80=94=20regras=20s=C3=B3=20no=20agents-mcp=20(#142)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workers/technical-documenter/action.yml | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/actions/workers/technical-documenter/action.yml b/.github/actions/workers/technical-documenter/action.yml index 8f960c8..179558f 100644 --- a/.github/actions/workers/technical-documenter/action.yml +++ b/.github/actions/workers/technical-documenter/action.yml @@ -1,5 +1,5 @@ name: Technical Documenter Worker -description: Marca Copilot como technical-documenter na issue (fonte agents-mcp) +description: Assign Copilot as technical-documenter — rules live only in agents-mcp inputs: gh_token: required: true @@ -19,20 +19,16 @@ runs: BASE: ${{ inputs.base_branch }} run: | set -euo pipefail + # Regras 100% no agents-mcp — não copiar checklist/labels aqui CUSTOM_INSTRUCTIONS='Atue 100% como technical-documenter do ControleOnline. -Leia e siga OBRIGATORIAMENTE: +Leia e siga OBRIGATORIAMENTE (fonte canônica única): https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/technical-documenter/agent.md Também leia: -- agents/skills/shared/operations/copilot-cooperation.md -- agents/skills/shared/documentation/documentation-governance.md -- agents/skills/by-role/technical-documenter/README.md +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/shared/operations/copilot-cooperation.md +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/by-role/technical-documenter/README.md -Regras: -- Wiki técnica é fonte primária -- Labels: agent:technical-documenter e agent:technical-documenter:done -- NÃO implemente código de produto -- Ao terminar: aplique agent:technical-documenter:done e remova agent:technical-documenter' +Não use regras embutidas neste assignment; a fonte acima prevalece.' gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:technical-documenter" || true @@ -40,7 +36,7 @@ Regras: -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ "/repos/${REPO}/issues/${ISSUE}/assignees" \ - --input - < Date: Sat, 15 Aug 2026 04:19:50 +0000 Subject: [PATCH 18/20] =?UTF-8?q?fix(ci):=20worker=20com=20um=20=C3=BAnico?= =?UTF-8?q?=20link=20can=C3=B4nico=20(#142)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/workers/qa/action.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/actions/workers/qa/action.yml b/.github/actions/workers/qa/action.yml index 9d14525..0f95cfb 100644 --- a/.github/actions/workers/qa/action.yml +++ b/.github/actions/workers/qa/action.yml @@ -1,5 +1,5 @@ name: QA Worker -description: Assign Copilot as QA — rules live only in agents-mcp +description: Assign Copilot as QA — single link to agents-mcp inputs: gh_token: required: true @@ -19,16 +19,9 @@ runs: BASE: ${{ inputs.base_branch }} run: | set -euo pipefail - # Regras 100% no agents-mcp — não copiar checklist/labels aqui CUSTOM_INSTRUCTIONS='Atue 100% como QA do ControleOnline. -Leia e siga OBRIGATORIAMENTE (fonte canônica única): -https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/qa/agent.md - -Também leia: -https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/shared/operations/copilot-cooperation.md -https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/by-role/qa/README.md - -Não use regras embutidas neste assignment; a fonte acima prevalece.' +Leia e siga OBRIGATORIAMENTE a fonte canônica única: +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/qa/agent.md' gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:qa" || true From c0230f4945fc76ea1b5cc883b0a34f66699d4a92 Mon Sep 17 00:00:00 2001 From: luizkim Date: Sat, 15 Aug 2026 04:19:52 +0000 Subject: [PATCH 19/20] =?UTF-8?q?fix(ci):=20worker=20com=20um=20=C3=BAnico?= =?UTF-8?q?=20link=20can=C3=B4nico=20(#142)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/workers/security/action.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/actions/workers/security/action.yml b/.github/actions/workers/security/action.yml index 296432d..086413e 100644 --- a/.github/actions/workers/security/action.yml +++ b/.github/actions/workers/security/action.yml @@ -1,5 +1,5 @@ name: Security Worker -description: Assign Copilot as Security — rules live only in agents-mcp +description: Assign Copilot as Security — single link to agents-mcp inputs: gh_token: required: true @@ -19,16 +19,9 @@ runs: BASE: ${{ inputs.base_branch }} run: | set -euo pipefail - # Regras 100% no agents-mcp — não copiar checklist/labels aqui CUSTOM_INSTRUCTIONS='Atue 100% como Security do ControleOnline. -Leia e siga OBRIGATORIAMENTE (fonte canônica única): -https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/security/agent.md - -Também leia: -https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/shared/operations/copilot-cooperation.md -https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/skills/by-role/security/README.md - -Não use regras embutidas neste assignment; a fonte acima prevalece.' +Leia e siga OBRIGATORIAMENTE a fonte canônica única: +https://raw.githubusercontent.com/ControleOnline/agents-mcp/master/agents/roles/security/agent.md' gh issue edit "$ISSUE" --repo "$REPO" --add-label "agent:security" || true From 7b5709b218af9b076b9a93f7c65bedfd1ef7f850 Mon Sep 17 00:00:00 2001 From: luizkim Date: Sat, 15 Aug 2026 04:19:53 +0000 Subject: [PATCH 20/20] =?UTF-8?q?fix(ci):=20worker=20com=20um=20=C3=BAnico?= =?UTF-8?q?=20link=20can=C3=B4nico=20(#142)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit