Use WebPage in direction.coffee example.

--- examples/direction.coffee
+++ examples/direction.coffee
@@ -1,28 +1,29 @@
 # Get driving direction using Google Directions API.

-if phantom.state.length is 0
-    if phantom.args.length < 2
-        console.log 'Usage: direction.js origin destination'
-        console.log 'Example: direction.js "San Diego" "Palo Alto"'
-        phantom.exit(1)
-    origin = phantom.args[0]
-    dest = phantom.args[1]
-    phantom.state = origin + ' to ' + dest
-    phantom.open(encodeURI('http://maps.googleapis.com/maps/api/directions/xml?origin=' + origin +
-                           '&destination=' + dest + '&units=imperial&mode=driving&sensor=false'))
+page = new WebPage()
+
+if phantom.args.length < 2
+  console.log 'Usage: direction.js origin destination'
+  console.log 'Example: direction.js "San Diego" "Palo Alto"'
+  phantom.exit(1)
 else
-    if phantom.loadStatus is 'fail'
-        console.log 'Unable to access network'
-    else
-        steps = phantom.content.match(/<html_instructions>(.*)<\/html_instructions>/ig)
-        if not steps
-            console.log 'No data available for ' + phantom.state
-        else
-            for ins in steps
-                ins = ins.replace(/\</ig, '<').replace(/\>/ig, '>')
-                ins = ins.replace(/\<div/ig, '\n<div')
-                ins = ins.replace(/<.*?>/g, '')
-                console.log(ins)
-            console.log ''
-            console.log phantom.content.match(/<copyrights>.*<\/copyrights>/ig).join('').replace(/<.*?>/g, '')
-    phantom.exit()
+  origin = phantom.args[0]
+  dest = phantom.args[1]
+  page.open encodeURI('http://maps.googleapis.com/maps/api/directions/xml?origin=' + origin +
+                      '&destination=' + dest + '&units=imperial&mode=driving&sensor=false'),
+            (status) ->
+              if status isnt 'success'
+                console.log 'Unable to access network'
+              else
+                steps = page.content.match(/<html_instructions>(.*)<\/html_instructions>/ig)
+                if not steps
+                  console.log 'No data available for ' + origin + ' to ' + dest
+                else
+                  for ins in steps
+                    ins = ins.replace(/\</ig, '<').replace(/\>/ig, '>')
+                    ins = ins.replace(/\<div/ig, '\n<div')
+                    ins = ins.replace(/<.*?>/g, '')
+                    console.log(ins)
+                  console.log ''
+                  console.log page.content.match(/<copyrights>.*<\/copyrights>/ig).join('').replace(/<.*?>/g, '')
+              phantom.exit()


started work on a doppio api class, no functionality yet

error: pathspec 'web/scripts/doppio-api.coffee' did not match any file(s) known to git

--- web/scripts/doppio-api.coffee
+++ web/scripts/doppio-api.coffee
@@ -0,0 +1,130 @@
+"use strict"
+
+class window.DoppioApi
+    ###
+    An api for the PlayerCodeEditor to interact with doppio with.
+    To be constructed only after the document is ready ($document.onReady).
+    Requires node.fs, jquery($), _.js and jvm.
+    This code assumes that the game's java file was preloaded by being included
+    in mini-rt.tar.
+    NOTE:
+        I know Lawrence is working on a more general api, but I can't find it right now
+        so I am just hacking this together to see if I can
+        get it to work.
+    ###
+    constructor: () ->
+        # This bit assumes document is ready:
+        # stdout = (str) -> controller.message str, '', true # noreprompt
+        @stdout = (str) -> alert str
+
+        bs_cl = new ClassLoader.BootstrapClassLoader(readClassfile)
+        @preload()
+
+    preload: ->
+        ###
+            Loads the mini-rt.tar into the node filesystem.
+        ###
+        try
+            data = node.fs.readFileSync("/home/doppio/browser/mini-rt.tar")
+        catch e
+            console.error e
+
+        if data?
+            file_count = 0
+            done = false
+            start_untar = (new Date).getTime()
+            on_complete = ->
+                end_untar = (new Date).getTime()
+                console.log "Untarring took a total of #{end_untar-start_untar}ms."
+                $('#overlay').fadeOut 'slow'
+                $('#progress-container').fadeOut 'slow'
+                # $('#console').click()
+            update_bar = _.throttle ((percent, path) ->
+                bar = $('#progress > .bar')
+                preloading_file = $('#preloading-file')
+                # +10% hack to make the bar appear fuller before fading kicks in
+                display_perc = Math.min Math.ceil(percent*100), 100
+                bar.width "#{display_perc}%", 150
+                preloading_file.text(
+                    if display_perc < 100 then "Loading #{path}"  else "Done!"))
+
+            untar new util.BytesArray(util.bytestr_to_array data), ((percent, path, file) ->
+                update_bar(percent, path)
+                base_dir = 'vendor/classes/'
+                [base, ext] = path.split('.')
+                unless ext is 'class'
+                    on_complete() if percent == 100
+                    return
+                file_count++
+                cls = base.substr(base_dir.length)
+                asyncExecute (->
+                    # XXX: We convert from bytestr to array to process the tar file, and
+                    #      then back to a bytestr to store as a file in the filesystem.
+                    node.fs.writeFileSync(path, util.array_to_bytestr(file), 'utf8', true)
+                    on_complete() if --file_count == 0 and done
+                ), 0),
+                ->
+                    done = true
+                    on_complete() if file_count == 0
+
+
+    # Read in a binary classfile synchronously. Return an array of bytes.
+    readClassfile: (cls, cb, failure_cb) ->
+        cls = cls[1...-1] # Convert Lfoo/bar/Baz; -> foo/bar/Baz.
+        for path in jvm.system_properties['java.class.path']
+            fullpath = "#{path}#{cls}.class"
+            try
+                data = util.bytestr_to_array node.fs.readFileSync(fullpath)
+            catch e
+                data = null
+            return cb(data) if data?
+
+        failure_cb(-> throw new Error "Error: No file found for class #{cls}.")
+
+    executeStudentCode: (studentCode, gameName) ->
+        ###
+            Runs the student's code for the game given by gameName.
+            Assumes that there is such a file as gameName.java in the file system.
+        ###
+
+
+    # We don't need the commands object, but we need to know what functionality
+    # to implement manually.
+    commands:
+        javac: (args, cb) ->
+            jvm.set_classpath '/home/doppio/vendor/classes/', './:/home/doppio'
+            rs = new runtime.RuntimeState(stdout, user_input, bs_cl)
+            jvm.run_class rs, 'classes/util/Javac', args, ->
+                # HACK: remove any classes that just got compiled from the class cache
+                for c in args when c.match /\.java$/
+                    bs_cl.remove_class(util.int_classname(c.slice(0,-5)))
+                controller.reprompt()
+            return null  # no reprompt, because we handle it ourselves
+        java: (args, cb) ->
+            if !args[0]? or (args[0] == '-classpath' and args.length < 3)
+                return "Usage: java [-classpath path1:path2...] class [args...]"
+            if args[0] == '-classpath'
+                jvm.set_classpath '/home/doppio/vendor/classes/', args[1]
+                class_name = args[2]
+                class_args = args[3..]
+            else
+                jvm.set_classpath '/home/doppio/vendor/classes/', './'
+                class_name = args[0]
+                class_args = args[1..]
+            rs = new runtime.RuntimeState(stdout, user_input, bs_cl)
+            jvm.run_class(rs, class_name, class_args, -> controller.reprompt())
+            return null  # no reprompt, because we handle it ourselves
+        clear_cache: ->
+            bs_cl = new ClassLoader.BootstrapClassLoader(readClassfile)
+            return true
+        rm: (args) ->
+            return "Usage: rm <file>" unless args[0]?
+            if args[0] == '*'
+                fnames = node.fs.readdirSync('.')
+                for fname in fnames
+                    fstat = node.fs.statSync(fname)
+                    if fstat.is_directory
+                        return "ERROR: '#{fname}' is a directory."
+                node.fs.unlinkSync(fname)
+            else node.fs.unlinkSync args[0]
+            true


Add example

Add example

error: pathspec 'example.coffee' did not match any file(s) known to git

--- example.coffee
+++ example.coffee
@@ -0,0 +1,13 @@
+# Run with
+# $ node_modules/.bin/coffee example
+require('./lib/coffee-backtrace.js')
+
+class Relay
+  constructor: (@message) ->
+
+  speak: -> process.stdout.write(@getMessage() + '\n')
+
+  getMessage: -> @message
+
+foo = new Relay("woof")
+setTimeout(foo.speak, 0)


Add test for 61f146d2

Add test for 61f146d2

error: pathspec 'test/model/shape.spec.coffee' did not match any file(s) known to git

--- test/model/shape.spec.coffee
+++ test/model/shape.spec.coffee
@@ -0,0 +1,23 @@
+helpers = require('../helpers')
+AWS = helpers.AWS
+
+describe 'AWS.Model.Shape', ->
+  describe 'TimestampShape', ->
+    describe 'toType()', ->
+      it 'converts unix timestamps', ->
+        api = new AWS.Model.Api metadata: timestampFormat: 'unixTimestamp'
+        shape = AWS.Model.Shape.create { type: 'timestamp' }, { api: api }
+        date = shape.toType('Thu, 01 Jan 1970 00:00:00 GMT')
+        expect(date).toEqual(new Date(0))
+
+      it 'converts iso8601 timestamps', ->
+        api = new AWS.Model.Api metadata: timestampFormat: 'iso8601'
+        shape = AWS.Model.Shape.create { type: 'timestamp' }, { api: api }
+        date = shape.toType('1970-01-01T00:00:00.000Z')
+        expect(date).toEqual(new Date(0))
+
+      it 'converts rfc822 timestamps', ->
+        api = new AWS.Model.Api metadata: timestampFormat: 'rfc822'
+        shape = AWS.Model.Shape.create { type: 'timestamp' }, { api: api }
+        date = shape.toType(12300)
+        expect(date).toEqual(new Date(12300))


test(lorax): Added parsing commit tests

test(lorax): Added parsing commit tests

error: pathspec 'test/parseCommit_test.coffee' did not match any file(s) known to git

