{"id":21199029,"url":"https://github.com/devsecops/atls","last_synced_at":"2026-04-28T09:34:04.049Z","repository":{"id":80515654,"uuid":"94379076","full_name":"devsecops/atls","owner":"devsecops","description":null,"archived":false,"fork":false,"pushed_at":"2017-07-06T18:56:50.000Z","size":26,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-01-03T01:06:38.764Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devsecops.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-14T22:50:42.000Z","updated_at":"2023-07-26T13:10:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"cfb5f833-ac74-4bcb-a115-b24f65511384","html_url":"https://github.com/devsecops/atls","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/devsecops/atls","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devsecops%2Fatls","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devsecops%2Fatls/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devsecops%2Fatls/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devsecops%2Fatls/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devsecops","download_url":"https://codeload.github.com/devsecops/atls/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devsecops%2Fatls/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32375610,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T09:24:15.638Z","status":"ssl_error","status_checked_at":"2026-04-28T09:24:15.071Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-20T19:55:35.462Z","updated_at":"2026-04-28T09:34:04.022Z","avatar_url":"https://github.com/devsecops.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# atls\n\n### Overview\natls is a chatbot built on the [Botkit](https://www.botkit.ai/) framework, using the [Easy Peasy Bots](https://medium.com/slack-developer-blog/easy-peasy-bots-getting-started-96b65e6049bf) guide. Originally designed as a list management bot, it has been extended to support plugins making it a versatile minion ready to do your bidding.\n\n### Basic Functionality\nAt its core, atls doesn't do much. The code from the Slack dev guide has only been modified slightly to support RTM reconnects (sources referenced where applicable), simple greetings and help command functionality. As previously mentioned, plugins are what makes atls work.\n\n### Plugins\nPlugins are created by adding your botkit code in a .js file and dropping it in the /plugins directory. You must also activate the plugin by requiring it in index.js, as well as adding help documentation if needed.\n\n[./app/index.js](./app/index.js):\n```\n/*///////////////////*\n *      Plugins      *\n *///////////////////*\n\n// Add plugins here\nlist_management_plugin = require('./plugins/list_management.js')\n\n// Add help documentation here\nplugin_helpers.push(list_management_plugin.help)\n```\n\nTo activate a plugin you simply require it under '// Add plugins here'. All users in your Slack team will be able to use the help function, and it will only show them a plugin is installed if the help documentation is added as seen above.\n\n### Help\nHelp documentation must be exported, like so:\n```\nmodule.exports.help = {\n    ...\n}\n```\n\nThe required parts are:\n```\n  'basic_help': 'Basic help shown when someone runs `help plugin_name`',\n  'plugin_name': 'your_plugin_name',\n  'plugin_description': 'Description'\n```\n\nBasic help is shown when someone runs `help plugin_name` with no arguments. The `plugin_name` should be unique and only contain [A-Za-z0-9-_]. This is used if a user looks for help specifically in your plugin with `help plugin_name command`. The `plugin_description` should be kept short and to the point.\n\nEverything else should be in the format of:\n```\n'command': 'Detailed command help'\n```\n\nWhen using regex's that allow shortend commands (ie: `del` and `delete`) you should add both versions to help.\n\nAn example can be seen in [./app/plugins/list_management.js](./app/plugins/list_management.js).\n\n### Before you begin\nYou'll need to make a couple quick edits:\n\n[./app/.env](./app/.env)\n```\nCLIENT_ID=1234.5678\nCLIENT_SECRET=1234567890\nPORT=8080\nMONGODB_URI=mongodb://mongodb:27017\n```\n\nFollow the Easy Peasy Bots link above to get a bot connected to Slack. You'll need to add your CLIENT_ID and CLIENT_SECRET in the .env file. The PORT value tells botkit what port to run on. Change the port if needed, as well as the mongodb URI. If you plan on using Docker, as outlined below, you should leave the mongodb URI as is. \n\n### Docker\nTo get you up and running quickly, we provided Docker files. You'll need to run them with `docker-compose`, but not before making a couple quick edits.\n\nThere are two containers, one for mongodb and one for atls and [localtunnel](https://localtunnel.me). Due to some quirks, atls and localtunnel both run from the same container through `./app/etc/entrypoint.sh`. Localtunnel is included in the entrypoint as `./app/etc/run_lt.sh` because it has a tendancy to crash, so it's wrapped in a shell script which allows it to restart automatically as needed.\n\nIn `./docker-compose.yml` you will need to change the localtunnel port if you want to use something other than 8080, and the  subdomain to something unique. This should be the same values you configured if you followed the Easy Peasy Bots guide above.\n\n```\nenvironment:\n- LT_PORT=8080\n- LT_SUBDOMAIN=ChangeMe\n```\n\nIf you change the port, be sure to reflect it in `docker-compose.yml` as well as `Dockerfile`. When everything is ready to go, just run `docker-compose up` and atls should connect to your Slack team.\n\n#### Volumes\nTwo volumes are mounted here, one for mongodb at `./db` and one for atls at `./app`. Each time the atls container starts, it will run `npm install`. This will build the dependencies locally on the first run, and any extra dependencies you add after that.\n\n#### Local Development\nBecause the code is mounted on the host filesystem, it's easy to develop locally and have your changes reflected in Slack whenever they're saved. This is made possible with `nodemon` which watches `./app/index.js` and `./app/plugins/*.js` for changes and restarts as necessary.\n\n### Things to consider\nWhen creating plugins, you'll need to export anything extra you might need access to. Controller is already exported so you can just import it with `var controller = module.parent.exports.controller`\n\nWhen using `controller.hears` with a regex such as:\n```\ncontroller.hears([/^my_command\\s+([A-Za-z0-9_-]+)?\\s*$/i], 'direct_message,mention,direct_mention', function(bot, message) {\n    ...\n}\n```\nyou should always include `\\s*` at the tail end before the `$`. This is hepful because Slack likes to suggest usernames that are similar to a command or argument you may be typing, and people (like myself) have a tendancy to just add a space after the argument to prevent it from being translated to a username.\n\nThe first time you connect the bot to Slack, you will need to authorize it by going to [https://your_subdomain.localtunnel.me/login](https://your_subdomain.localtunnel.me/login). In some environments, when you click 'Authorize' you may get a gateway timeout error, but if you replace `https://your_subdomain.localtunnel.me` with `http://localhost:PORT` it will authorize and connect. \n\nOnce the bot is intially connected, access tokens are stored in the database which is mounted on the host machine at `./db`, so you should ensure it can't be accessed by unauthorized users. Also, if you 'reset' the database by deleting everything under `./db`, you'll need to re-authorize the bot by going to /login again.\n\nLastly, if using localtunnel, it can be slow at times depending on your environment. This can cause action buttons (like 'edit' and 'delete' in the list_management.js plugin) to not work. If this happens, just keep trying and it should eventually work, but the code itself is likely not the issue unless you made any modifications to that section of the code.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevsecops%2Fatls","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevsecops%2Fatls","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevsecops%2Fatls/lists"}