--- test/parseCommit_test.coffee
+++ test/parseCommit_test.coffee
@@ -0,0 +1,76 @@
+lorax = require "../index"
+commit = """
+          7e7ac8957953e1686113f8086dc5b67246e5d3fa
+          feature(lorax): Basic testing
+
+          Fixes #123
+          """
+
+exports.parseCommitTest =
+  "hash parse": (test) ->
+    obj = lorax.parseCommit commit
+    test.equal obj.hash, "7e7ac8957953e1686113f8086dc5b67246e5d3fa"
+    test.done()
+
+  "type parse": (test) ->
+    obj = lorax.parseCommit commit
+    test.equal obj.type, "feature"
+    test.done()
+
+  "component parse": (test) ->
+    obj = lorax.parseCommit commit
+    test.equal obj.component, "lorax"
+    test.done()
+
+  "component special character parse": (test) ->
+    specialCommit = """
+    7e7ac8957953e1686113f8086dc5b67246e5d3fa
+    feature(lorax-test!): Basic testing
+    """
+    obj = lorax.parseCommit specialCommit
+    test.equal obj.component, "lorax-test!"
+    test.done()
+
+  "message parse": (test) ->
+    obj = lorax.parseCommit commit
+    test.equal obj.message, "Basic testing"
+    test.done()
+
+  "title parse": (test) ->
+    obj = lorax.parseCommit commit
+    test.equal obj.title, "feature(lorax): Basic testing"
+    test.done()
+
+  "issue parse": (test) ->
+    obj = lorax.parseCommit commit
+    test.equal obj.issues[0], "123"
+    test.done()
+
+  "issues parse": (test) ->
+    issuesCommit = """
+    7e7ac8957953e1686113f8086dc5b67246e5d3fa
+    feature(lorax): Basic testing
+
+    Fixes #123
+    Fixes #124
+    """
+
+    test.expect 2
+    obj = lorax.parseCommit issuesCommit
+    test.equal obj.issues[0], 123
+    test.equal obj.issues[1], 124
+    test.done()
+
+  "breaking change parse": (test) ->
+    breakingCommit = """
+    7e7ac8957953e1686113f8086dc5b67246e5d3fa
+    feature(lorax): Basic testing
+
+    BREAKING CHANGE: Testing
+    """
+    test.expect 2
+    obj = lorax.parseCommit breakingCommit
+    test.equal obj.type, "breaking"
+    test.equal obj.message, " Testing"
+
+    test.done()


Fixed onBackground for surface:stage-mouse-down events.

--- app/lib/surface/Surface.coffee
+++ app/lib/surface/Surface.coffee
@@ -482,7 +482,10 @@

   onMouseDown: (e) =>
     return if @disabled
-    onBackground = not @stage.hitTest e.stageX, e.stageY
+    newPos = @camera.screenToCanvas({x: e.stageX, y: e.stageY})
+    # getObject(s)UnderPoint is broken, so we have to use the private method to get what we want
+    onBackground = not @stage._getObjectsUnderPoint(newPos.x, newPos.y, null, true)
+
     worldPos = @camera.screenToWorld x: e.stageX, y: e.stageY
     event = onBackground: onBackground, x: e.stageX, y: e.stageY, originalEvent: e, worldPos: worldPos
     Backbone.Mediator.publish 'surface:stage-mouse-down', event


coffee script dummy

coffee script dummy

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/justinlhudson/WebApplication-Server.git/'


auto_reload

--- app/templates/_Gulpfile.coffee
+++ app/templates/_Gulpfile.coffee
@@ -87,7 +87,7 @@
 #   $RESTART
 # 	Taken from: http://noxoc.de/2014/06/25/reload-gulpfile-js-on-change/
 #*------------------------------------*/
-gulp.task 'auto_reload', () ->
+gulp.task "auto_reload", () ->
 	process = undefined
 	restart = () ->
 		if process != undefined
@@ -116,8 +116,8 @@
 gulp.task "watch", () ->
 	gulp.watch conf.path.pvt.scss + "/**/*.scss", ["sass"]
 	gulp.watch conf.path.pvt.coffee + "/**/*.coffee", ["coffee", reload]
-	gulp.watch conf.path.pvt.fnt + "/**/*", ['font']
-	gulp.watch conf.path.pvt.img + "/**/*", ['imagemin']
+	# gulp.watch conf.path.pvt.fnt + "/**/*", ['font']
+	# gulp.watch conf.path.pvt.img + "/**/*", ['imagemin']

 #*------------------------------------*\


rooms -> channels

rooms -> channels

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/eedevops/hubot-enterprise.git/'


Add validation check to save

Add validation check to save

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/douggr/atom-project-manager.git/'


Improve Documentation

Improve Documentation

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -33,8 +33,8 @@

 # **Fairy** depends on:
 #
+#   + **[redis]**, node.js driver for Redis, of course!
 #   + **[node-uuid]**, generate an unique identifier for each task.
-#   + **[redis]**, the node.js driver for Redis, of course!
 #   + **[express]**, only if you need the [http api] or [web front-end].
 #
 # [redis]:         https://github.com/mranney/node_redis
@@ -52,14 +52,14 @@
 # ### CommonJS Module Definition

 # The only exposed object is a `connect` method, which returns a `fairy` client
-# on invocation.
+# on invocation. **Usage:**
 #
 #     fairy = require('fairy').connect()
 #
 # `connect` method use the passed-in option to create a Redis client. Then use
 # that Redis client to initiate a new object of class `Fairy`.
 exports.connect = (options = {}) ->
-  client = redis.createClient options.port, options.host
+  client = redis.createClient options.port, options.host, options.options
   client.auth options.password if options.password?
   new Fairy client


Test that critical files are created

Test that critical files are created

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/steroids.git/'


handle chunked response, fixes #6

handle chunked response, fixes #6

--- server.coffee
+++ server.coffee
@@ -72,6 +72,11 @@
           'Camo-Host'              : camo_hostname
           'X-Content-Type-Options' : 'nosniff'

+        # Handle chunked responses properly
+        if content_length?
+          newHeaders['content-length'] = content_length
+        if srcResp.headers['transfer-encoding']
+          newHeaders['transfer-encoding'] = srcResp.headers['transfer-encoding']
         if srcResp.headers['content-encoding']
           newHeaders['content-encoding'] = srcResp.headers['content-encoding']


Shorter splash screen

Shorter splash screen

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/craftedlabs/rubyconfuruguay-mobile.git/'


Fix(?) issue with browser icon.

Fix(?) issue with browser icon.

I'm seeing an intermitent issue whereby the browser icon is showing as
disabled, when vimium is in fact enabled.  It's intermitent, so
difficult to track down.

I went back to look at the old code for setting the browser icon, and
reset this code to look more like the old code.  I suspect the problem
may be that we disabling the icon because we're getting no response from
one frame (or something like that).

--- background_scripts/main.coffee
+++ background_scripts/main.coffee
@@ -366,6 +366,9 @@
   disabledIcon = "icons/browser_action_disabled.png"
   partialIcon = "icons/browser_action_partial.png"
   chrome.tabs.get tabId, (tab) ->
+    # Default to disabled state in case we can't connect to Vimium, primarily for the "New Tab" page.
+    setBrowserActionIcon(tabId,disabledIcon)
+    setBadge badge: ""
     chrome.tabs.sendMessage tabId, { name: "getActiveState" }, (response) ->
       if response
         isCurrentlyEnabled = response.enabled
@@ -382,10 +385,7 @@
         # Propagate the new state only if it has changed.
         if (isCurrentlyEnabled != enabled || currentPasskeys != passKeys)
           chrome.tabs.sendMessage(tabId, { name: "setState", enabled: enabled, passKeys: passKeys, incognito: tab.incognito })
-      else
-        # We didn't get a response from the front end, so Vimium isn't running.
-        setBrowserActionIcon(tabId,disabledIcon)
-        setBadge {badge: ""}
+

 handleUpdateScrollPosition = (request, sender) ->
   updateScrollPosition(sender.tab, request.scrollX, request.scrollY)


Added method for setting display mode. Added promise containing result of zooming into entities.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/urbanetic/meteor-atlas-util.git/'


Correct process arch value

Correct process arch value

--- build/tasks/publish-build-task.coffee
+++ build/tasks/publish-build-task.coffee
@@ -59,7 +59,7 @@
     when 'linux'
       buildDir = grunt.config.get('atom.buildDir')
       sourcePath = fs.listSync(buildDir, ['.deb'])[0]
-      if process.arch is 'ia32g'
+      if process.arch is 'ia32'
         arch = 'i386'
       else
         arch = 'amd64'


CLIO-24007 Fix blank state

CLIO-24007 Fix blank state

Visit "/" would previously display a blank screen. It now displays a message, indicating the user to select a component.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/seanhealy/lib-themisui.git/'


Disable internal event tracking

Disable internal event tracking

Tracking down a server CPU issue.

--- app/core/Tracker.coffee
+++ app/core/Tracker.coffee
@@ -71,8 +71,9 @@
     analytics?.track action, properties, context

     # Log internally too.  Will turn off external event logging when internal logging is sufficient.
-    event = new AnalyticsLogEvent event: action, properties: properties
-    event.save()
+    # TODO: enable this after we figure out what's eating the server CPU
+    # event = new AnalyticsLogEvent event: action, properties: properties
+    # event.save()

   trackTiming: (duration, category, variable, label, samplePercentage=5) ->
     # https://developers.google.com/analytics/devguides/collection/gajs/gaTrackingTiming


Don't auto check when setting feed URL

Don't auto check when setting feed URL

--- src/browser/auto-updater-win32.coffee
+++ src/browser/auto-updater-win32.coffee
@@ -7,9 +7,6 @@
   _.extend @prototype, EventEmitter.prototype

   setFeedUrl: (@updateUrl) ->
-    if @updateUrl
-      # Schedule an update when the feed URL is set
-      process.nextTick => @checkForUpdates()

   quitAndInstall: ->
     unless SquirrelUpdate.existsSync()


fix #73

fix #73

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Adirelle/atom-autocomplete-php.git/'


On second thought, Internet Explorer isn't so bad.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/rfw/basilisk.git/'


StacksV2: YamlUtils for conversion

StacksV2: YamlUtils for conversion

error: pathspec 'client/admin/lib/views/stacksv2/yamlutils.coffee' did not match any file(s) known to git

--- client/admin/lib/views/stacksv2/yamlutils.coffee
+++ client/admin/lib/views/stacksv2/yamlutils.coffee
@@ -0,0 +1,39 @@
+jsyaml = require 'js-yaml'
+
+module.exports = {
+
+  jsonToYaml: (content) ->
+
+    contentType     = 'json'
+
+    try
+      contentObject = JSON.parse content
+
+      content       = jsyaml.safeDump contentObject
+      contentType   = 'yaml'
+
+    catch err
+      console.error '[JsonToYaml]', err
+
+    console.log '[JsonToYaml]', { content, contentType, err }
+
+    return { content, contentType, err }
+
+
+  yamlToJson: (content) ->
+
+    contentType     = 'yaml'
+
+    try
+      contentObject = jsyaml.safeLoad content
+
+      content       = JSON.stringify contentObject
+      contentType   = 'json'
+    catch err
+      console.error '[YamlToJson]', err
+
+    console.log '[YamlToJson]', { content, contentType, err }
+
+    return { content, contentType, err }
+
+}


moved CreateUniverse

moved CreateUniverse

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ChHeLeJa/SpaceTrader.git/'


Show drawer

Show drawer

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/kitchensink.git/'


New file

New file

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/spiralx/bunny-hop.git/'


Update configuration

Update configuration

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ehmicky/myos.git/'


fixed drawers API docs to have correct usage syntax

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


add notification service

add notification service

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/MicrosmartSA/ubiquity-ui.git/'


Remove issue related stuff

Remove issue related stuff

--- src/notification.coffee
+++ src/notification.coffee
@@ -23,22 +23,3 @@
       when 'warning' then 'alert'
       when 'info' then 'info'
       when 'success' then 'check'
-
-  getIssueUrl: ->
-    "https://github.com/atom/atom/issues/new?title=#{encodeURI(@getIssueTitle())}&body=#{encodeURI(@getIssueBody())}"
-
-  getIssueTitle: ->
-    @message
-
-  getIssueBody: ->
-    # TODO: crib version information from bug-report: https://github.com/lee-dohm/bug-report/blob/master/lib/bug-report.coffee#L69
-    """
-    There was an unhandled error
-
-    Stack Trace
-    ```
-    At #{@options.detail}
-
-    #{@options.stack}
-    ```
-    """


Added gruntfile

Added gruntfile

error: pathspec 'gruntfile.coffee' did not match any file(s) known to git

--- gruntfile.coffee
+++ gruntfile.coffee
@@ -0,0 +1,2 @@
+module.exports = ->
+


Integration test for ESRI Standard Indicatorator

error: pathspec 'test/integration/indicatorator.coffee' did not match any file(s) known to git

--- test/integration/indicatorator.coffee
+++ test/integration/indicatorator.coffee
@@ -0,0 +1,143 @@
+assert = require('chai').assert
+sinon = require('sinon')
+request = require 'request'
+fs = require 'fs'
+
+indicatorData = require('../../controllers/indicator_data')
+
+suite('Standard Indicatorator')
+
+test("Querying a standard indicator with source 'esri' correctly
+indicatorates the data", (done) ->
+  sandbox = sinon.sandbox.create()
+
+  expectedJSON = [{
+    "date": "2013-01-01T00:00:00.000Z",
+    "station": [{
+      "text": "GOOD",
+      "value": 37,
+      "periodStart": 1356998400000,
+      "station": "Palace Beach",
+      "geometry": {
+        "y": 24.428641001000074,
+        "x": 54.374894503000064
+      }
+    }],
+    "value": "9 of 13",
+    "text": "BAD"
+  },
+  {
+    "date": "2013-04-01T00:00:00.000Z",
+    "station": [{
+      "text": "GOOD",
+      "value": 50,
+      "periodStart": 1364774400000,
+      "station": "Emirates Palace Beach",
+      "geometry": {
+        "y": 24.465522647000057,
+        "x": 54.30470040400007
+      }
+    }],
+    "value": "10 of 20",
+    "text": "GOOD"
+  }]
+
+  esriServerResponse = {
+    "features": [
+      {
+          "geometry": {
+              "x": 54.374894503000064,
+              "y": 24.428641001000074
+          },
+          "attributes": {
+              "OBJECTID": 1,
+              "station": "Palace Beach",
+              "periodStart": 1356998400000,
+              "value": 37,
+              "text": "GOOD"
+          }
+      },
+      {
+          "geometry": {
+              "x": 54.30470040400007,
+              "y": 24.465522647000057
+          },
+          "attributes": {
+              "OBJECTID": 3,
+              "station": "Emirates Palace Beach",
+              "periodStart": 1364774400000,
+              "value": 50,
+              "text": "GOOD"
+          }
+      },
+      {
+          "geometry": {
+              "x": 54.30470040400007,
+              "y": 24.465522647000057
+          },
+          "attributes": {
+              "OBJECTID": 15,
+              "station": "Emirates Palace Beach",
+              "periodStart": 1356998400000,
+              "value": 160,
+              "text": "BAD"
+          }
+      },
+      {
+          "geometry": {
+              "x": 54.374894503000064,
+              "y": 24.428641001000074
+          },
+          "attributes": {
+              "OBJECTID": 25,
+              "station": "Palace Beach",
+              "periodStart": 1364774400000,
+              "value": 400,
+              "text": "BAD"
+          }
+      }
+    ]
+  }
+
+  indicatorDefinitions = [{
+    "id": "4",
+    "type": "standard",
+    "source": "esri",
+    "name": "Phosphate P water quality",
+    "featureName": "NRT_AD_MarineWQ:3",
+    "valueField": "value",
+    "reduceField": "station",
+    "range": [
+        {"minValue": 0.5, "message": "Good"},
+        {"minValue": 0, "message": "Bad"}
+    ]
+  }]
+
+  # Stubs
+  requestStub = sandbox.stub(request, 'get', (options, callback) ->
+    callback(null, {body: JSON.stringify(esriServerResponse)})
+  )
+
+  fsReadFileStub = sandbox.stub(fs, 'readFile', (filename, callback) ->
+    callback(null, JSON.stringify(indicatorDefinitions))
+  )
+
+  assertions = (statusCode, data) ->
+    try
+      assert.strictEqual statusCode, 200,
+        "Expected the server to respond with success"
+      assert.deepEqual JSON.parse(data), expectedJSON,
+        "Expected the application to return the correct indicatorated JSON"
+    catch err
+      done(err)
+    finally
+      sandbox.restore()
+
+  request =
+    params: id: 4
+
+  response =
+    send: assertions
+
+  indicatorData.query(request, response)
+)


Implement CancelWorkflowExecution

Implement CancelWorkflowExecution

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/skgcorp/swf.git/'


helper class for extract info

helper class for extract info

error: pathspec 'src/BindHelper.coffee' did not match any file(s) known to git

--- src/BindHelper.coffee
+++ src/BindHelper.coffee
@@ -0,0 +1,73 @@
+
+# @private
+#
+# This class should extract from element node all elements which contain information
+# about binding (data-bind-*)
+#
+# extracted info:
+# data-bind-from
+# data-bind-to
+# data-bind-strategy
+# data-bind-view
+# element selector
+class Sirius.BindHelper
+
+  # @param [String] - selector
+  # @param [Object] - contain information for extract (data-bind-*)
+  #                   and contain information from user
+  #                   and then merge extracted info and passed
+  #                   {to: 'data-bind-to', from: 'data-bind-from'
+  #                    strategy: 'data-bind-strategy'
+  #                    transform: 'data-bind-transform'
+  #                    }
+  constructor: (@element, @setting, @is_bind_view_to_model = true) ->
+    @adapter = Sirius.Application.adapter
+
+  #
+  #
+  # @param [Object] - `to` and `from` if present
+  #
+  extract: (user_setting = {}) ->
+    # need extract main element, and children
+    # fixme optimize this need extract only when element contain data-bind-*
+    elements = @adapter.all("#{@element}, #{@element} *")
+    # when it contain only one element (no children)
+    # it's a single mode
+    single = if elements.length == 1
+      true
+    else
+      false
+
+    to = @setting['to']
+    from = @setting['from']
+    strategy = @setting['strategy']
+    transform = @setting['transform']
+    default_from = @setting['default_from']
+    default_to = @setting['default_to']
+    adapter = @adapter
+    is_bind_view_to_model = @is_bind_view_to_model
+    result = []
+    #
+    # Extract all elements which contain data-bind-*
+    # with data-bind-strategy
+    # with data-bind-transform
+    # and selector
+    for element in elements
+      do(element) ->
+        tmp_to   = adapter.get_attr(element, to) || default_to
+        tmp_from = adapter.get_attr(element, from) || default_from
+        tmp_strategy = adapter.get_attr(element, strategy) || 'swap'
+        tmp_transform = adapter.get_attr(element, transform)
+        # for view to model, need tmp_to but for model to view need tmp_from
+        if is_bind_view_to_model
+          if tmp_to
+            r = {
+              to: tmp_to
+              from: tmp_from
+              strategy: tmp_strategy
+              transform: tmp_transform
+              element: element
+            }
+            result.push(r)
+
+    result


chore(build):trailing whitespace cleanup

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/keboola/kbc-ui-ex-db.git/'


create storage service interface. non functional

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/DogFoodBurrito/aviary.git/'


Fix extension keymap loading

Fix extension keymap loading

--- src/app/window.coffee
+++ src/app/window.coffee
@@ -74,9 +74,7 @@
       throw new Error("Extension '#{name}' does not exist at path '#{extensionPath}'") unless fs.exists(extensionPath)

       extension = rootView.activateExtension(require(extensionPath), config)
-      extensionKeymapPath = require.resolve(fs.join(extensionPath, "src/keymap"), {verifyExistence: false})
-      console.log extensionKeymapPath
-
+      extensionKeymapPath = require.resolve(fs.join(name, "src/keymap"), {verifyExistence: false})
       require extensionKeymapPath if fs.exists(extensionKeymapPath)
       extension
     catch e


Show enums using select element

Show enums using select element

--- lib/settings-panel.coffee
+++ lib/settings-panel.coffee
@@ -11,7 +11,8 @@
     settings = atom.config.getSettings()
     @appendSettings(namespace, settings[namespace])

-    @bindFormFields()
+    @bindCheckboxFields()
+    @bindSelectFields()
     @bindEditors()

   appendSettings: (namespace, settings) ->
@@ -30,7 +31,7 @@
           for name in _.keys(settings).sort()
             appendSetting.call(this, namespace, name, settings[name])

-  bindFormFields: ->
+  bindCheckboxFields: ->
     for input in @find('input[id]').toArray()
       do (input) =>
         input = $(input)
@@ -51,6 +52,17 @@
             value = @parseValue(type, value)

           atom.config.set(name, value)
+
+  bindSelectFields: ->
+    @find('select[id]').toArray().forEach (select) =>
+      select = $(select)
+      name = select.attr('id')
+
+      @subscribe atom.config.observe name, (value) ->
+        select.val(value)
+
+      select.change ->
+        atom.config.set(name, select.val())

   bindEditors: ->
     for editorView in @find('.editor[id]').views()
@@ -109,7 +121,9 @@

   @div class: 'control-group', =>
     @div class: 'controls', =>
-      if _.isBoolean(value)
+      if atom.config.getSchema("#{namespace}.#{name}")?.enum
+        appendOptions.call(this, namespace, name, value)
+      else if _.isBoolean(value)
         appendCheckbox.call(this, namespace, name, value)
       else if _.isArray(value)
         appendArray.call(this, namespace, name, value) if isEditableArray(value)
@@ -125,6 +139,20 @@
 getSettingDescription = (keyPath) ->
   atom.config.getSchema?(keyPath)?.description or ''

+appendOptions = (namespace, name, value) ->
+  keyPath = "#{namespace}.#{name}"
+  title = getSettingTitle(keyPath, name)
+  description = getSettingDescription(keyPath)
+  options = atom.config.getSchema(keyPath)?.enum ? []
+
+  @label class: 'control-label', =>
+    @div class: 'setting-title', title
+    @div class: 'setting-description', description
+
+  @select id: keyPath, class: 'form-control', =>
+    for option in options
+      @option value: option, option
+
 appendCheckbox = (namespace, name, value) ->
   keyPath = "#{namespace}.#{name}"
   title = getSettingTitle(keyPath, name)


removed console

removed console

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NewSpring/norma-sass.git/'


bug fix to postgres monitoring

bug fix to postgres monitoring

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


javascript tests

javascript tests

error: pathspec 'Tests/spec/dialog.spec.coffee' did not match any file(s) known to git

--- Tests/spec/dialog.spec.coffee
+++ Tests/spec/dialog.spec.coffee
@@ -0,0 +1,69 @@
+if require?
+    require "../../../JsTestBundle/Resources/config/init-test.coffee"
+
+    # file to test
+    require "../../Resources/coffee/dialog.coffee"
+
+describe "app dialog", ->
+
+    launchElement = null
+    dialog = null
+
+    beforeEach ->
+        launchElement = $('link')
+        dialog = new App.Dialog '.confirm-dialog', { width: 300, modal: true}
+        spyOn(dialog, 'displayErrors').andReturn true
+
+    it "creates new dialog", ->
+        expect(dialog).toBeDefined()
+        expect(dialog.element).toEqual('.confirm-dialog')
+
+    it "checks for errors, valid", ->
+        noErrors = dialog.checkForErrors {valid: 'stuff'}, 'success', {}, dialog
+        expect(noErrors).toBeFalsy()
+        expect(dialog.displayErrors).not.toHaveBeenCalled()
+
+    it "checks for errors, serverside", ->
+        serversideError = dialog.checkForErrors {valid: 'stuff'}, 'error', {}, dialog
+        expect(serversideError).toBeTruthy()
+        expect(dialog.displayErrors).toHaveBeenCalled()
+
+    it "checks for errors, fatal", ->
+        fatalError = dialog.checkForErrors "PHP Fatal Error: diibadaada", '', {}, dialog
+        expect(fatalError).toBeTruthy()
+        expect(dialog.displayErrors).toHaveBeenCalled()
+
+    it "checks for errors, unknown", ->
+        msyticError = dialog.checkForErrors '', '', {}, dialog
+        expect(msyticError).toBeTruthy()
+        expect(dialog.displayErrors).toHaveBeenCalled()
+
+    it "gets data uri", ->
+        expect(dialog.getUri(launchElement)).toBe "/path/to/href"
+
+    it "gets header", ->
+        header = dialog.getHeader(launchElement, {headerAttribute : 'title'})
+        expect(header).toBe "dialog-title"
+
+    it "binds dialog to element", ->
+        dialogElem = $('

')
+        dialog.bindDialogToElement dialogElem, launchElement
+
+        expect(dialogElem.attr('id')).toEqual $(launchElement).data('dialog-binded')
+
+
+describe "confirm dialog", ->
+
+    launchElement = null
+    dialog = null
+
+    beforeEach ->
+        launchElement = $('link');
+        dialog = new App.ConfirmDialog('.confirm-dialog', { width: 300, modal: true})
+
+    it "gets data uri", ->
+        expect(dialog.getUri(launchElement)).toBe "/path/to/data/href"
+
+    # disabled until proper content merged
+    xit "loads proper stuff after complete request", ->
+


add checkauth

add checkauth

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stevelacy/quare.git/'


Default implementation of User model

Default implementation of User model

error: pathspec 'client/data/User.coffee' did not match any file(s) known to git

--- client/data/User.coffee
+++ client/data/User.coffee
@@ -0,0 +1,46 @@
+unless Lanes.Data.Roles
+
+    class Lanes.Data.Role extends Lanes.Data.BasicModel
+        props:
+            id:     'string'
+            name:   'string'
+            member: { type: 'boolean', default: false }
+
+    class Lanes.Data.Roles extends Lanes.Data.BasicCollection
+        model: Lanes.Data.Role
+
+
+unless Lanes.Data.User
+    class Lanes.Data.User extends Lanes.Data.Model
+
+        constructor: (attributes,access)->
+            super
+            this.access_data = access
+
+        api_path: 'users'
+        derived:
+            roles:
+                fn: -> []
+            isLoggedIn:
+                fn: -> false
+            allRoles:
+                fn: -> new Lanes.Data.Roles
+
+        session:
+            access_data: 'object'
+
+        session:
+            id:          "integer"
+            login:       'string'
+            name:        'string'
+            email:       'string'
+            role_names:  'array'
+            options:     'object'
+            password:    'string'
+
+        canRead: (model,field)  -> true
+        canWrite: (model,field) -> true
+        canDelete: (model)      -> true
+
+unless Lanes.current_user
+    Lanes.current_user = new Lanes.Data.User


Config email in meteor.com

Config email in meteor.com

error: pathspec 'server/lib/emailConfig.coffee' did not match any file(s) known to git

--- server/lib/emailConfig.coffee
+++ server/lib/emailConfig.coffee
@@ -0,0 +1,5 @@
+Accounts.emailTemplates.from = "no-reply <no-reply@carddi.mobi>";
+
+if Meteor.settings.MAIL_URL?
+	console.log 'setting email', Meteor.settings.MAIL_URL
+	process.env.MAIL_URL = Meteor.settings.MAIL_URL


Add regression test for "can't create multiple folds over same region".

Am I using the term regression test correctly?

--- spec/app/renderer-spec.coffee
+++ spec/app/renderer-spec.coffee
@@ -307,6 +307,14 @@
           expect(line4.screenDelta).toEqual [1, 0]
           expect(line5.text).toMatch /9-+/

+      describe "when creating a fold where one already exists", ->
+        it "returns existing fold and does't create new fold", ->
+          fold = renderer.createFold(0,10)
+          expect(renderer.activeFolds[0].length).toBe 1
+
+          newFold = renderer.createFold(0,10)
+          expect(newFold).toBe fold
+          expect(renderer.activeFolds[0].length).toBe 1
     describe "when the buffer changes", ->
       [fold1, fold2] = []
       beforeEach ->


Added option to update a select (to use e.g. form.serialize())

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/saijim/Multipleter.git/'


adding package list for atom

adding package list for atom

using package-sync

error: pathspec 'atom.symlink/packages.cson' did not match any file(s) known to git

--- atom.symlink/packages.cson
+++ atom.symlink/packages.cson
@@ -0,0 +1,20 @@
+'packages': [
+  'atom-beautify'
+  'atom-csscomb'
+  'boron-syntax'
+  'csslint'
+  'cut-line'
+  'editorconfig'
+  'emmet'
+  'file-type-icons'
+  'gist-it'
+  'htmlhint'
+  'jslint'
+  'jsonlint'
+  'language-jade'
+  'language-lua'
+  'neutron-syntax'
+  'neutron-ui'
+  'package-sync'
+  'visual-bell'
+]


desgined the interface

desgined the interface

error: pathspec 'spec/lib/router-spec.coffee' did not match any file(s) known to git

--- spec/lib/router-spec.coffee
+++ spec/lib/router-spec.coffee
@@ -0,0 +1,19 @@
+describe 'Router', ->
+
+  describe '#()', ->
+
+  describe '#(source:EventEmitter)', ->
+
+  describe 'prototype', ->
+
+    describe '#bind(source:EventEmitter)', ->
+
+    describe '#unbind(source:EventEmitter)', ->
+
+    describe '#buildRoute(path:String)', ->
+
+    descirbe '#onLast(message:Message, done:Function)', ->
+
+    describe '#route(message:Message)', ->
+
+    describe '#on(path:String, message:Message)', ->


SpacePen's constructor doesn't default first arg to an empty object

If you want your view's initialize, class or content argument to default to an empty object, do it yourself!

--- vendor/space-pen.coffee
+++ vendor/space-pen.coffee
@@ -58,7 +58,7 @@
     fragment

   constructor: (args...) ->
-    args[0] ?= {}
+    # args[0] ?= {}
     [html, postProcessingSteps] = @constructor.buildHtml -> @content(args...)
     jQuery.fn.init.call(this, html)
     @constructor = jQuery # sadly, jQuery assumes this.constructor == jQuery in pushStack


Wait until all ajax calls are finished to get reconnect after session commit.

--- app/assets/javascripts/app/controllers/getting_started.coffee
+++ app/assets/javascripts/app/controllers/getting_started.coffee
@@ -110,7 +110,7 @@
         delay = =>
           App.Auth.loginCheck()
           @navigate '#'
-        @delay(delay, 800)
+        @delay(delay, 1200)
         return
     )


memory leak

memory leak

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/skgcorp/core.git/'


Clean up build-task

Clean up build-task

error: pathspec 'build/tasks/build-task.coffee' did not match any file(s) known to git

--- build/tasks/build-task.coffee
+++ build/tasks/build-task.coffee
@@ -0,0 +1,132 @@
+fs = require 'fs'
+path = require 'path'
+_ = require 'underscore-plus'
+
+module.exports = (grunt) ->
+  {cp, isAtomPackage, mkdir, rm} = require('./task-helpers')(grunt)
+
+  grunt.registerTask 'build', 'Build the application', ->
+    pkgName = grunt.config.get('pkgName')
+
+    shellAppDir = grunt.config.get("#{pkgName}.shellAppDir")
+    buildDir = grunt.config.get("#{pkgName}.buildDir")
+    appDir = grunt.config.get("#{pkgName}.appDir")
+    executableName = grunt.config.get("#{pkgName}.executableName")
+
+    rm shellAppDir
+    rm path.join(buildDir, 'installer')
+    mkdir path.dirname(buildDir)
+
+    switch process.platform
+      when 'darwin'
+        cp 'atom-shell/Atom.app', shellAppDir, filter: /default_app/
+        exeDir = path.join(shellAppDir, 'Contents', 'MacOS')
+        fs.renameSync path.join(exeDir, 'Atom'), path.join(exeDir, executableName)
+      when 'linux'
+        cp 'atom-shell', shellAppDir, filter: /default_app/
+        fs.renameSync path.join(shellAppDir, 'atom'), path.join(shellAppDir, executableName)
+      when 'win32'
+        cp 'atom-shell', shellAppDir, filter: /default_app/
+        fs.renameSync path.join(shellAppDir, 'atom.exe'), path.join(shellAppDir, executableName)
+
+    cp 'package.json', path.join(appDir, 'package.json')
+
+    nonPackageDirectories = [
+      'vendor'
+      'resources'
+    ]
+
+    {devDependencies} = grunt.file.readJSON('package.json')
+    for child in fs.readdirSync('node_modules')
+      directory = path.join('node_modules', child)
+      nonPackageDirectories.push(directory)
+
+    # Put any paths here that shouldn't end up in the built Atom.app
+    # so that it doesn't becomes larger than it needs to be.
+    ignoredPaths = [
+      path.join('less', 'dist')
+      path.join('npm', 'doc')
+      path.join('npm', 'html')
+      path.join('npm', 'man')
+      path.join('npm', 'node_modules', '.bin', 'beep')
+      path.join('npm', 'node_modules', '.bin', 'clear')
+      path.join('npm', 'node_modules', '.bin', 'starwars')
+      path.join('jasmine-node', 'node_modules', 'gaze')
+      path.join('jasmine-node', 'spec')
+      path.join('node_modules', 'nan')
+      path.join('build', 'binding.Makefile')
+      path.join('build', 'config.gypi')
+      path.join('build', 'gyp-mac-tool')
+      path.join('build', 'Makefile')
+      path.join('build', 'Release', 'obj.target')
+      path.join('build', 'Release', 'obj')
+      path.join('build', 'Release', '.deps')
+      path.join('vendor', 'apm')
+      path.join('resources', 'mac')
+      path.join('resources', 'win')
+
+      '.DS_Store'
+      '.jshintrc'
+      '.npmignore'
+      '.pairs'
+      '.travis.yml'
+    ]
+    ignoredPaths = ignoredPaths.map (ignoredPath) -> _.escapeRegExp(ignoredPath)
+
+    # Add .* to avoid matching hunspell_dictionaries.
+    ignoredPaths.push "#{_.escapeRegExp(path.join('spellchecker', 'vendor', 'hunspell') + path.sep)}.*"
+    ignoredPaths.push "#{_.escapeRegExp(path.join('build', 'Release') + path.sep)}.*\\.pdb"
+
+    # Ignore *.cc and *.h files from native modules
+    ignoredPaths.push "#{_.escapeRegExp(path.join('keytar', 'src') + path.sep)}.*\\.(cc|h)*"
+    ignoredPaths.push "#{_.escapeRegExp(path.join('nslog', 'src') + path.sep)}.*\\.(cc|h)*"
+    ignoredPaths.push "#{_.escapeRegExp(path.join('runas', 'src') + path.sep)}.*\\.(cc|h)*"
+    ignoredPaths.push "#{_.escapeRegExp(path.join('scrollbar-style', 'src') + path.sep)}.*\\.(cc|h)*"
+    ignoredPaths.push "#{_.escapeRegExp(path.join('spellchecker', 'src') + path.sep)}.*\\.(cc|h)*"
+
+    # Ignore build files
+    ignoredPaths.push "#{_.escapeRegExp(path.sep)}binding\\.gyp$"
+    ignoredPaths.push "#{_.escapeRegExp(path.sep)}.+\\.target.mk$"
+    ignoredPaths.push "#{_.escapeRegExp(path.sep)}linker\\.lock$"
+    ignoredPaths.push "#{_.escapeRegExp(path.join('build', 'Release') + path.sep)}.+\\.node\\.dSYM"
+
+    # Hunspell dictionaries are only not needed on OS X.
+    if process.platform is 'darwin'
+      ignoredPaths.push path.join('spellchecker', 'vendor', 'hunspell_dictionaries')
+    ignoredPaths = ignoredPaths.map (ignoredPath) -> "(#{ignoredPath})"
+
+    testFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}te?sts?#{_.escapeRegExp(path.sep)}")
+    exampleFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}examples?#{_.escapeRegExp(path.sep)}")
+    benchmarkFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}benchmarks?#{_.escapeRegExp(path.sep)}")
+
+    nodeModulesFilter = new RegExp(ignoredPaths.join('|'))
+    filterNodeModule = (pathToCopy) ->
+      return true if benchmarkFolderPattern.test(pathToCopy)
+
+      pathToCopy = path.resolve(pathToCopy)
+      nodeModulesFilter.test(pathToCopy) or testFolderPattern.test(pathToCopy) or exampleFolderPattern.test(pathToCopy)
+
+    packageFilter = new RegExp("(#{ignoredPaths.join('|')})|(.+\\.(cson|coffee)$)")
+    filterPackage = (pathToCopy) ->
+      return true if benchmarkFolderPattern.test(pathToCopy)
+
+      pathToCopy = path.resolve(pathToCopy)
+      packageFilter.test(pathToCopy) or testFolderPattern.test(pathToCopy) or exampleFolderPattern.test(pathToCopy)
+
+    for directory in nonPackageDirectories
+      cp directory, path.join(appDir, directory), filter: filterNodeModule
+
+    cp 'spec', path.join(appDir, 'spec')
+    cp 'src', path.join(appDir, 'src'), filter: /.+\.(cson|coffee)$/
+    cp 'static', path.join(appDir, 'static')
+    cp 'apm', path.join(appDir, 'apm'), filter: filterNodeModule
+
+    if process.platform is 'darwin'
+      grunt.file.recurse path.join('resources', 'mac'), (sourcePath, rootDirectory, subDirectory='', filename) ->
+        unless /.+\.plist/.test(sourcePath)
+          grunt.file.copy(sourcePath, path.resolve(appDir, '..', subDirectory, filename))
+
+    dependencies = ['compile', 'generate-license:save', 'generate-module-cache', 'compile-packages-slug']
+    dependencies.push('copy-info-plist') if process.platform is 'darwin'
+    dependencies.push('set-exe-icon') if process.platform is 'win32'
+    grunt.task.run(dependencies...)


add ck-config template

add ck-config template

error: pathspec 'lib/templates/kuhsaft/assets/ck-config.js.coffee' did not match any file(s) known to git

--- lib/templates/kuhsaft/assets/ck-config.js.coffee
+++ lib/templates/kuhsaft/assets/ck-config.js.coffee
@@ -0,0 +1,28 @@
+CKEDITOR.editorConfig = (config) ->
+  config.language = "de"
+  config.removeButtons = "Anchor,Underline,Strike,Subscript,Superscript"
+  config.format_tags = "p;h1;h2;h3;h4;pre"
+  config.toolbarGroups = [["Format"],
+                          ["Bold", "Italic", "Underline", "Strike", "-", "Subscript", "Superscript"],
+                          ["Table", "HorizontalRule", "SpecialChar"], ["Link", "Unlink"],
+                          ["Undo", "Redo", "-", "RemoveFormat", "Cut", "Copy", "Paste"],
+                          ["Source", "-", "ShowBlocks", "-", "About"],
+                          ["Maximize"]]
+
+# FULL OPTIONS:
+#[
+#['Source','-','Save','NewPage','Preview','-','Templates'],
+#['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print', 'SpellChecker', 'Scayt'],
+#['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
+#['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'],
+#'/',
+#['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
+#['NumberedList','BulletedList','-','Outdent','Indent','Blockquote','CreateDiv'],
+#['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
+#['Link','Unlink','Anchor'],
+#['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
+#'/',
+#['Styles','Format','Font','FontSize'],
+#['TextColor','BGColor'],
+#['Maximize', 'ShowBlocks','-','About']
+#]


Keep registration of push only at the app side

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Morgy93/Rocket.Chat.Cordova.git/'


remove cozy- in display name

remove cozy- in display name

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-home.git/'


sort cities

sort cities

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ofoso/ofo.git/'


Add spec for when lines become foldable

Add spec for when lines become foldable

--- spec/editor-component-spec.coffee
+++ spec/editor-component-spec.coffee
@@ -329,6 +329,15 @@
           expect(lineNumberHasClass(5, 'foldable')).toBe true
           expect(lineNumberHasClass(6, 'foldable')).toBe false

+        it "updates the foldable class on a line number that becomes foldable", ->
+          expect(lineNumberHasClass(11, 'foldable')).toBe false
+
+          editor.getBuffer().insert([11, 44], '\n    fold me')
+          expect(lineNumberHasClass(11, 'foldable')).toBe true
+
+          editor.undo()
+          expect(lineNumberHasClass(11, 'foldable')).toBe false
+
         it "adds, updates and removes the folded class on the correct line number nodes", ->
           editor.foldBufferRow(4)
           expect(lineNumberHasClass(4, 'folded')).toBe true


added helpers.coffee with two additions to basic js primitives.

error: pathspec 'helpers.coffee' did not match any file(s) known to git

--- helpers.coffee
+++ helpers.coffee
@@ -0,0 +1,21 @@
+###
+Remove an item e from an array.
+###
+Array::remove = (e) -> @[t..t] = [] if (t = @indexOf(e)) > -1
+
+###
+Pass a string 'trigger' where the callback should go and this
+should wait for the callback and returning its arguments.
+###
+Function::wait = (args...) ->
+  error = true
+  result = undefined
+  f = (args...) -> result = args
+  for a, i in args
+    if a is 'trigger'
+      args[i] = f
+      error = false
+  return if error
+  @(args...)
+  while not result? then
+  return result


Test Docas.io

Test Docas.io

--- test/1.test.coffee
+++ test/1.test.coffee
@@ -9,7 +9,6 @@
 total_groups = 10
 total_tasks  = 2000
 total_workers = require('os').cpus().length
-child_processes = []

 describe ["Process #{total_tasks} Tasks of #{total_groups} Groups by #{total_workers} Fail-n-Block Workers"], ->


:white_check_mark: add tests for showing matched chars

--- spec/fuzzy-finder-spec.coffee
+++ spec/fuzzy-finder-spec.coffee
@@ -624,6 +624,65 @@
           expect(atom.workspace.getActiveTextEditor()).toBe editor1
           expect(editor1.getCursorBufferPosition()).toEqual [3, 4]

+  describe "highlights matches", ->
+    beforeEach ->
+      jasmine.attachToDOM(workspaceElement)
+      dispatchCommand('toggle-buffer-finder')
+
+    it "highlights an exact match", ->
+      bufferView.filterEditorView.getModel().setText('sample.js')
+      bufferView.populateList()
+      resultView = bufferView.getSelectedItemView()
+
+      primaryMatches = resultView.find('.primary-line .matching')
+      secondaryMatches = resultView.find('.secondary-line .matching')
+      expect(primaryMatches.length).toBe 1
+      expect(primaryMatches.last().text()).toBe 'sample.js'
+      # Use `toBeGreaterThan` because dir may have some characters in it
+      expect(secondaryMatches.length).toBeGreaterThan 0
+      expect(secondaryMatches.last().text()).toBe 'sample.js'
+
+    it "highlights a partial match", ->
+      bufferView.filterEditorView.getModel().setText('sample')
+      bufferView.populateList()
+      resultView = bufferView.getSelectedItemView()
+
+      primaryMatches = resultView.find('.primary-line .matching')
+      secondaryMatches = resultView.find('.secondary-line .matching')
+      expect(primaryMatches.length).toBe 1
+      expect(primaryMatches.last().text()).toBe 'sample'
+      # Use `toBeGreaterThan` because dir may have some characters in it
+      expect(secondaryMatches.length).toBeGreaterThan 0
+      expect(secondaryMatches.last().text()).toBe 'sample'
+
+    it "highlights multiple matches in the file name", ->
+      bufferView.filterEditorView.getModel().setText('samplejs')
+      bufferView.populateList()
+      resultView = bufferView.getSelectedItemView()
+
+      primaryMatches = resultView.find('.primary-line .matching')
+      secondaryMatches = resultView.find('.secondary-line .matching')
+      expect(primaryMatches.length).toBe 2
+      expect(primaryMatches.first().text()).toBe 'sample'
+      expect(primaryMatches.last().text()).toBe 'js'
+      # Use `toBeGreaterThan` because dir may have some characters in it
+      expect(secondaryMatches.length).toBeGreaterThan 1
+      expect(secondaryMatches.last().text()).toBe 'js'
+
+    it "highlights matches in the directory and file name", ->
+      bufferView.filterEditorView.getModel().setText('root-dirsample')
+      bufferView.populateList()
+      resultView = bufferView.getSelectedItemView()
+
+      primaryMatches = resultView.find('.primary-line .matching')
+      secondaryMatches = resultView.find('.secondary-line .matching')
+      expect(primaryMatches.length).toBe 1
+      expect(primaryMatches.last().text()).toBe 'sample'
+      # Use `toBeGreaterThan` because dir may have some characters in it
+      expect(secondaryMatches.length).toBeGreaterThan 1
+      expect(secondaryMatches.first().text()).toBe 'root-dir'
+      expect(secondaryMatches.last().text()).toBe 'sample'
+
     describe "when the filter text doesn't have a file path", ->
       it "moves the cursor in the active editor to that line number", ->
         [editor1, editor2] = atom.workspace.getTextEditors()


move config above

move config above

--- index.coffee
+++ index.coffee
@@ -4,8 +4,9 @@
 # be abstracted into modules under /lib.
 #

+{ PORT, NODE_ENV } = require "./config"
+
 require 'newrelic' unless NODE_ENV is 'development'
-{ PORT } = require "./config"
 express = require "express"
 setup = require "./lib/setup"


first draft of .sqlite to rss command

first draft of .sqlite to rss command

error: pathspec 'code/rss.coffee' did not match any file(s) known to git

--- code/rss.coffee
+++ code/rss.coffee
@@ -0,0 +1,32 @@
+#!/usr/bin/env coffee
+
+fs = require 'fs'
+# https://github.com/dylang/node-rss
+RSS = require 'rss'
+
+sqlite3 = (require 'sqlite3').verbose()
+db = new sqlite3.Database 'loggit.sqlite'
+
+# :todo: We need to work out how to get the box name,
+# so the feed_url is correct.
+feed = new RSS
+  title: 'loggit RSS feed',
+  site_url: 'overview/',
+  description: "Stuff from the loggit runs",
+  author: 'The Box Author',
+  feed_url: 'rss.xml'
+
+# These functions are used later, see db.each.
+eachRow = (err, row) ->
+  feed.item
+    title: row.command,
+    url: 'http://api/sqlite?q=select*from+loggit_event+where+runid='+row.runid,
+    date: row.timestamp,
+    description: 'do not have one',
+    guid: row.runid
+
+allDone = ->
+  fs.writeFile 'loggit-rss.xml', feed.xml(), ->
+
+# "loop" over data and add to feed
+db.each "select * from loggit_event where type='start'", eachRow, allDone


Change snippet trigger. "w" for wiki-link

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ylansegal/dotfiles.git/'


No fold widgets in ACE.

No fold widgets in ACE.

--- app/views/play/level/tome/SpellView.coffee
+++ app/views/play/level/tome/SpellView.coffee
@@ -99,6 +99,7 @@
     @ace.setShowInvisibles aceConfig.invisibles
     @ace.setBehavioursEnabled aceConfig.behaviors
     @ace.setAnimatedScroll true
+    @ace.setShowFoldWidgets false
     @ace.setKeyboardHandler @keyBindings[aceConfig.keyBindings ? 'default']
     @toggleControls null, @writable
     @aceSession.selection.on 'changeCursor', @onCursorActivity


fixed a mistake in the regexp allowing some of the links to freeze the bot....

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Mikuia/Mikuia.git/'


[misc-robustness] account.favorites was empty string during first phase of import

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-emails.git/'


Call callback after creating

Call callback after creating

--- src/rebuild-module-cache.coffee
+++ src/rebuild-module-cache.coffee
@@ -22,6 +22,7 @@
       try
         @moduleCache ?= require(path.join(resourcePath, 'src', 'module-cache'))
         @moduleCache.create(packageDirectory)
+        callback()
       catch error
         callback(error)


(Forgot to add the `provider.coffee`)

(Forgot to add the `provider.coffee`)

 Changes to be committed:
	new file:   lib/provider.coffee

error: pathspec 'lib/provider.coffee' did not match any file(s) known to git

--- lib/provider.coffee
+++ lib/provider.coffee
@@ -0,0 +1,36 @@
+fs = require 'fs'
+
+module.exports =
+  # The `selector` variable chooses where this provider will work. With a star,
+  # it will work for all files; probably I should use something like
+  # "source.cha" in this provider.
+  selector: '*'
+  # The variable `disableForSelector` allows me to prevent the provider from
+  # being activated in some parts of the file (unfortunately, I'd probably have
+  # to create a syntax definition for the .cha files). In the example below, the
+  # provider won't be activated in comment sections of ruby files.
+  #disableForSelector: 'source.ruby .comment'
+
+  # This will take priority over the default provider, which has a inclusionPriority of 0.
+  # `excludeLowerPriority` will suppress any providers with a lower priority
+  # i.e. The default provider will be suppressed
+  inclusionPriority: 1
+  excludeLowerPriority: true
+
+  # This will be suggested before the default provider, which has a suggestionPriority of 1.
+  suggestionPriority: 2
+
+  load: (dict_data) ->
+    @dict_data = dict_data
+
+  getSuggestions: (options) ->
+    { prefix } = options
+    ret = @findMatchingSuggestions(prefix)
+    return ret;
+
+  findMatchingSuggestions: (prefix) ->
+    matchingSuggestions = dict_data.filter((elem) -> elem[0].startsWith(prefix))
+    console.log(matchingSuggestions);
+    return matchingSuggestions.map(@inflateSuggestion);
+
+  inflateSuggestion: (elem) -> { text: elem[1] }


:lipstick:

:lipstick:

--- src/app/language-mode.coffee
+++ src/app/language-mode.coffee
@@ -189,9 +189,9 @@
   #
   # Returns a {Number} of the indent level of the block of lines.
   minIndentLevelForRowRange: (startRow, endRow) ->
-    indents = (@editSession.indentationForBufferRow(row) for row in [startRow..endRow] when @editSession.lineForBufferRow(row).trim())
-    min = Math.min(indents...)
-    if min == Infinity then 0 else min
+    indents = (@editSession.indentationForBufferRow(row) for row in [startRow..endRow] when not @editSession.isBufferRowBlank(row))
+    indents = [0] unless indents.length
+    Math.min(indents...)

   # Indents all the rows between two buffer row numbers.
   #


there's some kind of chance i fixed the events


Put difflib/view in the correct vendor.js anymatch set.

--- config.coffee
+++ config.coffee
@@ -63,8 +63,8 @@

         #- vendor.js, all the vendor libraries
         'javascripts/vendor.js': [
-          regJoin('^vendor/scripts/(?!(Box2d|coffeescript))')
-          regJoin('^bower_components/(?!(aether|d3|difflib|diffview))')
+          regJoin('^vendor/scripts/(?!(Box2d|coffeescript|difflib|diffview))')
+          regJoin('^bower_components/(?!(aether|d3))')
         ]

         #- Other vendor libraries in separate bunches


Fixed reference bugs.

Fixed reference bugs.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/urbanetic/bismuth-schema.git/'


Remove circular dependency between err and fnName.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JoshuaToenyes/stout-core.git/'


Update es-419.coffee

Update es-419.coffee

--- app/locale/es-419.coffee
+++ app/locale/es-419.coffee
@@ -34,7 +34,7 @@
     about: "Sobre"
     contact: "Contacto"
     twitter_follow: "Seguir"
-#    teachers: "Teachers"
+    teachers: "Profesores"

   modal:
     close: "Cerrar"
@@ -62,17 +62,17 @@
     account: "Cuenta" # Tooltip on account button from /play
     settings: "Configuración" # Tooltip on settings button from /play
     next: "Próximo" # Go from choose hero to choose inventory before playing a level
-#    change_hero: "Change Hero" # Go back from choose inventory to choose hero
+    change_hero: "Cambiar héroe" # Go back from choose inventory to choose hero
     choose_inventory: "Equipar objetos"
-#    older_campaigns: "Older Campaigns"
-#    anonymous: "Anonymous Player"
+    older_campaigns: "Campañas previas"
+    anonymous: "Jugador Anónimo"
     level_difficulty: "Dificultad: "
     campaign_beginner: "Campaña para principiantes"
     choose_your_level: "Elige tu nivel" # The rest of this section is the old play view at /play-old and isn't very important.
     adventurer_prefix: "Puedes saltar a cualquier nivel de abajo, o discutir los niveles en "
     adventurer_forum: "el foro del aventurero"
     adventurer_suffix: "."
-#    campaign_old_beginner: "Old Beginner Campaign"
+    campaign_old_beginner: "Campaña anterior de principiante"
     campaign_beginner_description: "... en la que aprendes la hechicería de la programación."
     campaign_dev: "Niveles aleatorios más difíciles"
     campaign_dev_description: "... en los que aprendes sobre la interfaz mientras haces algo un poco más difícil."
@@ -135,7 +135,7 @@
   general:
     and: "y"
     name: "Nombre"
-#    date: "Date"
+    date: "Fecha"
     body: "Cuerpo"
     version: "Versión"
     commit_msg: "Enviar mensaje"
@@ -182,20 +182,20 @@
   play_level:
     done: "Listo"
     home: "Inicio"
-#    skip: "Skip"
+    skip: "Omitir"
     game_menu: "Menu del Juego"
     guide: "Guia"
     restart: "Reiniciar"
     goals: "Objetivos"
-#    goal: "Goal"
+    goal: "Objetivo"
     success: "¡Éxito!"
     incomplete: "Incompleto"
     timed_out: "Se te acabo el tiempo"
     failing: "Fallando"
     action_timeline: "Cronologia de Accion"
     click_to_select: "Has click en una unidad para seleccionarla."
-    reload_title: "¿Recargar Todo el Codigo?"
-    reload_really: "¿Estas seguro de que quieres empezar este nivel desde el principio?"
+    reload_title: "¿Recargar Todo el Código?"
+    reload_really: "¿Estás seguro de que quieres empezar este nivel desde el principio?"
     reload_confirm: "Recargar Todo"
     victory_title_prefix: "¡"
     victory_title_suffix: " Completo!"
@@ -204,7 +204,7 @@
     victory_rate_the_level: "Valora el nivel: " # Only in old-style levels.
     victory_return_to_ladder: "Volver a la escalera"
     victory_play_next_level: "Jugar Próximo Nivel" # Only in old-style levels.
-#    victory_play_continue: "Continue"
+    victory_play_continue: "Continuar"
     victory_go_home: "Ir al Inicio" # Only in old-style levels.
     victory_review: "¡Cuéntanos más!" # Only in old-style levels.
     victory_hour_of_code_done: "¿Has acabado?"
@@ -216,22 +216,22 @@
     tome_cast_button_castable: "Invocable" # Temporary, if tome_cast_button_run isn't translated.
     tome_cast_button_casting: "Invocando" # Temporary, if tome_cast_button_running isn't translated.
     tome_cast_button_cast: "Invocar" # Temporary, if tome_cast_button_ran isn't translated.
-#    tome_cast_button_run: "Run"
-#    tome_cast_button_running: "Running"
-#    tome_cast_button_ran: "Ran"
-#    tome_submit_button: "Submit"
-#    tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
-#    tome_select_method: "Select a Method"
-#    tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos).
+    tome_cast_button_run: "Ejecutar"
+    tome_cast_button_running: "Ejecutando"
+    tome_cast_button_ran: "Ejecutado"
+    tome_submit_button: "Enviar"
+    tome_reload_method: "Recargar código original para este método" # Title text for individual method reload button.
+    tome_select_method: "Seleccionar un Método"
+    tome_see_all_methods: "Ver todos los métodos que puedes editar" # Title text for method list selector (shown when there are multiple programmable methdos).
     tome_select_a_thang: "Selecciona Alguien para "
     tome_available_spells: "Hechizos Disponibles"
-#    tome_your_skills: "Your Skills"
+    tome_your_skills: "Tus habilidades"
     hud_continue: "Continuar (presionar shift+space)"
     spell_saved: "Hechizo Guardado"
     skip_tutorial: "Saltar (esc)"
     keyboard_shortcuts: "Atajos de teclado"
     loading_ready: "¡Listo!"
-#    loading_start: "Start Level"
+    loading_start: "Iniciar nivel"
     time_current: "Ahora:"
     time_total: "Max:"
     time_goto: "Ir a:"
@@ -264,59 +264,59 @@
     tip_talk_is_cheap: "Hablar es barato. Muestrame el código. - Linus Torvalds"
     tip_first_language: "La cosa más desastroza que puedes aprender es tu primer lenguaje de programación. - Alan Kay"
     tip_hardware_problem: "P: ¿Cuántos programadores son necesarios para cambiar una bombilla eléctrica?  R: Ninguno, es un problema de hardware."
-#    tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
-#    tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
-#    tip_brute_force: "When in doubt, use brute force. - Ken Thompson"
+    tip_hofstadters_law: "Ley de Hofstadter: Siempre toma más tiempo del que esperas, inclso cuando tienes en cuenta la ley de Hofstadter."
+    tip_premature_optimization: "La optimización prematura es la raíz de la maldad. - Donald Knuth"
+    tip_brute_force: "Cuando tengas duda, usa la fuerza bruta. - Ken Thompson"
     customize_wizard: "Personalizar Hechicero"

   game_menu:
-#    inventory_tab: "Inventory"
-#    choose_hero_tab: "Restart Level"
-#    save_load_tab: "Save/Load"
-#    options_tab: "Options"
-#    guide_tab: "Guide"
+    inventory_tab: "Inventario"
+    choose_hero_tab: "Reiniciar Nivel"
+    save_load_tab: "Guardar/Cargar"
+    options_tab: "Opciones"
+    guide_tab: "Guía"
     multiplayer_tab: "Multijugador"
-#    inventory_caption: "Equip your hero"
-#    choose_hero_caption: "Choose hero, language"
-#    save_load_caption: "... and view history"
-#    options_caption: "Configure settings"
-#    guide_caption: "Docs and tips"
-#    multiplayer_caption: "Play with friends!"
-
-#  inventory:
-#    choose_inventory: "Equip Items"
-
-#  choose_hero:
-#    choose_hero: "Choose Your Hero"
-#    programming_language: "Programming Language"
-#    programming_language_description: "Which programming language do you want to use?"
-#    status: "Status"
-#    weapons: "Weapons"
-#    health: "Health"
-#    speed: "Speed"
-
-#  save_load:
-#    granularity_saved_games: "Saved"
-#    granularity_change_history: "History"
+    inventory_caption: "Equipar tu héroe"
+    choose_hero_caption: "Elegir héroe, lenguaje"
+    save_load_caption: "... y ver historia"
+    options_caption: "Hacer ajustes"
+    guide_caption: "Documentos y consejos"
+    multiplayer_caption: "¡Jugar con amigos!"
+
+  inventory:
+    choose_inventory: "Elegir artículos"
+
+  choose_hero:
+    choose_hero: "Elige tu héroe"
+    programming_language: "Lenguaje de programación"
+    programming_language_description: "¿Qué lenguaje de programación vas a elegir?"
+    status: "Estado"
+    weapons: "Armas"
+    health: "Salud"
+    speed: "Velocidad"
+
+  save_load:
+    granularity_saved_games: "Almacenado"
+    granularity_change_history: "Historia"

   options:
-#    general_options: "General Options" # Check out the Options tab in the Game Menu while playing a level
-#    volume_label: "Volume"
-#    music_label: "Music"
-#    music_description: "Turn background music on/off."
-#    autorun_label: "Autorun"
-#    autorun_description: "Control automatic code execution."
+    general_options: "Opciones Generales" # Check out the Options tab in the Game Menu while playing a level
+    volume_label: "Volumen"
+    music_label: "Música"
+    music_description: "Música encendida/apagada."
+    autorun_label: "Autoejecutar"
+    autorun_description: "Controlar ejecución automática de código."
     editor_config: "Config. de Editor"
     editor_config_title: "Configuración del Editor"
-#    editor_config_level_language_label: "Language for This Level"
-#    editor_config_level_language_description: "Define the programming language for this particular level."
-#    editor_config_default_language_label: "Default Programming Language"
-#    editor_config_default_language_description: "Define the programming language you want to code in when starting new levels."
+    editor_config_level_language_label: "Lenguaje para este Nivel"
+    editor_config_level_language_description: "Definir el lenguaje de programación para Este nivel."
+    editor_config_default_language_label: "Lenguaje de Programación Predeterminado"
+    editor_config_default_language_description: "Definir el lenguaje de programación que deseas para codificar cuando inicias nuevos niveles."
     editor_config_keybindings_label: "Atajos de Teclado"
     editor_config_keybindings_default: "Default (As)"
     editor_config_keybindings_description: "Añade atajos adicionales conocidos de los editores comunes."
-#    editor_config_livecompletion_label: "Live Autocompletion"
-#    editor_config_livecompletion_description: "Displays autocomplete suggestions while typing."
+    editor_config_livecompletion_label: "Autocompletado automático"
+    editor_config_livecompletion_description: "Despliega sugerencias de autocompletado mientras escribes."
     editor_config_invisibles_label: "Mostrar Invisibles"
     editor_config_invisibles_description: "Visualiza invisibles tales como espacios o tabulaciones."
     editor_config_indentguides_label: "Mostrar guías de indentación"
@@ -324,30 +324,30 @@
     editor_config_behaviors_label: "Comportamientos Inteligentes"
     editor_config_behaviors_description: "Autocompleta corchetes, llaves y comillas."

-#  about:
-#    why_codecombat: "Why CodeCombat?"
-#    why_paragraph_1: "If you want to learn to program, you don't need lessons. You need to write a lot of code and have a great time doing it."
-#    why_paragraph_2_prefix: "That's what programming is about. It's gotta be fun. Not fun like"
-#    why_paragraph_2_italic: "yay a badge"
-#    why_paragraph_2_center: "but fun like"
-#    why_paragraph_2_italic_caps: "NO MOM I HAVE TO FINISH THE LEVEL!"
-#    why_paragraph_2_suffix: "That's why CodeCombat is a multiplayer game, not a gamified lesson course. We won't stop until you can't stop--but this time, that's a good thing."
-#    why_paragraph_3: "If you're going to get addicted to some game, get addicted to this one and become one of the wizards of the tech age."
-#    press_title: "Bloggers/Press"
-#    press_paragraph_1_prefix: "Want to write about us? Feel free to download and use all of the resources included in our"
-#    press_paragraph_1_link: "press packet"
-#    press_paragraph_1_suffix: ". All logos and images may be used without contacting us directly."
-#    team: "Team"
-#    george_title: "CEO"
-#    george_blurb: "Businesser"
-#    scott_title: "Programmer"
-#    scott_blurb: "Reasonable One"
-#    nick_title: "Programmer"
-#    nick_blurb: "Motivation Guru"
-#    michael_title: "Programmer"
-#    michael_blurb: "Sys Admin"
-#    matt_title: "Programmer"
-#    matt_blurb: "Bicyclist"
+  about:
+    why_codecombat: "¿Por qué CodeCombat?"
+    why_paragraph_1: "Si quieres aprender a programar, no necesitas lecciones. Necesitas escribir mucho código y disfrutarlo mucho haciéndolo."
+    why_paragraph_2_prefix: "De eso se trata la programación. Será divertido. No casi divertido"
+    why_paragraph_2_italic: "bien un premio"
+    why_paragraph_2_center: "pero algo divertido"
+    why_paragraph_2_italic_caps: "¡NO MAMÁ, TENGO QUE FINALIZAR EL NIVEL!"
+    why_paragraph_2_suffix: "Por tal motivo CodeCombat es un juego multiusuario, no un curso con gamificación. No finalizaremos hasta que terminos--pero en esta ocasión, es una buena cosa."
+    why_paragraph_3: "si te vas a volver adicto a un juego, hazlo a este y conviértete en un de los magos de la era tecnológica."
+    press_title: "Blogeros/Prensa"
+    press_paragraph_1_prefix: "¿Quieres escribirnos? Descarga y usa con confianza todos los recursos incluídos en nuestro"
+    press_paragraph_1_link: "paquete de prensa"
+    press_paragraph_1_suffix: ". Todos los logos e imágenes pueden ser usados sin contactarnos directamente."
+    team: "Equipo"
+    george_title: "CEO"
+    george_blurb: "Negociante"
+    scott_title: "Programador"
+    scott_blurb: "Razonable"
+    nick_title: "Programador"
+    nick_blurb: "Gurú motivacional"
+    michael_title: "Programador"
+    michael_blurb: "Sys Admin"
+    matt_title: "Programador"
+    matt_blurb: "Bicicletero"

   versions:
     save_version_title: "Guardar nueva versión"
@@ -410,32 +410,32 @@
     wizard_tab: "Hechicero"
     wizard_color: "Color de Ropas del Hechicero"

-#  keyboard_shortcuts:
-#    keyboard_shortcuts: "Keyboard Shortcuts"
-#    space: "Space"
-#    enter: "Enter"
-#    escape: "Escape"
-#    shift: "Shift"
-#    cast_spell: "Cast current spell."
-#    run_real_time: "Run in real time."
-#    continue_script: "Continue past current script."
-#    skip_scripts: "Skip past all skippable scripts."
-#    toggle_playback: "Toggle play/pause."
-#    scrub_playback: "Scrub back and forward through time."
-#    single_scrub_playback: "Scrub back and forward through time by a single frame."
+  keyboard_shortcuts:
+    keyboard_shortcuts: "Keyboard Shortcuts"
+    space: "Barra espaciadora"
+    enter: "Enter"
+    escape: "Escape"
+    shift: "Shift"
+    cast_spell: "Aplicar hechizo actual."
+    run_real_time: "Ejecutar en tiempo real."
+    continue_script: "Continuar hasta finalizado el script."
+    skip_scripts: "Omitir todos los scripts omitibles."
+    toggle_playback: "Aplicar ejecutar/pausar."
+    scrub_playback: "Devolverse y avanzar en el tiempo."
+    single_scrub_playback: "Devolverse y avanzar en el tiempo de a un cuadro."
 #    scrub_execution: "Scrub through current spell execution."
-#    toggle_debug: "Toggle debug display."
+    toggle_debug: "Mostrar ocultar depuración."
 #    toggle_grid: "Toggle grid overlay."
 #    toggle_pathfinding: "Toggle pathfinding overlay."
-#    beautify: "Beautify your code by standardizing its formatting."
-#    maximize_editor: "Maximize/minimize code editor."
-#    move_wizard: "Move your Wizard around the level."
-
-#  community:
-#    main_title: "CodeCombat Community"
-#    introduction: "Check out the ways you can get involved below and decide what sounds the most fun. We look forward to working with you!"
-#    level_editor_prefix: "Use the CodeCombat"
-#    level_editor_suffix: "to create and edit levels. Users have created levels for their classes, friends, hackathons, students, and siblings. If create a new level sounds intimidating you can start by forking one of ours!"
+    beautify: "Hacer bello tu código estandarizando formato."
+    maximize_editor: "Maximizar/minimizar editor de código."
+    move_wizard: "Mover tu hechizero en el nivel."
+
+  community:
+    main_title: "Comunidad CodeCombat"
+    introduction: "Mira las maneras en las que puedes involucrarte adelante y decide qué es más divertido. ¡Queremos trabajar contigo!"
+    level_editor_prefix: "Usar CodeCombat"
+    level_editor_suffix: "para crear y editar niveles. Los han creado niveles para sus clases, amigos, hackatones, estudiantes, familiares. Si crear un nuevo juego luce intimidante puedes ¡comenzar con base en uno nuestro!"
 #    thang_editor_prefix: "We call units within the game 'thangs'. Use the"
 #    thang_editor_suffix: "to modify the CodeCombat source artwork. Allow units to throw projectiles, alter the direction of an animation, change a unit's hit points, or upload your own vector sprites."
 #    article_editor_prefix: "See a mistake in some of our docs? Want to make some instructions for your own creations? Check out the"


path.dirName -> path.dirname

path.dirName -> path.dirname

--- src/browser/auto-updater-win32.coffee
+++ src/browser/auto-updater-win32.coffee
@@ -14,8 +14,8 @@
     @updateUrl = url

   quitAndInstall: ->
-    updateDotExe = path.join(path.dirName(process.execPath), '..', 'update.exe')
-
+    updateDotExe = path.join(path.dirname(process.execPath), '..', 'update.exe')
+
     unless fs.existsSync(updateDotExe)
       console.log 'Running developer or Chocolatey version of Atom, skipping'
       return
@@ -41,7 +41,7 @@

     emit 'checking-for-update'

-    updateDotExe = path.join(path.dirName(process.execPath), '..', 'update.exe')
+    updateDotExe = path.join(path.dirname(process.execPath), '..', 'update.exe')
     unless fs.existsSync(updateDotExe)
       console.log 'Running developer or Chocolatey version of Atom, skipping'
       emit 'update-not-available'


console could be helpful later

console could be helpful later

error: pathspec 'test/browser/src/console.coffee' did not match any file(s) known to git

--- test/browser/src/console.coffee
+++ test/browser/src/console.coffee
@@ -0,0 +1,26 @@
+# create console to log test debug output
+
+charsToReplace =
+  "&": "&"
+  "<": "<"
+  ">": ">"
+
+replaceChar = (tag) ->
+  charsToReplace[tag] || tag;
+
+safe_tags_replace = (str) ->
+  str.replace /[&<>]/g, replaceChar
+
+log =
+  if document? # in browser => log to page
+    console = document.getElementById "console"
+    (message) ->
+      console.innerHTML = console.innerHTML + "* " + (safe_tags_replace message) + "<br>";
+  else if console? # not in browser but console object available?
+    console.log
+  else
+    -> # no console output
+
+log "Initialized console"
+
+module.exports = log


open pane spec

open pane spec

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ivangabriele/atom-tfs.git/'


added modal mock

added modal mock

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/vtanathip/vCommerce.git/'


HTML 文法チェックタスクを追加

HTML 文法チェックタスクを追加

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/zimin9u/iomante.git/'


Fixed the recording calendar performance bugs. (#2355)

* Set the camera created at date as minimum date of the recording calendar.

* Improved the loading animation functionality and highlight the recording hour.

* Fixed the bug of change date from arrow functionality.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


add file permissions.coffee

add file permissions.coffee


new script, phpdoc.coffee.

new script, phpdoc.coffee.

error: pathspec 'src/scripts/phpdoc.coffee' did not match any file(s) known to git

--- src/scripts/phpdoc.coffee
+++ src/scripts/phpdoc.coffee
@@ -0,0 +1,41 @@
+# Description:
+#   PHP's functions reference.
+#
+# Dependencies:
+#   "jsdom": ""
+#   "jquery": ""
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot phpdoc for <function> - Shows PHP function information.
+#
+# Author:
+#   nebiros
+
+jsdom = require("jsdom").jsdom
+
+module.exports = (robot) ->
+  robot.respond /phpdoc for (.+)$/i, (msg) ->
+    msg
+      .http("http://www.php.net/manual/en/function." + msg.match[1].replace(/[_-]+/, "-") + ".php")
+      .get() (err, res, body) ->
+        window = (jsdom body, null,
+          features:
+            FetchExternalResources: false
+            ProcessExternalResources: false
+            MutationEvents: false
+            QuerySelector: false
+        ).createWindow()
+
+        $ = require("jquery").create(window)
+        ver = $.trim $(".refnamediv p.verinfo").text()
+        desc = $.trim $(".refnamediv span.dc-title").text()
+        syn = $.trim $(".methodsynopsis").text().replace(/\s+/g, " ").replace(/(\r\n|\n|\r)/gm, " ")
+
+        if ver and desc and syn
+          msg.send "#{ver} - #{desc}"
+          msg.send syn
+        else
+          msg.send "Not found."


Script to fetch the latest photos from a Tumblr blog.

error: pathspec 'src/scripts/tumblr.coffee' did not match any file(s) known to git

--- src/scripts/tumblr.coffee
+++ src/scripts/tumblr.coffee
@@ -0,0 +1,38 @@
+# Display photos from a Tumblr blog
+#
+# Environment variables:
+#
+#  HUBOT_TUMBLR_BLOG_NAME
+#  HUBOT_TUMBLR_API_KEY
+#
+# show me tumblr <count> - Shows the latest <count> tumblr photos (default is 1)
+module.exports = (robot) ->
+
+  blog_name = process.env.HUBOT_TUMBLR_BLOG_NAME
+  api_key   = process.env.HUBOT_TUMBLR_API_KEY
+
+
+  robot.respond /show (me )?tumblr( (\d+))?/i, (msg) ->
+    count = msg.match[3] || 1
+
+    msg.http("http://api.tumblr.com/v2/blog/#{blog_name}.tumblr.com/posts/photo")
+      .query(api_key: api_key, limit: count)
+      .get() (err, res, body) ->
+
+        if err
+          msg.send "Tumblr says: #{err}"
+          return
+
+        content = JSON.parse(body)
+
+        if content.meta.status isnt 200
+          msg.send "Tumblr says: #{content.meta.msg}"
+          return
+
+        posts = content.response.posts
+
+        for post in posts
+          if posts.length is 1
+            msg.send post.caption
+          for photo in post.photos
+            msg.send photo.original_size.url


chore (Model) remove commented code

chore (Model) remove commented code

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


adicionando customização do tooltip

adicionando customização do tooltip

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppCivico/votolegal-www.git/'


Publish nav events to message bus.

Publish nav events to message bus.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JoshuaToenyes/stout-client.git/'


test blacklist key

test blacklist key

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stefanorg/dotfiles.git/'


Bumped up Ace of Coders simulations for the tournament.

--- server/queues/scoring/getTwoGames.coffee
+++ server/queues/scoring/getTwoGames.coffee
@@ -66,7 +66,7 @@

 # Sampling by level: we pick a level, then find a human and ogre session for that level, one at random, one biased towards recent submissions.
 #ladderLevelIDs = ['greed', 'criss-cross', 'brawlwood', 'dungeon-arena', 'gold-rush', 'sky-span']  # Let's not give any extra simulations to old ladders.
-ladderLevelIDs = ['dueling-grounds', 'cavern-survival', 'multiplayer-treasure-grove', 'harrowland', 'zero-sum', 'ace-of-coders']
+ladderLevelIDs = ['dueling-grounds', 'cavern-survival', 'multiplayer-treasure-grove', 'harrowland', 'zero-sum', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders', 'ace-of-coders']
 sampleByLevel = (callback) ->
   levelID = _.sample ladderLevelIDs
   favorRecentHumans = Math.random() < 0.5  # We pick one session favoring recent submissions, then find another one uniformly to play against
@@ -76,6 +76,7 @@
   # In MongoDB 3.2, we will be able to easily get a random document with aggregate $sample: https://jira.mongodb.org/browse/SERVER-533
   queryParams.submitted = true
   favorRecent = queryParams.favorRecent
+  favorRecent = false  # temp, for Ace of Coders tournament
   delete queryParams.favorRecent
   if favorRecent
     return findRecentRandomSession queryParams, callback


docker start/stop: add test

docker start/stop: add test

error: pathspec 'test/docker/start_stop.coffee' did not match any file(s) known to git

--- test/docker/start_stop.coffee
+++ test/docker/start_stop.coffee
@@ -0,0 +1,33 @@
+
+should = require 'should'
+mecano = require '../../src'
+test = require '../test'
+they = require 'ssh2-they'
+
+describe 'docker start', ->
+
+  scratch = test.scratch @
+
+  they 'test stop then start', (ssh, next) ->
+    mecano
+      ssh: ssh
+    .docker_run
+      image: 'httpd'
+      container: 'mecano_test'
+      service: true
+    .docker_stop
+      container: 'mecano_test'
+    .execute
+      cmd: 'docker ps | grep "mecano_test"'
+      code: 1
+    .docker_start
+      container: 'mecano_test'
+    .execute
+      cmd: 'docker ps | grep "mecano_test"'
+    .docker_rm
+      container: 'mecano_test'
+      force: true
+    .execute
+      cmd: 'docker ps -a | grep "mecano_test"'
+      code: 1
+    .then next


fix parameters

fix parameters

--- src/admin.appsscript.coffee
+++ src/admin.appsscript.coffee
@@ -29,7 +29,7 @@
 			t = HtmlService.createTemplateFromFile 'admin_mailtable'
 			t.baseUrl = url
 			t.user = u
-			t.emails = a.getMails u, null, null
+			t.emails = a.getMails u
 			t.evaluate()
 		when Admin.ACTIONS.REMOVE
 			id = request.parameter.id


search fixes

search fixes

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


STI, STD

STI, STD

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/robey/carrot16.git/'


add test for Player

add test for Player

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ChHeLeJa/SpaceTrader.git/'


Launch spacejam.coffee for tests

Launch spacejam.coffee for tests

--- tests/SpaceJamTest.coffee
+++ tests/SpaceJamTest.coffee
@@ -3,7 +3,7 @@
 SpaceJam = require '../src/SpaceJam'

 path = require 'path'
-spacejamBin = require.resolve("../bin/spacejam")
+spacejamBin = require.resolve("../bin/spacejam.coffee")
 log.info spacejamBin


little refacto

little refacto

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/feathrs/feathrs-game.git/'


botsnack

botsnack

error: pathspec 'scripts/botsnack.coffee' did not match any file(s) known to git

--- scripts/botsnack.coffee
+++ scripts/botsnack.coffee
@@ -0,0 +1,11 @@
+# Give lefay a botsnack
+#
+
+smiles = [":)", ":D", ":3"]
+
+module.exports = (robot) ->
+  robot.respond /botsnack/i, (msg) ->
+    if Math.random() < 0.75
+      msg.send smiles[0]
+    else
+      msg.send smiles[Math.floor(Math.random() * (smiles.length-1))+1]


update docpad with docpad config

update docpad with docpad config

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/osemnetwork/osemspace.git/'


Reply to greeting.  - Add new script of greeting.

error: pathspec 'scripts/random_response.coffee' did not match any file(s) known to git

--- scripts/random_response.coffee
+++ scripts/random_response.coffee
@@ -0,0 +1,21 @@
+# Description:
+#   Return Hello
+#
+# Commands:
+#   hubot greeting - Return Greeting
+
+greeting = [
+  "Hello"
+  "$B$3$s$K$A$O(B"
+  "$B%K%$%O%*(B"
+  "$B%J%^%9%F(B"
+  "$B%A%c%*(B"
+  "$B%\%s%8%e!<%k(B"
+  "$B%0!<%F%s%?!<%/(B"
+]
+
+module.exports = (robot) ->
+  robot.respond /hi/i, (msg) ->
+    msg.send msg.random greeting
+
+